diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3c0f7e8a0221d6..3a8f3f7717c277 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -32,7 +32,8 @@ release.
-18.20.2
+18.20.3
+18.20.2
18.20.1
18.20.0
18.19.1
diff --git a/README.md b/README.md
index 62432860a15041..438d970948e1eb 100644
--- a/README.md
+++ b/README.md
@@ -745,6 +745,8 @@ Primary GPG keys for Node.js Releasers (some Releasers sign with subkeys):
`74F12602B6F1C4E913FAA37AD3A89613643B6201`
* **Juan José Arboleda** <>
`DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7`
+* **Marco Ippolito** <>
+ `CC68F5A3106FF448322E48ED27F5E38D5B0A215F`
* **Michaël Zasso** <>
`8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600`
* **Myles Borins** <>
@@ -766,6 +768,7 @@ gpg --keyserver hkps://keys.openpgp.org --recv-keys 4ED778F539E3634C779C87C6D706
gpg --keyserver hkps://keys.openpgp.org --recv-keys 141F07595B7B3FFE74309A937405533BE57C7D57
gpg --keyserver hkps://keys.openpgp.org --recv-keys 74F12602B6F1C4E913FAA37AD3A89613643B6201
gpg --keyserver hkps://keys.openpgp.org --recv-keys DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7
+gpg --keyserver hkps://keys.openpgp.org --recv-keys CC68F5A3106FF448322E48ED27F5E38D5B0A215F
gpg --keyserver hkps://keys.openpgp.org --recv-keys 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600
gpg --keyserver hkps://keys.openpgp.org --recv-keys C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8
gpg --keyserver hkps://keys.openpgp.org --recv-keys 890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4
diff --git a/common.gypi b/common.gypi
index 38471d4639eb5e..ec92c9df4c1ea2 100644
--- a/common.gypi
+++ b/common.gypi
@@ -36,7 +36,7 @@
# Reset this number to 0 on major V8 upgrades.
# Increment by one for each non-official patch applied to deps/v8.
- 'v8_embedder_string': '-node.36',
+ 'v8_embedder_string': '-node.37',
##### V8 defaults for Node.js #####
diff --git a/deps/acorn/acorn-walk/CHANGELOG.md b/deps/acorn/acorn-walk/CHANGELOG.md
index 30ec5a5eec9911..0b4eea8a95d3ed 100644
--- a/deps/acorn/acorn-walk/CHANGELOG.md
+++ b/deps/acorn/acorn-walk/CHANGELOG.md
@@ -1,3 +1,17 @@
+## 8.3.1 (2023-12-06)
+
+### Bug fixes
+
+Add `Function` and `Class` to the `AggregateType` type, so that they can be used in walkers without raising a type error.
+
+Visitor functions are now called in such a way that their `this` refers to the object they are part of.
+
+## 8.3.0 (2023-10-26)
+
+### New features
+
+Use a set of new, much more precise, TypeScript types.
+
## 8.2.0 (2021-09-06)
### New features
diff --git a/deps/acorn/acorn-walk/README.md b/deps/acorn/acorn-walk/README.md
index e192baced005ac..3c18a2c76a938e 100644
--- a/deps/acorn/acorn-walk/README.md
+++ b/deps/acorn/acorn-walk/README.md
@@ -10,9 +10,7 @@ Acorn is open source software released under an
You are welcome to
[report bugs](https://github.com/acornjs/acorn/issues) or create pull
-requests on [github](https://github.com/acornjs/acorn). For questions
-and discussion, please use the
-[Tern discussion forum](https://discuss.ternjs.net).
+requests on [github](https://github.com/acornjs/acorn).
## Installation
@@ -68,7 +66,7 @@ const acorn = require("acorn")
const walk = require("acorn-walk")
walk.ancestor(acorn.parse("foo('hi')"), {
- Literal(_, ancestors) {
+ Literal(_node, _state, ancestors) {
console.log("This literal's ancestors are:", ancestors.map(n => n.type))
}
})
diff --git a/deps/acorn/acorn-walk/dist/walk.d.mts b/deps/acorn/acorn-walk/dist/walk.d.mts
new file mode 100644
index 00000000000000..e07a6afaf8e336
--- /dev/null
+++ b/deps/acorn/acorn-walk/dist/walk.d.mts
@@ -0,0 +1,177 @@
+import * as acorn from "acorn"
+
+export type FullWalkerCallback = (
+ node: acorn.Node,
+ state: TState,
+ type: string
+) => void
+
+export type FullAncestorWalkerCallback = (
+ node: acorn.Node,
+ state: TState,
+ ancestors: acorn.Node[],
+ type: string
+) => void
+
+type AggregateType = {
+ Expression: acorn.Expression,
+ Statement: acorn.Statement,
+ Function: acorn.Function,
+ Class: acorn.Class,
+ Pattern: acorn.Pattern,
+ ForInit: acorn.VariableDeclaration | acorn.Expression
+}
+
+export type SimpleVisitors = {
+ [type in acorn.AnyNode["type"]]?: (node: Extract, state: TState) => void
+} & {
+ [type in keyof AggregateType]?: (node: AggregateType[type], state: TState) => void
+}
+
+export type AncestorVisitors = {
+ [type in acorn.AnyNode["type"]]?: ( node: Extract, state: TState, ancestors: acorn.Node[]
+) => void
+} & {
+ [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, ancestors: acorn.Node[]) => void
+}
+
+export type WalkerCallback = (node: acorn.Node, state: TState) => void
+
+export type RecursiveVisitors = {
+ [type in acorn.AnyNode["type"]]?: ( node: Extract, state: TState, callback: WalkerCallback) => void
+} & {
+ [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, callback: WalkerCallback) => void
+}
+
+export type FindPredicate = (type: string, node: acorn.Node) => boolean
+
+export interface Found {
+ node: acorn.Node,
+ state: TState
+}
+
+/**
+ * does a 'simple' walk over a tree
+ * @param node the AST node to walk
+ * @param visitors an object with properties whose names correspond to node types in the {@link https://github.com/estree/estree | ESTree spec}. The properties should contain functions that will be called with the node object and, if applicable the state at that point.
+ * @param base a walker algorithm
+ * @param state a start state. The default walker will simply visit all statements and expressions and not produce a meaningful state. (An example of a use of state is to track scope at each point in the tree.)
+ */
+export function simple(
+ node: acorn.Node,
+ visitors: SimpleVisitors,
+ base?: RecursiveVisitors,
+ state?: TState
+): void
+
+/**
+ * does a 'simple' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter.
+ * @param node
+ * @param visitors
+ * @param base
+ * @param state
+ */
+export function ancestor(
+ node: acorn.Node,
+ visitors: AncestorVisitors,
+ base?: RecursiveVisitors,
+ state?: TState
+ ): void
+
+/**
+ * does a 'recursive' walk, where the walker functions are responsible for continuing the walk on the child nodes of their target node.
+ * @param node
+ * @param state the start state
+ * @param functions contain an object that maps node types to walker functions
+ * @param base provides the fallback walker functions for node types that aren't handled in the {@link functions} object. If not given, the default walkers will be used.
+ */
+export function recursive(
+ node: acorn.Node,
+ state: TState,
+ functions: RecursiveVisitors,
+ base?: RecursiveVisitors
+): void
+
+/**
+ * does a 'full' walk over a tree, calling the {@link callback} with the arguments (node, state, type) for each node
+ * @param node
+ * @param callback
+ * @param base
+ * @param state
+ */
+export function full(
+ node: acorn.Node,
+ callback: FullWalkerCallback,
+ base?: RecursiveVisitors,
+ state?: TState
+): void
+
+/**
+ * does a 'full' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter.
+ * @param node
+ * @param callback
+ * @param base
+ * @param state
+ */
+export function fullAncestor(
+ node: acorn.Node,
+ callback: FullAncestorWalkerCallback,
+ base?: RecursiveVisitors,
+ state?: TState
+): void
+
+/**
+ * builds a new walker object by using the walker functions in {@link functions} and filling in the missing ones by taking defaults from {@link base}.
+ * @param functions
+ * @param base
+ */
+export function make(
+ functions: RecursiveVisitors,
+ base?: RecursiveVisitors
+): RecursiveVisitors
+
+/**
+ * tries to locate a node in a tree at the given start and/or end offsets, which satisfies the predicate test. {@link start} and {@link end} can be either `null` (as wildcard) or a `number`. {@link test} may be a string (indicating a node type) or a function that takes (nodeType, node) arguments and returns a boolean indicating whether this node is interesting. {@link base} and {@link state} are optional, and can be used to specify a custom walker. Nodes are tested from inner to outer, so if two nodes match the boundaries, the inner one will be preferred.
+ * @param node
+ * @param start
+ * @param end
+ * @param type
+ * @param base
+ * @param state
+ */
+export function findNodeAt(
+ node: acorn.Node,
+ start: number | undefined,
+ end?: number | undefined,
+ type?: FindPredicate | string,
+ base?: RecursiveVisitors,
+ state?: TState
+): Found | undefined
+
+/**
+ * like {@link findNodeAt}, but will match any node that exists 'around' (spanning) the given position.
+ * @param node
+ * @param start
+ * @param type
+ * @param base
+ * @param state
+ */
+export function findNodeAround(
+ node: acorn.Node,
+ start: number | undefined,
+ type?: FindPredicate | string,
+ base?: RecursiveVisitors,
+ state?: TState
+): Found | undefined
+
+/**
+ * Find the outermost matching node after a given position.
+ */
+export const findNodeAfter: typeof findNodeAround
+
+/**
+ * Find the outermost matching node before a given position.
+ */
+export const findNodeBefore: typeof findNodeAround
+
+export const base: RecursiveVisitors
diff --git a/deps/acorn/acorn-walk/dist/walk.d.ts b/deps/acorn/acorn-walk/dist/walk.d.ts
index 2d81f01c166875..e07a6afaf8e336 100644
--- a/deps/acorn/acorn-walk/dist/walk.d.ts
+++ b/deps/acorn/acorn-walk/dist/walk.d.ts
@@ -1,114 +1,177 @@
-import {Node} from 'acorn';
-
-declare module "acorn-walk" {
- type FullWalkerCallback = (
- node: Node,
- state: TState,
- type: string
- ) => void;
-
- type FullAncestorWalkerCallback = (
- node: Node,
- state: TState | Node[],
- ancestors: Node[],
- type: string
- ) => void;
- type WalkerCallback = (node: Node, state: TState) => void;
-
- type SimpleWalkerFn = (
- node: Node,
- state: TState
- ) => void;
-
- type AncestorWalkerFn = (
- node: Node,
- state: TState| Node[],
- ancestors: Node[]
- ) => void;
-
- type RecursiveWalkerFn = (
- node: Node,
- state: TState,
- callback: WalkerCallback
- ) => void;
-
- type SimpleVisitors = {
- [type: string]: SimpleWalkerFn
- };
-
- type AncestorVisitors = {
- [type: string]: AncestorWalkerFn
- };
-
- type RecursiveVisitors = {
- [type: string]: RecursiveWalkerFn
- };
-
- type FindPredicate = (type: string, node: Node) => boolean;
-
- interface Found {
- node: Node,
- state: TState
- }
-
- export function simple(
- node: Node,
- visitors: SimpleVisitors,
- base?: RecursiveVisitors,
- state?: TState
- ): void;
+import * as acorn from "acorn"
+
+export type FullWalkerCallback = (
+ node: acorn.Node,
+ state: TState,
+ type: string
+) => void
+
+export type FullAncestorWalkerCallback = (
+ node: acorn.Node,
+ state: TState,
+ ancestors: acorn.Node[],
+ type: string
+) => void
+
+type AggregateType = {
+ Expression: acorn.Expression,
+ Statement: acorn.Statement,
+ Function: acorn.Function,
+ Class: acorn.Class,
+ Pattern: acorn.Pattern,
+ ForInit: acorn.VariableDeclaration | acorn.Expression
+}
- export function ancestor(
- node: Node,
- visitors: AncestorVisitors,
- base?: RecursiveVisitors,
- state?: TState
- ): void;
-
- export function recursive(
- node: Node,
- state: TState,
- functions: RecursiveVisitors,
- base?: RecursiveVisitors
- ): void;
-
- export function full(
- node: Node,
- callback: FullWalkerCallback,
- base?: RecursiveVisitors,
- state?: TState
- ): void;
+export type SimpleVisitors = {
+ [type in acorn.AnyNode["type"]]?: (node: Extract, state: TState) => void
+} & {
+ [type in keyof AggregateType]?: (node: AggregateType[type], state: TState) => void
+}
- export function fullAncestor(
- node: Node,
- callback: FullAncestorWalkerCallback,
- base?: RecursiveVisitors,
- state?: TState
- ): void;
-
- export function make(
- functions: RecursiveVisitors,
- base?: RecursiveVisitors
- ): RecursiveVisitors;
-
- export function findNodeAt(
- node: Node,
- start: number | undefined,
- end?: number | undefined,
- type?: FindPredicate | string,
- base?: RecursiveVisitors,
- state?: TState
- ): Found | undefined;
+export type AncestorVisitors = {
+ [type in acorn.AnyNode["type"]]?: ( node: Extract, state: TState, ancestors: acorn.Node[]
+) => void
+} & {
+ [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, ancestors: acorn.Node[]) => void
+}
- export function findNodeAround(
- node: Node,
- start: number | undefined,
- type?: FindPredicate | string,
- base?: RecursiveVisitors,
- state?: TState
- ): Found | undefined;
+export type WalkerCallback = (node: acorn.Node, state: TState) => void
- export const findNodeAfter: typeof findNodeAround;
+export type RecursiveVisitors = {
+ [type in acorn.AnyNode["type"]]?: ( node: Extract, state: TState, callback: WalkerCallback) => void
+} & {
+ [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, callback: WalkerCallback) => void
+}
- export const base: RecursiveVisitors;
+export type FindPredicate = (type: string, node: acorn.Node) => boolean
+
+export interface Found {
+ node: acorn.Node,
+ state: TState
}
+
+/**
+ * does a 'simple' walk over a tree
+ * @param node the AST node to walk
+ * @param visitors an object with properties whose names correspond to node types in the {@link https://github.com/estree/estree | ESTree spec}. The properties should contain functions that will be called with the node object and, if applicable the state at that point.
+ * @param base a walker algorithm
+ * @param state a start state. The default walker will simply visit all statements and expressions and not produce a meaningful state. (An example of a use of state is to track scope at each point in the tree.)
+ */
+export function simple(
+ node: acorn.Node,
+ visitors: SimpleVisitors,
+ base?: RecursiveVisitors,
+ state?: TState
+): void
+
+/**
+ * does a 'simple' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter.
+ * @param node
+ * @param visitors
+ * @param base
+ * @param state
+ */
+export function ancestor(
+ node: acorn.Node,
+ visitors: AncestorVisitors,
+ base?: RecursiveVisitors,
+ state?: TState
+ ): void
+
+/**
+ * does a 'recursive' walk, where the walker functions are responsible for continuing the walk on the child nodes of their target node.
+ * @param node
+ * @param state the start state
+ * @param functions contain an object that maps node types to walker functions
+ * @param base provides the fallback walker functions for node types that aren't handled in the {@link functions} object. If not given, the default walkers will be used.
+ */
+export function recursive(
+ node: acorn.Node,
+ state: TState,
+ functions: RecursiveVisitors,
+ base?: RecursiveVisitors
+): void
+
+/**
+ * does a 'full' walk over a tree, calling the {@link callback} with the arguments (node, state, type) for each node
+ * @param node
+ * @param callback
+ * @param base
+ * @param state
+ */
+export function full(
+ node: acorn.Node,
+ callback: FullWalkerCallback,
+ base?: RecursiveVisitors,
+ state?: TState
+): void
+
+/**
+ * does a 'full' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter.
+ * @param node
+ * @param callback
+ * @param base
+ * @param state
+ */
+export function fullAncestor(
+ node: acorn.Node,
+ callback: FullAncestorWalkerCallback,
+ base?: RecursiveVisitors,
+ state?: TState
+): void
+
+/**
+ * builds a new walker object by using the walker functions in {@link functions} and filling in the missing ones by taking defaults from {@link base}.
+ * @param functions
+ * @param base
+ */
+export function make(
+ functions: RecursiveVisitors,
+ base?: RecursiveVisitors
+): RecursiveVisitors
+
+/**
+ * tries to locate a node in a tree at the given start and/or end offsets, which satisfies the predicate test. {@link start} and {@link end} can be either `null` (as wildcard) or a `number`. {@link test} may be a string (indicating a node type) or a function that takes (nodeType, node) arguments and returns a boolean indicating whether this node is interesting. {@link base} and {@link state} are optional, and can be used to specify a custom walker. Nodes are tested from inner to outer, so if two nodes match the boundaries, the inner one will be preferred.
+ * @param node
+ * @param start
+ * @param end
+ * @param type
+ * @param base
+ * @param state
+ */
+export function findNodeAt(
+ node: acorn.Node,
+ start: number | undefined,
+ end?: number | undefined,
+ type?: FindPredicate | string,
+ base?: RecursiveVisitors,
+ state?: TState
+): Found | undefined
+
+/**
+ * like {@link findNodeAt}, but will match any node that exists 'around' (spanning) the given position.
+ * @param node
+ * @param start
+ * @param type
+ * @param base
+ * @param state
+ */
+export function findNodeAround(
+ node: acorn.Node,
+ start: number | undefined,
+ type?: FindPredicate | string,
+ base?: RecursiveVisitors,
+ state?: TState
+): Found | undefined
+
+/**
+ * Find the outermost matching node after a given position.
+ */
+export const findNodeAfter: typeof findNodeAround
+
+/**
+ * Find the outermost matching node before a given position.
+ */
+export const findNodeBefore: typeof findNodeAround
+
+export const base: RecursiveVisitors
diff --git a/deps/acorn/acorn-walk/dist/walk.js b/deps/acorn/acorn-walk/dist/walk.js
index a7f81b0061a750..580df6413725f8 100644
--- a/deps/acorn/acorn-walk/dist/walk.js
+++ b/deps/acorn/acorn-walk/dist/walk.js
@@ -1,10 +1,10 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
- (global = global || self, factory((global.acorn = global.acorn || {}, global.acorn.walk = {})));
-}(this, (function (exports) { 'use strict';
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.acorn = global.acorn || {}, global.acorn.walk = {})));
+})(this, (function (exports) { 'use strict';
- // AST walker module for Mozilla Parser API compatible trees
+ // AST walker module for ESTree compatible trees
// A simple walk is one where you simply specify callbacks to be
// called on specific nodes. The last two arguments are optional. A
@@ -14,7 +14,7 @@
// Expression: function(node) { ... }
// });
//
- // to do something with all expressions. All Parser API node types
+ // to do something with all expressions. All ESTree node types
// can be used to identify node types, as well as Expression and
// Statement, which denote categories of nodes.
//
@@ -25,9 +25,9 @@
function simple(node, visitors, baseVisitor, state, override) {
if (!baseVisitor) { baseVisitor = base
; }(function c(node, st, override) {
- var type = override || node.type, found = visitors[type];
+ var type = override || node.type;
baseVisitor[type](node, st, c);
- if (found) { found(node, st); }
+ if (visitors[type]) { visitors[type](node, st); }
})(node, state, override);
}
@@ -38,11 +38,11 @@
var ancestors = [];
if (!baseVisitor) { baseVisitor = base
; }(function c(node, st, override) {
- var type = override || node.type, found = visitors[type];
+ var type = override || node.type;
var isNew = node !== ancestors[ancestors.length - 1];
if (isNew) { ancestors.push(node); }
baseVisitor[type](node, st, c);
- if (found) { found(node, st || ancestors, ancestors); }
+ if (visitors[type]) { visitors[type](node, st || ancestors, ancestors); }
if (isNew) { ancestors.pop(); }
})(node, state, override);
}
@@ -458,6 +458,4 @@
exports.recursive = recursive;
exports.simple = simple;
- Object.defineProperty(exports, '__esModule', { value: true });
-
-})));
+}));
diff --git a/deps/acorn/acorn-walk/dist/walk.mjs b/deps/acorn/acorn-walk/dist/walk.mjs
index 89dd1f1f4f3557..19eebc0e70f598 100644
--- a/deps/acorn/acorn-walk/dist/walk.mjs
+++ b/deps/acorn/acorn-walk/dist/walk.mjs
@@ -1,4 +1,4 @@
-// AST walker module for Mozilla Parser API compatible trees
+// AST walker module for ESTree compatible trees
// A simple walk is one where you simply specify callbacks to be
// called on specific nodes. The last two arguments are optional. A
@@ -8,7 +8,7 @@
// Expression: function(node) { ... }
// });
//
-// to do something with all expressions. All Parser API node types
+// to do something with all expressions. All ESTree node types
// can be used to identify node types, as well as Expression and
// Statement, which denote categories of nodes.
//
@@ -19,9 +19,9 @@
function simple(node, visitors, baseVisitor, state, override) {
if (!baseVisitor) { baseVisitor = base
; }(function c(node, st, override) {
- var type = override || node.type, found = visitors[type];
+ var type = override || node.type;
baseVisitor[type](node, st, c);
- if (found) { found(node, st); }
+ if (visitors[type]) { visitors[type](node, st); }
})(node, state, override);
}
@@ -32,11 +32,11 @@ function ancestor(node, visitors, baseVisitor, state, override) {
var ancestors = [];
if (!baseVisitor) { baseVisitor = base
; }(function c(node, st, override) {
- var type = override || node.type, found = visitors[type];
+ var type = override || node.type;
var isNew = node !== ancestors[ancestors.length - 1];
if (isNew) { ancestors.push(node); }
baseVisitor[type](node, st, c);
- if (found) { found(node, st || ancestors, ancestors); }
+ if (visitors[type]) { visitors[type](node, st || ancestors, ancestors); }
if (isNew) { ancestors.pop(); }
})(node, state, override);
}
diff --git a/deps/acorn/acorn-walk/package.json b/deps/acorn/acorn-walk/package.json
index 8d75b9711c2e35..9d3b7e5248fb83 100644
--- a/deps/acorn/acorn-walk/package.json
+++ b/deps/acorn/acorn-walk/package.json
@@ -16,8 +16,10 @@
],
"./package.json": "./package.json"
},
- "version": "8.2.0",
- "engines": {"node": ">=0.4.0"},
+ "version": "8.3.2",
+ "engines": {
+ "node": ">=0.4.0"
+ },
"maintainers": [
{
"name": "Marijn Haverbeke",
diff --git a/deps/acorn/acorn/CHANGELOG.md b/deps/acorn/acorn/CHANGELOG.md
index 12464cfdbeefdd..eb848a58b8a091 100644
--- a/deps/acorn/acorn/CHANGELOG.md
+++ b/deps/acorn/acorn/CHANGELOG.md
@@ -1,3 +1,39 @@
+## 8.11.3 (2023-12-29)
+
+### Bug fixes
+
+Add `Function` and `Class` to the `AggregateType` type, so that they can be used in walkers without raising a type error.
+
+Make sure `onToken` get an `import` keyword token when parsing `import.meta`.
+
+Fix a bug where `.loc.start` could be undefined for `new.target` `meta` nodes.
+
+## 8.11.2 (2023-10-27)
+
+### Bug fixes
+
+Fix a bug that caused regular expressions after colon tokens to not be properly tokenized in some circumstances.
+
+## 8.11.1 (2023-10-26)
+
+### Bug fixes
+
+Fix a regression where `onToken` would receive 'name' tokens for 'new' keyword tokens.
+
+## 8.11.0 (2023-10-26)
+
+### Bug fixes
+
+Fix an issue where tokenizing (without parsing) an object literal with a property named `class` or `function` could, in some circumstance, put the tokenizer into an invalid state.
+
+Fix an issue where a slash after a call to a propery named the same as some keywords would be tokenized as a regular expression.
+
+### New features
+
+Upgrade to Unicode 15.1.
+
+Use a set of new, much more precise, TypeScript types.
+
## 8.10.0 (2023-07-05)
### New features
diff --git a/deps/acorn/acorn/README.md b/deps/acorn/acorn/README.md
index b62d02bde1fbb0..cfc51b384a3e2b 100644
--- a/deps/acorn/acorn/README.md
+++ b/deps/acorn/acorn/README.md
@@ -9,9 +9,7 @@ Acorn is open source software released under an
You are welcome to
[report bugs](https://github.com/acornjs/acorn/issues) or create pull
-requests on [github](https://github.com/acornjs/acorn). For questions
-and discussion, please use the
-[Tern discussion forum](https://discuss.ternjs.net).
+requests on [github](https://github.com/acornjs/acorn).
## Installation
@@ -204,6 +202,13 @@ option is enabled). When the token's type is `tokTypes.eof`, you
should stop calling the method, since it will keep returning that same
token forever.
+Note that tokenizing JavaScript without parsing it is, in modern
+versions of the language, not really possible due to the way syntax is
+overloaded in ways that can only be disambiguated by the parse
+context. This package applies a bunch of heuristics to try and do a
+reasonable job, but you are advised to use `parse` with the `onToken`
+option instead of this.
+
In ES6 environment, returned result can be used as any other
protocol-compliant iterable:
diff --git a/deps/acorn/acorn/dist/acorn.d.mts b/deps/acorn/acorn/dist/acorn.d.mts
index 49ae59fd95776a..6ad58121195c96 100644
--- a/deps/acorn/acorn/dist/acorn.d.mts
+++ b/deps/acorn/acorn/dist/acorn.d.mts
@@ -1,26 +1,857 @@
-export {
- Node,
- Parser,
- Position,
- SourceLocation,
- TokContext,
- Token,
- TokenType,
- defaultOptions,
- getLineInfo,
- isIdentifierChar,
- isIdentifierStart,
- isNewLine,
- lineBreak,
- lineBreakG,
- parse,
- parseExpressionAt,
- tokContexts,
- tokTypes,
- tokenizer,
- version,
- AbstractToken,
- Comment,
- Options,
- ecmaVersion,
-} from "./acorn.js";
+export interface Node {
+ start: number
+ end: number
+ type: string
+ range?: [number, number]
+ loc?: SourceLocation | null
+}
+
+export interface SourceLocation {
+ source?: string | null
+ start: Position
+ end: Position
+}
+
+export interface Position {
+ /** 1-based */
+ line: number
+ /** 0-based */
+ column: number
+}
+
+export interface Identifier extends Node {
+ type: "Identifier"
+ name: string
+}
+
+export interface Literal extends Node {
+ type: "Literal"
+ value?: string | boolean | null | number | RegExp | bigint
+ raw?: string
+ regex?: {
+ pattern: string
+ flags: string
+ }
+ bigint?: string
+}
+
+export interface Program extends Node {
+ type: "Program"
+ body: Array
+ sourceType: "script" | "module"
+}
+
+export interface Function extends Node {
+ id?: Identifier | null
+ params: Array
+ body: BlockStatement | Expression
+ generator: boolean
+ expression: boolean
+ async: boolean
+}
+
+export interface ExpressionStatement extends Node {
+ type: "ExpressionStatement"
+ expression: Expression | Literal
+ directive?: string
+}
+
+export interface BlockStatement extends Node {
+ type: "BlockStatement"
+ body: Array
+}
+
+export interface EmptyStatement extends Node {
+ type: "EmptyStatement"
+}
+
+export interface DebuggerStatement extends Node {
+ type: "DebuggerStatement"
+}
+
+export interface WithStatement extends Node {
+ type: "WithStatement"
+ object: Expression
+ body: Statement
+}
+
+export interface ReturnStatement extends Node {
+ type: "ReturnStatement"
+ argument?: Expression | null
+}
+
+export interface LabeledStatement extends Node {
+ type: "LabeledStatement"
+ label: Identifier
+ body: Statement
+}
+
+export interface BreakStatement extends Node {
+ type: "BreakStatement"
+ label?: Identifier | null
+}
+
+export interface ContinueStatement extends Node {
+ type: "ContinueStatement"
+ label?: Identifier | null
+}
+
+export interface IfStatement extends Node {
+ type: "IfStatement"
+ test: Expression
+ consequent: Statement
+ alternate?: Statement | null
+}
+
+export interface SwitchStatement extends Node {
+ type: "SwitchStatement"
+ discriminant: Expression
+ cases: Array
+}
+
+export interface SwitchCase extends Node {
+ type: "SwitchCase"
+ test?: Expression | null
+ consequent: Array
+}
+
+export interface ThrowStatement extends Node {
+ type: "ThrowStatement"
+ argument: Expression
+}
+
+export interface TryStatement extends Node {
+ type: "TryStatement"
+ block: BlockStatement
+ handler?: CatchClause | null
+ finalizer?: BlockStatement | null
+}
+
+export interface CatchClause extends Node {
+ type: "CatchClause"
+ param?: Pattern | null
+ body: BlockStatement
+}
+
+export interface WhileStatement extends Node {
+ type: "WhileStatement"
+ test: Expression
+ body: Statement
+}
+
+export interface DoWhileStatement extends Node {
+ type: "DoWhileStatement"
+ body: Statement
+ test: Expression
+}
+
+export interface ForStatement extends Node {
+ type: "ForStatement"
+ init?: VariableDeclaration | Expression | null
+ test?: Expression | null
+ update?: Expression | null
+ body: Statement
+}
+
+export interface ForInStatement extends Node {
+ type: "ForInStatement"
+ left: VariableDeclaration | Pattern
+ right: Expression
+ body: Statement
+}
+
+export interface FunctionDeclaration extends Function {
+ type: "FunctionDeclaration"
+ id: Identifier
+ body: BlockStatement
+}
+
+export interface VariableDeclaration extends Node {
+ type: "VariableDeclaration"
+ declarations: Array
+ kind: "var" | "let" | "const"
+}
+
+export interface VariableDeclarator extends Node {
+ type: "VariableDeclarator"
+ id: Pattern
+ init?: Expression | null
+}
+
+export interface ThisExpression extends Node {
+ type: "ThisExpression"
+}
+
+export interface ArrayExpression extends Node {
+ type: "ArrayExpression"
+ elements: Array
+}
+
+export interface ObjectExpression extends Node {
+ type: "ObjectExpression"
+ properties: Array
+}
+
+export interface Property extends Node {
+ type: "Property"
+ key: Expression
+ value: Expression
+ kind: "init" | "get" | "set"
+ method: boolean
+ shorthand: boolean
+ computed: boolean
+}
+
+export interface FunctionExpression extends Function {
+ type: "FunctionExpression"
+ body: BlockStatement
+}
+
+export interface UnaryExpression extends Node {
+ type: "UnaryExpression"
+ operator: UnaryOperator
+ prefix: boolean
+ argument: Expression
+}
+
+export type UnaryOperator = "-" | "+" | "!" | "~" | "typeof" | "void" | "delete"
+
+export interface UpdateExpression extends Node {
+ type: "UpdateExpression"
+ operator: UpdateOperator
+ argument: Expression
+ prefix: boolean
+}
+
+export type UpdateOperator = "++" | "--"
+
+export interface BinaryExpression extends Node {
+ type: "BinaryExpression"
+ operator: BinaryOperator
+ left: Expression | PrivateIdentifier
+ right: Expression
+}
+
+export type BinaryOperator = "==" | "!=" | "===" | "!==" | "<" | "<=" | ">" | ">=" | "<<" | ">>" | ">>>" | "+" | "-" | "*" | "/" | "%" | "|" | "^" | "&" | "in" | "instanceof" | "**"
+
+export interface AssignmentExpression extends Node {
+ type: "AssignmentExpression"
+ operator: AssignmentOperator
+ left: Pattern
+ right: Expression
+}
+
+export type AssignmentOperator = "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | ">>>=" | "|=" | "^=" | "&=" | "**=" | "||=" | "&&=" | "??="
+
+export interface LogicalExpression extends Node {
+ type: "LogicalExpression"
+ operator: LogicalOperator
+ left: Expression
+ right: Expression
+}
+
+export type LogicalOperator = "||" | "&&" | "??"
+
+export interface MemberExpression extends Node {
+ type: "MemberExpression"
+ object: Expression | Super
+ property: Expression | PrivateIdentifier
+ computed: boolean
+ optional: boolean
+}
+
+export interface ConditionalExpression extends Node {
+ type: "ConditionalExpression"
+ test: Expression
+ alternate: Expression
+ consequent: Expression
+}
+
+export interface CallExpression extends Node {
+ type: "CallExpression"
+ callee: Expression | Super
+ arguments: Array
+ optional: boolean
+}
+
+export interface NewExpression extends Node {
+ type: "NewExpression"
+ callee: Expression
+ arguments: Array
+}
+
+export interface SequenceExpression extends Node {
+ type: "SequenceExpression"
+ expressions: Array
+}
+
+export interface ForOfStatement extends Node {
+ type: "ForOfStatement"
+ left: VariableDeclaration | Pattern
+ right: Expression
+ body: Statement
+ await: boolean
+}
+
+export interface Super extends Node {
+ type: "Super"
+}
+
+export interface SpreadElement extends Node {
+ type: "SpreadElement"
+ argument: Expression
+}
+
+export interface ArrowFunctionExpression extends Function {
+ type: "ArrowFunctionExpression"
+}
+
+export interface YieldExpression extends Node {
+ type: "YieldExpression"
+ argument?: Expression | null
+ delegate: boolean
+}
+
+export interface TemplateLiteral extends Node {
+ type: "TemplateLiteral"
+ quasis: Array
+ expressions: Array
+}
+
+export interface TaggedTemplateExpression extends Node {
+ type: "TaggedTemplateExpression"
+ tag: Expression
+ quasi: TemplateLiteral
+}
+
+export interface TemplateElement extends Node {
+ type: "TemplateElement"
+ tail: boolean
+ value: {
+ cooked?: string | null
+ raw: string
+ }
+}
+
+export interface AssignmentProperty extends Node {
+ type: "Property"
+ key: Expression
+ value: Pattern
+ kind: "init"
+ method: false
+ shorthand: boolean
+ computed: boolean
+}
+
+export interface ObjectPattern extends Node {
+ type: "ObjectPattern"
+ properties: Array
+}
+
+export interface ArrayPattern extends Node {
+ type: "ArrayPattern"
+ elements: Array
+}
+
+export interface RestElement extends Node {
+ type: "RestElement"
+ argument: Pattern
+}
+
+export interface AssignmentPattern extends Node {
+ type: "AssignmentPattern"
+ left: Pattern
+ right: Expression
+}
+
+export interface Class extends Node {
+ id?: Identifier | null
+ superClass?: Expression | null
+ body: ClassBody
+}
+
+export interface ClassBody extends Node {
+ type: "ClassBody"
+ body: Array
+}
+
+export interface MethodDefinition extends Node {
+ type: "MethodDefinition"
+ key: Expression | PrivateIdentifier
+ value: FunctionExpression
+ kind: "constructor" | "method" | "get" | "set"
+ computed: boolean
+ static: boolean
+}
+
+export interface ClassDeclaration extends Class {
+ type: "ClassDeclaration"
+ id: Identifier
+}
+
+export interface ClassExpression extends Class {
+ type: "ClassExpression"
+}
+
+export interface MetaProperty extends Node {
+ type: "MetaProperty"
+ meta: Identifier
+ property: Identifier
+}
+
+export interface ImportDeclaration extends Node {
+ type: "ImportDeclaration"
+ specifiers: Array
+ source: Literal
+}
+
+export interface ImportSpecifier extends Node {
+ type: "ImportSpecifier"
+ imported: Identifier | Literal
+ local: Identifier
+}
+
+export interface ImportDefaultSpecifier extends Node {
+ type: "ImportDefaultSpecifier"
+ local: Identifier
+}
+
+export interface ImportNamespaceSpecifier extends Node {
+ type: "ImportNamespaceSpecifier"
+ local: Identifier
+}
+
+export interface ExportNamedDeclaration extends Node {
+ type: "ExportNamedDeclaration"
+ declaration?: Declaration | null
+ specifiers: Array
+ source?: Literal | null
+}
+
+export interface ExportSpecifier extends Node {
+ type: "ExportSpecifier"
+ exported: Identifier | Literal
+ local: Identifier | Literal
+}
+
+export interface AnonymousFunctionDeclaration extends Function {
+ type: "FunctionDeclaration"
+ id: null
+ body: BlockStatement
+}
+
+export interface AnonymousClassDeclaration extends Class {
+ type: "ClassDeclaration"
+ id: null
+}
+
+export interface ExportDefaultDeclaration extends Node {
+ type: "ExportDefaultDeclaration"
+ declaration: AnonymousFunctionDeclaration | FunctionDeclaration | AnonymousClassDeclaration | ClassDeclaration | Expression
+}
+
+export interface ExportAllDeclaration extends Node {
+ type: "ExportAllDeclaration"
+ source: Literal
+ exported?: Identifier | Literal | null
+}
+
+export interface AwaitExpression extends Node {
+ type: "AwaitExpression"
+ argument: Expression
+}
+
+export interface ChainExpression extends Node {
+ type: "ChainExpression"
+ expression: MemberExpression | CallExpression
+}
+
+export interface ImportExpression extends Node {
+ type: "ImportExpression"
+ source: Expression
+}
+
+export interface ParenthesizedExpression extends Node {
+ type: "ParenthesizedExpression"
+ expression: Expression
+}
+
+export interface PropertyDefinition extends Node {
+ type: "PropertyDefinition"
+ key: Expression | PrivateIdentifier
+ value?: Expression | null
+ computed: boolean
+ static: boolean
+}
+
+export interface PrivateIdentifier extends Node {
+ type: "PrivateIdentifier"
+ name: string
+}
+
+export interface StaticBlock extends Node {
+ type: "StaticBlock"
+ body: Array
+}
+
+export type Statement =
+| ExpressionStatement
+| BlockStatement
+| EmptyStatement
+| DebuggerStatement
+| WithStatement
+| ReturnStatement
+| LabeledStatement
+| BreakStatement
+| ContinueStatement
+| IfStatement
+| SwitchStatement
+| ThrowStatement
+| TryStatement
+| WhileStatement
+| DoWhileStatement
+| ForStatement
+| ForInStatement
+| ForOfStatement
+| Declaration
+
+export type Declaration =
+| FunctionDeclaration
+| VariableDeclaration
+| ClassDeclaration
+
+export type Expression =
+| Identifier
+| Literal
+| ThisExpression
+| ArrayExpression
+| ObjectExpression
+| FunctionExpression
+| UnaryExpression
+| UpdateExpression
+| BinaryExpression
+| AssignmentExpression
+| LogicalExpression
+| MemberExpression
+| ConditionalExpression
+| CallExpression
+| NewExpression
+| SequenceExpression
+| ArrowFunctionExpression
+| YieldExpression
+| TemplateLiteral
+| TaggedTemplateExpression
+| ClassExpression
+| MetaProperty
+| AwaitExpression
+| ChainExpression
+| ImportExpression
+| ParenthesizedExpression
+
+export type Pattern =
+| Identifier
+| MemberExpression
+| ObjectPattern
+| ArrayPattern
+| RestElement
+| AssignmentPattern
+
+export type ModuleDeclaration =
+| ImportDeclaration
+| ExportNamedDeclaration
+| ExportDefaultDeclaration
+| ExportAllDeclaration
+
+export type AnyNode = Statement | Expression | Declaration | ModuleDeclaration | Literal | Program | SwitchCase | CatchClause | Property | Super | SpreadElement | TemplateElement | AssignmentProperty | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | ClassBody | MethodDefinition | MetaProperty | ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier | AnonymousFunctionDeclaration | AnonymousClassDeclaration | PropertyDefinition | PrivateIdentifier | StaticBlock
+
+export function parse(input: string, options: Options): Program
+
+export function parseExpressionAt(input: string, pos: number, options: Options): Expression
+
+export function tokenizer(input: string, options: Options): {
+ getToken(): Token
+ [Symbol.iterator](): Iterator
+}
+
+export type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | "latest"
+
+export interface Options {
+ /**
+ * `ecmaVersion` indicates the ECMAScript version to parse. Must be
+ * either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10
+ * (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"`
+ * (the latest version the library supports). This influences
+ * support for strict mode, the set of reserved words, and support
+ * for new syntax features.
+ */
+ ecmaVersion: ecmaVersion
+
+ /**
+ * `sourceType` indicates the mode the code should be parsed in.
+ * Can be either `"script"` or `"module"`. This influences global
+ * strict mode and parsing of `import` and `export` declarations.
+ */
+ sourceType?: "script" | "module"
+
+ /**
+ * a callback that will be called when a semicolon is automatically inserted.
+ * @param lastTokEnd the position of the comma as an offset
+ * @param lastTokEndLoc location if {@link locations} is enabled
+ */
+ onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
+
+ /**
+ * similar to `onInsertedSemicolon`, but for trailing commas
+ * @param lastTokEnd the position of the comma as an offset
+ * @param lastTokEndLoc location if `locations` is enabled
+ */
+ onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
+
+ /**
+ * By default, reserved words are only enforced if ecmaVersion >= 5.
+ * Set `allowReserved` to a boolean value to explicitly turn this on
+ * an off. When this option has the value "never", reserved words
+ * and keywords can also not be used as property names.
+ */
+ allowReserved?: boolean | "never"
+
+ /**
+ * When enabled, a return at the top level is not considered an error.
+ */
+ allowReturnOutsideFunction?: boolean
+
+ /**
+ * When enabled, import/export statements are not constrained to
+ * appearing at the top of the program, and an import.meta expression
+ * in a script isn't considered an error.
+ */
+ allowImportExportEverywhere?: boolean
+
+ /**
+ * By default, `await` identifiers are allowed to appear at the top-level scope only if {@link ecmaVersion} >= 2022.
+ * When enabled, await identifiers are allowed to appear at the top-level scope,
+ * but they are still not allowed in non-async functions.
+ */
+ allowAwaitOutsideFunction?: boolean
+
+ /**
+ * When enabled, super identifiers are not constrained to
+ * appearing in methods and do not raise an error when they appear elsewhere.
+ */
+ allowSuperOutsideMethod?: boolean
+
+ /**
+ * When enabled, hashbang directive in the beginning of file is
+ * allowed and treated as a line comment. Enabled by default when
+ * {@link ecmaVersion} >= 2023.
+ */
+ allowHashBang?: boolean
+
+ /**
+ * By default, the parser will verify that private properties are
+ * only used in places where they are valid and have been declared.
+ * Set this to false to turn such checks off.
+ */
+ checkPrivateFields?: boolean
+
+ /**
+ * When `locations` is on, `loc` properties holding objects with
+ * `start` and `end` properties as {@link Position} objects will be attached to the
+ * nodes.
+ */
+ locations?: boolean
+
+ /**
+ * a callback that will cause Acorn to call that export function with object in the same
+ * format as tokens returned from `tokenizer().getToken()`. Note
+ * that you are not allowed to call the parser from the
+ * callback—that will corrupt its internal state.
+ */
+ onToken?: ((token: Token) => void) | Token[]
+
+
+ /**
+ * This takes a export function or an array.
+ *
+ * When a export function is passed, Acorn will call that export function with `(block, text, start,
+ * end)` parameters whenever a comment is skipped. `block` is a
+ * boolean indicating whether this is a block (`/* *\/`) comment,
+ * `text` is the content of the comment, and `start` and `end` are
+ * character offsets that denote the start and end of the comment.
+ * When the {@link locations} option is on, two more parameters are
+ * passed, the full locations of {@link Position} export type of the start and
+ * end of the comments.
+ *
+ * When a array is passed, each found comment of {@link Comment} export type is pushed to the array.
+ *
+ * Note that you are not allowed to call the
+ * parser from the callback—that will corrupt its internal state.
+ */
+ onComment?: ((
+ isBlock: boolean, text: string, start: number, end: number, startLoc?: Position,
+ endLoc?: Position
+ ) => void) | Comment[]
+
+ /**
+ * Nodes have their start and end characters offsets recorded in
+ * `start` and `end` properties (directly on the node, rather than
+ * the `loc` object, which holds line/column data. To also add a
+ * [semi-standardized][range] `range` property holding a `[start,
+ * end]` array with the same numbers, set the `ranges` option to
+ * `true`.
+ */
+ ranges?: boolean
+
+ /**
+ * It is possible to parse multiple files into a single AST by
+ * passing the tree produced by parsing the first file as
+ * `program` option in subsequent parses. This will add the
+ * toplevel forms of the parsed file to the `Program` (top) node
+ * of an existing parse tree.
+ */
+ program?: Node
+
+ /**
+ * When {@link locations} is on, you can pass this to record the source
+ * file in every node's `loc` object.
+ */
+ sourceFile?: string
+
+ /**
+ * This value, if given, is stored in every node, whether {@link locations} is on or off.
+ */
+ directSourceFile?: string
+
+ /**
+ * When enabled, parenthesized expressions are represented by
+ * (non-standard) ParenthesizedExpression nodes
+ */
+ preserveParens?: boolean
+}
+
+export class Parser {
+ options: Options
+ input: string
+
+ private constructor(options: Options, input: string, startPos?: number)
+ parse(): Program
+
+ static parse(input: string, options: Options): Program
+ static parseExpressionAt(input: string, pos: number, options: Options): Expression
+ static tokenizer(input: string, options: Options): {
+ getToken(): Token
+ [Symbol.iterator](): Iterator
+ }
+ static extend(...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser
+}
+
+export const defaultOptions: Options
+
+export function getLineInfo(input: string, offset: number): Position
+
+export class TokenType {
+ label: string
+ keyword: string | undefined
+}
+
+export const tokTypes: {
+ num: TokenType
+ regexp: TokenType
+ string: TokenType
+ name: TokenType
+ privateId: TokenType
+ eof: TokenType
+
+ bracketL: TokenType
+ bracketR: TokenType
+ braceL: TokenType
+ braceR: TokenType
+ parenL: TokenType
+ parenR: TokenType
+ comma: TokenType
+ semi: TokenType
+ colon: TokenType
+ dot: TokenType
+ question: TokenType
+ questionDot: TokenType
+ arrow: TokenType
+ template: TokenType
+ invalidTemplate: TokenType
+ ellipsis: TokenType
+ backQuote: TokenType
+ dollarBraceL: TokenType
+
+ eq: TokenType
+ assign: TokenType
+ incDec: TokenType
+ prefix: TokenType
+ logicalOR: TokenType
+ logicalAND: TokenType
+ bitwiseOR: TokenType
+ bitwiseXOR: TokenType
+ bitwiseAND: TokenType
+ equality: TokenType
+ relational: TokenType
+ bitShift: TokenType
+ plusMin: TokenType
+ modulo: TokenType
+ star: TokenType
+ slash: TokenType
+ starstar: TokenType
+ coalesce: TokenType
+
+ _break: TokenType
+ _case: TokenType
+ _catch: TokenType
+ _continue: TokenType
+ _debugger: TokenType
+ _default: TokenType
+ _do: TokenType
+ _else: TokenType
+ _finally: TokenType
+ _for: TokenType
+ _function: TokenType
+ _if: TokenType
+ _return: TokenType
+ _switch: TokenType
+ _throw: TokenType
+ _try: TokenType
+ _var: TokenType
+ _const: TokenType
+ _while: TokenType
+ _with: TokenType
+ _new: TokenType
+ _this: TokenType
+ _super: TokenType
+ _class: TokenType
+ _extends: TokenType
+ _export: TokenType
+ _import: TokenType
+ _null: TokenType
+ _true: TokenType
+ _false: TokenType
+ _in: TokenType
+ _instanceof: TokenType
+ _typeof: TokenType
+ _void: TokenType
+ _delete: TokenType
+}
+
+export interface Comment {
+ type: "Line" | "Block"
+ value: string
+ start: number
+ end: number
+ loc?: SourceLocation
+ range?: [number, number]
+}
+
+export class Token {
+ type: TokenType
+ start: number
+ end: number
+ loc?: SourceLocation
+ range?: [number, number]
+}
+
+export const version: string
diff --git a/deps/acorn/acorn/dist/acorn.d.ts b/deps/acorn/acorn/dist/acorn.d.ts
index 5b26741473db1a..6ad58121195c96 100644
--- a/deps/acorn/acorn/dist/acorn.d.ts
+++ b/deps/acorn/acorn/dist/acorn.d.ts
@@ -1,292 +1,857 @@
-export as namespace acorn
-export = acorn
+export interface Node {
+ start: number
+ end: number
+ type: string
+ range?: [number, number]
+ loc?: SourceLocation | null
+}
-declare namespace acorn {
- function parse(input: string, options: Options): Node
+export interface SourceLocation {
+ source?: string | null
+ start: Position
+ end: Position
+}
- function parseExpressionAt(input: string, pos: number, options: Options): Node
+export interface Position {
+ /** 1-based */
+ line: number
+ /** 0-based */
+ column: number
+}
- function tokenizer(input: string, options: Options): {
- getToken(): Token
- [Symbol.iterator](): Iterator
- }
+export interface Identifier extends Node {
+ type: "Identifier"
+ name: string
+}
- type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 'latest'
-
- interface Options {
- ecmaVersion: ecmaVersion
- sourceType?: 'script' | 'module'
- onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
- onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
- allowReserved?: boolean | 'never'
- allowReturnOutsideFunction?: boolean
- allowImportExportEverywhere?: boolean
- allowAwaitOutsideFunction?: boolean
- allowSuperOutsideMethod?: boolean
- allowHashBang?: boolean
- locations?: boolean
- onToken?: ((token: Token) => any) | Token[]
- onComment?: ((
- isBlock: boolean, text: string, start: number, end: number, startLoc?: Position,
- endLoc?: Position
- ) => void) | Comment[]
- ranges?: boolean
- program?: Node
- sourceFile?: string
- directSourceFile?: string
- preserveParens?: boolean
+export interface Literal extends Node {
+ type: "Literal"
+ value?: string | boolean | null | number | RegExp | bigint
+ raw?: string
+ regex?: {
+ pattern: string
+ flags: string
}
+ bigint?: string
+}
- class Parser {
- // state.js
- lineStart: number;
- options: Options;
- curLine: number;
- start: number;
- end: number;
- input: string;
- type: TokenType;
-
- // state.js
- constructor(options: Options, input: string, startPos?: number)
- parse(this: Parser): Node
-
- // tokenize.js
- next(): void;
- nextToken(): void;
-
- // statement.js
- parseTopLevel(node: Node): Node;
-
- // node.js
- finishNode(node: Node, type: string): Node;
- finishNodeAt(node: Node, type: string, pos: number, loc: Position): Node;
-
- // location.js
- raise(pos: number, message: string) : void;
- raiseRecoverable?(pos: number, message: string) : void;
-
- // parseutils.js
- unexpected(pos: number) : void;
-
- // index.js
- static acorn: typeof acorn;
-
- // state.js
- static parse(this: typeof Parser, input: string, options: Options): Node
- static parseExpressionAt(this: typeof Parser, input: string, pos: number, options: Options): Node
- static tokenizer(this: typeof Parser, input: string, options: Options): {
- getToken(): Token
- [Symbol.iterator](): Iterator
- }
- static extend(this: typeof Parser, ...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser
- }
+export interface Program extends Node {
+ type: "Program"
+ body: Array
+ sourceType: "script" | "module"
+}
- interface Position { line: number; column: number; offset: number }
+export interface Function extends Node {
+ id?: Identifier | null
+ params: Array
+ body: BlockStatement | Expression
+ generator: boolean
+ expression: boolean
+ async: boolean
+}
- const defaultOptions: Options
+export interface ExpressionStatement extends Node {
+ type: "ExpressionStatement"
+ expression: Expression | Literal
+ directive?: string
+}
- function getLineInfo(input: string, offset: number): Position
+export interface BlockStatement extends Node {
+ type: "BlockStatement"
+ body: Array
+}
- class SourceLocation {
- start: Position
- end: Position
- source?: string | null
- constructor(p: Parser, start: Position, end: Position)
- }
+export interface EmptyStatement extends Node {
+ type: "EmptyStatement"
+}
- class Node {
- type: string
- start: number
- end: number
- loc?: SourceLocation
- sourceFile?: string
- range?: [number, number]
- constructor(parser: Parser, pos: number, loc?: SourceLocation)
- }
+export interface DebuggerStatement extends Node {
+ type: "DebuggerStatement"
+}
- class TokenType {
- label: string
- keyword: string
- beforeExpr: boolean
- startsExpr: boolean
- isLoop: boolean
- isAssign: boolean
- prefix: boolean
- postfix: boolean
- binop: number
- updateContext?: (prevType: TokenType) => void
- constructor(label: string, conf?: any)
- }
+export interface WithStatement extends Node {
+ type: "WithStatement"
+ object: Expression
+ body: Statement
+}
- const tokTypes: {
- num: TokenType
- regexp: TokenType
- string: TokenType
- name: TokenType
- privateId: TokenType
- eof: TokenType
- bracketL: TokenType
- bracketR: TokenType
- braceL: TokenType
- braceR: TokenType
- parenL: TokenType
- parenR: TokenType
- comma: TokenType
- semi: TokenType
- colon: TokenType
- dot: TokenType
- question: TokenType
- questionDot: TokenType
- arrow: TokenType
- template: TokenType
- invalidTemplate: TokenType
- ellipsis: TokenType
- backQuote: TokenType
- dollarBraceL: TokenType
- eq: TokenType
- assign: TokenType
- incDec: TokenType
- prefix: TokenType
- logicalOR: TokenType
- logicalAND: TokenType
- bitwiseOR: TokenType
- bitwiseXOR: TokenType
- bitwiseAND: TokenType
- equality: TokenType
- relational: TokenType
- bitShift: TokenType
- plusMin: TokenType
- modulo: TokenType
- star: TokenType
- slash: TokenType
- starstar: TokenType
- coalesce: TokenType
- _break: TokenType
- _case: TokenType
- _catch: TokenType
- _continue: TokenType
- _debugger: TokenType
- _default: TokenType
- _do: TokenType
- _else: TokenType
- _finally: TokenType
- _for: TokenType
- _function: TokenType
- _if: TokenType
- _return: TokenType
- _switch: TokenType
- _throw: TokenType
- _try: TokenType
- _var: TokenType
- _const: TokenType
- _while: TokenType
- _with: TokenType
- _new: TokenType
- _this: TokenType
- _super: TokenType
- _class: TokenType
- _extends: TokenType
- _export: TokenType
- _import: TokenType
- _null: TokenType
- _true: TokenType
- _false: TokenType
- _in: TokenType
- _instanceof: TokenType
- _typeof: TokenType
- _void: TokenType
- _delete: TokenType
- }
+export interface ReturnStatement extends Node {
+ type: "ReturnStatement"
+ argument?: Expression | null
+}
- class TokContext {
- constructor(token: string, isExpr: boolean, preserveSpace: boolean, override?: (p: Parser) => void)
- }
+export interface LabeledStatement extends Node {
+ type: "LabeledStatement"
+ label: Identifier
+ body: Statement
+}
- const tokContexts: {
- b_stat: TokContext
- b_expr: TokContext
- b_tmpl: TokContext
- p_stat: TokContext
- p_expr: TokContext
- q_tmpl: TokContext
- f_expr: TokContext
- f_stat: TokContext
- f_expr_gen: TokContext
- f_gen: TokContext
- }
+export interface BreakStatement extends Node {
+ type: "BreakStatement"
+ label?: Identifier | null
+}
- function isIdentifierStart(code: number, astral?: boolean): boolean
+export interface ContinueStatement extends Node {
+ type: "ContinueStatement"
+ label?: Identifier | null
+}
- function isIdentifierChar(code: number, astral?: boolean): boolean
+export interface IfStatement extends Node {
+ type: "IfStatement"
+ test: Expression
+ consequent: Statement
+ alternate?: Statement | null
+}
- interface AbstractToken {
- }
+export interface SwitchStatement extends Node {
+ type: "SwitchStatement"
+ discriminant: Expression
+ cases: Array
+}
- interface Comment extends AbstractToken {
- type: 'Line' | 'Block'
- value: string
- start: number
- end: number
- loc?: SourceLocation
- range?: [number, number]
- }
+export interface SwitchCase extends Node {
+ type: "SwitchCase"
+ test?: Expression | null
+ consequent: Array
+}
+
+export interface ThrowStatement extends Node {
+ type: "ThrowStatement"
+ argument: Expression
+}
- class Token {
- type: TokenType
- value: any
- start: number
- end: number
- loc?: SourceLocation
- range?: [number, number]
- constructor(p: Parser)
+export interface TryStatement extends Node {
+ type: "TryStatement"
+ block: BlockStatement
+ handler?: CatchClause | null
+ finalizer?: BlockStatement | null
+}
+
+export interface CatchClause extends Node {
+ type: "CatchClause"
+ param?: Pattern | null
+ body: BlockStatement
+}
+
+export interface WhileStatement extends Node {
+ type: "WhileStatement"
+ test: Expression
+ body: Statement
+}
+
+export interface DoWhileStatement extends Node {
+ type: "DoWhileStatement"
+ body: Statement
+ test: Expression
+}
+
+export interface ForStatement extends Node {
+ type: "ForStatement"
+ init?: VariableDeclaration | Expression | null
+ test?: Expression | null
+ update?: Expression | null
+ body: Statement
+}
+
+export interface ForInStatement extends Node {
+ type: "ForInStatement"
+ left: VariableDeclaration | Pattern
+ right: Expression
+ body: Statement
+}
+
+export interface FunctionDeclaration extends Function {
+ type: "FunctionDeclaration"
+ id: Identifier
+ body: BlockStatement
+}
+
+export interface VariableDeclaration extends Node {
+ type: "VariableDeclaration"
+ declarations: Array
+ kind: "var" | "let" | "const"
+}
+
+export interface VariableDeclarator extends Node {
+ type: "VariableDeclarator"
+ id: Pattern
+ init?: Expression | null
+}
+
+export interface ThisExpression extends Node {
+ type: "ThisExpression"
+}
+
+export interface ArrayExpression extends Node {
+ type: "ArrayExpression"
+ elements: Array
+}
+
+export interface ObjectExpression extends Node {
+ type: "ObjectExpression"
+ properties: Array
+}
+
+export interface Property extends Node {
+ type: "Property"
+ key: Expression
+ value: Expression
+ kind: "init" | "get" | "set"
+ method: boolean
+ shorthand: boolean
+ computed: boolean
+}
+
+export interface FunctionExpression extends Function {
+ type: "FunctionExpression"
+ body: BlockStatement
+}
+
+export interface UnaryExpression extends Node {
+ type: "UnaryExpression"
+ operator: UnaryOperator
+ prefix: boolean
+ argument: Expression
+}
+
+export type UnaryOperator = "-" | "+" | "!" | "~" | "typeof" | "void" | "delete"
+
+export interface UpdateExpression extends Node {
+ type: "UpdateExpression"
+ operator: UpdateOperator
+ argument: Expression
+ prefix: boolean
+}
+
+export type UpdateOperator = "++" | "--"
+
+export interface BinaryExpression extends Node {
+ type: "BinaryExpression"
+ operator: BinaryOperator
+ left: Expression | PrivateIdentifier
+ right: Expression
+}
+
+export type BinaryOperator = "==" | "!=" | "===" | "!==" | "<" | "<=" | ">" | ">=" | "<<" | ">>" | ">>>" | "+" | "-" | "*" | "/" | "%" | "|" | "^" | "&" | "in" | "instanceof" | "**"
+
+export interface AssignmentExpression extends Node {
+ type: "AssignmentExpression"
+ operator: AssignmentOperator
+ left: Pattern
+ right: Expression
+}
+
+export type AssignmentOperator = "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | ">>>=" | "|=" | "^=" | "&=" | "**=" | "||=" | "&&=" | "??="
+
+export interface LogicalExpression extends Node {
+ type: "LogicalExpression"
+ operator: LogicalOperator
+ left: Expression
+ right: Expression
+}
+
+export type LogicalOperator = "||" | "&&" | "??"
+
+export interface MemberExpression extends Node {
+ type: "MemberExpression"
+ object: Expression | Super
+ property: Expression | PrivateIdentifier
+ computed: boolean
+ optional: boolean
+}
+
+export interface ConditionalExpression extends Node {
+ type: "ConditionalExpression"
+ test: Expression
+ alternate: Expression
+ consequent: Expression
+}
+
+export interface CallExpression extends Node {
+ type: "CallExpression"
+ callee: Expression | Super
+ arguments: Array
+ optional: boolean
+}
+
+export interface NewExpression extends Node {
+ type: "NewExpression"
+ callee: Expression
+ arguments: Array
+}
+
+export interface SequenceExpression extends Node {
+ type: "SequenceExpression"
+ expressions: Array
+}
+
+export interface ForOfStatement extends Node {
+ type: "ForOfStatement"
+ left: VariableDeclaration | Pattern
+ right: Expression
+ body: Statement
+ await: boolean
+}
+
+export interface Super extends Node {
+ type: "Super"
+}
+
+export interface SpreadElement extends Node {
+ type: "SpreadElement"
+ argument: Expression
+}
+
+export interface ArrowFunctionExpression extends Function {
+ type: "ArrowFunctionExpression"
+}
+
+export interface YieldExpression extends Node {
+ type: "YieldExpression"
+ argument?: Expression | null
+ delegate: boolean
+}
+
+export interface TemplateLiteral extends Node {
+ type: "TemplateLiteral"
+ quasis: Array
+ expressions: Array
+}
+
+export interface TaggedTemplateExpression extends Node {
+ type: "TaggedTemplateExpression"
+ tag: Expression
+ quasi: TemplateLiteral
+}
+
+export interface TemplateElement extends Node {
+ type: "TemplateElement"
+ tail: boolean
+ value: {
+ cooked?: string | null
+ raw: string
}
+}
+
+export interface AssignmentProperty extends Node {
+ type: "Property"
+ key: Expression
+ value: Pattern
+ kind: "init"
+ method: false
+ shorthand: boolean
+ computed: boolean
+}
+
+export interface ObjectPattern extends Node {
+ type: "ObjectPattern"
+ properties: Array
+}
+
+export interface ArrayPattern extends Node {
+ type: "ArrayPattern"
+ elements: Array
+}
+
+export interface RestElement extends Node {
+ type: "RestElement"
+ argument: Pattern
+}
+
+export interface AssignmentPattern extends Node {
+ type: "AssignmentPattern"
+ left: Pattern
+ right: Expression
+}
+
+export interface Class extends Node {
+ id?: Identifier | null
+ superClass?: Expression | null
+ body: ClassBody
+}
+
+export interface ClassBody extends Node {
+ type: "ClassBody"
+ body: Array
+}
+
+export interface MethodDefinition extends Node {
+ type: "MethodDefinition"
+ key: Expression | PrivateIdentifier
+ value: FunctionExpression
+ kind: "constructor" | "method" | "get" | "set"
+ computed: boolean
+ static: boolean
+}
+
+export interface ClassDeclaration extends Class {
+ type: "ClassDeclaration"
+ id: Identifier
+}
+
+export interface ClassExpression extends Class {
+ type: "ClassExpression"
+}
+
+export interface MetaProperty extends Node {
+ type: "MetaProperty"
+ meta: Identifier
+ property: Identifier
+}
+
+export interface ImportDeclaration extends Node {
+ type: "ImportDeclaration"
+ specifiers: Array
+ source: Literal
+}
+
+export interface ImportSpecifier extends Node {
+ type: "ImportSpecifier"
+ imported: Identifier | Literal
+ local: Identifier
+}
+
+export interface ImportDefaultSpecifier extends Node {
+ type: "ImportDefaultSpecifier"
+ local: Identifier
+}
+
+export interface ImportNamespaceSpecifier extends Node {
+ type: "ImportNamespaceSpecifier"
+ local: Identifier
+}
+
+export interface ExportNamedDeclaration extends Node {
+ type: "ExportNamedDeclaration"
+ declaration?: Declaration | null
+ specifiers: Array
+ source?: Literal | null
+}
+
+export interface ExportSpecifier extends Node {
+ type: "ExportSpecifier"
+ exported: Identifier | Literal
+ local: Identifier | Literal
+}
+
+export interface AnonymousFunctionDeclaration extends Function {
+ type: "FunctionDeclaration"
+ id: null
+ body: BlockStatement
+}
+
+export interface AnonymousClassDeclaration extends Class {
+ type: "ClassDeclaration"
+ id: null
+}
+
+export interface ExportDefaultDeclaration extends Node {
+ type: "ExportDefaultDeclaration"
+ declaration: AnonymousFunctionDeclaration | FunctionDeclaration | AnonymousClassDeclaration | ClassDeclaration | Expression
+}
- function isNewLine(code: number): boolean
-
- const lineBreak: RegExp
-
- const lineBreakG: RegExp
-
- const version: string
-
- const nonASCIIwhitespace: RegExp
-
- const keywordTypes: {
- _break: TokenType
- _case: TokenType
- _catch: TokenType
- _continue: TokenType
- _debugger: TokenType
- _default: TokenType
- _do: TokenType
- _else: TokenType
- _finally: TokenType
- _for: TokenType
- _function: TokenType
- _if: TokenType
- _return: TokenType
- _switch: TokenType
- _throw: TokenType
- _try: TokenType
- _var: TokenType
- _const: TokenType
- _while: TokenType
- _with: TokenType
- _new: TokenType
- _this: TokenType
- _super: TokenType
- _class: TokenType
- _extends: TokenType
- _export: TokenType
- _import: TokenType
- _null: TokenType
- _true: TokenType
- _false: TokenType
- _in: TokenType
- _instanceof: TokenType
- _typeof: TokenType
- _void: TokenType
- _delete: TokenType
+export interface ExportAllDeclaration extends Node {
+ type: "ExportAllDeclaration"
+ source: Literal
+ exported?: Identifier | Literal | null
+}
+
+export interface AwaitExpression extends Node {
+ type: "AwaitExpression"
+ argument: Expression
+}
+
+export interface ChainExpression extends Node {
+ type: "ChainExpression"
+ expression: MemberExpression | CallExpression
+}
+
+export interface ImportExpression extends Node {
+ type: "ImportExpression"
+ source: Expression
+}
+
+export interface ParenthesizedExpression extends Node {
+ type: "ParenthesizedExpression"
+ expression: Expression
+}
+
+export interface PropertyDefinition extends Node {
+ type: "PropertyDefinition"
+ key: Expression | PrivateIdentifier
+ value?: Expression | null
+ computed: boolean
+ static: boolean
+}
+
+export interface PrivateIdentifier extends Node {
+ type: "PrivateIdentifier"
+ name: string
+}
+
+export interface StaticBlock extends Node {
+ type: "StaticBlock"
+ body: Array
+}
+
+export type Statement =
+| ExpressionStatement
+| BlockStatement
+| EmptyStatement
+| DebuggerStatement
+| WithStatement
+| ReturnStatement
+| LabeledStatement
+| BreakStatement
+| ContinueStatement
+| IfStatement
+| SwitchStatement
+| ThrowStatement
+| TryStatement
+| WhileStatement
+| DoWhileStatement
+| ForStatement
+| ForInStatement
+| ForOfStatement
+| Declaration
+
+export type Declaration =
+| FunctionDeclaration
+| VariableDeclaration
+| ClassDeclaration
+
+export type Expression =
+| Identifier
+| Literal
+| ThisExpression
+| ArrayExpression
+| ObjectExpression
+| FunctionExpression
+| UnaryExpression
+| UpdateExpression
+| BinaryExpression
+| AssignmentExpression
+| LogicalExpression
+| MemberExpression
+| ConditionalExpression
+| CallExpression
+| NewExpression
+| SequenceExpression
+| ArrowFunctionExpression
+| YieldExpression
+| TemplateLiteral
+| TaggedTemplateExpression
+| ClassExpression
+| MetaProperty
+| AwaitExpression
+| ChainExpression
+| ImportExpression
+| ParenthesizedExpression
+
+export type Pattern =
+| Identifier
+| MemberExpression
+| ObjectPattern
+| ArrayPattern
+| RestElement
+| AssignmentPattern
+
+export type ModuleDeclaration =
+| ImportDeclaration
+| ExportNamedDeclaration
+| ExportDefaultDeclaration
+| ExportAllDeclaration
+
+export type AnyNode = Statement | Expression | Declaration | ModuleDeclaration | Literal | Program | SwitchCase | CatchClause | Property | Super | SpreadElement | TemplateElement | AssignmentProperty | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | ClassBody | MethodDefinition | MetaProperty | ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier | AnonymousFunctionDeclaration | AnonymousClassDeclaration | PropertyDefinition | PrivateIdentifier | StaticBlock
+
+export function parse(input: string, options: Options): Program
+
+export function parseExpressionAt(input: string, pos: number, options: Options): Expression
+
+export function tokenizer(input: string, options: Options): {
+ getToken(): Token
+ [Symbol.iterator](): Iterator
+}
+
+export type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | "latest"
+
+export interface Options {
+ /**
+ * `ecmaVersion` indicates the ECMAScript version to parse. Must be
+ * either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10
+ * (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"`
+ * (the latest version the library supports). This influences
+ * support for strict mode, the set of reserved words, and support
+ * for new syntax features.
+ */
+ ecmaVersion: ecmaVersion
+
+ /**
+ * `sourceType` indicates the mode the code should be parsed in.
+ * Can be either `"script"` or `"module"`. This influences global
+ * strict mode and parsing of `import` and `export` declarations.
+ */
+ sourceType?: "script" | "module"
+
+ /**
+ * a callback that will be called when a semicolon is automatically inserted.
+ * @param lastTokEnd the position of the comma as an offset
+ * @param lastTokEndLoc location if {@link locations} is enabled
+ */
+ onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
+
+ /**
+ * similar to `onInsertedSemicolon`, but for trailing commas
+ * @param lastTokEnd the position of the comma as an offset
+ * @param lastTokEndLoc location if `locations` is enabled
+ */
+ onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
+
+ /**
+ * By default, reserved words are only enforced if ecmaVersion >= 5.
+ * Set `allowReserved` to a boolean value to explicitly turn this on
+ * an off. When this option has the value "never", reserved words
+ * and keywords can also not be used as property names.
+ */
+ allowReserved?: boolean | "never"
+
+ /**
+ * When enabled, a return at the top level is not considered an error.
+ */
+ allowReturnOutsideFunction?: boolean
+
+ /**
+ * When enabled, import/export statements are not constrained to
+ * appearing at the top of the program, and an import.meta expression
+ * in a script isn't considered an error.
+ */
+ allowImportExportEverywhere?: boolean
+
+ /**
+ * By default, `await` identifiers are allowed to appear at the top-level scope only if {@link ecmaVersion} >= 2022.
+ * When enabled, await identifiers are allowed to appear at the top-level scope,
+ * but they are still not allowed in non-async functions.
+ */
+ allowAwaitOutsideFunction?: boolean
+
+ /**
+ * When enabled, super identifiers are not constrained to
+ * appearing in methods and do not raise an error when they appear elsewhere.
+ */
+ allowSuperOutsideMethod?: boolean
+
+ /**
+ * When enabled, hashbang directive in the beginning of file is
+ * allowed and treated as a line comment. Enabled by default when
+ * {@link ecmaVersion} >= 2023.
+ */
+ allowHashBang?: boolean
+
+ /**
+ * By default, the parser will verify that private properties are
+ * only used in places where they are valid and have been declared.
+ * Set this to false to turn such checks off.
+ */
+ checkPrivateFields?: boolean
+
+ /**
+ * When `locations` is on, `loc` properties holding objects with
+ * `start` and `end` properties as {@link Position} objects will be attached to the
+ * nodes.
+ */
+ locations?: boolean
+
+ /**
+ * a callback that will cause Acorn to call that export function with object in the same
+ * format as tokens returned from `tokenizer().getToken()`. Note
+ * that you are not allowed to call the parser from the
+ * callback—that will corrupt its internal state.
+ */
+ onToken?: ((token: Token) => void) | Token[]
+
+
+ /**
+ * This takes a export function or an array.
+ *
+ * When a export function is passed, Acorn will call that export function with `(block, text, start,
+ * end)` parameters whenever a comment is skipped. `block` is a
+ * boolean indicating whether this is a block (`/* *\/`) comment,
+ * `text` is the content of the comment, and `start` and `end` are
+ * character offsets that denote the start and end of the comment.
+ * When the {@link locations} option is on, two more parameters are
+ * passed, the full locations of {@link Position} export type of the start and
+ * end of the comments.
+ *
+ * When a array is passed, each found comment of {@link Comment} export type is pushed to the array.
+ *
+ * Note that you are not allowed to call the
+ * parser from the callback—that will corrupt its internal state.
+ */
+ onComment?: ((
+ isBlock: boolean, text: string, start: number, end: number, startLoc?: Position,
+ endLoc?: Position
+ ) => void) | Comment[]
+
+ /**
+ * Nodes have their start and end characters offsets recorded in
+ * `start` and `end` properties (directly on the node, rather than
+ * the `loc` object, which holds line/column data. To also add a
+ * [semi-standardized][range] `range` property holding a `[start,
+ * end]` array with the same numbers, set the `ranges` option to
+ * `true`.
+ */
+ ranges?: boolean
+
+ /**
+ * It is possible to parse multiple files into a single AST by
+ * passing the tree produced by parsing the first file as
+ * `program` option in subsequent parses. This will add the
+ * toplevel forms of the parsed file to the `Program` (top) node
+ * of an existing parse tree.
+ */
+ program?: Node
+
+ /**
+ * When {@link locations} is on, you can pass this to record the source
+ * file in every node's `loc` object.
+ */
+ sourceFile?: string
+
+ /**
+ * This value, if given, is stored in every node, whether {@link locations} is on or off.
+ */
+ directSourceFile?: string
+
+ /**
+ * When enabled, parenthesized expressions are represented by
+ * (non-standard) ParenthesizedExpression nodes
+ */
+ preserveParens?: boolean
+}
+
+export class Parser {
+ options: Options
+ input: string
+
+ private constructor(options: Options, input: string, startPos?: number)
+ parse(): Program
+
+ static parse(input: string, options: Options): Program
+ static parseExpressionAt(input: string, pos: number, options: Options): Expression
+ static tokenizer(input: string, options: Options): {
+ getToken(): Token
+ [Symbol.iterator](): Iterator
}
+ static extend(...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser
}
+
+export const defaultOptions: Options
+
+export function getLineInfo(input: string, offset: number): Position
+
+export class TokenType {
+ label: string
+ keyword: string | undefined
+}
+
+export const tokTypes: {
+ num: TokenType
+ regexp: TokenType
+ string: TokenType
+ name: TokenType
+ privateId: TokenType
+ eof: TokenType
+
+ bracketL: TokenType
+ bracketR: TokenType
+ braceL: TokenType
+ braceR: TokenType
+ parenL: TokenType
+ parenR: TokenType
+ comma: TokenType
+ semi: TokenType
+ colon: TokenType
+ dot: TokenType
+ question: TokenType
+ questionDot: TokenType
+ arrow: TokenType
+ template: TokenType
+ invalidTemplate: TokenType
+ ellipsis: TokenType
+ backQuote: TokenType
+ dollarBraceL: TokenType
+
+ eq: TokenType
+ assign: TokenType
+ incDec: TokenType
+ prefix: TokenType
+ logicalOR: TokenType
+ logicalAND: TokenType
+ bitwiseOR: TokenType
+ bitwiseXOR: TokenType
+ bitwiseAND: TokenType
+ equality: TokenType
+ relational: TokenType
+ bitShift: TokenType
+ plusMin: TokenType
+ modulo: TokenType
+ star: TokenType
+ slash: TokenType
+ starstar: TokenType
+ coalesce: TokenType
+
+ _break: TokenType
+ _case: TokenType
+ _catch: TokenType
+ _continue: TokenType
+ _debugger: TokenType
+ _default: TokenType
+ _do: TokenType
+ _else: TokenType
+ _finally: TokenType
+ _for: TokenType
+ _function: TokenType
+ _if: TokenType
+ _return: TokenType
+ _switch: TokenType
+ _throw: TokenType
+ _try: TokenType
+ _var: TokenType
+ _const: TokenType
+ _while: TokenType
+ _with: TokenType
+ _new: TokenType
+ _this: TokenType
+ _super: TokenType
+ _class: TokenType
+ _extends: TokenType
+ _export: TokenType
+ _import: TokenType
+ _null: TokenType
+ _true: TokenType
+ _false: TokenType
+ _in: TokenType
+ _instanceof: TokenType
+ _typeof: TokenType
+ _void: TokenType
+ _delete: TokenType
+}
+
+export interface Comment {
+ type: "Line" | "Block"
+ value: string
+ start: number
+ end: number
+ loc?: SourceLocation
+ range?: [number, number]
+}
+
+export class Token {
+ type: TokenType
+ start: number
+ end: number
+ loc?: SourceLocation
+ range?: [number, number]
+}
+
+export const version: string
diff --git a/deps/acorn/acorn/dist/acorn.js b/deps/acorn/acorn/dist/acorn.js
index 62e1aa63d0974f..3a6a3a2aeed54c 100644
--- a/deps/acorn/acorn/dist/acorn.js
+++ b/deps/acorn/acorn/dist/acorn.js
@@ -8,10 +8,10 @@
var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
// This file was generated. Do not modify manually!
- var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938, 6, 4191];
+ var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191];
// This file was generated. Do not modify manually!
- var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f";
+ var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65";
// This file was generated. Do not modify manually!
var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
@@ -279,8 +279,10 @@
toString.call(obj) === "[object Array]"
); });
+ var regexpCache = Object.create(null);
+
function wordsRegexp(words) {
- return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$")
+ return regexpCache[words] || (regexpCache[words] = new RegExp("^(?:" + words.replace(/ /g, "|") + ")$"))
}
function codePointToString(code) {
@@ -340,11 +342,11 @@
// Can be either `"script"` or `"module"`. This influences global
// strict mode and parsing of `import` and `export` declarations.
sourceType: "script",
- // `onInsertedSemicolon` can be a callback that will be called
- // when a semicolon is automatically inserted. It will be passed
- // the position of the comma as an offset, and if `locations` is
- // enabled, it is given the location as a `{line, column}` object
- // as second argument.
+ // `onInsertedSemicolon` can be a callback that will be called when
+ // a semicolon is automatically inserted. It will be passed the
+ // position of the inserted semicolon as an offset, and if
+ // `locations` is enabled, it is given the location as a `{line,
+ // column}` object as second argument.
onInsertedSemicolon: null,
// `onTrailingComma` is similar to `onInsertedSemicolon`, but for
// trailing commas.
@@ -397,6 +399,8 @@
// passed, the full `{line, column}` locations of the start and
// end of the comments. Note that you are not allowed to call the
// parser from the callback—that will corrupt its internal state.
+ // When this option has an array as value, objects representing the
+ // comments are pushed to it.
onComment: null,
// Nodes have their start and end characters offsets recorded in
// `start` and `end` properties (directly on the node, rather than
@@ -1772,8 +1776,6 @@
{ this.checkPatternExport(exports, pat.left); }
else if (type === "RestElement")
{ this.checkPatternExport(exports, pat.argument); }
- else if (type === "ParenthesizedExpression")
- { this.checkPatternExport(exports, pat.expression); }
};
pp$8.checkVariableExport = function(exports, decls) {
@@ -2337,7 +2339,7 @@
{ this.exprAllowed = type.beforeExpr; }
};
- // Used to handle egde cases when token context could not be inferred correctly during tokenization phase
+ // Used to handle edge cases when token context could not be inferred correctly during tokenization phase
pp$6.overrideContext = function(tokenCtx) {
if (this.curContext() !== tokenCtx) {
@@ -2390,6 +2392,11 @@
this.exprAllowed = false;
};
+ types$1.colon.updateContext = function() {
+ if (this.curContext().token === "function") { this.context.pop(); }
+ this.exprAllowed = true;
+ };
+
types$1.backQuote.updateContext = function() {
if (this.curContext() === types.q_tmpl)
{ this.context.pop(); }
@@ -2935,12 +2942,14 @@
// Consume `import` as an identifier for `import.meta`.
// Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`.
if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword import"); }
- var meta = this.parseIdent(true);
+ this.next();
if (this.type === types$1.parenL && !forNew) {
return this.parseDynamicImport(node)
} else if (this.type === types$1.dot) {
- node.meta = meta;
+ var meta = this.startNodeAt(node.start, node.loc && node.loc.start);
+ meta.name = "import";
+ node.meta = this.finishNode(meta, "Identifier");
return this.parseImportMeta(node)
} else {
this.unexpected();
@@ -3088,9 +3097,12 @@
pp$5.parseNew = function() {
if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); }
var node = this.startNode();
- var meta = this.parseIdent(true);
- if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) {
- node.meta = meta;
+ this.next();
+ if (this.options.ecmaVersion >= 6 && this.type === types$1.dot) {
+ var meta = this.startNodeAt(node.start, node.loc && node.loc.start);
+ meta.name = "new";
+ node.meta = this.finishNode(meta, "Identifier");
+ this.next();
var containsEsc = this.containsEsc;
node.property = this.parseIdent(true);
if (node.property.name !== "target")
@@ -3492,6 +3504,7 @@
(this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {
this.context.pop();
}
+ this.type = types$1.name;
} else {
this.unexpected();
}
@@ -5914,7 +5927,7 @@
// [walk]: util/walk.js
- var version = "8.10.0";
+ var version = "8.11.3";
Parser.acorn = {
Parser: Parser,
@@ -5939,11 +5952,10 @@
};
// The main exported interface (under `self.acorn` when in the
- // browser) is a `parse` function that takes a code string and
- // returns an abstract syntax tree as specified by [Mozilla parser
- // API][api].
+ // browser) is a `parse` function that takes a code string and returns
+ // an abstract syntax tree as specified by the [ESTree spec][estree].
//
- // [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
+ // [estree]: https://github.com/estree/estree
function parse(input, options) {
return Parser.parse(input, options)
diff --git a/deps/acorn/acorn/dist/acorn.mjs b/deps/acorn/acorn/dist/acorn.mjs
index 119eff98d4ded6..d1f81ef48511a4 100644
--- a/deps/acorn/acorn/dist/acorn.mjs
+++ b/deps/acorn/acorn/dist/acorn.mjs
@@ -2,10 +2,10 @@
var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
// This file was generated. Do not modify manually!
-var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938, 6, 4191];
+var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191];
// This file was generated. Do not modify manually!
-var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f";
+var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65";
// This file was generated. Do not modify manually!
var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
@@ -273,8 +273,10 @@ var isArray = Array.isArray || (function (obj) { return (
toString.call(obj) === "[object Array]"
); });
+var regexpCache = Object.create(null);
+
function wordsRegexp(words) {
- return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$")
+ return regexpCache[words] || (regexpCache[words] = new RegExp("^(?:" + words.replace(/ /g, "|") + ")$"))
}
function codePointToString(code) {
@@ -334,11 +336,11 @@ var defaultOptions = {
// Can be either `"script"` or `"module"`. This influences global
// strict mode and parsing of `import` and `export` declarations.
sourceType: "script",
- // `onInsertedSemicolon` can be a callback that will be called
- // when a semicolon is automatically inserted. It will be passed
- // the position of the comma as an offset, and if `locations` is
- // enabled, it is given the location as a `{line, column}` object
- // as second argument.
+ // `onInsertedSemicolon` can be a callback that will be called when
+ // a semicolon is automatically inserted. It will be passed the
+ // position of the inserted semicolon as an offset, and if
+ // `locations` is enabled, it is given the location as a `{line,
+ // column}` object as second argument.
onInsertedSemicolon: null,
// `onTrailingComma` is similar to `onInsertedSemicolon`, but for
// trailing commas.
@@ -391,6 +393,8 @@ var defaultOptions = {
// passed, the full `{line, column}` locations of the start and
// end of the comments. Note that you are not allowed to call the
// parser from the callback—that will corrupt its internal state.
+ // When this option has an array as value, objects representing the
+ // comments are pushed to it.
onComment: null,
// Nodes have their start and end characters offsets recorded in
// `start` and `end` properties (directly on the node, rather than
@@ -1766,8 +1770,6 @@ pp$8.checkPatternExport = function(exports, pat) {
{ this.checkPatternExport(exports, pat.left); }
else if (type === "RestElement")
{ this.checkPatternExport(exports, pat.argument); }
- else if (type === "ParenthesizedExpression")
- { this.checkPatternExport(exports, pat.expression); }
};
pp$8.checkVariableExport = function(exports, decls) {
@@ -2331,7 +2333,7 @@ pp$6.updateContext = function(prevType) {
{ this.exprAllowed = type.beforeExpr; }
};
-// Used to handle egde cases when token context could not be inferred correctly during tokenization phase
+// Used to handle edge cases when token context could not be inferred correctly during tokenization phase
pp$6.overrideContext = function(tokenCtx) {
if (this.curContext() !== tokenCtx) {
@@ -2384,6 +2386,11 @@ types$1._function.updateContext = types$1._class.updateContext = function(prevTy
this.exprAllowed = false;
};
+types$1.colon.updateContext = function() {
+ if (this.curContext().token === "function") { this.context.pop(); }
+ this.exprAllowed = true;
+};
+
types$1.backQuote.updateContext = function() {
if (this.curContext() === types.q_tmpl)
{ this.context.pop(); }
@@ -2929,12 +2936,14 @@ pp$5.parseExprImport = function(forNew) {
// Consume `import` as an identifier for `import.meta`.
// Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`.
if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword import"); }
- var meta = this.parseIdent(true);
+ this.next();
if (this.type === types$1.parenL && !forNew) {
return this.parseDynamicImport(node)
} else if (this.type === types$1.dot) {
- node.meta = meta;
+ var meta = this.startNodeAt(node.start, node.loc && node.loc.start);
+ meta.name = "import";
+ node.meta = this.finishNode(meta, "Identifier");
return this.parseImportMeta(node)
} else {
this.unexpected();
@@ -3082,9 +3091,12 @@ var empty = [];
pp$5.parseNew = function() {
if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); }
var node = this.startNode();
- var meta = this.parseIdent(true);
- if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) {
- node.meta = meta;
+ this.next();
+ if (this.options.ecmaVersion >= 6 && this.type === types$1.dot) {
+ var meta = this.startNodeAt(node.start, node.loc && node.loc.start);
+ meta.name = "new";
+ node.meta = this.finishNode(meta, "Identifier");
+ this.next();
var containsEsc = this.containsEsc;
node.property = this.parseIdent(true);
if (node.property.name !== "target")
@@ -3486,6 +3498,7 @@ pp$5.parseIdentNode = function() {
(this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {
this.context.pop();
}
+ this.type = types$1.name;
} else {
this.unexpected();
}
@@ -5908,7 +5921,7 @@ pp.readWord = function() {
// [walk]: util/walk.js
-var version = "8.10.0";
+var version = "8.11.3";
Parser.acorn = {
Parser: Parser,
@@ -5933,11 +5946,10 @@ Parser.acorn = {
};
// The main exported interface (under `self.acorn` when in the
-// browser) is a `parse` function that takes a code string and
-// returns an abstract syntax tree as specified by [Mozilla parser
-// API][api].
+// browser) is a `parse` function that takes a code string and returns
+// an abstract syntax tree as specified by the [ESTree spec][estree].
//
-// [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
+// [estree]: https://github.com/estree/estree
function parse(input, options) {
return Parser.parse(input, options)
diff --git a/deps/acorn/acorn/package.json b/deps/acorn/acorn/package.json
index 4243aa3542deb3..1b8dc76afc3cf5 100644
--- a/deps/acorn/acorn/package.json
+++ b/deps/acorn/acorn/package.json
@@ -16,7 +16,7 @@
],
"./package.json": "./package.json"
},
- "version": "8.10.0",
+ "version": "8.11.3",
"engines": {
"node": ">=0.4.0"
},
diff --git a/deps/ada/ada.cpp b/deps/ada/ada.cpp
index 9641cce39cda12..bff36abb835760 100644
--- a/deps/ada/ada.cpp
+++ b/deps/ada/ada.cpp
@@ -1,4 +1,4 @@
-/* auto-generated on 2024-01-29 13:13:24 -0500. Do not edit! */
+/* auto-generated on 2024-04-11 16:39:11 -0400. Do not edit! */
/* begin file src/ada.cpp */
#include "ada.h"
/* begin file src/checkers.cpp */
@@ -11585,7 +11585,7 @@ ada_really_inline bool url::parse_scheme(const std::string_view input) {
}
}
} else { // slow path
- std::string _buffer = std::string(input);
+ std::string _buffer(input);
// Next function is only valid if the input is ASCII and returns false
// otherwise, but it seems that we always have ascii content so we do not
// need to check the return value.
@@ -13227,7 +13227,7 @@ template
}
}
} else { // slow path
- std::string _buffer = std::string(input);
+ std::string _buffer(input);
// Next function is only valid if the input is ASCII and returns false
// otherwise, but it seems that we always have ascii content so we do not
// need to check the return value.
@@ -13683,7 +13683,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) {
return false;
}
- std::string previous_host = std::string(get_hostname());
+ std::string previous_host(get_hostname());
uint32_t previous_port = components.port;
size_t host_end_pos = input.find('#');
@@ -14983,7 +14983,7 @@ bool ada_can_parse(const char* input, size_t length) noexcept {
bool ada_can_parse_with_base(const char* input, size_t input_length,
const char* base, size_t base_length) noexcept {
- auto base_view = std::string_view(base, base_length);
+ std::string_view base_view(base, base_length);
return ada::can_parse(std::string_view(input, input_length), &base_view);
}
@@ -15388,14 +15388,18 @@ ada_owned_string ada_search_params_to_string(ada_url_search_params result) {
size_t ada_search_params_size(ada_url_search_params result) {
ada::result& r =
*(ada::result*)result;
- if (!r) return 0;
+ if (!r) {
+ return 0;
+ }
return r->size();
}
void ada_search_params_sort(ada_url_search_params result) {
ada::result& r =
*(ada::result*)result;
- if (r) r->sort();
+ if (r) {
+ r->sort();
+ }
}
void ada_search_params_append(ada_url_search_params result, const char* key,
@@ -15444,7 +15448,9 @@ bool ada_search_params_has(ada_url_search_params result, const char* key,
size_t key_length) {
ada::result& r =
*(ada::result*)result;
- if (!r) return false;
+ if (!r) {
+ return false;
+ }
return r->has(std::string_view(key, key_length));
}
@@ -15453,7 +15459,9 @@ bool ada_search_params_has_value(ada_url_search_params result, const char* key,
size_t value_length) {
ada::result& r =
*(ada::result*)result;
- if (!r) return false;
+ if (!r) {
+ return false;
+ }
return r->has(std::string_view(key, key_length),
std::string_view(value, value_length));
}
@@ -15462,9 +15470,13 @@ ada_string ada_search_params_get(ada_url_search_params result, const char* key,
size_t key_length) {
ada::result& r =
*(ada::result*)result;
- if (!r) return ada_string_create(NULL, 0);
+ if (!r) {
+ return ada_string_create(NULL, 0);
+ }
auto found = r->get(std::string_view(key, key_length));
- if (!found.has_value()) return ada_string_create(NULL, 0);
+ if (!found.has_value()) {
+ return ada_string_create(NULL, 0);
+ }
return ada_string_create(found->data(), found->length());
}
@@ -15522,14 +15534,18 @@ void ada_free_strings(ada_strings result) {
size_t ada_strings_size(ada_strings result) {
ada::result>* r =
(ada::result>*)result;
- if (!r) return 0;
+ if (!r) {
+ return 0;
+ }
return (*r)->size();
}
ada_string ada_strings_get(ada_strings result, size_t index) {
ada::result>* r =
(ada::result>*)result;
- if (!r) return ada_string_create(NULL, 0);
+ if (!r) {
+ return ada_string_create(NULL, 0);
+ }
std::string_view view = (*r)->at(index);
return ada_string_create(view.data(), view.length());
}
@@ -15544,9 +15560,13 @@ ada_string ada_search_params_keys_iter_next(
ada_url_search_params_keys_iter result) {
ada::result* r =
(ada::result*)result;
- if (!r) return ada_string_create(NULL, 0);
+ if (!r) {
+ return ada_string_create(NULL, 0);
+ }
auto next = (*r)->next();
- if (!next.has_value()) return ada_string_create(NULL, 0);
+ if (!next.has_value()) {
+ return ada_string_create(NULL, 0);
+ }
return ada_string_create(next->data(), next->length());
}
@@ -15554,7 +15574,9 @@ bool ada_search_params_keys_iter_has_next(
ada_url_search_params_keys_iter result) {
ada::result* r =
(ada::result*)result;
- if (!r) return false;
+ if (!r) {
+ return false;
+ }
return (*r)->has_next();
}
@@ -15569,9 +15591,13 @@ ada_string ada_search_params_values_iter_next(
ada_url_search_params_values_iter result) {
ada::result* r =
(ada::result*)result;
- if (!r) return ada_string_create(NULL, 0);
+ if (!r) {
+ return ada_string_create(NULL, 0);
+ }
auto next = (*r)->next();
- if (!next.has_value()) return ada_string_create(NULL, 0);
+ if (!next.has_value()) {
+ return ada_string_create(NULL, 0);
+ }
return ada_string_create(next->data(), next->length());
}
@@ -15579,7 +15605,9 @@ bool ada_search_params_values_iter_has_next(
ada_url_search_params_values_iter result) {
ada::result* r =
(ada::result*)result;
- if (!r) return false;
+ if (!r) {
+ return false;
+ }
return (*r)->has_next();
}
@@ -15596,8 +15624,9 @@ ada_string_pair ada_search_params_entries_iter_next(
(ada::result*)result;
if (!r) return {ada_string_create(NULL, 0), ada_string_create(NULL, 0)};
auto next = (*r)->next();
- if (!next.has_value())
+ if (!next.has_value()) {
return {ada_string_create(NULL, 0), ada_string_create(NULL, 0)};
+ }
return ada_string_pair{
ada_string_create(next->first.data(), next->first.length()),
ada_string_create(next->second.data(), next->second.length())};
@@ -15607,7 +15636,9 @@ bool ada_search_params_entries_iter_has_next(
ada_url_search_params_entries_iter result) {
ada::result* r =
(ada::result*)result;
- if (!r) return false;
+ if (!r) {
+ return false;
+ }
return (*r)->has_next();
}
diff --git a/deps/ada/ada.h b/deps/ada/ada.h
index 03a22534d3f87c..b9e000b841d1ed 100644
--- a/deps/ada/ada.h
+++ b/deps/ada/ada.h
@@ -1,4 +1,4 @@
-/* auto-generated on 2024-01-29 13:13:24 -0500. Do not edit! */
+/* auto-generated on 2024-04-11 16:39:11 -0400. Do not edit! */
/* begin file include/ada.h */
/**
* @file ada.h
@@ -461,9 +461,11 @@ namespace ada {
#ifdef ADA_VISUAL_STUDIO
#define ADA_ASSUME(COND) __assume(COND)
#else
-#define ADA_ASSUME(COND) \
- do { \
- if (!(COND)) __builtin_unreachable(); \
+#define ADA_ASSUME(COND) \
+ do { \
+ if (!(COND)) { \
+ __builtin_unreachable(); \
+ } \
} while (0)
#endif
@@ -482,6 +484,9 @@ namespace ada {
#include
/**
+ * These functions are not part of our public API and may
+ * change at any time.
+ * @private
* @namespace ada::character_sets
* @brief Includes the definitions for unicode character sets.
*/
@@ -492,6 +497,11 @@ ada_really_inline bool bit_at(const uint8_t a[], uint8_t i);
#endif // ADA_CHARACTER_SETS_H
/* end file include/ada/character_sets.h */
+/**
+ * These functions are not part of our public API and may
+ * change at any time.
+ * @private
+ */
namespace ada::character_sets {
constexpr char hex[1024] =
@@ -936,19 +946,19 @@ constexpr uint8_t WWW_FORM_URLENCODED_PERCENT_ENCODE[32] = {
// 20 21 22 23 24 25 26 27
0x00 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
// 28 29 2A 2B 2C 2D 2E 2F
- 0x01 | 0x02 | 0x00 | 0x08 | 0x10 | 0x00 | 0x00 | 0x00,
+ 0x01 | 0x02 | 0x00 | 0x08 | 0x10 | 0x00 | 0x00 | 0x80,
// 30 31 32 33 34 35 36 37
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
// 38 39 3A 3B 3C 3D 3E 3F
- 0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x80,
+ 0x00 | 0x00 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
// 40 41 42 43 44 45 46 47
- 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
+ 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
// 48 49 4A 4B 4C 4D 4E 4F
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
// 50 51 52 53 54 55 56 57
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
// 58 59 5A 5B 5C 5D 5E 5F
- 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
+ 0x00 | 0x00 | 0x00 | 0x08 | 0x00 | 0x20 | 0x40 | 0x00,
// 60 61 62 63 64 65 66 67
0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
// 68 69 6A 6B 6C 6D 6E 6F
@@ -956,7 +966,7 @@ constexpr uint8_t WWW_FORM_URLENCODED_PERCENT_ENCODE[32] = {
// 70 71 72 73 74 75 76 77
0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00,
// 78 79 7A 7B 7C 7D 7E 7F
- 0x00 | 0x00 | 0x00 | 0x08 | 0x00 | 0x20 | 0x40 | 0x80,
+ 0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
// 80 81 82 83 84 85 86 87
0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80,
// 88 89 8A 8B 8C 8D 8E 8F
@@ -1064,7 +1074,7 @@ ada_really_inline bool begins_with(std::string_view view,
} // namespace ada::checkers
-#endif // ADA_CHECKERS_H
+#endif // ADA_CHECKERS_INL_H
/* end file include/ada/checkers-inl.h */
/* begin file include/ada/log.h */
/**
@@ -1540,6 +1550,9 @@ struct url_base {
#include
/**
+ * These functions are not part of our public API and may
+ * change at any time.
+ *
* @private
* @namespace ada::helpers
* @brief Includes the definitions for helper functions
@@ -1702,6 +1715,7 @@ inline void inner_concat(std::string& buffer, T t, Args... args) {
}
/**
+ * @private
* Concatenate the arguments and return a string.
* @returns a string
*/
@@ -1713,6 +1727,7 @@ std::string concat(Args... args) {
}
/**
+ * @private
* @return Number of leading zeroes.
*/
inline int leading_zeroes(uint32_t input_num) noexcept {
@@ -1726,6 +1741,7 @@ inline int leading_zeroes(uint32_t input_num) noexcept {
}
/**
+ * @private
* Counts the number of decimal digits necessary to represent x.
* faster than std::to_string(x).size().
* @return digit count
@@ -4335,6 +4351,30 @@ constexpr std::string_view is_special_list[] = {"http", " ", "https", "ws",
constexpr uint16_t special_ports[] = {80, 0, 443, 80, 21, 443, 0, 0};
} // namespace details
+/****
+ * @private
+ * In is_special, get_scheme_type, and get_special_port, we
+ * use a standard hashing technique to find the index of the scheme in
+ * the is_special_list. The hashing technique is based on the size of
+ * the scheme and the first character of the scheme. It ensures that we
+ * do at most one string comparison per call. If the protocol is
+ * predictible (e.g., it is always "http"), we can get a better average
+ * performance by using a simpler approach where we loop and compare
+ * scheme with all possible protocols starting with the most likely
+ * protocol. Doing multiple comparisons may have a poor worst case
+ * performance, however. In this instance, we choose a potentially
+ * slightly lower best-case performance for a better worst-case
+ * performance. We can revisit this choice at any time.
+ *
+ * Reference:
+ * Schmidt, Douglas C. "Gperf: A perfect hash function generator."
+ * More C++ gems 17 (2000).
+ *
+ * Reference: https://en.wikipedia.org/wiki/Perfect_hash_function
+ *
+ * Reference: https://github.com/ada-url/ada/issues/617
+ ****/
+
ada_really_inline constexpr bool is_special(std::string_view scheme) {
if (scheme.empty()) {
return false;
@@ -4434,12 +4474,17 @@ std::string ipv4(uint64_t address) noexcept;
#include
/**
+ * Unicode operations. These functions are not part of our public API and may
+ * change at any time.
+ *
+ * @private
* @namespace ada::unicode
* @brief Includes the definitions for unicode operations
*/
namespace ada::unicode {
/**
+ * @private
* We receive a UTF-8 string representing a domain name.
* If the string is percent encoded, we apply percent decoding.
*
@@ -4483,11 +4528,13 @@ bool to_ascii(std::optional& out, std::string_view plain,
size_t first_percent);
/**
+ * @private
* @see https://www.unicode.org/reports/tr46/#ToUnicode
*/
std::string to_unicode(std::string_view input);
/**
+ * @private
* Checks if the input has tab or newline characters.
*
* @attention The has_tabs_or_newline function is a bottleneck and it is simple
@@ -4497,12 +4544,14 @@ ada_really_inline bool has_tabs_or_newline(
std::string_view user_input) noexcept;
/**
+ * @private
* Checks if the input is a forbidden host code point.
* @see https://url.spec.whatwg.org/#forbidden-host-code-point
*/
ada_really_inline constexpr bool is_forbidden_host_code_point(char c) noexcept;
/**
+ * @private
* Checks if the input contains a forbidden domain code point.
* @see https://url.spec.whatwg.org/#forbidden-domain-code-point
*/
@@ -4510,6 +4559,7 @@ ada_really_inline constexpr bool contains_forbidden_domain_code_point(
const char* input, size_t length) noexcept;
/**
+ * @private
* Checks if the input contains a forbidden domain code point in which case
* the first bit is set to 1. If the input contains an upper case ASCII letter,
* then the second bit is set to 1.
@@ -4520,6 +4570,7 @@ contains_forbidden_domain_code_point_or_upper(const char* input,
size_t length) noexcept;
/**
+ * @private
* Checks if the input is a forbidden domain code point.
* @see https://url.spec.whatwg.org/#forbidden-domain-code-point
*/
@@ -4527,11 +4578,13 @@ ada_really_inline constexpr bool is_forbidden_domain_code_point(
char c) noexcept;
/**
+ * @private
* Checks if the input is alphanumeric, '+', '-' or '.'
*/
ada_really_inline constexpr bool is_alnum_plus(char c) noexcept;
/**
+ * @private
* @details An ASCII hex digit is an ASCII upper hex digit or ASCII lower hex
* digit. An ASCII upper hex digit is an ASCII digit or a code point in the
* range U+0041 (A) to U+0046 (F), inclusive. An ASCII lower hex digit is an
@@ -4540,6 +4593,7 @@ ada_really_inline constexpr bool is_alnum_plus(char c) noexcept;
ada_really_inline constexpr bool is_ascii_hex_digit(char c) noexcept;
/**
+ * @private
* Checks if the input is a C0 control or space character.
*
* @details A C0 control or space is a C0 control or U+0020 SPACE.
@@ -4549,6 +4603,7 @@ ada_really_inline constexpr bool is_ascii_hex_digit(char c) noexcept;
ada_really_inline constexpr bool is_c0_control_or_space(char c) noexcept;
/**
+ * @private
* Checks if the input is a ASCII tab or newline character.
*
* @details An ASCII tab or newline is U+0009 TAB, U+000A LF, or U+000D CR.
@@ -4556,6 +4611,7 @@ ada_really_inline constexpr bool is_c0_control_or_space(char c) noexcept;
ada_really_inline constexpr bool is_ascii_tab_or_newline(char c) noexcept;
/**
+ * @private
* @details A double-dot path segment must be ".." or an ASCII case-insensitive
* match for ".%2e", "%2e.", or "%2e%2e".
*/
@@ -4563,6 +4619,7 @@ ada_really_inline ada_constexpr bool is_double_dot_path_segment(
std::string_view input) noexcept;
/**
+ * @private
* @details A single-dot path segment must be "." or an ASCII case-insensitive
* match for "%2e".
*/
@@ -4570,17 +4627,20 @@ ada_really_inline constexpr bool is_single_dot_path_segment(
std::string_view input) noexcept;
/**
+ * @private
* @details ipv4 character might contain 0-9 or a-f character ranges.
*/
ada_really_inline constexpr bool is_lowercase_hex(char c) noexcept;
/**
+ * @private
* @details Convert hex to binary. Caller is responsible to ensure that
* the parameter is an hexadecimal digit (0-9, A-F, a-f).
*/
ada_really_inline unsigned constexpr convert_hex_to_binary(char c) noexcept;
/**
+ * @private
* first_percent should be = input.find('%')
*
* @todo It would be faster as noexcept maybe, but it could be unsafe since.
@@ -4591,12 +4651,14 @@ ada_really_inline unsigned constexpr convert_hex_to_binary(char c) noexcept;
std::string percent_decode(std::string_view input, size_t first_percent);
/**
+ * @private
* Returns a percent-encoding string whether percent encoding was needed or not.
* @see https://github.com/nodejs/node/blob/main/src/node_url.cc#L226
*/
std::string percent_encode(std::string_view input,
const uint8_t character_set[]);
/**
+ * @private
* Returns a percent-encoded string version of input, while starting the percent
* encoding at the provided index.
* @see https://github.com/nodejs/node/blob/main/src/node_url.cc#L226
@@ -4604,6 +4666,7 @@ std::string percent_encode(std::string_view input,
std::string percent_encode(std::string_view input,
const uint8_t character_set[], size_t index);
/**
+ * @private
* Returns true if percent encoding was needed, in which case, we store
* the percent-encoded content in 'out'. If the boolean 'append' is set to
* true, the content is appended to 'out'.
@@ -4614,12 +4677,14 @@ template
bool percent_encode(std::string_view input, const uint8_t character_set[],
std::string& out);
/**
+ * @private
* Returns the index at which percent encoding should start, or (equivalently),
* the length of the prefix that does not require percent encoding.
*/
ada_really_inline size_t percent_encode_index(std::string_view input,
const uint8_t character_set[]);
/**
+ * @private
* Lowers the string in-place, assuming that the content is ASCII.
* Return true if the content was ASCII.
*/
@@ -4957,12 +5022,16 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u);
#include
/**
+ * These functions are not part of our public API and may
+ * change at any time.
+ * @private
* @namespace ada::checkers
* @brief Includes the definitions for validation functions
*/
namespace ada::checkers {
/**
+ * @private
* Assuming that x is an ASCII letter, this function returns the lower case
* equivalent.
* @details More likely to be inlined by the compiler and constexpr.
@@ -4970,6 +5039,7 @@ namespace ada::checkers {
constexpr char to_lower(char x) noexcept;
/**
+ * @private
* Returns true if the character is an ASCII letter. Equivalent to std::isalpha
* but more likely to be inlined by the compiler.
*
@@ -4978,6 +5048,7 @@ constexpr char to_lower(char x) noexcept;
constexpr bool is_alpha(char x) noexcept;
/**
+ * @private
* Check whether a string starts with 0x or 0X. The function is only
* safe if input.size() >=2.
*
@@ -4985,17 +5056,20 @@ constexpr bool is_alpha(char x) noexcept;
*/
inline bool has_hex_prefix_unsafe(std::string_view input);
/**
+ * @private
* Check whether a string starts with 0x or 0X.
*/
inline bool has_hex_prefix(std::string_view input);
/**
+ * @private
* Check whether x is an ASCII digit. More likely to be inlined than
* std::isdigit.
*/
constexpr bool is_digit(char x) noexcept;
/**
+ * @private
* @details A string starts with a Windows drive letter if all of the following
* are true:
*
@@ -5009,6 +5083,7 @@ constexpr bool is_digit(char x) noexcept;
inline constexpr bool is_windows_drive_letter(std::string_view input) noexcept;
/**
+ * @private
* @details A normalized Windows drive letter is a Windows drive letter of which
* the second code point is U+003A (:).
*/
@@ -5016,12 +5091,14 @@ inline constexpr bool is_normalized_windows_drive_letter(
std::string_view input) noexcept;
/**
+ * @private
* @warning Will be removed when Ada requires C++20.
*/
ada_really_inline bool begins_with(std::string_view view,
std::string_view prefix);
/**
+ * @private
* Returns true if an input is an ipv4 address. It is assumed that the string
* does not contain uppercase ASCII characters (the input should have been
* lowered cased before calling this function) and is not empty.
@@ -5029,6 +5106,7 @@ ada_really_inline bool begins_with(std::string_view view,
ada_really_inline ada_constexpr bool is_ipv4(std::string_view view) noexcept;
/**
+ * @private
* Returns a bitset. If the first bit is set, then at least one character needs
* percent encoding. If the second bit is set, a \\ is found. If the third bit
* is set then we have a dot. If the fourth bit is set, then we have a percent
@@ -5038,6 +5116,7 @@ ada_really_inline constexpr uint8_t path_signature(
std::string_view input) noexcept;
/**
+ * @private
* Returns true if the length of the domain name and its labels are according to
* the specifications. The length of the domain must be 255 octets (253
* characters not including the last 2 which are the empty label reserved at the
@@ -5589,7 +5668,7 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u) {
if (query.has_value()) {
out.search_start = uint32_t(running_index);
running_index += get_search().size();
- if (get_search().size() == 0) {
+ if (get_search().empty()) {
running_index++;
}
}
@@ -5751,6 +5830,10 @@ ada_really_inline size_t url::parse_port(std::string_view view,
#include
/**
+ * Unicode operations. These functions are not part of our public API and may
+ * change at any time.
+ *
+ * private
* @namespace ada::unicode
* @brief Includes the declarations for unicode operations
*/
@@ -6056,7 +6139,7 @@ inline void url_aggregator::append_base_pathname(const std::string_view input) {
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
#if ADA_DEVELOPMENT_CHECKS
// computing the expected password.
- std::string path_expected = std::string(get_pathname());
+ std::string path_expected(get_pathname());
path_expected.append(input);
#endif // ADA_DEVELOPMENT_CHECKS
uint32_t ending_index = uint32_t(buffer.size());
@@ -6126,7 +6209,7 @@ inline void url_aggregator::append_base_username(const std::string_view input) {
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
#if ADA_DEVELOPMENT_CHECKS
// computing the expected password.
- std::string username_expected = std::string(get_username());
+ std::string username_expected(get_username());
username_expected.append(input);
#endif // ADA_DEVELOPMENT_CHECKS
add_authority_slashes_if_needed();
@@ -6156,7 +6239,7 @@ inline void url_aggregator::append_base_username(const std::string_view input) {
components.hash_start += difference;
}
#if ADA_DEVELOPMENT_CHECKS
- std::string username_after = std::string(get_username());
+ std::string username_after(get_username());
ADA_ASSERT_EQUAL(
username_expected, username_after,
"append_base_username problem after inserting " + std::string(input));
@@ -6282,7 +6365,7 @@ inline void url_aggregator::append_base_password(const std::string_view input) {
components.hash_start += difference;
}
#if ADA_DEVELOPMENT_CHECKS
- std::string password_after = std::string(get_password());
+ std::string password_after(get_password());
ADA_ASSERT_EQUAL(
password_expected, password_after,
"append_base_password problem after inserting " + std::string(input));
@@ -6769,7 +6852,7 @@ struct url_search_params {
/**
* @see https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior
*/
- inline std::string to_string();
+ inline std::string to_string() const;
/**
* Returns a simple JS-style iterator over all of the keys in this
@@ -6886,12 +6969,12 @@ inline void url_search_params::initialize(std::string_view input) {
auto equal = current.find('=');
if (equal == std::string_view::npos) {
- auto name = std::string(current);
+ std::string name(current);
std::replace(name.begin(), name.end(), '+', ' ');
params.emplace_back(unicode::percent_decode(name, name.find('%')), "");
} else {
- auto name = std::string(current.substr(0, equal));
- auto value = std::string(current.substr(equal + 1));
+ std::string name(current.substr(0, equal));
+ std::string value(current.substr(equal + 1));
std::replace(name.begin(), name.end(), '+', ' ');
std::replace(value.begin(), value.end(), '+', ' ');
@@ -6964,7 +7047,7 @@ inline bool url_search_params::has(std::string_view key,
return entry != params.end();
}
-inline std::string url_search_params::to_string() {
+inline std::string url_search_params::to_string() const {
auto character_set = ada::character_sets::WWW_FORM_URLENCODED_PERCENT_ENCODE;
std::string out{};
for (size_t i = 0; i < params.size(); i++) {
@@ -7049,20 +7132,26 @@ inline bool url_search_params_iter::has_next() {
template <>
inline std::optional url_search_params_keys_iter::next() {
- if (!has_next()) return std::nullopt;
+ if (!has_next()) {
+ return std::nullopt;
+ }
return params.params[pos++].first;
}
template <>
inline std::optional url_search_params_values_iter::next() {
- if (!has_next()) return std::nullopt;
+ if (!has_next()) {
+ return std::nullopt;
+ }
return params.params[pos++].second;
}
template <>
inline std::optional
url_search_params_entries_iter::next() {
- if (!has_next()) return std::nullopt;
+ if (!has_next()) {
+ return std::nullopt;
+ }
return params.params[pos++];
}
@@ -7080,14 +7169,14 @@ url_search_params_entries_iter::next() {
#ifndef ADA_ADA_VERSION_H
#define ADA_ADA_VERSION_H
-#define ADA_VERSION "2.7.6"
+#define ADA_VERSION "2.7.8"
namespace ada {
enum {
ADA_VERSION_MAJOR = 2,
ADA_VERSION_MINOR = 7,
- ADA_VERSION_REVISION = 6,
+ ADA_VERSION_REVISION = 8,
};
} // namespace ada
diff --git a/deps/cares/CHANGES b/deps/cares/CHANGES
index 24a68a89849b67..ae56d4f24bc3d9 100644
--- a/deps/cares/CHANGES
+++ b/deps/cares/CHANGES
@@ -1,5 +1,250 @@
Changelog for the c-ares project. Generated with git2changes.pl
+Version 1.28.1 (30 Mar 2024)
+
+GitHub (30 Mar 2024)
+- [Brad House brought this change]
+
+ release prep for 1.28.1 (#739)
+
+Brad House (30 Mar 2024)
+- ares_search() and ares_getaddrinfo() resolution fails if no search domains
+
+ Due to an error in creating the list of domains to search, if no search
+ domains were configured, resolution would fail.
+
+ Fixes Issue: #737
+ Fix By: Brad House (@bradh352)
+
+- typo
+
+Version 1.28.0 (28 Mar 2024)
+
+GitHub (28 Mar 2024)
+- [Brad House brought this change]
+
+ Allow configuration value for NDots to be zero (#735)
+
+ As per Issue #734 some people use `ndots:0` in their configuration which
+ is allowed by the system resolver but not by c-ares. Add support for
+ `ndots:0` and add a test case to validate this behavior.
+
+ Fixes Issue: #734
+ Fix By: Brad House (@bradh352)
+
+Brad House (27 Mar 2024)
+- typo
+
+GitHub (27 Mar 2024)
+- [Brad House brought this change]
+
+ 1.28.0 release prep (#733)
+
+Brad House (27 Mar 2024)
+- CMake: don't overwrite global required libraries/definitions/includes
+
+ When chain building c-ares, global settings were being unset which
+ could lead to build problems.
+
+ Fixes Issue: #729
+ Fix By: Brad House (@bradh352)
+
+- remove tests that have been disabled forever
+
+- clang-format
+
+- ares_search_dnsrec() takes a const
+
+- sonarcloud: clean up some minor codesmells
+
+GitHub (26 Mar 2024)
+- [Brad House brought this change]
+
+ mark deprecated functions as such (#732)
+
+ Multiple functions have been deprecated over the years, annotate them
+ with attribute deprecated.
+
+ When possible show a message about their replacements.
+
+ This is a continuation/completion of PR #706
+
+ Fix By: Cristian Rodríguez (@crrodriguez)
+
+Brad House (26 Mar 2024)
+- silence clang static analyzer
+
+- silence coverity
+
+- coverity: fix mostly bogus warnings
+
+- fix missing doc
+
+GitHub (25 Mar 2024)
+- [Brad House brought this change]
+
+ Rework internals to pass around `ares_dns_record_t` instead of binary data (#730)
+
+ c-ares has historically passed around raw dns packets in binary form.
+ Now that we have a new parser, and messages are already parsed
+ internally, lets pass around that parsed message rather than requiring
+ multiple parse attempts on the same message. Also add a new
+ `ares_send_dnsrec()` and `ares_query_dnsrec()` similar to
+ `ares_search_dnsrec()` added with PR #719 that can return the pointer to
+ the `ares_dns_record_t` to the caller enqueuing queries and rework
+ `ares_search_dnsrec()` to use `ares_send_dnsrec()` internally.
+
+ Fix By: Brad House (@bradh352)
+
+Brad House (23 Mar 2024)
+- tests: mockserver is local, shorten timeouts to make test cases run faster to use less CI resources
+
+- appveyor: disable UWP builds until MSVC version is updated in base image
+
+GitHub (21 Mar 2024)
+- [Faraz brought this change]
+
+ Include netinet6/in6.h (#728)
+
+ On some platforms, "netinet6/in6.h" is not included by "netinet/in.h"
+ and needs to be included separately.
+
+ Fix By: Faraz (@farazrbx)
+
+- [Oliver Welsh brought this change]
+
+ Add function ares_search_dnrec() to search for records using the new DNS record parser (#719)
+
+ This PR adds a new function `ares_search_dnsrec()` to search for records
+ using the new DNS record parser.
+
+ The function takes an arbitrary DNS record object to search (that must
+ represent a query for a single name). The function takes a new callback
+ type, `ares_callback_dnsrec`, that is invoked with a parsed DNS record
+ object rather than the raw buffer(+length).
+
+ The original motivation for this change is to provide support for
+ [draft-kaplan-enum-sip-routing-04](https://datatracker.ietf.org/doc/html/draft-kaplan-enum-sip-routing-04);
+ when routing phone calls using an ENUM server, it can be useful to
+ include identifying source information in an OPT RR options value, to
+ help select the appropriate route for the call. The new function allows
+ for more customisable searches like this.
+
+ **Summary of code changes**
+
+ A new function `ares_search_dnsrec()` has been added and exposed.
+ Moreover, the entire `ares_search_int()` internal code flow has been
+ refactored to use parsed DNS record objects and the new DNS record
+ parser. The DNS record object is passed through the `search_query`
+ structure by encoding/decoding to/from a buffer (if multiple search
+ domains are used). A helper function `ares_dns_write_query_altname()` is
+ used to re-write the DNS record object with a new query name (used to
+ append search domains).
+
+ `ares_search()` is now a wrapper around the new internal code, where the
+ DNS record object is created based on the name, class and type
+ parameters.
+
+ The new function uses a new callback type, `ares_callback_dnsrec`. This
+ is invoked with a parsed DNS record object. For now, we convert from
+ `ares_callback` to this new type using `ares__dnsrec_convert_cb()`.
+
+ Some functions that are common to both `ares_query()` and
+ `ares_search()` have been refactored using the new DNS record parser.
+ See `ares_dns_record_create_query()` and
+ `ares_dns_query_reply_tostatus()`.
+
+ **Testing**
+
+ A new FV has been added to test the new function, which searches for a
+ DNS record containing an OPT RR with custom options value.
+
+ As part of this, I needed to enhance the mock DNS server to expect
+ request text (and assert that it matches actual request text). This is
+ because the FV needs to check that the request contains the correct OPT
+ RR.
+
+ **Documentation**
+
+ The man page docs have been updated to describe the new feature.
+
+ **Futures**
+
+ In the future, a new variant of `ares_send()` could be introduced in the
+ same vein (`ares_send_dnsrec()`). This could be used by
+ `ares_search_dnsrec()`. Moreover, we could migrate internal code to use
+ `ares_callback_dnsrec` as the default callback.
+
+ This will help to make the new DNS record parser the norm in C-Ares.
+
+ ---------
+
+ Co-authored-by: Oliver Welsh (@oliverwelsh)
+
+- [Brad House brought this change]
+
+ Replace configuration file parsers with memory-safe parser (#725)
+
+ Rewrite configuration parsers using new memory safe parsing functions.
+ After CVE-2024-25629 its obvious that we need to prioritize again on
+ getting all the hand written parsers with direct pointer manipulation
+ replaced. They're just not safe and hard to audit. It was yet another
+ example of 20+yr old code having a memory safety issue just now coming
+ to light.
+
+ Though these parsers are definitely less efficient, they're written with
+ memory safety in mind, and any performance difference is going to be
+ meaningless for something that only happens once a while.
+
+ Fix By: Brad House (@bradh352)
+
+Brad House (12 Mar 2024)
+- skip ubsan/asan on debian arm64 due to the compiler getting killed
+
+- ares_init potential memory leak
+
+ If initializing using default settings fails, there may be a memory leak of
+ search domains that were set by system configuration.
+
+ Fixes Issue: #724
+ Fix By: Brad House (@bradh352)
+
+GitHub (12 Mar 2024)
+- [Faraz Fallahi brought this change]
+
+ simple implementation for isascii where stdlib isascii is not available (#721)
+
+ Some platforms don't have the isascii() function. Implement as a macro.
+
+ Fix By: Faraz Fallahi (@fffaraz)
+
+Brad House (11 Mar 2024)
+- Doxygen: fix typos
+
+ Fix reported typos in doxygen-style comments.
+
+ Fixes Issue: #722
+ Credit: @dzalyalov88
+
+- CI: update freebsd image
+
+- CMake: Fix Chain building if CMAKE runtime paths not set
+
+ This fixes issues created by #708
+
+ Fix By: Brad House (@bradh352)
+
+- silence benign warnings
+
+- Remove acountry completely from code, including manpage
+
+ Since acountry cannot be restored due to nerd.dk being decommissioned,
+ we should completely remove the manpage and source. This also
+ will resolve issue #718.
+
+ Fixes Issue: #718
+ Fix By: Brad House (@bradh352)
+
Version 1.27.0 (22 Feb 2024)
GitHub (22 Feb 2024)
@@ -6100,127 +6345,3 @@ Yang Tse (10 Mar 2013)
Daniel Stenberg (9 Mar 2013)
- ares.h: there is no ares_free_soa function
-
-Yang Tse (9 Mar 2013)
-- Makefile.am: empty AM_LDFLAGS definition for automake 1.7 compatibility
-
-- ares_inet_ntop.3: s/socklen_t/ares_socklen_t
-
-- configure: use XC_LIBTOOL for portability across libtool versions
-
-- xc-lt-iface.m4: provide XC_LIBTOOL macro
-
-- Makefile.am: use AM_CPPFLAGS instead of INCLUDES
-
-- inet_ntop.c: s/socklen_t/ares_socklen_t
-
-- inet_ntop.c: s/socklen_t/ares_socklen_t for portability
-
-Daniel Stenberg (19 Feb 2013)
-- ares.h: s/socklen_t/ares_socklen_t for portability
-
-- ares_inet_ntop.3: 4th argument is socklen_t!
-
-- spell inet correctly!
-
-- ares_inet_pton/ntop: cleanup
-
- Make sure that the symbols are always exported and present in c-ares.
-
- Make the headers prefixed with 'ares'.
-
- Removed the inet_ntop.h version as it no longer features any content.
-
-- ares_inet_ntop/ares_inet_pton: added man pages
-
-Yang Tse (15 Feb 2013)
-- [Gisle Vanem brought this change]
-
- curl_setup_once.h: definition of HAVE_CLOSE_S defines sclose() to close_s()
-
-- [Gisle Vanem brought this change]
-
- config-dos.h: define HAVE_CLOSE_S for MSDOS/Watt-32
-
-- [Gisle Vanem brought this change]
-
- config-dos.h: define strerror() to strerror_s_() for High-C
-
-Daniel Stenberg (13 Feb 2013)
-- ares_get_datatype: removed unused function
-
- it was also wrongly named as internal functions require two underscores
-
-- ares__bitncmp: use two underscores for private functions
-
- It used a single one previously making it look like a public one
-
-- ares__generate_new_id: moved to ares_query.c
-
- ... and ares__rc4 is turned into a local static function.
-
-- ares__swap_lists: make private and static
-
- ... since there's only one user, make it static within ares_process.c
-
-Yang Tse (13 Feb 2013)
-- Makefile.msvc: add four VS version strings
-
-Daniel Stenberg (13 Feb 2013)
-- ares_expand_name.3: clarify how to free the data
-
-Yang Tse (30 Jan 2013)
-- zz40-xc-ovr.m4: fix 'wc' detection - follow-up 2
-
- - Fix a pair of single quotes to double quotes.
-
- URL: http://curl.haxx.se/mail/lib-2013-01/0355.html
- Reported by: Tor Arntsen
-
-- zz40-xc-ovr.m4: fix 'wc' detection - follow-up
-
- - Take into account that 'wc' may return leading spaces and/or tabs.
-
- - Set initial IFS to space, tab and newline.
-
-- zz40-xc-ovr.m4: fix 'wc' detection
-
- - Take into account that 'wc' may return leading spaces.
-
- - Set internationalization behavior variables.
-
- Tor Arntsen analyzed and reported the issue.
-
- URL: http://curl.haxx.se/mail/lib-2013-01/0351.html
-
-- zz40-xc-ovr.m4: check another three basic utilities
-
-- zz40-xc-ovr.m4: 1.0 interface stabilization
-
- - Stabilization results in 4 public interface m4 macros:
- XC_CONFIGURE_PREAMBLE
- XC_CONFIGURE_PREAMBLE_VER_MAJOR
- XC_CONFIGURE_PREAMBLE_VER_MINOR
- XC_CHECK_PATH_SEPARATOR
- - Avoid one level of internal indirection
- - Update comments
- - Drop XC_OVR_ZZ40 macro
-
-- zz40-xc-ovr.m4: emit witness message in configure BODY
-
- This avoids witness message in output when running configure --help,
- while sending the message to config.log for other configure runs.
-
-- zz40-xc-ovr.m4: truly do version conditional overriding
-
- - version conditional overriding
- - catch unexpanded XC macros
- - fix double words in comments
-
-- zz40-xc-ovr.m4: fix variable assignment of subshell output bashism
-
- Tor Arntsen analyzed and reported the issue.
-
- URL: http://curl.haxx.se/mail/lib-2013-01/0306.html
-
-- zz40-xc-ovr.m4: reinstate strict AC_REQUIRE macro dependencies
diff --git a/deps/cares/CMakeLists.txt b/deps/cares/CMakeLists.txt
index e951cafd7b4068..2718ce52b73ff6 100644
--- a/deps/cares/CMakeLists.txt
+++ b/deps/cares/CMakeLists.txt
@@ -12,10 +12,10 @@ INCLUDE (CheckCSourceCompiles)
INCLUDE (CheckStructHasMember)
INCLUDE (CheckLibraryExists)
-PROJECT (c-ares LANGUAGES C VERSION "1.27.0" )
+PROJECT (c-ares LANGUAGES C VERSION "1.28.1" )
# Set this version before release
-SET (CARES_VERSION "1.27.0")
+SET (CARES_VERSION "1.28.1")
INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are wrong.
@@ -30,7 +30,7 @@ INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are w
# For example, a version of 4:0:2 would generate output such as:
# libname.so -> libname.so.2
# libname.so.2 -> libname.so.2.2.0
-SET (CARES_LIB_VERSIONINFO "14:0:12")
+SET (CARES_LIB_VERSIONINFO "15:1:13")
OPTION (CARES_STATIC "Build as a static library" OFF)
@@ -98,7 +98,7 @@ IF (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}")
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
- SET (PACKAGE_DIRECTORY ${PROJECT_BINARY_DIR}/package)
+ SET (CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
ENDIF ()
# Destinations for installing different kinds of targets (pass to install command).
@@ -113,11 +113,10 @@ SET (TARGETS_INST_DEST
# CHECK_LIBRARY_EXISTS can't be used as it will return true if the function
# is found in a different required/dependent library.
MACRO (CARES_FUNCTION_IN_LIBRARY func lib var)
-
- SET (_ORIG_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
+ SET (_ORIG_FIL_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
SET (CMAKE_REQUIRED_LIBRARIES )
CHECK_FUNCTION_EXISTS ("${func}" "_CARES_FUNC_IN_LIB_GLOBAL_${func}")
- SET (CMAKE_REQUIRED_LIBRARIES "${_ORIG_CMAKE_REQUIRED_LIBRARIES}")
+ SET (CMAKE_REQUIRED_LIBRARIES "${_ORIG_FIL_CMAKE_REQUIRED_LIBRARIES}")
IF ("${_CARES_FUNC_IN_LIB_GLOBAL_${func}}")
SET (${var} FALSE)
@@ -207,6 +206,7 @@ CHECK_INCLUDE_FILES (malloc.h HAVE_MALLOC_H)
CHECK_INCLUDE_FILES (memory.h HAVE_MEMORY_H)
CHECK_INCLUDE_FILES (netdb.h HAVE_NETDB_H)
CHECK_INCLUDE_FILES (netinet/in.h HAVE_NETINET_IN_H)
+CHECK_INCLUDE_FILES (netinet6/in6.h HAVE_NETINET6_IN6_H)
# On old MacOS SDK versions, you must include sys/socket.h before net/if.h
IF (HAVE_SYS_SOCKET_H)
CHECK_INCLUDE_FILES ("sys/socket.h;net/if.h" HAVE_NET_IF_H)
@@ -303,7 +303,11 @@ ENDIF ()
# headers, libraries, and definitions for the detection to work properly
# CMAKE_REQUIRED_DEFINITIONS, CMAKE_REQUIRED_LIBRARIES, and
# CMAKE_EXTRA_INCLUDE_FILES. When we're done with the detection, we'll
-# unset them.
+# restore them to their original values (otherwise a parent project
+# that tries to set these won't be maintained, see Issue #729)
+SET (ORIG_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEEFINITIONS})
+SET (ORIG_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
+SET (ORIG_CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES})
SET (CMAKE_REQUIRED_DEFINITIONS ${SYSFLAGS})
LIST (APPEND CMAKE_REQUIRED_LIBRARIES ${CARES_DEPENDENT_LIBS})
@@ -323,6 +327,7 @@ CARES_EXTRAINCLUDE_IFSET (HAVE_NETDB_H netdb.h)
CARES_EXTRAINCLUDE_IFSET (HAVE_NET_IF_H net/if.h)
CARES_EXTRAINCLUDE_IFSET (HAVE_IFADDRS_H ifaddrs.h)
CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_IN_H netinet/in.h)
+CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET6_IN6_H netinet6/in6.h)
CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_TCP_H netinet/tcp.h)
CARES_EXTRAINCLUDE_IFSET (HAVE_SIGNAL_H signal.h)
CARES_EXTRAINCLUDE_IFSET (HAVE_STDLIB_H stdlib.h)
@@ -458,10 +463,10 @@ CHECK_SYMBOL_EXISTS (epoll_create1 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_EPOLL)
# from libc. We need to perform a link test instead of a header/symbol test.
CHECK_FUNCTION_EXISTS (__system_property_get HAVE___SYSTEM_PROPERTY_GET)
-# Unset temporary data
-SET (CMAKE_EXTRA_INCLUDE_FILES)
-SET (CMAKE_REQUIRED_DEFINITIONS)
-SET (CMAKE_REQUIRED_LIBRARIES)
+# Restore original values (as per Issue #729)
+SET (CMAKE_REQUIRED_DEFINITIONS ${ORIG_CMAKE_REQUIRED_DEEFINITIONS})
+SET (CMAKE_REQUIRED_LIBRARIES ${ORIG_CMAKE_REQUIRED_LIBRARIES})
+SET (CMAKE_EXTRA_INCLUDE_FILES ${ORIG_CMAKE_EXTRA_INCLUDE_FILES})
################################################################################
diff --git a/deps/cares/Makefile.in b/deps/cares/Makefile.in
index d1c663d5488366..928cdc217ee6de 100644
--- a/deps/cares/Makefile.in
+++ b/deps/cares/Makefile.in
@@ -364,6 +364,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
diff --git a/deps/cares/Makefile.msvc b/deps/cares/Makefile.msvc
index c89454ec155d94..f6e8f4e71f2e6f 100644
--- a/deps/cares/Makefile.msvc
+++ b/deps/cares/Makefile.msvc
@@ -229,7 +229,7 @@ LINK_CMD_EXE_DBG = $(LINK_CMD_EXE) /debug $(PDBTYPE_CONSOLIDATE)
CARES_TARGET = $(STA_LIB_REL).lib
CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB
CARES_LFLAGS =
-SPROG_CFLAGS = /DCARES_STATICLIB
+SPROG_CFLAGS = /DCARES_STATICLIB /DCARES_NO_DEPRECATED
SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(STA_LIB_REL).lib
CARES_LINK = $(LINK_CMD_LIB)
SPROG_LINK = $(LINK_CMD_EXE_REL)
@@ -240,7 +240,7 @@ CC_CMD = $(CC_CMD_REL)
CARES_TARGET = $(STA_LIB_DBG).lib
CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB /DDEBUGBUILD
CARES_LFLAGS =
-SPROG_CFLAGS = /DCARES_STATICLIB
+SPROG_CFLAGS = /DCARES_STATICLIB /DCARES_NO_DEPRECATED
SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(STA_LIB_DBG).lib
CARES_LINK = $(LINK_CMD_LIB)
SPROG_LINK = $(LINK_CMD_EXE_DBG)
@@ -251,7 +251,7 @@ CC_CMD = $(CC_CMD_DBG)
CARES_TARGET = $(DYN_LIB_REL).dll
CARES_CFLAGS = /DCARES_BUILDING_LIBRARY
CARES_LFLAGS = /release $(EX_LIBS_REL) /implib:$(CARES_OUTDIR)\$(IMP_LIB_REL).lib $(PDB_NONE)
-SPROG_CFLAGS =
+SPROG_CFLAGS = /DCARES_NO_DEPRECATED
SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(IMP_LIB_REL).lib
CARES_LINK = $(LINK_CMD_DLL)
SPROG_LINK = $(LINK_CMD_EXE_REL)
@@ -264,7 +264,7 @@ RC_CMD = $(RC_CMD_REL)
CARES_TARGET = $(DYN_LIB_DBG).dll
CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DDEBUGBUILD
CARES_LFLAGS = /debug $(EX_LIBS_DBG) /implib:$(CARES_OUTDIR)\$(IMP_LIB_DBG).lib /pdb:$(CARES_OUTDIR)\$(DYN_LIB_DBG).pdb $(PDBTYPE_CONSOLIDATE)
-SPROG_CFLAGS =
+SPROG_CFLAGS = /DCARES_NO_DEPRECATED
SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(IMP_LIB_DBG).lib
CARES_LINK = $(LINK_CMD_DLL)
SPROG_LINK = $(LINK_CMD_EXE_DBG)
diff --git a/deps/cares/RELEASE-NOTES.md b/deps/cares/RELEASE-NOTES.md
index 0fdcbc6b968488..3a9b9dd9c35fa1 100644
--- a/deps/cares/RELEASE-NOTES.md
+++ b/deps/cares/RELEASE-NOTES.md
@@ -1,40 +1,49 @@
-## c-ares version 1.27.0 - Feb 23 2024
+## c-ares version 1.28.1 - Mar 30 2024
-This is a security, feature, and bugfix release.
+This release contains a fix for a single significant regression introduced
+in c-ares 1.28.0.
-Security:
+* `ares_search()` and `ares_getaddrinfo()` resolution fails if no search domains
+ are specified. [Issue #737](https://github.com/c-ares/c-ares/issues/737)
-* Moderate. CVE-2024-25629. Reading malformatted `/etc/resolv.conf`,
- `/etc/nsswitch.conf` or the `HOSTALIASES` file could result in a crash.
- [GHSA-mg26-v6qh-x48q](https://github.com/c-ares/c-ares/security/advisories/GHSA-mg26-v6qh-x48q)
+
+## c-ares version 1.28.0 - Mar 29 2024
+
+This is a feature and bugfix release.
Features:
-* New function `ares_queue_active_queries()` to retrieve number of in-flight
- queries. [PR #712](https://github.com/c-ares/c-ares/pull/712)
-* New function `ares_queue_wait_empty()` to wait for the number of in-flight
- queries to reach zero. [PR #710](https://github.com/c-ares/c-ares/pull/710)
-* New `ARES_FLAG_NO_DEFLT_SVR` for `ares_init_options()` to return a failure if
- no DNS servers can be found rather than attempting to use `127.0.0.1`. This
- also introduces a new ares status code of `ARES_ENOSERVER`. [PR #713](https://github.com/c-ares/c-ares/pull/713)
+* Emit warnings when deprecated c-ares functions are used. This can be
+ disabled by passing a compiler definition of `CARES_NO_DEPRECATED`. [PR #732](https://github.com/c-ares/c-ares/pull/732)
+* Add function `ares_search_dnsrec()` to search for records using the new DNS
+ record data structures. [PR #719](https://github.com/c-ares/c-ares/pull/719)
+* Rework internals to pass around `ares_dns_record_t` instead of binary data,
+ this introduces new public functions of `ares_query_dnsrec()` and
+ `ares_send_dnsrec()`. [PR #730](https://github.com/c-ares/c-ares/pull/730)
Changes:
-* EDNS Packet size should be 1232 as per DNS Flag Day. [PR #705](https://github.com/c-ares/c-ares/pull/705)
+* tests: when performing simulated queries, reduce timeouts to make tests run
+ faster
+* Replace configuration file parsers with memory-safe parser. [PR #725](https://github.com/c-ares/c-ares/pull/725)
+* Remove `acountry` completely, the manpage might still get installed otherwise. [Issue #718](https://github.com/c-ares/c-ares/pull/718)
Bugfixes:
-* Windows DNS suffix search list memory leak. [PR #711](https://github.com/c-ares/c-ares/pull/711)
-* Fix warning due to ignoring return code of `write()`. [PR #709](https://github.com/c-ares/c-ares/pull/709)
-* CMake: don't override target output locations if not top-level. [Issue #708](https://github.com/c-ares/c-ares/issues/708)
-* Fix building c-ares without thread support. [PR #700](https://github.com/c-ares/c-ares/pull/700)
+* CMake: don't overwrite global required libraries/definitions/includes which
+ could cause build errors for projects chain building c-ares. [Issue #729](https://github.com/c-ares/c-ares/issues/729)
+* On some platforms, `netinet6/in6.h` is not included by `netinet/in.h`
+ and needs to be included separately. [PR #728](https://github.com/c-ares/c-ares/pull/728)
+* Fix a potential memory leak in `ares_init()`. [Issue #724](https://github.com/c-ares/c-ares/issues/724)
+* Some platforms don't have the `isascii()` function. Implement as a macro. [PR #721](https://github.com/c-ares/c-ares/pull/721)
+* CMake: Fix Chain building if CMAKE runtime paths not set
+* NDots configuration should allow a value of zero. [PR #735](https://github.com/c-ares/c-ares/pull/735)
Thanks go to these friendly people for their efforts and contributions for this release:
-* Anthony Alayo (@anthonyalayo)
* Brad House (@bradh352)
-* Cheng Zhao (@zcbenz)
* Cristian Rodríguez (@crrodriguez)
* Daniel Stenberg (@bagder)
+* Faraz (@farazrbx)
+* Faraz Fallahi (@fffaraz)
* Oliver Welsh (@oliverwelsh)
-* Vojtěch Vobr (@vojtechvobr)
diff --git a/deps/cares/aminclude_static.am b/deps/cares/aminclude_static.am
index e3fc636c7b51a4..6fa817a8346703 100644
--- a/deps/cares/aminclude_static.am
+++ b/deps/cares/aminclude_static.am
@@ -1,6 +1,6 @@
# aminclude_static.am generated automatically by Autoconf
-# from AX_AM_MACROS_STATIC on Fri Feb 23 08:24:27 CET 2024
+# from AX_AM_MACROS_STATIC on Sat Mar 30 16:17:17 CET 2024
# Code coverage
diff --git a/deps/cares/cares.gyp b/deps/cares/cares.gyp
index e8ac0b75796e72..053cdf8c8286ad 100644
--- a/deps/cares/cares.gyp
+++ b/deps/cares/cares.gyp
@@ -26,7 +26,6 @@
'src/lib/ares__llist.c',
'src/lib/ares__llist.h',
'src/lib/ares__parse_into_addrinfo.c',
- 'src/lib/ares__read_line.c',
'src/lib/ares__slist.c',
'src/lib/ares__slist.h',
'src/lib/ares__socket.c',
@@ -74,7 +73,6 @@
'src/lib/ares_library_init.c',
'src/lib/ares_ipv6.h',
'src/lib/ares_math.c',
- 'src/lib/ares_mkquery.c',
'src/lib/ares_options.c',
'src/lib/ares_parse_a_reply.c',
'src/lib/ares_parse_aaaa_reply.c',
@@ -154,7 +152,15 @@
'type': '<(library)',
'include_dirs': [ 'include' ],
'direct_dependent_settings': {
- 'include_dirs': [ 'include' ]
+ 'include_dirs': [ 'include' ],
+ 'cflags': [ '-Wno-error=deprecated-declarations' ],
+ 'conditions': [
+ [ 'OS=="mac"', {
+ 'xcode_settings': {
+ 'OTHER_CFLAGS': [ '-Wno-error=deprecated-declarations' ]
+ }
+ }]
+ ]
},
'sources': [
'<@(cares_sources_common)',
diff --git a/deps/cares/configure b/deps/cares/configure
index ac3c7b55db0565..656164f46e3ad8 100755
--- a/deps/cares/configure
+++ b/deps/cares/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for c-ares 1.27.0.
+# Generated by GNU Autoconf 2.71 for c-ares 1.28.1.
#
# Report bugs to .
#
@@ -621,8 +621,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='c-ares'
PACKAGE_TARNAME='c-ares'
-PACKAGE_VERSION='1.27.0'
-PACKAGE_STRING='c-ares 1.27.0'
+PACKAGE_VERSION='1.28.1'
+PACKAGE_STRING='c-ares 1.28.1'
PACKAGE_BUGREPORT='c-ares mailing list: http://lists.haxx.se/listinfo/c-ares'
PACKAGE_URL=''
@@ -1420,7 +1420,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures c-ares 1.27.0 to adapt to many kinds of systems.
+\`configure' configures c-ares 1.28.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1491,7 +1491,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of c-ares 1.27.0:";;
+ short | recursive ) echo "Configuration of c-ares 1.28.1:";;
esac
cat <<\_ACEOF
@@ -1627,7 +1627,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-c-ares configure 1.27.0
+c-ares configure 1.28.1
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2251,7 +2251,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by c-ares $as_me 1.27.0, which was
+It was created by c-ares $as_me 1.28.1, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@@ -3225,7 +3225,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-CARES_VERSION_INFO="14:0:12"
+CARES_VERSION_INFO="15:1:13"
@@ -5907,7 +5907,7 @@ fi
# Define the identity of the package.
PACKAGE='c-ares'
- VERSION='1.27.0'
+ VERSION='1.28.1'
printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -21681,6 +21681,31 @@ if test "x$ac_cv_header_netinet_in_h" = xyes
then :
printf "%s\n" "#define HAVE_NETINET_IN_H 1" >>confdefs.h
+fi
+ac_fn_c_check_header_compile "$LINENO" "netinet6/in6.h" "ac_cv_header_netinet6_in6_h" "
+#ifdef HAVE_SYS_TYPES_H
+#include
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+#include
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include
+#endif
+
+
+"
+if test "x$ac_cv_header_netinet6_in6_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NETINET6_IN6_H 1" >>confdefs.h
+
fi
ac_fn_c_check_header_compile "$LINENO" "netinet/tcp.h" "ac_cv_header_netinet_tcp_h" "
#ifdef HAVE_SYS_TYPES_H
@@ -25931,7 +25956,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by c-ares $as_me 1.27.0, which was
+This file was extended by c-ares $as_me 1.28.1, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -25999,7 +26024,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-c-ares config.status 1.27.0
+c-ares config.status 1.28.1
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
diff --git a/deps/cares/configure.ac b/deps/cares/configure.ac
index 1a3ba8c3fc4c49..4d263a7f309017 100644
--- a/deps/cares/configure.ac
+++ b/deps/cares/configure.ac
@@ -2,10 +2,10 @@ dnl Copyright (C) The c-ares project and its contributors
dnl SPDX-License-Identifier: MIT
AC_PREREQ([2.69])
-AC_INIT([c-ares], [1.27.0],
+AC_INIT([c-ares], [1.28.1],
[c-ares mailing list: http://lists.haxx.se/listinfo/c-ares])
-CARES_VERSION_INFO="14:0:12"
+CARES_VERSION_INFO="15:1:13"
dnl This flag accepts an argument of the form current[:revision[:age]]. So,
dnl passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
dnl 1.
@@ -436,6 +436,7 @@ AC_CHECK_HEADERS(
netioapi.h \
netdb.h \
netinet/in.h \
+ netinet6/in6.h \
netinet/tcp.h \
net/if.h \
ifaddrs.h \
diff --git a/deps/cares/docs/Makefile.in b/deps/cares/docs/Makefile.in
index 4f5bb62409c7ab..8cb46878fa59ee 100644
--- a/deps/cares/docs/Makefile.in
+++ b/deps/cares/docs/Makefile.in
@@ -263,6 +263,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
@@ -357,18 +358,22 @@ MANPAGES = ares_cancel.3 \
ares_dns_rcode_tostr.3 \
ares_dns_record.3 \
ares_dns_record_create.3 \
+ ares_dns_record_duplicate.3 \
ares_dns_record_get_flags.3 \
ares_dns_record_get_id.3 \
ares_dns_record_get_opcode.3 \
ares_dns_record_get_rcode.3 \
ares_dns_record_destroy.3 \
ares_dns_record_query_add.3 \
+ ares_dns_record_query_set_name.3 \
+ ares_dns_record_query_set_type.3 \
ares_dns_record_query_cnt.3 \
ares_dns_record_query_get.3 \
ares_dns_record_rr_add.3 \
ares_dns_record_rr_cnt.3 \
ares_dns_record_rr_del.3 \
ares_dns_record_rr_get.3 \
+ ares_dns_record_rr_get_const.3 \
ares_dns_rec_type_fromstr.3 \
ares_dns_rec_type_t.3 \
ares_dns_rr.3 \
@@ -442,10 +447,16 @@ MANPAGES = ares_cancel.3 \
ares_parse_uri_reply.3 \
ares_process.3 \
ares_query.3 \
+ ares_query_dnsrec.3 \
+ ares_queue.3 \
+ ares_queue_active_queries.3 \
+ ares_queue_wait_empty.3 \
ares_reinit.3 \
ares_save_options.3 \
ares_search.3 \
+ ares_search_dnsrec.3 \
ares_send.3 \
+ ares_send_dnsrec.3 \
ares_set_local_dev.3 \
ares_set_local_ip4.3 \
ares_set_local_ip6.3 \
diff --git a/deps/cares/docs/Makefile.inc b/deps/cares/docs/Makefile.inc
index 3645a7fcddc58b..882bf2280446d5 100644
--- a/deps/cares/docs/Makefile.inc
+++ b/deps/cares/docs/Makefile.inc
@@ -20,18 +20,22 @@ MANPAGES = ares_cancel.3 \
ares_dns_rcode_tostr.3 \
ares_dns_record.3 \
ares_dns_record_create.3 \
+ ares_dns_record_duplicate.3 \
ares_dns_record_get_flags.3 \
ares_dns_record_get_id.3 \
ares_dns_record_get_opcode.3 \
ares_dns_record_get_rcode.3 \
ares_dns_record_destroy.3 \
ares_dns_record_query_add.3 \
+ ares_dns_record_query_set_name.3 \
+ ares_dns_record_query_set_type.3 \
ares_dns_record_query_cnt.3 \
ares_dns_record_query_get.3 \
ares_dns_record_rr_add.3 \
ares_dns_record_rr_cnt.3 \
ares_dns_record_rr_del.3 \
ares_dns_record_rr_get.3 \
+ ares_dns_record_rr_get_const.3 \
ares_dns_rec_type_fromstr.3 \
ares_dns_rec_type_t.3 \
ares_dns_rr.3 \
@@ -105,13 +109,16 @@ MANPAGES = ares_cancel.3 \
ares_parse_uri_reply.3 \
ares_process.3 \
ares_query.3 \
+ ares_query_dnsrec.3 \
ares_queue.3 \
ares_queue_active_queries.3 \
ares_queue_wait_empty.3 \
ares_reinit.3 \
ares_save_options.3 \
ares_search.3 \
+ ares_search_dnsrec.3 \
ares_send.3 \
+ ares_send_dnsrec.3 \
ares_set_local_dev.3 \
ares_set_local_ip4.3 \
ares_set_local_ip6.3 \
diff --git a/deps/cares/docs/adig.1 b/deps/cares/docs/adig.1
index 48b491b593b73c..59923790587ddd 100644
--- a/deps/cares/docs/adig.1
+++ b/deps/cares/docs/adig.1
@@ -64,4 +64,4 @@ Report bugs to the c-ares mailing list:
\fBhttps://lists.haxx.se/listinfo/c-ares\fR
.SH "SEE ALSO"
.PP
-acountry(1), ahost(1).
+ahost(1).
diff --git a/deps/cares/docs/ahost.1 b/deps/cares/docs/ahost.1
index 5feed981ab62c1..e17057273f8285 100644
--- a/deps/cares/docs/ahost.1
+++ b/deps/cares/docs/ahost.1
@@ -47,4 +47,4 @@ Report bugs to the c-ares mailing list:
\fBhttps://lists.haxx.se/listinfo/c-ares\fR
.SH "SEE ALSO"
.PP
-acountry(1), adig(1)
+adig(1)
diff --git a/deps/cares/docs/ares_dns_record.3 b/deps/cares/docs/ares_dns_record.3
index fe23b5eece60e5..01ce7601aa3199 100644
--- a/deps/cares/docs/ares_dns_record.3
+++ b/deps/cares/docs/ares_dns_record.3
@@ -19,7 +19,7 @@ ares_status_t ares_dns_parse(const unsigned char *buf,
size_t buf_len, unsigned int flags,
ares_dns_record_t **dnsrec);
-ares_status_t ares_dns_write(ares_dns_record_t *dnsrec,
+ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec,
unsigned char **buf, size_t *buf_len);
ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec,
@@ -28,6 +28,8 @@ ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec,
ares_dns_opcode_t opcode,
ares_dns_rcode_t rcode);
+ares_dns_record_t *ares_dns_record_duplicate(const ares_dns_record_t *dnsrec);
+
unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec);
unsigned short ares_dns_record_get_flags(const ares_dns_record_t *dnsrec);
@@ -41,6 +43,14 @@ ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec,
ares_dns_rec_type_t qtype,
ares_dns_class_t qclass);
+ares_status_t ares_dns_record_query_set_name(ares_dns_record_t *dnsrec,
+ size_t idx,
+ const char *name);
+
+ares_status_t ares_dns_record_query_set_type(ares_dns_record_t *dnsrec,
+ size_t idx,
+ ares_dns_rec_type_t qtype);
+
size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec);
ares_status_t ares_dns_record_query_get(const ares_dns_record_t *dnsrec,
@@ -67,7 +77,7 @@ on requests, and some may only be valid on responses:
.B ARES_REC_TYPE_SOA
- Start of authority zone
.br
-.B ARES_REC_TYPE_PTR
+.B ARES_REC_TYPE_PTR
- Domain name pointer
.br
.B ARES_REC_TYPE_HINFO
@@ -317,6 +327,13 @@ is meant mostly for responses and is passed in the
.IR rcode
parameter and is typically \fPARES_RCODE_NOERROR\fP.
+The \fIares_dns_record_duplicate(3)\fP function duplicates an existing DNS
+record structure. This may be useful if needing to save a result as retrieved
+from \fIares_send_dnsrec(3)\fP or \fIares_search_dnsrec(3)\fP. The structure
+to be duplicated is passed in the
+.IR dnsrec
+parameter, and the duplicated copy is returned, or NULL on error such as
+out of memory.
The \fIares_dns_record_get_id(3)\fP function is used to retrieve the DNS
message id from the DNS record provided in the
@@ -350,6 +367,29 @@ parameter and the question class (typically \fIARES_CLASS_IN\fP) in the
.IR qclass
parameter.
+The \fIares_dns_record_query_set_name(3)\fP function is used to modify the
+question name in the DNS record provided in the
+.IR dnsrec
+parameter. The index of the query, which must be less than
+\fIares_dns_record_query_cnt(3)\fP, is provided in the
+.IR idx
+parameter. The new domain name is provided in the
+.IR name
+parameter. Care should be taken as this will cause invalidation of any
+\fIname\fP pointer retrieved from \fIares_dns_Record_query_get(3)\fP. This
+function is useful if sending multiple similar queries without re-creating
+the entire DNS query.
+
+The \fIares_dns_record_query_set_type(3)\fP function is used to modify the
+question type in the DNS record provided in the
+.IR dnsrec
+parameter. The index of the query, which must be less than
+\fIares_dns_record_query_cnt(3)\fP, is provided in the
+.IR idx
+parameter. The new query type is provided in the
+.IR qtype
+parameter.
+
The \fIares_dns_record_query_cnt(3)\fP function is used to retrieve the number
of DNS questions in the DNS record provided in the
.IR dnsrec
@@ -363,7 +403,8 @@ parameter. The index provided in the
parameter must be less than the value returned from \fIares_dns_record_query_cnt(3)\fP.
The DNS question name will be returned in the variable pointed to by the
.IR name
-parameter, this may be provided as NULL if the name is not needed.
+parameter, this may be provided as NULL if the name is not needed. This pointer
+will be invalided by any call to \fIares_dns_record_query_set_name(3)\fP.
The DNS question type will be returned in the variable pointed to by the
.IR qtype
parameter, this may be provided as NULL if the type is not needed.
diff --git a/deps/cares/docs/ares_dns_record_duplicate.3 b/deps/cares/docs/ares_dns_record_duplicate.3
new file mode 100644
index 00000000000000..4acc581d29789c
--- /dev/null
+++ b/deps/cares/docs/ares_dns_record_duplicate.3
@@ -0,0 +1,3 @@
+.\" Copyright (C) 2023 The c-ares project and its contributors.
+.\" SPDX-License-Identifier: MIT
+.so man3/ares_dns_record.3
diff --git a/deps/cares/docs/ares_dns_record_query_set_name.3 b/deps/cares/docs/ares_dns_record_query_set_name.3
new file mode 100644
index 00000000000000..4acc581d29789c
--- /dev/null
+++ b/deps/cares/docs/ares_dns_record_query_set_name.3
@@ -0,0 +1,3 @@
+.\" Copyright (C) 2023 The c-ares project and its contributors.
+.\" SPDX-License-Identifier: MIT
+.so man3/ares_dns_record.3
diff --git a/deps/cares/docs/ares_dns_record_query_set_type.3 b/deps/cares/docs/ares_dns_record_query_set_type.3
new file mode 100644
index 00000000000000..4acc581d29789c
--- /dev/null
+++ b/deps/cares/docs/ares_dns_record_query_set_type.3
@@ -0,0 +1,3 @@
+.\" Copyright (C) 2023 The c-ares project and its contributors.
+.\" SPDX-License-Identifier: MIT
+.so man3/ares_dns_record.3
diff --git a/deps/cares/docs/ares_dns_record_rr_get_const.3 b/deps/cares/docs/ares_dns_record_rr_get_const.3
new file mode 100644
index 00000000000000..b93e4cd4e37fa8
--- /dev/null
+++ b/deps/cares/docs/ares_dns_record_rr_get_const.3
@@ -0,0 +1,3 @@
+.\" Copyright (C) 2023 The c-ares project and its contributors.
+.\" SPDX-License-Identifier: MIT
+.so man3/ares_dns_rr.3
diff --git a/deps/cares/docs/ares_dns_rr.3 b/deps/cares/docs/ares_dns_rr.3
index 2999d18e3aa6bb..290859e838e7ef 100644
--- a/deps/cares/docs/ares_dns_rr.3
+++ b/deps/cares/docs/ares_dns_rr.3
@@ -4,14 +4,15 @@
.TH ARES_DNS_RR 3 "12 November 2023"
.SH NAME
ares_dns_record_rr_add, ares_dns_record_rr_cnt, ares_dns_record_rr_del,
-ares_dns_record_rr_get, ares_dns_rr_get_addr, ares_dns_rr_get_addr6,
-ares_dns_rr_get_bin, ares_dns_rr_get_class, ares_dns_rr_get_name,
-ares_dns_rr_get_opt, ares_dns_rr_get_opt_byid, ares_dns_rr_get_opt_cnt,
-ares_dns_rr_get_str, ares_dns_rr_get_ttl, ares_dns_rr_get_type,
-ares_dns_rr_get_u16, ares_dns_rr_get_u32, ares_dns_rr_get_u8, ares_dns_rr_key_t,
-ares_dns_rr_set_addr, ares_dns_rr_set_addr6, ares_dns_rr_set_bin,
-ares_dns_rr_set_opt, ares_dns_rr_set_str, ares_dns_rr_set_u16,
-ares_dns_rr_set_u32, ares_dns_rr_set_u8, ares_dns_section_t, ares_tlsa_match_t,
+ares_dns_record_rr_get, ares_dns_record_rr_get_const, ares_dns_rr_get_addr,
+ares_dns_rr_get_addr6, ares_dns_rr_get_bin, ares_dns_rr_get_class,
+ares_dns_rr_get_name, ares_dns_rr_get_opt, ares_dns_rr_get_opt_byid,
+ares_dns_rr_get_opt_cnt, ares_dns_rr_get_str, ares_dns_rr_get_ttl,
+ares_dns_rr_get_type, ares_dns_rr_get_u16, ares_dns_rr_get_u32,
+ares_dns_rr_get_u8, ares_dns_rr_key_t, ares_dns_rr_set_addr,
+ares_dns_rr_set_addr6, ares_dns_rr_set_bin, ares_dns_rr_set_opt,
+ares_dns_rr_set_str, ares_dns_rr_set_u16, ares_dns_rr_set_u32,
+ares_dns_rr_set_u8, ares_dns_section_t, ares_tlsa_match_t,
ares_tlsa_selector_t, ares_tlsa_usage_t \-
DNS Resource Record creating, reading, and writing functions.
.SH SYNOPSIS
@@ -33,6 +34,10 @@ ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec,
ares_dns_section_t sect,
size_t idx);
+const ares_dns_rr_t *ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect,
+ size_t idx);
+
ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec,
ares_dns_section_t sect,
size_t idx);
@@ -357,14 +362,17 @@ parameter, and the Time To Live (TTL) in the
parameter.
-The \fIares_dns_record_rr_get(3)\fP function is used to retrieve the resource
-record pointer from the DNS record provided in the
+The \fIares_dns_record_rr_get(3)\fP and \fIares_dns_record_rr_get_const(3)\fP
+functions are used to retrieve the resource record pointer from the DNS record
+provided in the
.IR dnsrec
parameter, for the resource record section provided in the
.IR sect
parameter, for the specified index in the
.IR idx
-parameter. The index must be less than \fIares_dns_record_rr_cnt(3)\fP.
+parameter. The index must be less than \fIares_dns_record_rr_cnt(3)\fP. The
+former returns a writable pointer to the resource record, while the latter
+returns a read-only pointer to the resource record.
The \fIares_dns_record_rr_del(3)\fP is used to delete a resource record from
@@ -615,8 +623,8 @@ prescribed datatype values and in general can't fail except for misuse cases,
in which a 0 (or NULL) may be returned, however 0 can also be a valid return
value for most of these functions.
-\fIares_dns_record_rr_get(3)\fP will return the requested resource record
-pointer or NULL on failure (misuse).
+\fIares_dns_record_rr_get(3)\fP and \fIares_dns_record_rr_get_const(3)\fP will
+return the requested resource record pointer or NULL on failure (misuse).
\fIares_dns_rr_get_opt_byid(3)\fP will return ARES_TRUE if the option was
found, otherwise ARES_FALSE if not found (or misuse).
diff --git a/deps/cares/docs/ares_init_options.3 b/deps/cares/docs/ares_init_options.3
index 000cc1d9a592b5..72889b5b4874ef 100644
--- a/deps/cares/docs/ares_init_options.3
+++ b/deps/cares/docs/ares_init_options.3
@@ -158,7 +158,7 @@ before giving up. The default is three tries.
The number of dots which must be present in a domain name for it to be
queried for "as is" prior to querying for it with the default domain
extensions appended. The default value is 1 unless set otherwise by
-resolv.conf or the RES_OPTIONS environment variable.
+resolv.conf or the RES_OPTIONS environment variable. Valid range is 0-15.
.TP 18
.B ARES_OPT_MAXTIMEOUTMS
.B int \fImaxtimeout\fP;
diff --git a/deps/cares/docs/ares_query.3 b/deps/cares/docs/ares_query.3
index 00e44f52594d90..24decf7009441b 100644
--- a/deps/cares/docs/ares_query.3
+++ b/deps/cares/docs/ares_query.3
@@ -9,19 +9,32 @@ ares_query \- Initiate a single-question DNS query
.nf
#include
-typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP,
- int \fItimeouts\fP, unsigned char *\fIabuf\fP,
- int \fIalen\fP)
+typedef void (*ares_callback_dnsrec)(void *arg, ares_status_t status,
+ size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+
+ares_status_t ares_query_dnsrec(ares_channel_t *channel,
+ const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type,
+ ares_callback_dnsrec callback,
+ void *arg,
+ unsigned short *qid);
+
+typedef void (*ares_callback)(void *arg, int status,
+ int timeouts, unsigned char *abuf,
+ int alen);
+
+void ares_query(ares_channel_t *channel, const char *name,
+ int dnsclass, int type,
+ ares_callback callback, void *arg);
-void ares_query(ares_channel_t *\fIchannel\fP, const char *\fIname\fP,
- int \fIdnsclass\fP, int \fItype\fP,
- ares_callback \fIcallback\fP, void *\fIarg\fP)
.fi
+
.SH DESCRIPTION
-The
-.B ares_query
-function initiates a single-question DNS query on the name service
-channel identified by
+
+The \fBares_query_dnsrec(3)\fP and \fBares_query(3)\fP functions initiate a
+single-question DNS query on the name service channel identified by
.IR channel .
The parameter
.I name
@@ -31,27 +44,27 @@ a label must be escaped with a backslash. The parameters
.I dnsclass
and
.I type
-give the class and type of the query using the values defined in
-.BR .
+give the class and type of the query.
+
+\fBares_query_dnsrec(3)\fP uses the ares \fBares_dns_class_t\fP and
+\fBares_dns_rec_type_t\fP defined types. However, \fBares_query(3)\fP uses
+the values defined in \fB\fP.
+
When the query is complete or has failed, the ares library will invoke
.IR callback .
-Completion or failure of the query may happen immediately, or may
-happen during a later call to
-.BR ares_process (3)
-or
-.BR ares_destroy (3).
-.PP
+Completion or failure of the query may happen immediately (even before the
+return of the function call), or may happen during a later call to
+\fBares_process(3)\fP or \fBares_destroy(3)\fP.
+
If this is called from a thread other than which the main program event loop is
running, care needs to be taken to ensure any file descriptor lists are updated
immediately within the eventloop. When the associated callback is called,
it is called with a channel lock so care must be taken to ensure any processing
is minimal to prevent DNS channel stalls.
-.PP
+
The callback argument
.I arg
-is copied from the
-.B ares_query
-argument
+is copied from the \fBares_query_dnsrec(3)\fP or \fBares_query(3)\fP argument
.IR arg .
The callback argument
.I status
@@ -73,9 +86,7 @@ The query completed but the server claims to have experienced a
failure. (This code can only occur if the
.B ARES_FLAG_NOCHECKRESP
flag was specified at channel initialization time; otherwise, such
-responses are ignored at the
-.BR ares_send (3)
-level.)
+responses are ignored at the \fBares_send_dnsrec(3)\fP level.)
.TP 19
.B ARES_ENOTFOUND
The query completed but the queried-for domain name was not found.
@@ -85,18 +96,14 @@ The query completed but the server does not implement the operation
requested by the query. (This code can only occur if the
.B ARES_FLAG_NOCHECKRESP
flag was specified at channel initialization time; otherwise, such
-responses are ignored at the
-.BR ares_send (3)
-level.)
+responses are ignored at the \fBares_send_dnsrec(3)\fP level.)
.TP 19
.B ARES_EREFUSED
The query completed but the server refused the query. (This code can
only occur if the
.B ARES_FLAG_NOCHECKRESP
flag was specified at channel initialization time; otherwise, such
-responses are ignored at the
-.BR ares_send (3)
-level.)
+responses are ignored at the \fBares_send_dnsrec(3)\fP level.)
.TP 19
.B ARES_EBADNAME
The query name
@@ -126,23 +133,26 @@ is being destroyed; the query will not be completed.
The query will not be completed because no DNS servers were configured on the
channel.
.PP
+
The callback argument
.I timeouts
reports how many times a query timed out during the execution of the
given request.
-.PP
+
If the query completed (even if there was something wrong with it, as
indicated by some of the above error codes), the callback argument
+.I dnsrec
+or
.I abuf
-points to a result buffer of length
-.IR alen .
-If the query did not complete,
-.I abuf
-will be NULL and
-.I alen
-will be 0.
+will be non-NULL, otherwise they will be NULL.
+
+.SH AVAILABILITY
+\fBares_query_dnsrec(3)\fP was introduced in c-ares 1.28.0.
+
.SH SEE ALSO
-.BR ares_process (3)
+.BR ares_process (3),
+.BR ares_dns_record (3)
+
.SH AUTHOR
Greg Hudson, MIT Information Systems
.br
diff --git a/deps/cares/docs/ares_query_dnsrec.3 b/deps/cares/docs/ares_query_dnsrec.3
new file mode 100644
index 00000000000000..b178e987646055
--- /dev/null
+++ b/deps/cares/docs/ares_query_dnsrec.3
@@ -0,0 +1,3 @@
+.\" Copyright (C) 2023 The c-ares project and its contributors.
+.\" SPDX-License-Identifier: MIT
+.so man3/ares_query.3
diff --git a/deps/cares/docs/ares_queue.3 b/deps/cares/docs/ares_queue.3
new file mode 100644
index 00000000000000..1212e8d3f8c3cc
--- /dev/null
+++ b/deps/cares/docs/ares_queue.3
@@ -0,0 +1,53 @@
+.\"
+.\" SPDX-License-Identifier: MIT
+.\"
+.TH ARES_QUEUE 3 "16 February 2024"
+.SH NAME
+ares_queue_wait_empty, ares_queue_active_queries \- Functions for checking the
+c-ares queue status
+.SH SYNOPSIS
+.nf
+#include
+
+size_t ares_queue_active_queries(ares_channel_t *channel);
+
+ares_status_t ares_queue_wait_empty(ares_channel_t *channel,
+ int timeout_ms);
+.fi
+.SH DESCRIPTION
+The \fBares_queue_active_queries(3)\fP function retrieves the total number of
+active queries pending answers from servers. Some c-ares requests may spawn
+multiple queries, such as \fIares_getaddrinfo(3)\fP when using \fIAF_UNSPEC\fP,
+which will be reflected in this number. The \fBchannel\fP parameter must be set
+to an initialized channel.
+
+The \fBares_queue_wait_empty(3)\fP function blocks until notified that there are
+no longer any queries in queue, or the specified timeout has expired. The
+\fBchannel\fP parameter must be set to an initialized channel. The
+\fBtimeout_ms\fP parameter is the number of milliseconds to wait for the queue
+to be empty or -1 for Infinite.
+
+.SH RETURN VALUES
+\fIares_queue_active_queries(3)\fP returns the active query count.
+
+\fIares_queue_wait_empty(3)\fP can return any of the following values:
+.TP 14
+.B ARES_ENOTIMP
+if not built with threading support
+.TP 14
+.B ARES_ETIMEOUT
+if requested timeout expired
+.TP 14
+.B ARES_SUCCESS
+when queue is empty.
+.TP 14
+
+.SH AVAILABILITY
+This function was first introduced in c-ares version 1.27.0, and requires the
+c-ares library to be built with threading support.
+
+.SH SEE ALSO
+.BR ares_init_options (3),
+.BR ares_threadsafety (3)
+.SH AUTHOR
+Copyright (C) 2024 The c-ares project and its members.
diff --git a/deps/cares/docs/ares_queue_active_queries.3 b/deps/cares/docs/ares_queue_active_queries.3
new file mode 100644
index 00000000000000..c16c69ddcb9e02
--- /dev/null
+++ b/deps/cares/docs/ares_queue_active_queries.3
@@ -0,0 +1,3 @@
+.\" Copyright (C) 2024 The c-ares project and its contributors.
+.\" SPDX-License-Identifier: MIT
+.so man3/ares_queue.3
diff --git a/deps/cares/docs/ares_queue_wait_empty.3 b/deps/cares/docs/ares_queue_wait_empty.3
new file mode 100644
index 00000000000000..c16c69ddcb9e02
--- /dev/null
+++ b/deps/cares/docs/ares_queue_wait_empty.3
@@ -0,0 +1,3 @@
+.\" Copyright (C) 2024 The c-ares project and its contributors.
+.\" SPDX-License-Identifier: MIT
+.so man3/ares_queue.3
diff --git a/deps/cares/docs/ares_search.3 b/deps/cares/docs/ares_search.3
index 08246d349d02fd..1a324b0ff47db5 100644
--- a/deps/cares/docs/ares_search.3
+++ b/deps/cares/docs/ares_search.3
@@ -9,13 +9,23 @@ ares_search \- Initiate a DNS query with domain search
.nf
#include
+typedef void (*ares_callback_dnsrec)(void *\fIarg\fP,
+ ares_status_t \fIstatus\fP,
+ size_t \fItimeouts\fP,
+ const ares_dns_record_t *\fIdnsrec\fP);
+
+void ares_search_dnsrec(ares_channel_t *\fIchannel\fP,
+ const ares_dns_record_t *\fIdnsrec\fP,
+ ares_callback_dnsrec \fIcallback\fP, void *\fIarg\fP);
+
typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP,
int \fItimeouts\fP, unsigned char *\fIabuf\fP,
- int \fIalen\fP)
+ int \fIalen\fP);
void ares_search(ares_channel_t *\fIchannel\fP, const char *\fIname\fP,
int \fIdnsclass\fP, int \fItype\fP,
- ares_callback \fIcallback\fP, void *\fIarg\fP)
+ ares_callback \fIcallback\fP, void *\fIarg\fP);
+
.fi
.SH DESCRIPTION
The
@@ -142,9 +152,34 @@ will usually be NULL and
will usually be 0, but in some cases an unsuccessful query result may
be placed in
.IR abuf .
+
+The \fIares_search_dnsrec(3)\fP function behaves identically to
+\fIares_search(3)\fP, but takes an initialized and filled DNS record object to
+use for queries as the second argument
+.I dnsrec
+instead of a name, class and type. This object is used as the base for the
+queries and must itself represent a valid query for a single name. Note that
+the search domains will only be appended to the name in the question section;
+RRs on the DNS record object will not be affected. Moreover, the
+.I callback
+argument is of type \fIares_callback_dnsrec\fP. This callback behaves
+identically to \fIares_callback\fP, but is invoked with a parsed DNS record
+object
+.I dnsrec
+rather than a raw buffer with length. Note that this object is read-only.
+
+The \fIares_search_dnsrec(3)\fP function returns an \fIares_status_t\fP response
+code. This may be useful to know that the query was enqueued properly. The
+response code does not reflect the result of the query, just the result of the
+enqueuing of the query.
+
+.SH AVAILABILITY
+\fBares_search_dnsrec(3)\fP was introduced in c-ares 1.28.0.
+
.SH SEE ALSO
.BR ares_process (3),
.BR ares_dns_record (3)
+
.SH AUTHOR
Greg Hudson, MIT Information Systems
.br
diff --git a/deps/cares/docs/ares_search_dnsrec.3 b/deps/cares/docs/ares_search_dnsrec.3
new file mode 100644
index 00000000000000..86c2317c071144
--- /dev/null
+++ b/deps/cares/docs/ares_search_dnsrec.3
@@ -0,0 +1,3 @@
+.\" Copyright (C) 2023 The c-ares project and its contributors.
+.\" SPDX-License-Identifier: MIT
+.so man3/ares_search.3
diff --git a/deps/cares/docs/ares_send.3 b/deps/cares/docs/ares_send.3
index 1fe1c0273e7379..010bb2579174bd 100644
--- a/deps/cares/docs/ares_send.3
+++ b/deps/cares/docs/ares_send.3
@@ -9,46 +9,78 @@ ares_send \- Initiate a DNS query
.nf
#include
-typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP,
- int \fItimeouts\fP, unsigned char *\fIabuf\fP,
- int \fIalen\fP)
+typedef void (*ares_callback_dnsrec)(void *arg, ares_status_t status,
+ size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+
+ares_status_t ares_send_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback,
+ void *arg, unsigned short *qid);
+
+typedef void (*ares_callback)(void *arg, int status,
+ int timeouts, unsigned char *abuf,
+ int alen);
+
+void ares_send(ares_channel_t *channel, const unsigned char *qbuf,
+ int qlen, ares_callback callback, void *arg);
-void ares_send(ares_channel_t *\fIchannel\fP, const unsigned char *\fIqbuf\fP,
- int \fIqlen\fP, ares_callback \fIcallback\fP, void *\fIarg\fP)
.fi
.SH DESCRIPTION
-The
-.B ares_send
-function initiates a DNS query on the name service channel identified
-by
-.IR channel .
-The parameters
-.I qbuf
+The \fIares_send_dnsrec(3)\fP function initiates a DNS query formatted using the
+\fIares_dns_record_t *\fP data structure created via
+\fIares_dns_record_create(3)\fP in the
+.IR dnsrec
+parameter. The supplied callback in the
+.IR callback
+parameter also returns the response using a
+\fIares_dns_record_t *\fP data structure.
+
+The \fIares_send(3)\fP function similarly initiates a DNS query, but instead uses
+raw binary buffers with fully formatted DNS messages passed in the request via the
+.IR qbuf
and
-.I qlen
-give the DNS query, which should already have been formatted according
-to the DNS protocol. When the query is complete or has failed, the
-ares library will invoke
-.IR callback .
-Completion or failure of the query may happen immediately, or may
-happen later as network events are processed.
-.PP
+.IR qlen
+parameters. The supplied callback in the
+.IR callback
+parameter also returns the raw binary DNS response in the
+.IR abuf
+and
+.IR alen
+parameters. This method should be considered deprecated in favor of
+\fIares_send_dnsrec(3)\fP.
+
+Both functions take an initialized ares channel identified by
+.IR channel .
+
+The \fIares_send_dnsrec(3)\fP also can be supplied an optional output parameter of
+.IR qid
+to populate the query id as it was placed on the wire.
+
+The \fIares_send_dnsrec(3)\fP function returns an \fIares_status_t\fP response
+code. This may be useful to know that the query was enqueued properly. The
+response code does not reflect the result of the query, just the result of the
+enqueuing of the query.
+
+Completion or failure of the query may happen immediately (even before the
+function returning), or may happen later as network events are processed.
+
When the associated callback is called, it is called with a channel lock so care
must be taken to ensure any processing is minimal to prevent DNS channel stalls.
The callback may be triggered from a different thread than the one which
-called \fIares_send(3)\fP.
+called \fIares_send_dnsrec(3)\fP or \fIares_send(3)\fP.
For integrators running their own event loops and not using \fBARES_OPT_EVENT_THREAD\fP,
care needs to be taken to ensure any file descriptor lists are updated immediately
within the eventloop when notified.
-.PP
+
The callback argument
-.I arg
-is copied from the
-.B ares_send
-argument
-.IR arg .
+.IR arg
+is copied from the \fIares_send_dnsrec(3)\fP or \fIares_send(3)\fP
+.IR arg
+parameter.
+
The callback argument
.I status
indicates whether the query succeeded and, if not, how it failed. It
@@ -82,43 +114,44 @@ is being destroyed; the query will not be completed.
The query will not be completed because no DNS servers were configured on the
channel.
.PP
+
The callback argument
.I timeouts
reports how many times a query timed out during the execution of the
given request.
-.PP
+
If the query completed, the callback argument
-.I abuf
-points to a result buffer of length
-.IR alen .
-If the query did not complete,
-.I abuf
-will be NULL and
-.I alen
-will be 0.
-.PP
+.IR dnsrec
+for \fIares_send_dnsrec(3)\fP or
+.IR abuf
+and
+.IR alen
+for \fIares_send(3)\fP will be non-NULL.
+
Unless the flag
.B ARES_FLAG_NOCHECKRESP
-was set at channel initialization time,
-.B ares_send
-will normally ignore responses whose questions do not match the
-questions in
-.IR qbuf ,
-as well as responses with reply codes of
+was set at channel initialization time, \fIares_send_dnsrec(3)\fP and
+\fIares_send(3)\fP will normally ignore responses whose questions do not match
+the supplied questions, as well as responses with reply codes of
.BR SERVFAIL ,
.BR NOTIMP ,
and
.BR REFUSED .
Unlike other query functions in the ares library, however,
-.B ares_send
-does not inspect the header of the reply packet to determine the error
-status, so a callback status of
+\fIares_send_dnsrec(3)\fP and \fIares_send(3)\fP do not inspect the header of
+the reply packet to determine the error status, so a callback status of
.B ARES_SUCCESS
-does not reflect as much about the response as for other query
-functions.
+does not reflect as much about the response as for other query functions.
+
+.SH AVAILABILITY
+\fBares_send_dnsrec(3)\fP was introduced in c-ares 1.28.0.
+
.SH SEE ALSO
+.BR ares_dns_record_create (3),
.BR ares_process (3),
+.BR ares_search (3),
.BR ares_dns_record (3)
+
.SH AUTHOR
Greg Hudson, MIT Information Systems
.br
diff --git a/deps/cares/docs/ares_send_dnsrec.3 b/deps/cares/docs/ares_send_dnsrec.3
new file mode 100644
index 00000000000000..f5596f5cf049bc
--- /dev/null
+++ b/deps/cares/docs/ares_send_dnsrec.3
@@ -0,0 +1,3 @@
+.\" Copyright (C) 2023 The c-ares project and its contributors.
+.\" SPDX-License-Identifier: MIT
+.so man3/ares_send.3
diff --git a/deps/cares/include/Makefile.in b/deps/cares/include/Makefile.in
index cf8cb55170cc8b..6e06995bfc5a3b 100644
--- a/deps/cares/include/Makefile.in
+++ b/deps/cares/include/Makefile.in
@@ -274,6 +274,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
diff --git a/deps/cares/include/ares.h b/deps/cares/include/ares.h
index acbd6583074a56..bc17230e47262f 100644
--- a/deps/cares/include/ares.h
+++ b/deps/cares/include/ares.h
@@ -119,6 +119,37 @@ extern "C" {
# endif
#endif
+#ifdef __GNUC__
+# define CARES_GCC_VERSION \
+ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#else
+# define CARES_GCC_VERSION 0
+#endif
+
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+#ifdef CARES_NO_DEPRECATED
+# define CARES_DEPRECATED
+# define CARES_DEPRECATED_FOR(f)
+#else
+# if CARES_GCC_VERSION >= 30200 || __has_attribute(__deprecated__)
+# define CARES_DEPRECATED __attribute__((__deprecated__))
+# else
+# define CARES_DEPRECATED
+# endif
+
+# if CARES_GCC_VERSION >= 40500 || defined(__clang__)
+# define CARES_DEPRECATED_FOR(f) \
+ __attribute__((deprecated("Use " #f " instead")))
+# elif defined(_MSC_VER)
+# define CARES_DEPRECATED_FOR(f) __declspec(deprecated("Use " #f " instead"))
+# else
+# define CARES_DEPRECATED_FOR(f) CARES_DEPRECATED
+# endif
+#endif
+
typedef enum {
ARES_SUCCESS = 0,
@@ -352,29 +383,57 @@ typedef struct ares_channeldata *ares_channel;
/* Current main channel typedef */
typedef struct ares_channeldata ares_channel_t;
+/*
+ * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr
+ * struct below when ares itself was built, but many apps would use this
+ * private version since the header checked a HAVE_* define for it. Starting
+ * with 1.7.0 we always declare and use our own to stop relying on the
+ * system's one.
+ */
+struct ares_in6_addr {
+ union {
+ unsigned char _S6_u8[16];
+ } _S6_un;
+};
+
+struct ares_addr {
+ int family;
+
+ union {
+ struct in_addr addr4;
+ struct ares_in6_addr addr6;
+ } addr;
+};
+
+/* DNS record parser, writer, and helpers */
+#include "ares_dns_record.h"
-typedef void (*ares_callback)(void *arg, int status, int timeouts,
+typedef void (*ares_callback)(void *arg, int status, int timeouts,
unsigned char *abuf, int alen);
-typedef void (*ares_host_callback)(void *arg, int status, int timeouts,
+typedef void (*ares_callback_dnsrec)(void *arg, ares_status_t status,
+ size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+
+typedef void (*ares_host_callback)(void *arg, int status, int timeouts,
struct hostent *hostent);
-typedef void (*ares_nameinfo_callback)(void *arg, int status, int timeouts,
+typedef void (*ares_nameinfo_callback)(void *arg, int status, int timeouts,
char *node, char *service);
-typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, int type,
+typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, int type,
void *data);
-typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, int type,
+typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, int type,
void *data);
-typedef void (*ares_addrinfo_callback)(void *arg, int status, int timeouts,
+typedef void (*ares_addrinfo_callback)(void *arg, int status, int timeouts,
struct ares_addrinfo *res);
CARES_EXTERN int ares_library_init(int flags);
CARES_EXTERN int ares_library_init_mem(int flags, void *(*amalloc)(size_t size),
- void (*afree)(void *ptr),
+ void (*afree)(void *ptr),
void *(*arealloc)(void *ptr,
size_t size));
@@ -384,13 +443,14 @@ CARES_EXTERN int ares_library_init_android(jobject connectivity_manager);
CARES_EXTERN int ares_library_android_initialized(void);
#endif
-CARES_EXTERN int ares_library_initialized(void);
+CARES_EXTERN int ares_library_initialized(void);
-CARES_EXTERN void ares_library_cleanup(void);
+CARES_EXTERN void ares_library_cleanup(void);
-CARES_EXTERN const char *ares_version(int *version);
+CARES_EXTERN const char *ares_version(int *version);
-CARES_EXTERN int ares_init(ares_channel_t **channelptr);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_init_options) int ares_init(
+ ares_channel_t **channelptr);
CARES_EXTERN int ares_init_options(ares_channel_t **channelptr,
const struct ares_options *options,
@@ -453,7 +513,7 @@ struct iovec;
struct ares_socket_functions {
ares_socket_t (*asocket)(int, int, int, void *);
- int (*aclose)(ares_socket_t, void *);
+ int (*aclose)(ares_socket_t, void *);
int (*aconnect)(ares_socket_t, const struct sockaddr *, ares_socklen_t,
void *);
ares_ssize_t (*arecvfrom)(ares_socket_t, void *, size_t, int,
@@ -462,24 +522,76 @@ struct ares_socket_functions {
};
CARES_EXTERN void
- ares_set_socket_functions(ares_channel_t *channel,
- const struct ares_socket_functions *funcs,
- void *user_data);
+ ares_set_socket_functions(ares_channel_t *channel,
+ const struct ares_socket_functions *funcs,
+ void *user_data);
+
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_send_dnsrec) void ares_send(
+ ares_channel_t *channel, const unsigned char *qbuf, int qlen,
+ ares_callback callback, void *arg);
-CARES_EXTERN void ares_send(ares_channel_t *channel, const unsigned char *qbuf,
- int qlen, ares_callback callback, void *arg);
+/*! Send a DNS query as an ares_dns_record_t with a callback containing the
+ * parsed DNS record.
+ *
+ * \param[in] channel Pointer to channel on which queries will be sent.
+ * \param[in] dnsrec DNS Record to send
+ * \param[in] callback Callback function invoked on completion or failure of
+ * the query sequence.
+ * \param[in] arg Additional argument passed to the callback function.
+ * \param[out] qid Query ID
+ * \return One of the c-ares status codes.
+ */
+CARES_EXTERN ares_status_t ares_send_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback,
+ void *arg, unsigned short *qid);
-CARES_EXTERN void ares_query(ares_channel_t *channel, const char *name,
- int dnsclass, int type, ares_callback callback,
- void *arg);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_query_dnsrec) void ares_query(
+ ares_channel_t *channel, const char *name, int dnsclass, int type,
+ ares_callback callback, void *arg);
-CARES_EXTERN void ares_search(ares_channel_t *channel, const char *name,
- int dnsclass, int type, ares_callback callback,
- void *arg);
+/*! Perform a DNS query with a callback containing the parsed DNS record.
+ *
+ * \param[in] channel Pointer to channel on which queries will be sent.
+ * \param[in] name Query name
+ * \param[in] dnsclass DNS Class
+ * \param[in] type DNS Record Type
+ * \param[in] callback Callback function invoked on completion or failure of
+ * the query sequence.
+ * \param[in] arg Additional argument passed to the callback function.
+ * \param[out] qid Query ID
+ * \return One of the c-ares status codes.
+ */
+CARES_EXTERN ares_status_t ares_query_dnsrec(ares_channel_t *channel,
+ const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type,
+ ares_callback_dnsrec callback,
+ void *arg, unsigned short *qid);
+
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_search_dnsrec) void ares_search(
+ ares_channel_t *channel, const char *name, int dnsclass, int type,
+ ares_callback callback, void *arg);
+
+/*! Search for a complete DNS message.
+ *
+ * \param[in] channel Pointer to channel on which queries will be sent.
+ * \param[in] dnsrec Pointer to initialized and filled DNS record object.
+ * \param[in] callback Callback function invoked on completion or failure of
+ * the query sequence.
+ * \param[in] arg Additional argument passed to the callback function.
+ * \return One of the c-ares status codes. In all cases, except
+ * ARES_EFORMERR due to misuse, this error code will also be sent
+ * to the provided callback.
+ */
+CARES_EXTERN ares_status_t ares_search_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback,
+ void *arg);
-CARES_EXTERN void ares_gethostbyname(ares_channel_t *channel, const char *name,
- int family, ares_host_callback callback,
- void *arg);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_getaddrinfo) void ares_gethostbyname(
+ ares_channel_t *channel, const char *name, int family,
+ ares_host_callback callback, void *arg);
CARES_EXTERN int ares_gethostbyname_file(ares_channel_t *channel,
const char *name, int family,
@@ -494,61 +606,42 @@ CARES_EXTERN void ares_getnameinfo(ares_channel_t *channel,
ares_socklen_t salen, int flags,
ares_nameinfo_callback callback, void *arg);
-CARES_EXTERN int ares_fds(ares_channel_t *channel, fd_set *read_fds,
- fd_set *write_fds);
+CARES_EXTERN CARES_DEPRECATED_FOR(
+ ARES_OPT_EVENT_THREAD or
+ ARES_OPT_SOCK_STATE_CB) int ares_fds(ares_channel_t *channel,
+ fd_set *read_fds, fd_set *write_fds);
-CARES_EXTERN int ares_getsock(ares_channel_t *channel, ares_socket_t *socks,
- int numsocks);
+CARES_EXTERN CARES_DEPRECATED_FOR(
+ ARES_OPT_EVENT_THREAD or
+ ARES_OPT_SOCK_STATE_CB) int ares_getsock(ares_channel_t *channel,
+ ares_socket_t *socks, int numsocks);
CARES_EXTERN struct timeval *ares_timeout(ares_channel_t *channel,
struct timeval *maxtv,
struct timeval *tv);
-CARES_EXTERN void ares_process(ares_channel_t *channel, fd_set *read_fds,
- fd_set *write_fds);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_process_fd) void ares_process(
+ ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds);
CARES_EXTERN void ares_process_fd(ares_channel_t *channel,
ares_socket_t read_fd,
ares_socket_t write_fd);
-CARES_EXTERN int ares_create_query(const char *name, int dnsclass, int type,
- unsigned short id, int rd,
- unsigned char **buf, int *buflen,
- int max_udp_size);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_record_create) int ares_create_query(
+ const char *name, int dnsclass, int type, unsigned short id, int rd,
+ unsigned char **buf, int *buflen, int max_udp_size);
-CARES_EXTERN int ares_mkquery(const char *name, int dnsclass, int type,
- unsigned short id, int rd, unsigned char **buf,
- int *buflen);
-
-CARES_EXTERN int ares_expand_name(const unsigned char *encoded,
- const unsigned char *abuf, int alen, char **s,
- long *enclen);
-
-CARES_EXTERN int ares_expand_string(const unsigned char *encoded,
- const unsigned char *abuf, int alen,
- unsigned char **s, long *enclen);
-
-/*
- * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr
- * struct below when ares itself was built, but many apps would use this
- * private version since the header checked a HAVE_* define for it. Starting
- * with 1.7.0 we always declare and use our own to stop relying on the
- * system's one.
- */
-struct ares_in6_addr {
- union {
- unsigned char _S6_u8[16];
- } _S6_un;
-};
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_record_create) int ares_mkquery(
+ const char *name, int dnsclass, int type, unsigned short id, int rd,
+ unsigned char **buf, int *buflen);
-struct ares_addr {
- int family;
+CARES_EXTERN int ares_expand_name(const unsigned char *encoded,
+ const unsigned char *abuf, int alen, char **s,
+ long *enclen);
- union {
- struct in_addr addr4;
- struct ares_in6_addr addr6;
- } addr;
-};
+CARES_EXTERN int ares_expand_string(const unsigned char *encoded,
+ const unsigned char *abuf, int alen,
+ unsigned char **s, long *enclen);
struct ares_addrttl {
struct in_addr ipaddr;
@@ -675,52 +768,50 @@ struct ares_addrinfo_hints {
** so written.
*/
-CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf, int alen,
- struct hostent **host,
- struct ares_addrttl *addrttls,
- int *naddrttls);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_a_reply(
+ const unsigned char *abuf, int alen, struct hostent **host,
+ struct ares_addrttl *addrttls, int *naddrttls);
-CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
- struct hostent **host,
- struct ares_addr6ttl *addrttls,
- int *naddrttls);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_aaaa_reply(
+ const unsigned char *abuf, int alen, struct hostent **host,
+ struct ares_addr6ttl *addrttls, int *naddrttls);
-CARES_EXTERN int ares_parse_caa_reply(const unsigned char *abuf, int alen,
- struct ares_caa_reply **caa_out);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_caa_reply(
+ const unsigned char *abuf, int alen, struct ares_caa_reply **caa_out);
-CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf, int alen,
- const void *addr, int addrlen, int family,
- struct hostent **host);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_ptr_reply(
+ const unsigned char *abuf, int alen, const void *addr, int addrlen,
+ int family, struct hostent **host);
-CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf, int alen,
- struct hostent **host);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_ns_reply(
+ const unsigned char *abuf, int alen, struct hostent **host);
-CARES_EXTERN int ares_parse_srv_reply(const unsigned char *abuf, int alen,
- struct ares_srv_reply **srv_out);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_srv_reply(
+ const unsigned char *abuf, int alen, struct ares_srv_reply **srv_out);
-CARES_EXTERN int ares_parse_mx_reply(const unsigned char *abuf, int alen,
- struct ares_mx_reply **mx_out);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_mx_reply(
+ const unsigned char *abuf, int alen, struct ares_mx_reply **mx_out);
-CARES_EXTERN int ares_parse_txt_reply(const unsigned char *abuf, int alen,
- struct ares_txt_reply **txt_out);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_txt_reply(
+ const unsigned char *abuf, int alen, struct ares_txt_reply **txt_out);
-CARES_EXTERN int ares_parse_txt_reply_ext(const unsigned char *abuf, int alen,
- struct ares_txt_ext **txt_out);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_txt_reply_ext(
+ const unsigned char *abuf, int alen, struct ares_txt_ext **txt_out);
-CARES_EXTERN int ares_parse_naptr_reply(const unsigned char *abuf, int alen,
- struct ares_naptr_reply **naptr_out);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_naptr_reply(
+ const unsigned char *abuf, int alen, struct ares_naptr_reply **naptr_out);
-CARES_EXTERN int ares_parse_soa_reply(const unsigned char *abuf, int alen,
- struct ares_soa_reply **soa_out);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_soa_reply(
+ const unsigned char *abuf, int alen, struct ares_soa_reply **soa_out);
-CARES_EXTERN int ares_parse_uri_reply(const unsigned char *abuf, int alen,
- struct ares_uri_reply **uri_out);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_uri_reply(
+ const unsigned char *abuf, int alen, struct ares_uri_reply **uri_out);
-CARES_EXTERN void ares_free_string(void *str);
+CARES_EXTERN void ares_free_string(void *str);
-CARES_EXTERN void ares_free_hostent(struct hostent *host);
+CARES_EXTERN void ares_free_hostent(struct hostent *host);
-CARES_EXTERN void ares_free_data(void *dataptr);
+CARES_EXTERN void ares_free_data(void *dataptr);
CARES_EXTERN const char *ares_strerror(int code);
@@ -747,23 +838,26 @@ struct ares_addr_port_node {
int tcp_port;
};
-CARES_EXTERN int ares_set_servers(ares_channel_t *channel,
- const struct ares_addr_node *servers);
-CARES_EXTERN int
- ares_set_servers_ports(ares_channel_t *channel,
- const struct ares_addr_port_node *servers);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_set_servers_csv) int ares_set_servers(
+ ares_channel_t *channel, const struct ares_addr_node *servers);
+
+CARES_EXTERN
+ CARES_DEPRECATED_FOR(ares_set_servers_ports_csv) int ares_set_servers_ports(
+ ares_channel_t *channel, const struct ares_addr_port_node *servers);
/* Incoming string format: host[:port][,host[:port]]... */
-CARES_EXTERN int ares_set_servers_csv(ares_channel_t *channel,
- const char *servers);
-CARES_EXTERN int ares_set_servers_ports_csv(ares_channel_t *channel,
- const char *servers);
-CARES_EXTERN char *ares_get_servers_csv(ares_channel_t *channel);
+CARES_EXTERN int ares_set_servers_csv(ares_channel_t *channel,
+ const char *servers);
+CARES_EXTERN int ares_set_servers_ports_csv(ares_channel_t *channel,
+ const char *servers);
+CARES_EXTERN char *ares_get_servers_csv(ares_channel_t *channel);
-CARES_EXTERN int ares_get_servers(ares_channel_t *channel,
- struct ares_addr_node **servers);
-CARES_EXTERN int ares_get_servers_ports(ares_channel_t *channel,
- struct ares_addr_port_node **servers);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_get_servers_csv) int ares_get_servers(
+ ares_channel_t *channel, struct ares_addr_node **servers);
+
+CARES_EXTERN
+ CARES_DEPRECATED_FOR(ares_get_servers_ports_csv) int ares_get_servers_ports(
+ ares_channel_t *channel, struct ares_addr_port_node **servers);
CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst,
ares_socklen_t size);
@@ -803,7 +897,4 @@ CARES_EXTERN size_t ares_queue_active_queries(ares_channel_t *channel);
}
#endif
-/* DNS record parser, writer, and helpers */
-#include "ares_dns_record.h"
-
#endif /* ARES__H */
diff --git a/deps/cares/include/ares_dns_record.h b/deps/cares/include/ares_dns_record.h
index 3f802aefa3231e..8d09bd0a464254 100644
--- a/deps/cares/include/ares_dns_record.h
+++ b/deps/cares/include/ares_dns_record.h
@@ -393,11 +393,11 @@ typedef enum {
/*! Parse Additional from RFC 1035 that allow name compression as RAW */
ARES_DNS_PARSE_AR_BASE_RAW = 1 << 2,
/*! Parse Answers from later RFCs (no name compression) RAW */
- ARES_DNS_PARSE_AN_EXT_RAW = 1 << 3,
+ ARES_DNS_PARSE_AN_EXT_RAW = 1 << 3,
/*! Parse Authority from later RFCs (no name compression) as RAW */
- ARES_DNS_PARSE_NS_EXT_RAW = 1 << 4,
- /*< Parse Additional from later RFCs (no name compression) as RAW */
- ARES_DNS_PARSE_AR_EXT_RAW = 1 << 5
+ ARES_DNS_PARSE_NS_EXT_RAW = 1 << 4,
+ /*! Parse Additional from later RFCs (no name compression) as RAW */
+ ARES_DNS_PARSE_AR_EXT_RAW = 1 << 5
} ares_dns_parse_flags_t;
/*! String representation of DNS Record Type
@@ -468,7 +468,7 @@ CARES_EXTERN const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode);
* \param[in] ipaddr ASCII string form of the ip address
* \param[in,out] addr Must set "family" member to one of AF_UNSPEC,
* AF_INET, AF_INET6 on input.
- * \param[out] ptr_len Length of binary form address
+ * \param[out] out_len Length of binary form address
* \return Pointer to start of binary address or NULL on error.
*/
CARES_EXTERN const void *ares_dns_pton(const char *ipaddr,
@@ -619,6 +619,32 @@ CARES_EXTERN ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec,
ares_dns_rec_type_t qtype,
ares_dns_class_t qclass);
+/*! Replace the question name with a new name. This may be used when performing
+ * a search with aliases.
+ *
+ * Note that this will invalidate the name pointer returned from
+ * ares_dns_record_query_get().
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] idx Index of question (typically 0)
+ * \param[in] name Name to use as replacement.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_record_query_set_name(
+ ares_dns_record_t *dnsrec, size_t idx, const char *name);
+
+
+/*! Replace the question type with a different type. This may be used when
+ * needing to query more than one address class (e.g. A and AAAA)
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] idx Index of question (typically 0)
+ * \param[in] qtype Record Type to use as replacement.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_record_query_set_type(
+ ares_dns_record_t *dnsrec, size_t idx, ares_dns_rec_type_t qtype);
+
/*! Get the count of queries in the DNS Record
*
* \param[in] dnsrec Initialized record object
@@ -631,6 +657,8 @@ CARES_EXTERN size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec);
* \param[in] dnsrec Initialized record object
* \param[in] idx Index of query
* \param[out] name Optional. Returns name, may pass NULL if not desired.
+ * This pointer will be invalided by any call to
+ * ares_dns_record_query_set_name().
* \param[out] qtype Optional. Returns record type, may pass NULL.
* \param[out] qclass Optional. Returns class, may pass NULL.
* \return ARES_SUCCESS on success
@@ -667,17 +695,28 @@ CARES_EXTERN ares_status_t ares_dns_record_rr_add(
const char *name, ares_dns_rec_type_t type, ares_dns_class_t rclass,
unsigned int ttl);
-/*! Fetch a resource record based on the section and index.
+/*! Fetch a writable resource record based on the section and index.
*
* \param[in] dnsrec Initialized record object
* \param[in] sect Section for resource record
* \param[in] idx Index of resource record in section
- * \return NULL on misuse, otherwise a pointer to the resource record
+ * \return NULL on misuse, otherwise a writable pointer to the resource record
*/
CARES_EXTERN ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec,
ares_dns_section_t sect,
size_t idx);
+/*! Fetch a non-writeable resource record based on the section and index.
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] sect Section for resource record
+ * \param[in] idx Index of resource record in section
+ * \return NULL on misuse, otherwise a const pointer to the resource record
+ */
+CARES_EXTERN const ares_dns_rr_t *
+ ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t idx);
+
/*! Remove the resource record based on the section and index
*
@@ -686,9 +725,9 @@ CARES_EXTERN ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec,
* \param[in] idx Index of resource record in section
* \return ARES_SUCCESS on success, otherwise an error code.
*/
-CARES_EXTERN ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec,
- ares_dns_section_t sect,
- size_t idx);
+CARES_EXTERN ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect,
+ size_t idx);
/*! Retrieve the resource record Name/Hostname
@@ -696,7 +735,7 @@ CARES_EXTERN ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec,
* \param[in] rr Pointer to resource record
* \return Name
*/
-CARES_EXTERN const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr);
+CARES_EXTERN const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr);
/*! Retrieve the resource record type
*
@@ -959,8 +998,19 @@ CARES_EXTERN ares_status_t ares_dns_parse(const unsigned char *buf,
* \param[out] buf_len Length of returned buffer containing DNS message.
* \return ARES_SUCCESS on success
*/
-CARES_EXTERN ares_status_t ares_dns_write(ares_dns_record_t *dnsrec,
+CARES_EXTERN ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec,
unsigned char **buf, size_t *buf_len);
+
+
+/*! Duplicate a complete DNS message. This does not copy internal members
+ * (such as the ttl decrement capability).
+ *
+ * \param[in] dnsrec Pointer to initialized and filled DNS record object.
+ * \return duplicted DNS record object, or NULL on out of memory.
+ */
+CARES_EXTERN ares_dns_record_t *
+ ares_dns_record_duplicate(const ares_dns_record_t *dnsrec);
+
/*! @} */
#ifdef __cplusplus
diff --git a/deps/cares/include/ares_version.h b/deps/cares/include/ares_version.h
index 44dbdef161ac35..0e94a98be8f280 100644
--- a/deps/cares/include/ares_version.h
+++ b/deps/cares/include/ares_version.h
@@ -31,12 +31,12 @@
#define ARES_COPYRIGHT "2004 - 2024 Daniel Stenberg, ."
#define ARES_VERSION_MAJOR 1
-#define ARES_VERSION_MINOR 27
-#define ARES_VERSION_PATCH 0
+#define ARES_VERSION_MINOR 28
+#define ARES_VERSION_PATCH 1
#define ARES_VERSION \
((ARES_VERSION_MAJOR << 16) | (ARES_VERSION_MINOR << 8) | \
(ARES_VERSION_PATCH))
-#define ARES_VERSION_STR "1.27.0"
+#define ARES_VERSION_STR "1.28.1"
#if (ARES_VERSION >= 0x010700)
# define CARES_HAVE_ARES_LIBRARY_INIT 1
diff --git a/deps/cares/src/Makefile.in b/deps/cares/src/Makefile.in
index 040373fe95a247..f657ef0d43e7b9 100644
--- a/deps/cares/src/Makefile.in
+++ b/deps/cares/src/Makefile.in
@@ -285,6 +285,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
diff --git a/deps/cares/src/lib/CMakeLists.txt b/deps/cares/src/lib/CMakeLists.txt
index 015e57f8193ebd..de73f712f1d1ce 100644
--- a/deps/cares/src/lib/CMakeLists.txt
+++ b/deps/cares/src/lib/CMakeLists.txt
@@ -31,7 +31,6 @@ IF (CARES_SHARED)
EXPORT_NAME cares
OUTPUT_NAME cares
COMPILE_PDB_NAME cares
- COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
SOVERSION ${CARES_LIB_VERSION_MAJOR}
VERSION "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}"
C_STANDARD 90
@@ -65,11 +64,13 @@ IF (CARES_SHARED)
COMPONENT Library
${TARGETS_INST_DEST}
)
- INSTALL(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/cares.pdb
- DESTINATION ${CMAKE_INSTALL_BINDIR}
- COMPONENT Library
- OPTIONAL
- )
+ IF (MSVC)
+ INSTALL(FILES $
+ DESTINATION ${CMAKE_INSTALL_BINDIR}
+ COMPONENT Library
+ OPTIONAL
+ )
+ ENDIF ()
ENDIF ()
SET (STATIC_SUFFIX "_static")
@@ -88,7 +89,6 @@ IF (CARES_STATIC)
EXPORT_NAME cares${STATIC_SUFFIX}
OUTPUT_NAME cares${STATIC_SUFFIX}
COMPILE_PDB_NAME cares${STATIC_SUFFIX}
- COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
C_STANDARD 90
)
@@ -116,11 +116,6 @@ IF (CARES_STATIC)
INSTALL (TARGETS ${LIBNAME} EXPORT ${PROJECT_NAME}-targets COMPONENT Devel
${TARGETS_INST_DEST}
)
- INSTALL(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/cares${STATIC_SUFFIX}.pdb
- DESTINATION ${CMAKE_INSTALL_BINDIR}
- COMPONENT Library
- OPTIONAL
- )
ENDIF ()
# For chain building: add alias targets that look like import libs that would be returned by find_package(c-ares).
diff --git a/deps/cares/src/lib/Makefile.in b/deps/cares/src/lib/Makefile.in
index c516cba2cf46d2..0060295c21e8ef 100644
--- a/deps/cares/src/lib/Makefile.in
+++ b/deps/cares/src/lib/Makefile.in
@@ -15,7 +15,7 @@
@SET_MAKE@
# aminclude_static.am generated automatically by Autoconf
-# from AX_AM_MACROS_STATIC on Fri Jan 26 17:16:19 CET 2024
+# from AX_AM_MACROS_STATIC on Sat Mar 30 16:15:43 CET 2024
# Copyright (C) The c-ares project and its contributors
# SPDX-License-Identifier: MIT
@@ -169,14 +169,14 @@ am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \
libcares_la-ares__htable_szvp.lo \
libcares_la-ares__iface_ips.lo libcares_la-ares__llist.lo \
libcares_la-ares__parse_into_addrinfo.lo \
- libcares_la-ares__read_line.lo libcares_la-ares__slist.lo \
- libcares_la-ares__socket.lo libcares_la-ares__sortaddrinfo.lo \
- libcares_la-ares__threads.lo libcares_la-ares__timeval.lo \
- libcares_la-ares_android.lo libcares_la-ares_cancel.lo \
- libcares_la-ares_data.lo libcares_la-ares_destroy.lo \
- libcares_la-ares_dns_mapping.lo libcares_la-ares_dns_name.lo \
- libcares_la-ares_dns_parse.lo libcares_la-ares_dns_record.lo \
- libcares_la-ares_dns_write.lo libcares_la-ares_event_epoll.lo \
+ libcares_la-ares__slist.lo libcares_la-ares__socket.lo \
+ libcares_la-ares__sortaddrinfo.lo libcares_la-ares__threads.lo \
+ libcares_la-ares__timeval.lo libcares_la-ares_android.lo \
+ libcares_la-ares_cancel.lo libcares_la-ares_data.lo \
+ libcares_la-ares_destroy.lo libcares_la-ares_dns_mapping.lo \
+ libcares_la-ares_dns_name.lo libcares_la-ares_dns_parse.lo \
+ libcares_la-ares_dns_record.lo libcares_la-ares_dns_write.lo \
+ libcares_la-ares_event_epoll.lo \
libcares_la-ares_event_kqueue.lo \
libcares_la-ares_event_poll.lo \
libcares_la-ares_event_select.lo \
@@ -193,9 +193,8 @@ am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \
libcares_la-ares_gethostbyname.lo \
libcares_la-ares_getnameinfo.lo libcares_la-ares_getsock.lo \
libcares_la-ares_init.lo libcares_la-ares_library_init.lo \
- libcares_la-ares_math.lo libcares_la-ares_mkquery.lo \
- libcares_la-ares_create_query.lo libcares_la-ares_options.lo \
- libcares_la-ares_parse_a_reply.lo \
+ libcares_la-ares_math.lo libcares_la-ares_create_query.lo \
+ libcares_la-ares_options.lo libcares_la-ares_parse_a_reply.lo \
libcares_la-ares_parse_aaaa_reply.lo \
libcares_la-ares_parse_caa_reply.lo \
libcares_la-ares_parse_mx_reply.lo \
@@ -254,7 +253,6 @@ am__depfiles_remade = \
./$(DEPDIR)/libcares_la-ares__iface_ips.Plo \
./$(DEPDIR)/libcares_la-ares__llist.Plo \
./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo \
- ./$(DEPDIR)/libcares_la-ares__read_line.Plo \
./$(DEPDIR)/libcares_la-ares__slist.Plo \
./$(DEPDIR)/libcares_la-ares__socket.Plo \
./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo \
@@ -292,7 +290,6 @@ am__depfiles_remade = \
./$(DEPDIR)/libcares_la-ares_init.Plo \
./$(DEPDIR)/libcares_la-ares_library_init.Plo \
./$(DEPDIR)/libcares_la-ares_math.Plo \
- ./$(DEPDIR)/libcares_la-ares_mkquery.Plo \
./$(DEPDIR)/libcares_la-ares_options.Plo \
./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo \
./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo \
@@ -505,6 +502,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
@@ -628,7 +626,6 @@ CSOURCES = ares__addrinfo2hostent.c \
ares__iface_ips.c \
ares__llist.c \
ares__parse_into_addrinfo.c \
- ares__read_line.c \
ares__slist.c \
ares__socket.c \
ares__sortaddrinfo.c \
@@ -665,7 +662,6 @@ CSOURCES = ares__addrinfo2hostent.c \
ares_init.c \
ares_library_init.c \
ares_math.c \
- ares_mkquery.c \
ares_create_query.c \
ares_options.c \
ares_parse_a_reply.c \
@@ -834,7 +830,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__iface_ips.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__llist.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__read_line.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__slist.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__socket.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo@am__quote@ # am--include-marker
@@ -872,7 +867,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_init.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_library_init.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_math.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_mkquery.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_options.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo@am__quote@ # am--include-marker
@@ -1019,13 +1013,6 @@ libcares_la-ares__parse_into_addrinfo.lo: ares__parse_into_addrinfo.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__parse_into_addrinfo.lo `test -f 'ares__parse_into_addrinfo.c' || echo '$(srcdir)/'`ares__parse_into_addrinfo.c
-libcares_la-ares__read_line.lo: ares__read_line.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__read_line.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__read_line.Tpo -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__read_line.Tpo $(DEPDIR)/libcares_la-ares__read_line.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__read_line.c' object='libcares_la-ares__read_line.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c
-
libcares_la-ares__slist.lo: ares__slist.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__slist.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__slist.Tpo -c -o libcares_la-ares__slist.lo `test -f 'ares__slist.c' || echo '$(srcdir)/'`ares__slist.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__slist.Tpo $(DEPDIR)/libcares_la-ares__slist.Plo
@@ -1278,13 +1265,6 @@ libcares_la-ares_math.lo: ares_math.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_math.lo `test -f 'ares_math.c' || echo '$(srcdir)/'`ares_math.c
-libcares_la-ares_mkquery.lo: ares_mkquery.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_mkquery.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_mkquery.Tpo -c -o libcares_la-ares_mkquery.lo `test -f 'ares_mkquery.c' || echo '$(srcdir)/'`ares_mkquery.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_mkquery.Tpo $(DEPDIR)/libcares_la-ares_mkquery.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_mkquery.c' object='libcares_la-ares_mkquery.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_mkquery.lo `test -f 'ares_mkquery.c' || echo '$(srcdir)/'`ares_mkquery.c
-
libcares_la-ares_create_query.lo: ares_create_query.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_create_query.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_create_query.Tpo -c -o libcares_la-ares_create_query.lo `test -f 'ares_create_query.c' || echo '$(srcdir)/'`ares_create_query.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_create_query.Tpo $(DEPDIR)/libcares_la-ares_create_query.Plo
@@ -1728,7 +1708,6 @@ distclean: distclean-recursive
-rm -f ./$(DEPDIR)/libcares_la-ares__iface_ips.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares__llist.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo
- -rm -f ./$(DEPDIR)/libcares_la-ares__read_line.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares__slist.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares__socket.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo
@@ -1766,7 +1745,6 @@ distclean: distclean-recursive
-rm -f ./$(DEPDIR)/libcares_la-ares_init.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares_library_init.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares_math.Plo
- -rm -f ./$(DEPDIR)/libcares_la-ares_mkquery.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares_options.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo
@@ -1855,7 +1833,6 @@ maintainer-clean: maintainer-clean-recursive
-rm -f ./$(DEPDIR)/libcares_la-ares__iface_ips.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares__llist.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo
- -rm -f ./$(DEPDIR)/libcares_la-ares__read_line.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares__slist.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares__socket.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo
@@ -1893,7 +1870,6 @@ maintainer-clean: maintainer-clean-recursive
-rm -f ./$(DEPDIR)/libcares_la-ares_init.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares_library_init.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares_math.Plo
- -rm -f ./$(DEPDIR)/libcares_la-ares_mkquery.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares_options.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo
-rm -f ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo
diff --git a/deps/cares/src/lib/Makefile.inc b/deps/cares/src/lib/Makefile.inc
index 29a65fd35b1dd0..38f7a115fe3598 100644
--- a/deps/cares/src/lib/Makefile.inc
+++ b/deps/cares/src/lib/Makefile.inc
@@ -13,7 +13,6 @@ CSOURCES = ares__addrinfo2hostent.c \
ares__iface_ips.c \
ares__llist.c \
ares__parse_into_addrinfo.c \
- ares__read_line.c \
ares__slist.c \
ares__socket.c \
ares__sortaddrinfo.c \
@@ -50,7 +49,6 @@ CSOURCES = ares__addrinfo2hostent.c \
ares_init.c \
ares_library_init.c \
ares_math.c \
- ares_mkquery.c \
ares_create_query.c \
ares_options.c \
ares_parse_a_reply.c \
diff --git a/deps/cares/src/lib/ares__buf.c b/deps/cares/src/lib/ares__buf.c
index 8f9f32d71867ff..0663383df9e42e 100644
--- a/deps/cares/src/lib/ares__buf.c
+++ b/deps/cares/src/lib/ares__buf.c
@@ -45,47 +45,6 @@ struct ares__buf {
* SIZE_MAX if not set. */
};
-ares_bool_t ares__isprint(int ch)
-{
- if (ch >= 0x20 && ch <= 0x7E) {
- return ARES_TRUE;
- }
- return ARES_FALSE;
-}
-
-/* Character set allowed by hostnames. This is to include the normal
- * domain name character set plus:
- * - underscores which are used in SRV records.
- * - Forward slashes such as are used for classless in-addr.arpa
- * delegation (CNAMEs)
- * - Asterisks may be used for wildcard domains in CNAMEs as seen in the
- * real world.
- * While RFC 2181 section 11 does state not to do validation,
- * that applies to servers, not clients. Vulnerabilities have been
- * reported when this validation is not performed. Security is more
- * important than edge-case compatibility (which is probably invalid
- * anyhow). */
-ares_bool_t ares__is_hostnamech(int ch)
-{
- /* [A-Za-z0-9-*._/]
- * Don't use isalnum() as it is locale-specific
- */
- if (ch >= 'A' && ch <= 'Z') {
- return ARES_TRUE;
- }
- if (ch >= 'a' && ch <= 'z') {
- return ARES_TRUE;
- }
- if (ch >= '0' && ch <= '9') {
- return ARES_TRUE;
- }
- if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*') {
- return ARES_TRUE;
- }
-
- return ARES_FALSE;
-}
-
ares__buf_t *ares__buf_create(void)
{
ares__buf_t *buf = ares_malloc_zero(sizeof(*buf));
@@ -630,6 +589,24 @@ ares_status_t ares__buf_fetch_bytes_into_buf(ares__buf_t *buf,
return ares__buf_consume(buf, len);
}
+static ares_bool_t ares__is_whitespace(unsigned char c,
+ ares_bool_t include_linefeed)
+{
+ switch (c) {
+ case '\r':
+ case '\t':
+ case ' ':
+ case '\v':
+ case '\f':
+ return ARES_TRUE;
+ case '\n':
+ return include_linefeed;
+ default:
+ break;
+ }
+ return ARES_FALSE;
+}
+
size_t ares__buf_consume_whitespace(ares__buf_t *buf,
ares_bool_t include_linefeed)
{
@@ -642,24 +619,11 @@ size_t ares__buf_consume_whitespace(ares__buf_t *buf,
}
for (i = 0; i < remaining_len; i++) {
- switch (ptr[i]) {
- case '\r':
- case '\t':
- case ' ':
- case '\v':
- case '\f':
- break;
- case '\n':
- if (!include_linefeed) {
- goto done;
- }
- break;
- default:
- goto done;
+ if (!ares__is_whitespace(ptr[i], include_linefeed)) {
+ break;
}
}
-done:
if (i > 0) {
ares__buf_consume(buf, i);
}
@@ -677,20 +641,11 @@ size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf)
}
for (i = 0; i < remaining_len; i++) {
- switch (ptr[i]) {
- case '\r':
- case '\t':
- case ' ':
- case '\v':
- case '\f':
- case '\n':
- goto done;
- default:
- break;
+ if (ares__is_whitespace(ptr[i], ARES_TRUE)) {
+ break;
}
}
-done:
if (i > 0) {
ares__buf_consume(buf, i);
}
@@ -826,7 +781,7 @@ static ares_bool_t ares__buf_split_isduplicate(ares__llist_t *list,
ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims,
size_t delims_len, ares__buf_split_t flags,
- ares__llist_t **list)
+ size_t max_sections, ares__llist_t **list)
{
ares_status_t status = ARES_SUCCESS;
ares_bool_t first = ARES_TRUE;
@@ -842,20 +797,57 @@ ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims,
}
while (ares__buf_len(buf)) {
- size_t len;
+ size_t len = 0;
+ const unsigned char *ptr;
+
+ if (first) {
+ /* No delimiter yet, just tag the start */
+ ares__buf_tag(buf);
+ } else {
+ if (flags & ARES_BUF_SPLIT_DONT_CONSUME_DELIMS) {
+ /* tag then eat delimiter so its first byte in buffer */
+ ares__buf_tag(buf);
+ ares__buf_consume(buf, 1);
+ } else {
+ /* throw away delimiter */
+ ares__buf_consume(buf, 1);
+ ares__buf_tag(buf);
+ }
+ }
+
+ if (max_sections && ares__llist_len(*list) >= max_sections - 1) {
+ ares__buf_consume(buf, ares__buf_len(buf));
+ } else {
+ ares__buf_consume_until_charset(buf, delims, delims_len, ARES_FALSE);
+ }
- ares__buf_tag(buf);
+ ptr = ares__buf_tag_fetch(buf, &len);
- len = ares__buf_consume_until_charset(buf, delims, delims_len, ARES_FALSE);
+ /* Shouldn't be possible */
+ if (ptr == NULL) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
+
+ if (flags & ARES_BUF_SPLIT_LTRIM) {
+ size_t i;
+ for (i = 0; i < len; i++) {
+ if (!ares__is_whitespace(ptr[i], ARES_TRUE)) {
+ break;
+ }
+ }
+ ptr += i;
+ len -= i;
+ }
- /* Don't treat a delimiter as part of the length */
- if (!first && len && flags & ARES_BUF_SPLIT_DONT_CONSUME_DELIMS) {
- len--;
+ if (flags & ARES_BUF_SPLIT_RTRIM) {
+ while (len && ares__is_whitespace(ptr[len - 1], ARES_TRUE)) {
+ len--;
+ }
}
if (len != 0 || flags & ARES_BUF_SPLIT_ALLOW_BLANK) {
- const unsigned char *ptr = ares__buf_tag_fetch(buf, &len);
- ares__buf_t *data;
+ ares__buf_t *data;
if (!(flags & ARES_BUF_SPLIT_NO_DUPLICATES) ||
!ares__buf_split_isduplicate(*list, ptr, len, flags)) {
@@ -880,12 +872,6 @@ ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims,
}
}
- if (!(flags & ARES_BUF_SPLIT_DONT_CONSUME_DELIMS) &&
- ares__buf_len(buf) != 0) {
- /* Consume delimiter */
- ares__buf_consume(buf, 1);
- }
-
first = ARES_FALSE;
}
@@ -1150,3 +1136,80 @@ ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data,
return ARES_SUCCESS;
}
+
+ares_status_t ares__buf_load_file(const char *filename, ares__buf_t *buf)
+{
+ FILE *fp = NULL;
+ unsigned char *ptr = NULL;
+ size_t len = 0;
+ size_t ptr_len = 0;
+ long ftell_len = 0;
+ ares_status_t status;
+
+ if (filename == NULL || buf == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ fp = fopen(filename, "rb");
+ if (fp == NULL) {
+ int error = ERRNO;
+ switch (error) {
+ case ENOENT:
+ case ESRCH:
+ status = ARES_ENOTFOUND;
+ goto done;
+ default:
+ DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
+ strerror(error)));
+ DEBUGF(fprintf(stderr, "Error opening file: %s\n", filename));
+ status = ARES_EFILE;
+ goto done;
+ }
+ }
+
+ /* Get length portably, fstat() is POSIX, not C */
+ if (fseek(fp, 0, SEEK_END) != 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ ftell_len = ftell(fp);
+ if (ftell_len < 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+ len = (size_t)ftell_len;
+
+ if (fseek(fp, 0, SEEK_SET) != 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ if (len == 0) {
+ status = ARES_SUCCESS;
+ goto done;
+ }
+
+ /* Read entire data into buffer */
+ ptr_len = len;
+ ptr = ares__buf_append_start(buf, &ptr_len);
+ if (ptr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ ptr_len = fread(ptr, 1, len, fp);
+ if (ptr_len != len) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ ares__buf_append_finish(buf, len);
+ status = ARES_SUCCESS;
+
+done:
+ if (fp != NULL) {
+ fclose(fp);
+ }
+ return status;
+}
diff --git a/deps/cares/src/lib/ares__buf.h b/deps/cares/src/lib/ares__buf.h
index 52054a0b33c658..4298814f7b4396 100644
--- a/deps/cares/src/lib/ares__buf.h
+++ b/deps/cares/src/lib/ares__buf.h
@@ -177,7 +177,7 @@ void ares__buf_append_finish(ares__buf_t *buf, size_t len);
*
* \param[in] buf Initialized buffer object.
* \param[in] data Data to hex dump
- * \param[in] data_len Length of data to hexdump
+ * \param[in] len Length of data to hexdump
* \return ARES_SUCCESS on success.
*/
ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data,
@@ -373,7 +373,8 @@ size_t ares__buf_consume_whitespace(ares__buf_t *buf,
size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf);
-/*! Consume until a character in the character set provided is reached
+/*! Consume until a character in the character set provided is reached. Does
+ * not include the character from the charset at the end.
*
* \param[in] buf Initialized buffer object
* \param[in] charset character set
@@ -414,7 +415,9 @@ typedef enum {
/*! No flags */
ARES_BUF_SPLIT_NONE = 0,
/*! The delimiter will be the first character in the buffer, except the
- * first buffer since the start doesn't have a delimiter
+ * first buffer since the start doesn't have a delimiter. This option is
+ * incompatible with ARES_BUF_SPLIT_LTRIM since the delimiter is always
+ * the first character.
*/
ARES_BUF_SPLIT_DONT_CONSUME_DELIMS = 1 << 0,
/*! Allow blank sections, by default blank sections are not emitted. If using
@@ -424,7 +427,13 @@ typedef enum {
/*! Remove duplicate entries */
ARES_BUF_SPLIT_NO_DUPLICATES = 1 << 2,
/*! Perform case-insensitive matching when comparing values */
- ARES_BUF_SPLIT_CASE_INSENSITIVE = 1 << 3
+ ARES_BUF_SPLIT_CASE_INSENSITIVE = 1 << 3,
+ /*! Trim leading whitespace from buffer */
+ ARES_BUF_SPLIT_LTRIM = 1 << 4,
+ /*! Trim trailing whitespace from buffer */
+ ARES_BUF_SPLIT_RTRIM = 1 << 5,
+ /*! Trim leading and trailing whitespace from buffer */
+ ARES_BUF_SPLIT_TRIM = (ARES_BUF_SPLIT_LTRIM | ARES_BUF_SPLIT_RTRIM)
} ares__buf_split_t;
/*! Split the provided buffer into multiple sub-buffers stored in the variable
@@ -435,6 +444,12 @@ typedef enum {
* \param[in] delims Possible delimiters
* \param[in] delims_len Length of possible delimiters
* \param[in] flags One more more flags
+ * \param[in] max_sections Maximum number of sections. Use 0 for
+ * unlimited. Useful for splitting key/value
+ * pairs where the delimiter may be a valid
+ * character in the value. A value of 1 would
+ * have little usefulness and would effectively
+ * ignore the delimiter itself.
* \param[out] list Result. Depending on flags, this may be a
* valid list with no elements. Use
* ares__llist_destroy() to free the memory which
@@ -444,7 +459,7 @@ typedef enum {
*/
ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims,
size_t delims_len, ares__buf_split_t flags,
- ares__llist_t **list);
+ size_t max_sections, ares__llist_t **list);
/*! Check the unprocessed buffer to see if it begins with the sequence of
@@ -536,7 +551,7 @@ size_t ares__buf_get_position(const ares__buf_t *buf);
* \param[in] remaining_len maximum length that should be used for parsing
* the string, this is often less than the remaining
* buffer and is based on the RR record length.
- * \param[out] str Pointer passed by reference to be filled in with
+ * \param[out] name Pointer passed by reference to be filled in with
* allocated string of the parsed that must be
* ares_free()'d by the caller.
* \param[in] allow_multiple ARES_TRUE if it should attempt to parse multiple
@@ -567,6 +582,18 @@ ares_status_t ares__buf_parse_dns_str(ares__buf_t *buf, size_t remaining_len,
ares_status_t ares__buf_parse_dns_binstr(ares__buf_t *buf, size_t remaining_len,
unsigned char **bin, size_t *bin_len,
ares_bool_t allow_multiple);
+
+/*! Load data from specified file path into provided buffer. The entire file
+ * is loaded into memory.
+ *
+ * \param[in] filename complete path to file
+ * \param[in,out] buf Initialized (non-const) buffer object to load data
+ * into
+ * \return ARES_ENOTFOUND if file not found, ARES_EFILE if issues reading
+ * file, ARES_ENOMEM if out of memory, ARES_SUCCESS on success.
+ */
+ares_status_t ares__buf_load_file(const char *filename, ares__buf_t *buf);
+
/*! @} */
#endif /* __ARES__BUF_H */
diff --git a/deps/cares/src/lib/ares__hosts_file.c b/deps/cares/src/lib/ares__hosts_file.c
index c6fe63a429d269..e279623de37e64 100644
--- a/deps/cares/src/lib/ares__hosts_file.c
+++ b/deps/cares/src/lib/ares__hosts_file.c
@@ -98,95 +98,6 @@ struct ares_hosts_entry {
ares__llist_t *hosts;
};
-static ares_status_t ares__read_file_into_buf(const char *filename,
- ares__buf_t *buf)
-{
- FILE *fp = NULL;
- unsigned char *ptr = NULL;
- size_t len = 0;
- size_t ptr_len = 0;
- long ftell_len = 0;
- ares_status_t status;
-
- if (filename == NULL || buf == NULL) {
- return ARES_EFORMERR;
- }
-
- fp = fopen(filename, "rb");
- if (fp == NULL) {
- int error = ERRNO;
- switch (error) {
- case ENOENT:
- case ESRCH:
- status = ARES_ENOTFOUND;
- goto done;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
- strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n", filename));
- status = ARES_EFILE;
- goto done;
- }
- }
-
- /* Get length portably, fstat() is POSIX, not C */
- if (fseek(fp, 0, SEEK_END) != 0) {
- status = ARES_EFILE;
- goto done;
- }
-
- ftell_len = ftell(fp);
- if (ftell_len < 0) {
- status = ARES_EFILE;
- goto done;
- }
- len = (size_t)ftell_len;
-
- if (fseek(fp, 0, SEEK_SET) != 0) {
- status = ARES_EFILE;
- goto done;
- }
-
- if (len == 0) {
- status = ARES_SUCCESS;
- goto done;
- }
-
- /* Read entire data into buffer */
- ptr_len = len;
- ptr = ares__buf_append_start(buf, &ptr_len);
- if (ptr == NULL) {
- status = ARES_ENOMEM;
- goto done;
- }
-
- ptr_len = fread(ptr, 1, len, fp);
- if (ptr_len != len) {
- status = ARES_EFILE;
- goto done;
- }
-
- ares__buf_append_finish(buf, len);
- status = ARES_SUCCESS;
-
-done:
- if (fp != NULL) {
- fclose(fp);
- }
- return status;
-}
-
-static ares_bool_t ares__is_hostname(const char *str)
-{
- size_t i;
- for (i = 0; str[i] != 0; i++) {
- if (!ares__is_hostnamech(str[i])) {
- return ARES_FALSE;
- }
- }
- return ARES_TRUE;
-}
-
const void *ares_dns_pton(const char *ipaddr, struct ares_addr *addr,
size_t *out_len)
{
@@ -605,7 +516,7 @@ static ares_status_t ares__parse_hosts(const char *filename,
goto done;
}
- status = ares__read_file_into_buf(filename, buf);
+ status = ares__buf_load_file(filename, buf);
if (status != ARES_SUCCESS) {
goto done;
}
diff --git a/deps/cares/src/lib/ares__htable.h b/deps/cares/src/lib/ares__htable.h
index fd1c0a2366022f..d09c865977cdae 100644
--- a/deps/cares/src/lib/ares__htable.h
+++ b/deps/cares/src/lib/ares__htable.h
@@ -58,21 +58,21 @@ typedef struct ares__htable ares__htable_t;
* but otherwise will not change between calls.
* \return hash
*/
-typedef unsigned int (*ares__htable_hashfunc_t)(const void *key,
+typedef unsigned int (*ares__htable_hashfunc_t)(const void *key,
unsigned int seed);
/*! Callback to free the bucket
*
* \param[in] bucket user provided bucket
*/
-typedef void (*ares__htable_bucket_free_t)(void *bucket);
+typedef void (*ares__htable_bucket_free_t)(void *bucket);
/*! Callback to extract the key from the user-provided bucket
*
* \param[in] bucket user provided bucket
* \return pointer to key held in bucket
*/
-typedef const void *(*ares__htable_bucket_key_t)(const void *bucket);
+typedef const void *(*ares__htable_bucket_key_t)(const void *bucket);
/*! Callback to compare two keys for equality
*
@@ -80,15 +80,15 @@ typedef const void *(*ares__htable_bucket_key_t)(const void *bucket);
* \param[in] key2 second key
* \return ARES_TRUE if equal, ARES_FALSE if not
*/
-typedef ares_bool_t (*ares__htable_key_eq_t)(const void *key1,
+typedef ares_bool_t (*ares__htable_key_eq_t)(const void *key1,
const void *key2);
/*! Destroy the initialized hashtable
*
- * \param[in] initialized hashtable
+ * \param[in] htable initialized hashtable
*/
-void ares__htable_destroy(ares__htable_t *htable);
+void ares__htable_destroy(ares__htable_t *htable);
/*! Create a new hashtable
*
diff --git a/deps/cares/src/lib/ares__htable_asvp.h b/deps/cares/src/lib/ares__htable_asvp.h
index ee253455b2690c..49a766d023091e 100644
--- a/deps/cares/src/lib/ares__htable_asvp.h
+++ b/deps/cares/src/lib/ares__htable_asvp.h
@@ -51,7 +51,7 @@ typedef struct ares__htable_asvp ares__htable_asvp_t;
*
* \param[in] val user-supplied value
*/
-typedef void (*ares__htable_asvp_val_free_t)(void *val);
+typedef void (*ares__htable_asvp_val_free_t)(void *val);
/*! Destroy hashtable
*
@@ -71,7 +71,7 @@ ares__htable_asvp_t *
/*! Retrieve an array of keys from the hashtable.
*
* \param[in] htable Initialized hashtable
- * \param[out] num_keys Count of returned keys
+ * \param[out] num Count of returned keys
* \return Array of keys in the hashtable. Must be free'd with ares_free().
*/
ares_socket_t *ares__htable_asvp_keys(const ares__htable_asvp_t *htable,
diff --git a/deps/cares/src/lib/ares__htable_strvp.h b/deps/cares/src/lib/ares__htable_strvp.h
index 80d375c06804a5..25dd2b90777d8d 100644
--- a/deps/cares/src/lib/ares__htable_strvp.h
+++ b/deps/cares/src/lib/ares__htable_strvp.h
@@ -49,7 +49,7 @@ typedef struct ares__htable_strvp ares__htable_strvp_t;
*
* \param[in] val user-supplied value
*/
-typedef void (*ares__htable_strvp_val_free_t)(void *val);
+typedef void (*ares__htable_strvp_val_free_t)(void *val);
/*! Destroy hashtable
*
diff --git a/deps/cares/src/lib/ares__htable_szvp.h b/deps/cares/src/lib/ares__htable_szvp.h
index 9857afe79604d3..62b1776be92b5b 100644
--- a/deps/cares/src/lib/ares__htable_szvp.h
+++ b/deps/cares/src/lib/ares__htable_szvp.h
@@ -49,7 +49,7 @@ typedef struct ares__htable_szvp ares__htable_szvp_t;
*
* \param[in] val user-supplied value
*/
-typedef void (*ares__htable_szvp_val_free_t)(void *val);
+typedef void (*ares__htable_szvp_val_free_t)(void *val);
/*! Destroy hashtable
*
diff --git a/deps/cares/src/lib/ares__llist.h b/deps/cares/src/lib/ares__llist.h
index bd18bb9ec1d54c..7d57bdab3b077c 100644
--- a/deps/cares/src/lib/ares__llist.h
+++ b/deps/cares/src/lib/ares__llist.h
@@ -52,7 +52,7 @@ typedef struct ares__llist_node ares__llist_node_t;
*
* \param[in] data user supplied data
*/
-typedef void (*ares__llist_destructor_t)(void *data);
+typedef void (*ares__llist_destructor_t)(void *data);
/*! Create a linked list object
*
@@ -201,8 +201,8 @@ void ares__llist_destroy(ares__llist_t *list);
/*! Detach node from the current list and re-attach it to the new list as the
* last entry.
*
- * \param[in] node node to move
- * \param[in] parent new list
+ * \param[in] node node to move
+ * \param[in] new_parent new list
*/
void ares__llist_node_move_parent_last(ares__llist_node_t *node,
ares__llist_t *new_parent);
@@ -210,8 +210,8 @@ void ares__llist_node_move_parent_last(ares__llist_node_t *node,
/*! Detach node from the current list and re-attach it to the new list as the
* first entry.
*
- * \param[in] node node to move
- * \param[in] parent new list
+ * \param[in] node node to move
+ * \param[in] new_parent new list
*/
void ares__llist_node_move_parent_first(ares__llist_node_t *node,
ares__llist_t *new_parent);
diff --git a/deps/cares/src/lib/ares__parse_into_addrinfo.c b/deps/cares/src/lib/ares__parse_into_addrinfo.c
index a5ce0c594fc3be..90e951c02f3f6d 100644
--- a/deps/cares/src/lib/ares__parse_into_addrinfo.c
+++ b/deps/cares/src/lib/ares__parse_into_addrinfo.c
@@ -47,13 +47,12 @@
#include "ares.h"
#include "ares_private.h"
-ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen,
+ares_status_t ares__parse_into_addrinfo(const ares_dns_record_t *dnsrec,
ares_bool_t cname_only_is_enodata,
unsigned short port,
struct ares_addrinfo *ai)
{
ares_status_t status;
- ares_dns_record_t *dnsrec = NULL;
size_t i;
size_t ancount;
const char *hostname = NULL;
@@ -63,11 +62,6 @@ ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen,
struct ares_addrinfo_cname *cnames = NULL;
struct ares_addrinfo_node *nodes = NULL;
- status = ares_dns_parse(abuf, alen, 0, &dnsrec);
- if (status != ARES_SUCCESS) {
- goto done;
- }
-
/* Save question hostname */
status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL);
if (status != ARES_SUCCESS) {
@@ -83,7 +77,7 @@ ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen,
for (i = 0; i < ancount; i++) {
ares_dns_rec_type_t rtype;
const ares_dns_rr_t *rr =
- ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+ ares_dns_record_rr_get_const(dnsrec, ARES_SECTION_ANSWER, i);
if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) {
continue;
@@ -177,7 +171,6 @@ ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen,
done:
ares__freeaddrinfo_cnames(cnames);
ares__freeaddrinfo_nodes(nodes);
- ares_dns_record_destroy(dnsrec);
/* compatibility */
if (status == ARES_EBADNAME) {
diff --git a/deps/cares/src/lib/ares__read_line.c b/deps/cares/src/lib/ares__read_line.c
deleted file mode 100644
index 018f55e8b2681f..00000000000000
--- a/deps/cares/src/lib/ares__read_line.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
- *
- * 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 (including the next
- * paragraph) 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.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-
-#include "ares.h"
-#include "ares_private.h"
-
-/* This is an internal function. Its contract is to read a line from
- * a file into a dynamically allocated buffer, zeroing the trailing
- * newline if there is one. The calling routine may call
- * ares__read_line multiple times with the same buf and bufsize
- * pointers; *buf will be reallocated and *bufsize adjusted as
- * appropriate. The initial value of *buf should be NULL. After the
- * calling routine is done reading lines, it should free *buf.
- */
-ares_status_t ares__read_line(FILE *fp, char **buf, size_t *bufsize)
-{
- char *newbuf;
- size_t offset = 0;
- size_t len;
-
- if (*buf == NULL) {
- *buf = ares_malloc(128);
- if (!*buf) {
- return ARES_ENOMEM;
- }
- *bufsize = 128;
- }
-
- for (;;) {
- int bytestoread = (int)(*bufsize - offset);
-
- if (!fgets(*buf + offset, bytestoread, fp)) {
- return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF;
- }
- len = offset + ares_strlen(*buf + offset);
-
- /* Probably means there was an embedded NULL as the first character in
- * the line, throw away line */
- if (len == 0) {
- offset = 0;
- continue;
- }
-
- if ((*buf)[len - 1] == '\n') {
- (*buf)[len - 1] = 0;
- break;
- }
- offset = len;
- if (len < *bufsize - 1) {
- continue;
- }
-
- /* Allocate more space. */
- newbuf = ares_realloc(*buf, *bufsize * 2);
- if (!newbuf) {
- ares_free(*buf);
- *buf = NULL;
- return ARES_ENOMEM;
- }
- *buf = newbuf;
- *bufsize *= 2;
- }
- return ARES_SUCCESS;
-}
diff --git a/deps/cares/src/lib/ares__slist.h b/deps/cares/src/lib/ares__slist.h
index 04cd50806ebc2d..26af88fa782499 100644
--- a/deps/cares/src/lib/ares__slist.h
+++ b/deps/cares/src/lib/ares__slist.h
@@ -63,7 +63,7 @@ typedef struct ares__slist_node ares__slist_node_t;
*
* \param[in] data User-defined data to destroy
*/
-typedef void (*ares__slist_destructor_t)(void *data);
+typedef void (*ares__slist_destructor_t)(void *data);
/*! SkipList comparison function
*
@@ -71,7 +71,7 @@ typedef void (*ares__slist_destructor_t)(void *data);
* \param[in] data2 Second user-defined data object
* \return < 0 if data1 < data1, > 0 if data1 > data2, 0 if data1 == data2
*/
-typedef int (*ares__slist_cmp_t)(const void *data1, const void *data2);
+typedef int (*ares__slist_cmp_t)(const void *data1, const void *data2);
/*! Create SkipList
*
diff --git a/deps/cares/src/lib/ares__threads.c b/deps/cares/src/lib/ares__threads.c
index 028790aead5abe..f6de8c698e373d 100644
--- a/deps/cares/src/lib/ares__threads.c
+++ b/deps/cares/src/lib/ares__threads.c
@@ -138,9 +138,9 @@ struct ares__thread {
HANDLE thread;
DWORD id;
- void *(*func)(void *arg);
- void *arg;
- void *rv;
+ void *(*func)(void *arg);
+ void *arg;
+ void *rv;
};
/* Wrap for pthread compatibility */
@@ -335,8 +335,8 @@ static void ares__timespec_timeout(struct timespec *ts, unsigned long add_ms)
# error cannot determine current system time
# endif
- ts->tv_sec += add_ms / 1000;
- ts->tv_nsec += (add_ms % 1000) * 1000000;
+ ts->tv_sec += (time_t)(add_ms / 1000);
+ ts->tv_nsec += (long)((add_ms % 1000) * 1000000);
/* Normalize if needed */
if (ts->tv_nsec >= 1000000000) {
diff --git a/deps/cares/src/lib/ares__threads.h b/deps/cares/src/lib/ares__threads.h
index 39764296478a07..108354dfc1e17f 100644
--- a/deps/cares/src/lib/ares__threads.h
+++ b/deps/cares/src/lib/ares__threads.h
@@ -52,9 +52,9 @@ ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond,
struct ares__thread;
typedef struct ares__thread ares__thread_t;
-typedef void *(*ares__thread_func_t)(void *arg);
-ares_status_t ares__thread_create(ares__thread_t **thread,
- ares__thread_func_t func, void *arg);
+typedef void *(*ares__thread_func_t)(void *arg);
+ares_status_t ares__thread_create(ares__thread_t **thread,
+ ares__thread_func_t func, void *arg);
ares_status_t ares__thread_join(ares__thread_t *thread, void **rv);
#endif
diff --git a/deps/cares/src/lib/ares_cancel.c b/deps/cares/src/lib/ares_cancel.c
index 0ee6124dd71440..5a9fb722cb7778 100644
--- a/deps/cares/src/lib/ares_cancel.c
+++ b/deps/cares/src/lib/ares_cancel.c
@@ -74,7 +74,7 @@ void ares_cancel(ares_channel_t *channel)
query->node_all_queries = NULL;
/* NOTE: its possible this may enqueue new queries */
- query->callback(query->arg, ARES_ECANCELLED, 0, NULL, 0);
+ query->callback(query->arg, ARES_ECANCELLED, 0, NULL);
ares__free_query(query);
/* See if the connection should be cleaned up */
diff --git a/deps/cares/src/lib/ares_config.h.cmake b/deps/cares/src/lib/ares_config.h.cmake
index 01dcccaa17c2b4..10a1b7a971604b 100644
--- a/deps/cares/src/lib/ares_config.h.cmake
+++ b/deps/cares/src/lib/ares_config.h.cmake
@@ -212,6 +212,9 @@
/* Define to 1 if you have the header file. */
#cmakedefine HAVE_NETINET_IN_H
+/* Define to 1 if you have the header file. */
+#cmakedefine HAVE_NETINET6_IN6_H
+
/* Define to 1 if you have the header file. */
#cmakedefine HAVE_NETINET_TCP_H
diff --git a/deps/cares/src/lib/ares_config.h.in b/deps/cares/src/lib/ares_config.h.in
index 4e07e58473a009..f486b6b4f000b9 100644
--- a/deps/cares/src/lib/ares_config.h.in
+++ b/deps/cares/src/lib/ares_config.h.in
@@ -186,6 +186,9 @@
/* Define to 1 if you have the header file. */
#undef HAVE_NETDB_H
+/* Define to 1 if you have the header file. */
+#undef HAVE_NETINET6_IN6_H
+
/* Define to 1 if you have the header file. */
#undef HAVE_NETINET_IN_H
diff --git a/deps/cares/src/lib/ares_create_query.c b/deps/cares/src/lib/ares_create_query.c
index f66b0ff6e0693d..a2f2caac6e95d9 100644
--- a/deps/cares/src/lib/ares_create_query.c
+++ b/deps/cares/src/lib/ares_create_query.c
@@ -28,13 +28,15 @@
#include "ares.h"
#include "ares_private.h"
-int ares_create_query(const char *name, int dnsclass, int type,
- unsigned short id, int rd, unsigned char **bufp,
- int *buflenp, int max_udp_size)
+static int ares_create_query_int(const char *name, int dnsclass, int type,
+ unsigned short id, int rd,
+ unsigned char **bufp, int *buflenp,
+ int max_udp_size)
{
ares_status_t status;
ares_dns_record_t *dnsrec = NULL;
size_t len;
+ ares_dns_flags_t rd_flag = rd ? ARES_FLAG_RD : 0;
if (name == NULL || bufp == NULL || buflenp == NULL) {
status = ARES_EFORMERR;
@@ -44,56 +46,13 @@ int ares_create_query(const char *name, int dnsclass, int type,
*bufp = NULL;
*buflenp = 0;
- /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
- if (ares__is_onion_domain(name)) {
- status = ARES_ENOTFOUND;
- goto done;
- }
-
- status = ares_dns_record_create(&dnsrec, id, rd ? ARES_FLAG_RD : 0,
- ARES_OPCODE_QUERY, ARES_RCODE_NOERROR);
+ status = ares_dns_record_create_query(
+ &dnsrec, name, (ares_dns_class_t)dnsclass, (ares_dns_rec_type_t)type, id,
+ rd_flag, (size_t)max_udp_size);
if (status != ARES_SUCCESS) {
goto done;
}
- status = ares_dns_record_query_add(dnsrec, name, (ares_dns_rec_type_t)type,
- (ares_dns_class_t)dnsclass);
- if (status != ARES_SUCCESS) {
- goto done;
- }
-
- /* max_udp_size > 0 indicates EDNS, so send OPT RR as an additional record */
- if (max_udp_size > 0) {
- ares_dns_rr_t *rr = NULL;
-
- status = ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, "",
- ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0);
- if (status != ARES_SUCCESS) {
- goto done;
- }
-
- if (max_udp_size > 65535) {
- status = ARES_EFORMERR;
- goto done;
- }
-
- status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE,
- (unsigned short)max_udp_size);
- if (status != ARES_SUCCESS) {
- goto done;
- }
-
- status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0);
- if (status != ARES_SUCCESS) {
- goto done;
- }
-
- status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0);
- if (status != ARES_SUCCESS) {
- goto done;
- }
- }
-
status = ares_dns_write(dnsrec, bufp, &len);
if (status != ARES_SUCCESS) {
goto done;
@@ -105,3 +64,17 @@ int ares_create_query(const char *name, int dnsclass, int type,
ares_dns_record_destroy(dnsrec);
return (int)status;
}
+
+int ares_create_query(const char *name, int dnsclass, int type,
+ unsigned short id, int rd, unsigned char **bufp,
+ int *buflenp, int max_udp_size)
+{
+ return ares_create_query_int(name, dnsclass, type, id, rd, bufp, buflenp,
+ max_udp_size);
+}
+
+int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
+ int rd, unsigned char **buf, int *buflen)
+{
+ return ares_create_query_int(name, dnsclass, type, id, rd, buf, buflen, 0);
+}
diff --git a/deps/cares/src/lib/ares_destroy.c b/deps/cares/src/lib/ares_destroy.c
index 145084577f7fba..6965b601e76e07 100644
--- a/deps/cares/src/lib/ares_destroy.c
+++ b/deps/cares/src/lib/ares_destroy.c
@@ -51,7 +51,7 @@ void ares_destroy(ares_channel_t *channel)
struct query *query = ares__llist_node_claim(node);
query->node_all_queries = NULL;
- query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL, 0);
+ query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL);
ares__free_query(query);
node = next;
diff --git a/deps/cares/src/lib/ares_dns_mapping.c b/deps/cares/src/lib/ares_dns_mapping.c
index 55f1af7939c32f..2b463fe83128a7 100644
--- a/deps/cares/src/lib/ares_dns_mapping.c
+++ b/deps/cares/src/lib/ares_dns_mapping.c
@@ -883,3 +883,37 @@ const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode)
return "UNKNOWN";
}
+
+/* Convert an rcode and ancount from a query reply into an ares_status_t
+ * value. Used internally by ares_search() and ares_query().
+ */
+ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode,
+ size_t ancount)
+{
+ ares_status_t status = ARES_SUCCESS;
+
+ switch (rcode) {
+ case ARES_RCODE_NOERROR:
+ status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA;
+ break;
+ case ARES_RCODE_FORMERR:
+ status = ARES_EFORMERR;
+ break;
+ case ARES_RCODE_SERVFAIL:
+ status = ARES_ESERVFAIL;
+ break;
+ case ARES_RCODE_NXDOMAIN:
+ status = ARES_ENOTFOUND;
+ break;
+ case ARES_RCODE_NOTIMP:
+ status = ARES_ENOTIMP;
+ break;
+ case ARES_RCODE_REFUSED:
+ status = ARES_EREFUSED;
+ break;
+ default:
+ break;
+ }
+
+ return status;
+}
diff --git a/deps/cares/src/lib/ares_dns_private.h b/deps/cares/src/lib/ares_dns_private.h
index 91635e74cd8010..3af4b3c9926e42 100644
--- a/deps/cares/src/lib/ares_dns_private.h
+++ b/deps/cares/src/lib/ares_dns_private.h
@@ -49,6 +49,33 @@ ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec);
void ares_dns_record_write_ttl_decrement(ares_dns_record_t *dnsrec,
unsigned int ttl_decrement);
+/*! Create a DNS record object for a query. The arguments are the same as
+ * those for ares_create_query().
+ *
+ * \param[out] dnsrec DNS record object to create.
+ * \param[in] name NUL-terminated name for the query.
+ * \param[in] dnsclass Class for the query.
+ * \param[in] type Type for the query.
+ * \param[in] id Identifier for the query.
+ * \param[in] flags Flags for the query.
+ * \param[in] max_udp_size Maximum size of a UDP packet for EDNS.
+ * \return ARES_SUCCESS on success, otherwise an error code.
+ */
+ares_status_t
+ ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type, unsigned short id,
+ ares_dns_flags_t flags, size_t max_udp_size);
+
+/*! Convert the RCODE and ANCOUNT from a DNS query reply into a status code.
+ *
+ * \param[in] rcode The RCODE from the reply.
+ * \param[in] ancount The ANCOUNT from the reply.
+ * \return An appropriate status code.
+ */
+ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode,
+ size_t ancount);
+
struct ares_dns_qd {
char *name;
ares_dns_rec_type_t qtype;
diff --git a/deps/cares/src/lib/ares_dns_record.c b/deps/cares/src/lib/ares_dns_record.c
index 30219003e24a57..ec7f7e734302de 100644
--- a/deps/cares/src/lib/ares_dns_record.c
+++ b/deps/cares/src/lib/ares_dns_record.c
@@ -276,6 +276,39 @@ ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec,
return ARES_SUCCESS;
}
+ares_status_t ares_dns_record_query_set_name(ares_dns_record_t *dnsrec,
+ size_t idx, const char *name)
+{
+ char *orig_name = NULL;
+
+ if (dnsrec == NULL || idx >= dnsrec->qdcount || name == NULL) {
+ return ARES_EFORMERR;
+ }
+ orig_name = dnsrec->qd[idx].name;
+ dnsrec->qd[idx].name = ares_strdup(name);
+ if (dnsrec->qd[idx].name == NULL) {
+ dnsrec->qd[idx].name = orig_name;
+ return ARES_ENOMEM;
+ }
+
+ ares_free(orig_name);
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_query_set_type(ares_dns_record_t *dnsrec,
+ size_t idx,
+ ares_dns_rec_type_t qtype)
+{
+ if (dnsrec == NULL || idx >= dnsrec->qdcount ||
+ !ares_dns_rec_type_isvalid(qtype, ARES_TRUE)) {
+ return ARES_EFORMERR;
+ }
+
+ dnsrec->qd[idx].qtype = qtype;
+
+ return ARES_SUCCESS;
+}
+
ares_status_t ares_dns_record_query_get(const ares_dns_record_t *dnsrec,
size_t idx, const char **name,
ares_dns_rec_type_t *qtype,
@@ -499,7 +532,7 @@ ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec,
return &rr_ptr[idx];
}
-static const ares_dns_rr_t *
+const ares_dns_rr_t *
ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec,
ares_dns_section_t sect, size_t idx)
{
@@ -1314,3 +1347,103 @@ ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec)
}
return ARES_FALSE;
}
+
+/* Construct a DNS record for a name with given class and type. Used internally
+ * by ares_search() and ares_create_query().
+ */
+ares_status_t
+ ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type, unsigned short id,
+ ares_dns_flags_t flags, size_t max_udp_size)
+{
+ ares_status_t status;
+ ares_dns_rr_t *rr = NULL;
+
+ if (dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *dnsrec = NULL;
+
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN */
+ if (ares__is_onion_domain(name)) {
+ status = ARES_ENOTFOUND;
+ goto done;
+ }
+
+ status = ares_dns_record_create(dnsrec, id, (unsigned short)flags,
+ ARES_OPCODE_QUERY, ARES_RCODE_NOERROR);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_record_query_add(*dnsrec, name, type, dnsclass);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* max_udp_size > 0 indicates EDNS, so send OPT RR as an additional record */
+ if (max_udp_size > 0) {
+ /* max_udp_size must fit into a 16 bit unsigned integer field on the OPT
+ * RR, so check here that it fits
+ */
+ if (max_udp_size > 65535) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
+
+ status = ares_dns_record_rr_add(&rr, *dnsrec, ARES_SECTION_ADDITIONAL, "",
+ ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE,
+ (unsigned short)max_udp_size);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares_dns_record_destroy(*dnsrec);
+ *dnsrec = NULL;
+ }
+ return status;
+}
+
+ares_dns_record_t *ares_dns_record_duplicate(const ares_dns_record_t *dnsrec)
+{
+ unsigned char *data = NULL;
+ size_t data_len = 0;
+ ares_dns_record_t *out = NULL;
+ ares_status_t status;
+
+ if (dnsrec == NULL) {
+ return NULL;
+ }
+
+ status = ares_dns_write(dnsrec, &data, &data_len);
+ if (status != ARES_SUCCESS) {
+ return NULL;
+ }
+
+ status = ares_dns_parse(data, data_len, 0, &out);
+ ares_free(data);
+ if (status != ARES_SUCCESS) {
+ return NULL;
+ }
+ return out;
+}
diff --git a/deps/cares/src/lib/ares_dns_write.c b/deps/cares/src/lib/ares_dns_write.c
index 2e99c5ba88aee7..b49ec07bcb9b6b 100644
--- a/deps/cares/src/lib/ares_dns_write.c
+++ b/deps/cares/src/lib/ares_dns_write.c
@@ -831,10 +831,10 @@ static ares_status_t ares_dns_write_rr_raw_rr(ares__buf_t *buf,
return ares__buf_append(buf, data, data_len);
}
-static ares_status_t ares_dns_write_rr(ares_dns_record_t *dnsrec,
- ares__llist_t **namelist,
- ares_dns_section_t section,
- ares__buf_t *buf)
+static ares_status_t ares_dns_write_rr(const ares_dns_record_t *dnsrec,
+ ares__llist_t **namelist,
+ ares_dns_section_t section,
+ ares__buf_t *buf)
{
size_t i;
@@ -849,7 +849,7 @@ static ares_status_t ares_dns_write_rr(ares_dns_record_t *dnsrec,
size_t end_length;
unsigned int ttl;
- rr = ares_dns_record_rr_get(dnsrec, section, i);
+ rr = ares_dns_record_rr_get_const(dnsrec, section, i);
if (rr == NULL) {
return ARES_EFORMERR;
}
@@ -988,8 +988,8 @@ static ares_status_t ares_dns_write_rr(ares_dns_record_t *dnsrec,
return ARES_SUCCESS;
}
-ares_status_t ares_dns_write(ares_dns_record_t *dnsrec, unsigned char **buf,
- size_t *buf_len)
+ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec,
+ unsigned char **buf, size_t *buf_len)
{
ares__buf_t *b = NULL;
ares_status_t status;
diff --git a/deps/cares/src/lib/ares_event.h b/deps/cares/src/lib/ares_event.h
index 9d01d75f372afe..23e9637924ba07 100644
--- a/deps/cares/src/lib/ares_event.h
+++ b/deps/cares/src/lib/ares_event.h
@@ -72,11 +72,11 @@ struct ares_event {
typedef struct {
const char *name;
ares_bool_t (*init)(ares_event_thread_t *e);
- void (*destroy)(ares_event_thread_t *e);
+ void (*destroy)(ares_event_thread_t *e);
ares_bool_t (*event_add)(ares_event_t *event);
- void (*event_del)(ares_event_t *event);
- void (*event_mod)(ares_event_t *event, ares_event_flags_t new_flags);
- size_t (*wait)(ares_event_thread_t *e, unsigned long timeout_ms);
+ void (*event_del)(ares_event_t *event);
+ void (*event_mod)(ares_event_t *event, ares_event_flags_t new_flags);
+ size_t (*wait)(ares_event_thread_t *e, unsigned long timeout_ms);
} ares_event_sys_t;
struct ares_event_thread {
diff --git a/deps/cares/src/lib/ares_event_poll.c b/deps/cares/src/lib/ares_event_poll.c
index c16b2824663544..33b1d6dfd58ec7 100644
--- a/deps/cares/src/lib/ares_event_poll.c
+++ b/deps/cares/src/lib/ares_event_poll.c
@@ -75,8 +75,11 @@ static size_t ares_evsys_poll_wait(ares_event_thread_t *e,
size_t cnt = 0;
size_t i;
- if (num_fds) {
+ if (fdlist != NULL && num_fds) {
pollfd = ares_malloc_zero(sizeof(*pollfd) * num_fds);
+ if (pollfd == NULL) {
+ goto done;
+ }
for (i = 0; i < num_fds; i++) {
const ares_event_t *ev =
ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]);
@@ -96,7 +99,7 @@ static size_t ares_evsys_poll_wait(ares_event_thread_t *e,
goto done;
}
- for (i = 0; i < num_fds; i++) {
+ for (i = 0; pollfd != NULL && i < num_fds; i++) {
ares_event_t *ev;
ares_event_flags_t flags = 0;
diff --git a/deps/cares/src/lib/ares_getaddrinfo.c b/deps/cares/src/lib/ares_getaddrinfo.c
index eaa4b422c06e9e..cfc889c70a84e2 100644
--- a/deps/cares/src/lib/ares_getaddrinfo.c
+++ b/deps/cares/src/lib/ares_getaddrinfo.c
@@ -79,15 +79,20 @@ struct host_query {
char *lookups; /* Duplicate memory from channel because of ares_reinit() */
const char *remaining_lookups; /* types of lookup we need to perform ("fb" by
default, file and dns respectively) */
- char **domains; /* duplicate from channel for ares_reinit() safety */
- size_t ndomains;
- struct ares_addrinfo *ai; /* store results between lookups */
- unsigned short qid_a; /* qid for A request */
- unsigned short qid_aaaa; /* qid for AAAA request */
- size_t remaining; /* number of DNS answers waiting for */
- ares_ssize_t next_domain; /* next search domain to try */
- size_t
- nodata_cnt; /* Track nodata responses to possibly override final result */
+
+ /* Search order for names */
+ char **names;
+ size_t names_cnt;
+ size_t next_name_idx; /* next name index being attempted */
+
+ struct ares_addrinfo *ai; /* store results between lookups */
+ unsigned short qid_a; /* qid for A request */
+ unsigned short qid_aaaa; /* qid for AAAA request */
+
+ size_t remaining; /* number of DNS answers waiting for */
+
+ /* Track nodata responses to possibly override final result */
+ size_t nodata_cnt;
};
static const struct ares_addrinfo_hints default_hints = {
@@ -98,10 +103,6 @@ static const struct ares_addrinfo_hints default_hints = {
};
/* forward declarations */
-static void host_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen);
-static ares_bool_t as_is_first(const struct host_query *hquery);
-static ares_bool_t as_is_only(const struct host_query *hquery);
static ares_bool_t next_dns_lookup(struct host_query *hquery);
struct ares_addrinfo_cname *
@@ -324,6 +325,17 @@ static ares_bool_t fake_addrinfo(const char *name, unsigned short port,
return ARES_TRUE;
}
+static void hquery_free(struct host_query *hquery, ares_bool_t cleanup_ai)
+{
+ if (cleanup_ai) {
+ ares_freeaddrinfo(hquery->ai);
+ }
+ ares__strsplit_free(hquery->names, hquery->names_cnt);
+ ares_free(hquery->name);
+ ares_free(hquery->lookups);
+ ares_free(hquery);
+}
+
static void end_hquery(struct host_query *hquery, ares_status_t status)
{
struct ares_addrinfo_node sentinel;
@@ -349,10 +361,7 @@ static void end_hquery(struct host_query *hquery, ares_status_t status)
}
hquery->callback(hquery->arg, (int)status, (int)hquery->timeouts, hquery->ai);
- ares__strsplit_free(hquery->domains, hquery->ndomains);
- ares_free(hquery->lookups);
- ares_free(hquery->name);
- ares_free(hquery);
+ hquery_free(hquery, ARES_FALSE);
}
ares_bool_t ares__is_localhost(const char *name)
@@ -478,25 +487,23 @@ static void terminate_retries(const struct host_query *hquery,
query->no_retries = ARES_TRUE;
}
-static void host_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen)
+static void host_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
{
struct host_query *hquery = (struct host_query *)arg;
ares_status_t addinfostatus = ARES_SUCCESS;
- unsigned short qid = 0;
- hquery->timeouts += (size_t)timeouts;
+ hquery->timeouts += timeouts;
hquery->remaining--;
if (status == ARES_SUCCESS) {
- if (alen < 0) {
+ if (dnsrec == NULL) {
addinfostatus = ARES_EBADRESP;
} else {
- addinfostatus = ares__parse_into_addrinfo(abuf, (size_t)alen, ARES_TRUE,
- hquery->port, hquery->ai);
+ addinfostatus =
+ ares__parse_into_addrinfo(dnsrec, ARES_TRUE, hquery->port, hquery->ai);
}
- if (addinfostatus == ARES_SUCCESS && alen >= HFIXEDSZ) {
- qid = DNS_HEADER_QID(abuf); /* Converts to host byte order */
- terminate_retries(hquery, qid);
+ if (addinfostatus == ARES_SUCCESS) {
+ terminate_retries(hquery, ares_dns_record_get_id(dnsrec));
}
}
@@ -505,7 +512,7 @@ static void host_callback(void *arg, int status, int timeouts,
/* must make sure we don't do next_lookup() on destroy or cancel,
* and return the appropriate status. We won't return a partial
* result in this case. */
- end_hquery(hquery, (ares_status_t)status);
+ end_hquery(hquery, status);
} else if (addinfostatus != ARES_SUCCESS && addinfostatus != ARES_ENODATA) {
/* error in parsing result e.g. no memory */
if (addinfostatus == ARES_EBADRESP && hquery->ai->nodes) {
@@ -523,10 +530,9 @@ static void host_callback(void *arg, int status, int timeouts,
if (status == ARES_ENODATA || addinfostatus == ARES_ENODATA) {
hquery->nodata_cnt++;
}
- next_lookup(hquery,
- hquery->nodata_cnt ? ARES_ENODATA : (ares_status_t)status);
+ next_lookup(hquery, hquery->nodata_cnt ? ARES_ENODATA : status);
} else {
- end_hquery(hquery, (ares_status_t)status);
+ end_hquery(hquery, status);
}
}
@@ -542,7 +548,6 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name,
unsigned short port = 0;
int family;
struct ares_addrinfo *ai;
- char *alias_name = NULL;
ares_status_t status;
if (!hints) {
@@ -563,25 +568,12 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name,
return;
}
- /* perform HOSTALIAS resolution (technically this function does some other
- * things we are going to ignore) */
- status = ares__single_domain(channel, name, &alias_name);
- if (status != ARES_SUCCESS) {
- callback(arg, (int)status, 0, NULL);
- return;
- }
-
- if (alias_name) {
- name = alias_name;
- }
-
if (service) {
if (hints->ai_flags & ARES_AI_NUMERICSERV) {
unsigned long val;
errno = 0;
val = strtoul(service, NULL, 0);
if ((val == 0 && errno != 0) || val > 65535) {
- ares_free(alias_name);
callback(arg, ARES_ESERVICE, 0, NULL);
return;
}
@@ -593,7 +585,6 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name,
errno = 0;
val = strtoul(service, NULL, 0);
if ((val == 0 && errno != 0) || val > 65535) {
- ares_free(alias_name);
callback(arg, ARES_ESERVICE, 0, NULL);
return;
}
@@ -604,66 +595,53 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name,
ai = ares_malloc_zero(sizeof(*ai));
if (!ai) {
- ares_free(alias_name);
callback(arg, ARES_ENOMEM, 0, NULL);
return;
}
if (fake_addrinfo(name, port, hints, ai, callback, arg)) {
- ares_free(alias_name);
return;
}
/* Allocate and fill in the host query structure. */
hquery = ares_malloc_zero(sizeof(*hquery));
if (!hquery) {
- ares_free(alias_name);
ares_freeaddrinfo(ai);
callback(arg, ARES_ENOMEM, 0, NULL);
return;
}
- memset(hquery, 0, sizeof(*hquery));
- hquery->name = ares_strdup(name);
- ares_free(alias_name);
- if (!hquery->name) {
- ares_free(hquery);
- ares_freeaddrinfo(ai);
+
+ hquery->port = port;
+ hquery->channel = channel;
+ hquery->hints = *hints;
+ hquery->sent_family = -1; /* nothing is sent yet */
+ hquery->callback = callback;
+ hquery->arg = arg;
+ hquery->ai = ai;
+ hquery->name = ares_strdup(name);
+ if (hquery->name == NULL) {
+ hquery_free(hquery, ARES_TRUE);
callback(arg, ARES_ENOMEM, 0, NULL);
return;
}
- hquery->lookups = ares_strdup(channel->lookups);
- if (!hquery->lookups) {
- ares_free(hquery->name);
- ares_free(hquery);
- ares_freeaddrinfo(ai);
- callback(arg, ARES_ENOMEM, 0, NULL);
+
+ status =
+ ares__search_name_list(channel, name, &hquery->names, &hquery->names_cnt);
+ if (status != ARES_SUCCESS) {
+ hquery_free(hquery, ARES_TRUE);
+ callback(arg, (int)status, 0, NULL);
return;
}
+ hquery->next_name_idx = 0;
- if (channel->ndomains) {
- /* Duplicate for ares_reinit() safety */
- hquery->domains =
- ares__strsplit_duplicate(channel->domains, channel->ndomains);
- if (hquery->domains == NULL) {
- ares_free(hquery->lookups);
- ares_free(hquery->name);
- ares_free(hquery);
- ares_freeaddrinfo(ai);
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
- hquery->ndomains = channel->ndomains;
- }
- hquery->port = port;
- hquery->channel = channel;
- hquery->hints = *hints;
- hquery->sent_family = -1; /* nothing is sent yet */
- hquery->callback = callback;
- hquery->arg = arg;
+ hquery->lookups = ares_strdup(channel->lookups);
+ if (hquery->lookups == NULL) {
+ hquery_free(hquery, ARES_TRUE);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
hquery->remaining_lookups = hquery->lookups;
- hquery->ai = ai;
- hquery->next_domain = -1;
/* Start performing lookups according to channel->lookups. */
next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */);
@@ -684,93 +662,39 @@ void ares_getaddrinfo(ares_channel_t *channel, const char *name,
static ares_bool_t next_dns_lookup(struct host_query *hquery)
{
- char *s = NULL;
- ares_bool_t is_s_allocated = ARES_FALSE;
- ares_status_t status;
-
- /* if next_domain == -1 and as_is_first is true, try hquery->name */
- if (hquery->next_domain == -1) {
- if (as_is_first(hquery)) {
- s = hquery->name;
- }
- hquery->next_domain = 0;
- }
-
- /* if as_is_first is false, try hquery->name at last */
- if (!s && (size_t)hquery->next_domain == hquery->ndomains) {
- if (!as_is_first(hquery)) {
- s = hquery->name;
- }
- hquery->next_domain++;
- }
-
- if (!s && (size_t)hquery->next_domain < hquery->ndomains &&
- !as_is_only(hquery)) {
- status = ares__cat_domain(hquery->name,
- hquery->domains[hquery->next_domain++], &s);
- if (status == ARES_SUCCESS) {
- is_s_allocated = ARES_TRUE;
- }
- }
+ const char *name = NULL;
- if (s) {
- /* NOTE: hquery may be invalidated during the call to ares_query_qid(),
- * so should not be referenced after this point */
- switch (hquery->hints.ai_family) {
- case AF_INET:
- hquery->remaining += 1;
- ares_query_qid(hquery->channel, s, C_IN, T_A, host_callback, hquery,
- &hquery->qid_a);
- break;
- case AF_INET6:
- hquery->remaining += 1;
- ares_query_qid(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery,
- &hquery->qid_aaaa);
- break;
- case AF_UNSPEC:
- hquery->remaining += 2;
- ares_query_qid(hquery->channel, s, C_IN, T_A, host_callback, hquery,
- &hquery->qid_a);
- ares_query_qid(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery,
- &hquery->qid_aaaa);
- break;
- default:
- break;
- }
- if (is_s_allocated) {
- ares_free(s);
- }
- return ARES_TRUE;
- } else {
- assert(!hquery->ai->nodes);
+ if (hquery->next_name_idx >= hquery->names_cnt) {
return ARES_FALSE;
}
-}
-static ares_bool_t as_is_first(const struct host_query *hquery)
-{
- const char *p;
- size_t ndots = 0;
- for (p = hquery->name; p && *p; p++) {
- if (*p == '.') {
- ndots++;
- }
- }
- if (as_is_only(hquery)) {
- /* prevent ARES_EBADNAME for valid FQDN, where ndots < channel->ndots */
- return ARES_TRUE;
- }
- return ndots >= hquery->channel->ndots ? ARES_TRUE : ARES_FALSE;
-}
+ name = hquery->names[hquery->next_name_idx++];
-static ares_bool_t as_is_only(const struct host_query *hquery)
-{
- size_t nname = ares_strlen(hquery->name);
- if (hquery->channel->flags & ARES_FLAG_NOSEARCH) {
- return ARES_TRUE;
- }
- if (hquery->name != NULL && nname && hquery->name[nname - 1] == '.') {
- return ARES_TRUE;
+ /* NOTE: hquery may be invalidated during the call to ares_query_qid(),
+ * so should not be referenced after this point */
+ switch (hquery->hints.ai_family) {
+ case AF_INET:
+ hquery->remaining += 1;
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A,
+ host_callback, hquery, &hquery->qid_a);
+ break;
+ case AF_INET6:
+ hquery->remaining += 1;
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN,
+ ARES_REC_TYPE_AAAA, host_callback, hquery,
+ &hquery->qid_aaaa);
+ break;
+ case AF_UNSPEC:
+ hquery->remaining += 2;
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A,
+ host_callback, hquery, &hquery->qid_a);
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN,
+ ARES_REC_TYPE_AAAA, host_callback, hquery,
+ &hquery->qid_aaaa);
+ break;
+ default:
+ break;
}
- return ARES_FALSE;
+
+ return ARES_TRUE;
}
diff --git a/deps/cares/src/lib/ares_gethostbyaddr.c b/deps/cares/src/lib/ares_gethostbyaddr.c
index ab54706ba96889..453673260dcee5 100644
--- a/deps/cares/src/lib/ares_gethostbyaddr.c
+++ b/deps/cares/src/lib/ares_gethostbyaddr.c
@@ -59,11 +59,11 @@ struct addr_query {
size_t timeouts;
};
-static void next_lookup(struct addr_query *aquery);
-static void addr_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen);
-static void end_aquery(struct addr_query *aquery, ares_status_t status,
- struct hostent *host);
+static void next_lookup(struct addr_query *aquery);
+static void addr_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+static void end_aquery(struct addr_query *aquery, ares_status_t status,
+ struct hostent *host);
static ares_status_t file_lookup(ares_channel_t *channel,
const struct ares_addr *addr,
struct hostent **host);
@@ -138,7 +138,8 @@ static void next_lookup(struct addr_query *aquery)
return;
}
aquery->remaining_lookups = p + 1;
- ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, aquery);
+ ares_query_dnsrec(aquery->channel, name, ARES_CLASS_IN,
+ ARES_REC_TYPE_PTR, addr_callback, aquery, NULL);
ares_free(name);
return;
case 'f':
@@ -159,27 +160,27 @@ static void next_lookup(struct addr_query *aquery)
end_aquery(aquery, ARES_ENOTFOUND, NULL);
}
-static void addr_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen)
+static void addr_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
{
struct addr_query *aquery = (struct addr_query *)arg;
struct hostent *host;
size_t addrlen;
- aquery->timeouts += (size_t)timeouts;
+ aquery->timeouts += timeouts;
if (status == ARES_SUCCESS) {
if (aquery->addr.family == AF_INET) {
addrlen = sizeof(aquery->addr.addr.addr4);
- status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr.addr4,
- (int)addrlen, AF_INET, &host);
+ status = ares_parse_ptr_reply_dnsrec(dnsrec, &aquery->addr.addr.addr4,
+ (int)addrlen, AF_INET, &host);
} else {
addrlen = sizeof(aquery->addr.addr.addr6);
- status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr.addr6,
- (int)addrlen, AF_INET6, &host);
+ status = ares_parse_ptr_reply_dnsrec(dnsrec, &aquery->addr.addr.addr6,
+ (int)addrlen, AF_INET6, &host);
}
- end_aquery(aquery, (ares_status_t)status, host);
+ end_aquery(aquery, status, host);
} else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) {
- end_aquery(aquery, (ares_status_t)status, NULL);
+ end_aquery(aquery, status, NULL);
} else {
next_lookup(aquery);
}
diff --git a/deps/cares/src/lib/ares_init.c b/deps/cares/src/lib/ares_init.c
index bae7c72fe2cf67..28a509ea48a5af 100644
--- a/deps/cares/src/lib/ares_init.c
+++ b/deps/cares/src/lib/ares_init.c
@@ -152,10 +152,6 @@ static ares_status_t init_by_defaults(ares_channel_t *channel)
channel->tries = DEFAULT_TRIES;
}
- if (channel->ndots == 0) {
- channel->ndots = 1;
- }
-
if (ares__slist_len(channel->servers) == 0) {
/* Add a default local named server to the channel unless configured not
* to (in which case return an error).
@@ -261,31 +257,6 @@ static ares_status_t init_by_defaults(ares_channel_t *channel)
}
error:
- if (rc) {
- if (channel->domains && channel->domains[0]) {
- ares_free(channel->domains[0]);
- }
- if (channel->domains) {
- ares_free(channel->domains);
- channel->domains = NULL;
- }
-
- if (channel->lookups) {
- ares_free(channel->lookups);
- channel->lookups = NULL;
- }
-
- if (channel->resolvconf_path) {
- ares_free(channel->resolvconf_path);
- channel->resolvconf_path = NULL;
- }
-
- if (channel->hosts_path) {
- ares_free(channel->hosts_path);
- channel->hosts_path = NULL;
- }
- }
-
if (hostname) {
ares_free(hostname);
}
@@ -309,6 +280,9 @@ int ares_init_options(ares_channel_t **channelptr,
return ARES_ENOMEM;
}
+ /* One option where zero is valid, so set default value here */
+ channel->ndots = 1;
+
status = ares__channel_threading_init(channel);
if (status != ARES_SUCCESS) {
goto done;
diff --git a/deps/cares/src/lib/ares_ipv6.h b/deps/cares/src/lib/ares_ipv6.h
index be8cbe989396c2..28d7851ff3f051 100644
--- a/deps/cares/src/lib/ares_ipv6.h
+++ b/deps/cares/src/lib/ares_ipv6.h
@@ -27,6 +27,10 @@
#ifndef ARES_IPV6_H
#define ARES_IPV6_H
+#ifdef HAVE_NETINET6_IN6_H
+# include
+#endif
+
#ifndef HAVE_PF_INET6
# define PF_INET6 AF_INET6
#endif
diff --git a/deps/cares/src/lib/ares_library_init.c b/deps/cares/src/lib/ares_library_init.c
index 5cd39dc244ba4b..2767f1f93c77e4 100644
--- a/deps/cares/src/lib/ares_library_init.c
+++ b/deps/cares/src/lib/ares_library_init.c
@@ -72,7 +72,7 @@ static void default_free(void *p)
#endif
void *(*ares_malloc)(size_t size) = default_malloc;
void *(*ares_realloc)(void *ptr, size_t size) = default_realloc;
-void (*ares_free)(void *ptr) = default_free;
+void (*ares_free)(void *ptr) = default_free;
void *ares_malloc_zero(size_t size)
{
@@ -114,7 +114,7 @@ int ares_library_init(int flags)
}
int ares_library_init_mem(int flags, void *(*amalloc)(size_t size),
- void (*afree)(void *ptr),
+ void (*afree)(void *ptr),
void *(*arealloc)(void *ptr, size_t size))
{
if (amalloc) {
diff --git a/deps/cares/src/lib/ares_mkquery.c b/deps/cares/src/lib/ares_mkquery.c
deleted file mode 100644
index da1898e74cd951..00000000000000
--- a/deps/cares/src/lib/ares_mkquery.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
- *
- * 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 (including the next
- * paragraph) 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.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-#include "ares.h"
-
-int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
- int rd, unsigned char **buf, int *buflen)
-{
- return ares_create_query(name, dnsclass, type, id, rd, buf, buflen, 0);
-}
diff --git a/deps/cares/src/lib/ares_options.c b/deps/cares/src/lib/ares_options.c
index 342d2ea1bec968..adc3e062ac437e 100644
--- a/deps/cares/src/lib/ares_options.c
+++ b/deps/cares/src/lib/ares_options.c
@@ -316,7 +316,7 @@ ares_status_t ares__init_by_options(ares_channel_t *channel,
}
if (optmask & ARES_OPT_NDOTS) {
- if (options->ndots <= 0) {
+ if (options->ndots < 0) {
optmask &= ~(ARES_OPT_NDOTS);
} else {
channel->ndots = (size_t)options->ndots;
diff --git a/deps/cares/src/lib/ares_parse_a_reply.c b/deps/cares/src/lib/ares_parse_a_reply.c
index f576575fe4b2fd..da841f0da9af36 100644
--- a/deps/cares/src/lib/ares_parse_a_reply.c
+++ b/deps/cares/src/lib/ares_parse_a_reply.c
@@ -59,6 +59,7 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
char *question_hostname = NULL;
ares_status_t status;
size_t req_naddrttls = 0;
+ ares_dns_record_t *dnsrec = NULL;
if (alen < 0) {
return ARES_EBADRESP;
@@ -71,7 +72,12 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
memset(&ai, 0, sizeof(ai));
- status = ares__parse_into_addrinfo(abuf, (size_t)alen, 0, 0, &ai);
+ status = ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__parse_into_addrinfo(dnsrec, 0, 0, &ai);
if (status != ARES_SUCCESS && status != ARES_ENODATA) {
goto fail;
}
@@ -96,6 +102,11 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
ares__freeaddrinfo_nodes(ai.nodes);
ares_free(ai.name);
ares_free(question_hostname);
+ ares_dns_record_destroy(dnsrec);
+
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
return (int)status;
}
diff --git a/deps/cares/src/lib/ares_parse_aaaa_reply.c b/deps/cares/src/lib/ares_parse_aaaa_reply.c
index cef4ad7f80948f..b3eba166be6ad6 100644
--- a/deps/cares/src/lib/ares_parse_aaaa_reply.c
+++ b/deps/cares/src/lib/ares_parse_aaaa_reply.c
@@ -61,6 +61,7 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
char *question_hostname = NULL;
ares_status_t status;
size_t req_naddrttls = 0;
+ ares_dns_record_t *dnsrec = NULL;
if (alen < 0) {
return ARES_EBADRESP;
@@ -73,7 +74,12 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
memset(&ai, 0, sizeof(ai));
- status = ares__parse_into_addrinfo(abuf, (size_t)alen, 0, 0, &ai);
+ status = ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__parse_into_addrinfo(dnsrec, 0, 0, &ai);
if (status != ARES_SUCCESS && status != ARES_ENODATA) {
goto fail;
}
@@ -97,6 +103,11 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
ares__freeaddrinfo_nodes(ai.nodes);
ares_free(question_hostname);
ares_free(ai.name);
+ ares_dns_record_destroy(dnsrec);
+
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
return (int)status;
}
diff --git a/deps/cares/src/lib/ares_parse_ptr_reply.c b/deps/cares/src/lib/ares_parse_ptr_reply.c
index d8a29f272251cf..6ee20f722e3d01 100644
--- a/deps/cares/src/lib/ares_parse_ptr_reply.c
+++ b/deps/cares/src/lib/ares_parse_ptr_reply.c
@@ -36,33 +36,20 @@
#include "ares.h"
#include "ares_private.h"
-int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int,
- const void *addr, int addrlen, int family,
- struct hostent **host)
+ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec,
+ const void *addr, int addrlen,
+ int family, struct hostent **host)
{
- ares_status_t status;
- size_t alen;
- size_t ptrcount = 0;
- struct hostent *hostent = NULL;
- const char *hostname = NULL;
- const char *ptrname = NULL;
- ares_dns_record_t *dnsrec = NULL;
- size_t i;
- size_t ancount;
+ ares_status_t status;
+ size_t ptrcount = 0;
+ struct hostent *hostent = NULL;
+ const char *hostname = NULL;
+ const char *ptrname = NULL;
+ size_t i;
+ size_t ancount;
*host = NULL;
- if (alen_int < 0) {
- return ARES_EBADRESP;
- }
-
- alen = (size_t)alen_int;
-
- status = ares_dns_parse(abuf, alen, 0, &dnsrec);
- if (status != ARES_SUCCESS) {
- goto done;
- }
-
/* Fetch name from query as we will use it to compare later on. Old code
* did this check, so we'll retain it. */
status = ares_dns_record_query_get(dnsrec, 0, &ptrname, NULL, NULL);
@@ -114,7 +101,7 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int,
/* Cycle through answers */
for (i = 0; i < ancount; i++) {
const ares_dns_rr_t *rr =
- ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+ ares_dns_record_rr_get_const(dnsrec, ARES_SECTION_ANSWER, i);
if (rr == NULL) {
/* Shouldn't be possible */
@@ -195,6 +182,34 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int,
} else {
*host = hostent;
}
+ return status;
+}
+
+int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int,
+ const void *addr, int addrlen, int family,
+ struct hostent **host)
+{
+ size_t alen;
+ ares_dns_record_t *dnsrec = NULL;
+ ares_status_t status;
+
+ if (alen_int < 0) {
+ return ARES_EBADRESP;
+ }
+
+ alen = (size_t)alen_int;
+
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_parse_ptr_reply_dnsrec(dnsrec, addr, addrlen, family, host);
+
+done:
ares_dns_record_destroy(dnsrec);
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
return (int)status;
}
diff --git a/deps/cares/src/lib/ares_private.h b/deps/cares/src/lib/ares_private.h
index fd321b911c4a1c..6a9e04af2eb633 100644
--- a/deps/cares/src/lib/ares_private.h
+++ b/deps/cares/src/lib/ares_private.h
@@ -209,7 +209,7 @@ struct query {
unsigned char *qbuf;
size_t qlen;
- ares_callback callback;
+ ares_callback_dnsrec callback;
void *arg;
/* Query status */
@@ -318,12 +318,12 @@ struct ares_channeldata {
};
/* Does the domain end in ".onion" or ".onion."? Case-insensitive. */
-ares_bool_t ares__is_onion_domain(const char *name);
+ares_bool_t ares__is_onion_domain(const char *name);
/* Memory management functions */
-extern void *(*ares_malloc)(size_t size);
-extern void *(*ares_realloc)(void *ptr, size_t size);
-extern void (*ares_free)(void *ptr);
+extern void *(*ares_malloc)(size_t size);
+extern void *(*ares_realloc)(void *ptr, size_t size);
+extern void (*ares_free)(void *ptr);
void *ares_malloc_zero(size_t size);
void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size);
@@ -335,23 +335,37 @@ ares_bool_t ares__timedout(const struct timeval *now,
ares_status_t ares__send_query(struct query *query, struct timeval *now);
ares_status_t ares__requeue_query(struct query *query, struct timeval *now);
-/* Identical to ares_query, but returns a normal ares return code like
- * ARES_SUCCESS, and can be passed the qid by reference which will be
- * filled in on ARES_SUCCESS */
-ares_status_t ares_query_qid(ares_channel_t *channel, const char *name,
- int dnsclass, int type, ares_callback callback,
- void *arg, unsigned short *qid);
-/* Identical to ares_send() except returns normal ares return codes like
- * ARES_SUCCESS */
-ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf,
- size_t qlen, ares_callback callback, void *arg,
- unsigned short *qid);
-void ares__close_connection(struct server_connection *conn);
-void ares__close_sockets(struct server_state *server);
-void ares__check_cleanup_conn(const ares_channel_t *channel,
- struct server_connection *conn);
-ares_status_t ares__read_line(FILE *fp, char **buf, size_t *bufsize);
-void ares__free_query(struct query *query);
+/*! Retrieve a list of names to use for searching. The first successful
+ * query in the list wins. This function also uses the HOSTSALIASES file
+ * as well as uses channel configuration to determine the search order.
+ *
+ * \param[in] channel initialized ares channel
+ * \param[in] name initial name being searched
+ * \param[out] names array of names to attempt, use ares__strsplit_free()
+ * when no longer needed.
+ * \param[out] names_len number of names in array
+ * \return ARES_SUCCESS on success, otherwise one of the other error codes.
+ */
+ares_status_t ares__search_name_list(const ares_channel_t *channel,
+ const char *name, char ***names,
+ size_t *names_len);
+
+/*! Function to create callback arg for converting from ares_callback_dnsrec
+ * to ares_calback */
+void *ares__dnsrec_convert_arg(ares_callback callback, void *arg);
+
+/*! Callback function used to convert from the ares_callback_dnsrec prototype to
+ * the ares_callback prototype, by writing the result and passing that to
+ * the inner callback.
+ */
+void ares__dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+
+void ares__close_connection(struct server_connection *conn);
+void ares__close_sockets(struct server_state *server);
+void ares__check_cleanup_conn(const ares_channel_t *channel,
+ struct server_connection *conn);
+void ares__free_query(struct query *query);
ares_rand_state *ares__init_rand_state(void);
void ares__destroy_rand_state(ares_rand_state *state);
@@ -391,6 +405,7 @@ typedef struct {
size_t tries;
ares_bool_t rotate;
size_t timeout_ms;
+ ares_bool_t usevc;
} ares_sysconfig_t;
ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig);
@@ -401,8 +416,13 @@ ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort,
const char *str);
void ares__destroy_servers_state(ares_channel_t *channel);
-ares_status_t ares__single_domain(const ares_channel_t *channel,
- const char *name, char **s);
+
+/* Returns ARES_SUCCESS if alias found, alias is set. Returns ARES_ENOTFOUND
+ * if not alias found. Returns other errors on critical failure like
+ * ARES_ENOMEM */
+ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel,
+ const char *name, char **alias);
+
ares_status_t ares__cat_domain(const char *name, const char *domain, char **s);
ares_status_t ares__sortaddrinfo(ares_channel_t *channel,
struct ares_addrinfo_node *ai_node);
@@ -427,10 +447,13 @@ ares_status_t ares_append_ai_node(int aftype, unsigned short port,
void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head,
struct ares_addrinfo_cname *tail);
-ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen,
+ares_status_t ares__parse_into_addrinfo(const ares_dns_record_t *dnsrec,
ares_bool_t cname_only_is_enodata,
unsigned short port,
struct ares_addrinfo *ai);
+ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec,
+ const void *addr, int addrlen,
+ int family, struct hostent **host);
ares_status_t ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family,
struct hostent **host);
@@ -456,10 +479,9 @@ ares_ssize_t ares__socket_recvfrom(ares_channel_t *channel, ares_socket_t s,
ares_ssize_t ares__socket_recv(ares_channel_t *channel, ares_socket_t s,
void *data, size_t data_len);
void ares__close_socket(ares_channel, ares_socket_t);
-int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd,
- const struct sockaddr *addr, ares_socklen_t addrlen);
-ares_bool_t ares__is_hostnamech(int ch);
-void ares__destroy_server(struct server_state *server);
+int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd,
+ const struct sockaddr *addr, ares_socklen_t addrlen);
+void ares__destroy_server(struct server_state *server);
ares_status_t ares__servers_update(ares_channel_t *channel,
ares__llist_t *server_list,
@@ -494,7 +516,6 @@ ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry,
unsigned short port,
ares_bool_t want_cnames,
struct ares_addrinfo *ai);
-ares_bool_t ares__isprint(int ch);
/*! Parse a compressed DNS name as defined in RFC1035 starting at the current
@@ -560,7 +581,7 @@ void ares_queue_notify_empty(ares_channel_t *channel);
} while (0)
#define ARES_CONFIG_CHECK(x) \
- (x && x->lookups && ares__slist_len(x->servers) > 0 && x->ndots > 0 && \
+ (x && x->lookups && ares__slist_len(x->servers) > 0 && \
x->timeout > 0 && x->tries > 0)
ares_bool_t ares__subnet_match(const struct ares_addr *addr,
@@ -583,10 +604,10 @@ ares_status_t ares_qcache_insert(ares_channel_t *channel,
const struct timeval *now,
const struct query *query,
ares_dns_record_t *dnsrec);
-ares_status_t ares_qcache_fetch(ares_channel_t *channel,
- const struct timeval *now,
- const unsigned char *qbuf, size_t qlen,
- unsigned char **abuf, size_t *alen);
+ares_status_t ares_qcache_fetch(ares_channel_t *channel,
+ const struct timeval *now,
+ const ares_dns_record_t *dnsrec,
+ const ares_dns_record_t **dnsrec_resp);
ares_status_t ares__channel_threading_init(ares_channel_t *channel);
void ares__channel_threading_destroy(ares_channel_t *channel);
diff --git a/deps/cares/src/lib/ares_process.c b/deps/cares/src/lib/ares_process.c
index bd84d09e134805..b9705ae882b9ff 100644
--- a/deps/cares/src/lib/ares_process.c
+++ b/deps/cares/src/lib/ares_process.c
@@ -68,8 +68,7 @@ static ares_bool_t same_questions(const ares_dns_record_t *qrec,
static ares_bool_t same_address(const struct sockaddr *sa,
const struct ares_addr *aa);
static void end_query(ares_channel_t *channel, struct query *query,
- ares_status_t status, const unsigned char *abuf,
- size_t alen);
+ ares_status_t status, const ares_dns_record_t *dnsrec);
static void server_increment_failures(struct server_state *server)
{
@@ -625,6 +624,7 @@ static ares_status_t process_answer(ares_channel_t *channel,
ares_dns_record_t *rdnsrec = NULL;
ares_dns_record_t *qdnsrec = NULL;
ares_status_t status;
+ ares_bool_t is_cached = ARES_FALSE;
/* Parse the response */
status = ares_dns_parse(abuf, alen, 0, &rdnsrec);
@@ -648,7 +648,7 @@ static ares_status_t process_answer(ares_channel_t *channel,
/* Parse the question we sent as we use it to compare */
status = ares_dns_parse(query->qbuf, query->qlen, 0, &qdnsrec);
if (status != ARES_SUCCESS) {
- end_query(channel, query, status, NULL, 0);
+ end_query(channel, query, status, NULL);
goto cleanup;
}
@@ -674,7 +674,7 @@ static ares_status_t process_answer(ares_channel_t *channel,
ares_dns_has_opt_rr(qdnsrec) && !ares_dns_has_opt_rr(rdnsrec)) {
status = rewrite_without_edns(qdnsrec, query);
if (status != ARES_SUCCESS) {
- end_query(channel, query, status, NULL, 0);
+ end_query(channel, query, status, NULL);
goto cleanup;
}
@@ -729,16 +729,20 @@ static ares_status_t process_answer(ares_channel_t *channel,
/* If cache insertion was successful, it took ownership. We ignore
* other cache insertion failures. */
if (ares_qcache_insert(channel, now, query, rdnsrec) == ARES_SUCCESS) {
- rdnsrec = NULL;
+ is_cached = ARES_TRUE;
}
server_set_good(server);
- end_query(channel, query, ARES_SUCCESS, abuf, alen);
+ end_query(channel, query, ARES_SUCCESS, rdnsrec);
status = ARES_SUCCESS;
cleanup:
- ares_dns_record_destroy(rdnsrec);
+ /* Don't cleanup the cached pointer to the dns response */
+ if (!is_cached) {
+ ares_dns_record_destroy(rdnsrec);
+ }
+
ares_dns_record_destroy(qdnsrec);
return status;
}
@@ -774,7 +778,7 @@ ares_status_t ares__requeue_query(struct query *query, struct timeval *now)
query->error_status = ARES_ETIMEOUT;
}
- end_query(channel, query, query->error_status, NULL, 0);
+ end_query(channel, query, query->error_status, NULL);
return ARES_ETIMEOUT;
}
@@ -893,7 +897,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now)
}
if (server == NULL) {
- end_query(channel, query, ARES_ENOSERVER /* ? */, NULL, 0);
+ end_query(channel, query, ARES_ENOSERVER /* ? */, NULL);
return ARES_ENOSERVER;
}
@@ -920,7 +924,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now)
/* Anything else is not retryable, likely ENOMEM */
default:
- end_query(channel, query, status, NULL, 0);
+ end_query(channel, query, status, NULL);
return status;
}
}
@@ -931,7 +935,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now)
status = ares__append_tcpbuf(server, query);
if (status != ARES_SUCCESS) {
- end_query(channel, query, status, NULL, 0);
+ end_query(channel, query, status, NULL);
/* Only safe to kill connection if it was new, otherwise it should be
* cleaned up by another process later */
@@ -979,7 +983,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now)
/* Anything else is not retryable, likely ENOMEM */
default:
- end_query(channel, query, status, NULL, 0);
+ end_query(channel, query, status, NULL);
return status;
}
node = ares__llist_node_first(server->connections);
@@ -1011,7 +1015,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now)
query->node_queries_by_timeout =
ares__slist_insert(channel->queries_by_timeout, query);
if (!query->node_queries_by_timeout) {
- end_query(channel, query, ARES_ENOMEM, NULL, 0);
+ end_query(channel, query, ARES_ENOMEM, NULL);
/* Only safe to kill connection if it was new, otherwise it should be
* cleaned up by another process later */
if (new_connection) {
@@ -1027,7 +1031,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now)
ares__llist_insert_last(conn->queries_to_conn, query);
if (query->node_queries_to_conn == NULL) {
- end_query(channel, query, ARES_ENOMEM, NULL, 0);
+ end_query(channel, query, ARES_ENOMEM, NULL);
/* Only safe to kill connection if it was new, otherwise it should be
* cleaned up by another process later */
if (new_connection) {
@@ -1124,14 +1128,10 @@ static void ares_detach_query(struct query *query)
}
static void end_query(ares_channel_t *channel, struct query *query,
- ares_status_t status, const unsigned char *abuf,
- size_t alen)
+ ares_status_t status, const ares_dns_record_t *dnsrec)
{
/* Invoke the callback. */
- query->callback(query->arg, (int)status, (int)query->timeouts,
- /* due to prior design flaws, abuf isn't meant to be modified,
- * but bad prototypes, ugh. Lets cast off constfor compat. */
- (unsigned char *)((void *)((size_t)abuf)), (int)alen);
+ query->callback(query->arg, status, query->timeouts, dnsrec);
ares__free_query(query);
/* Check and notify if no other queries are enqueued on the channel. This
diff --git a/deps/cares/src/lib/ares_qcache.c b/deps/cares/src/lib/ares_qcache.c
index bab8781850789a..2af1125a0d299f 100644
--- a/deps/cares/src/lib/ares_qcache.c
+++ b/deps/cares/src/lib/ares_qcache.c
@@ -81,6 +81,7 @@ static char *ares__qcache_calc_key(const ares_dns_record_t *dnsrec)
for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) {
const char *name;
+ size_t name_len;
ares_dns_rec_type_t qtype;
ares_dns_class_t qclass;
@@ -114,7 +115,15 @@ static char *ares__qcache_calc_key(const ares_dns_record_t *dnsrec)
goto fail;
}
- status = ares__buf_append_str(buf, name);
+ /* On queries, a '.' may be appended to the name to indicate an explicit
+ * name lookup without performing a search. Strip this since its not part
+ * of a cached response. */
+ name_len = ares_strlen(name);
+ if (name_len && name[name_len - 1] == '.') {
+ name_len--;
+ }
+
+ status = ares__buf_append(buf, (const unsigned char *)name, name_len);
if (status != ARES_SUCCESS) {
goto fail;
}
@@ -384,20 +393,24 @@ static ares_status_t ares__qcache_insert(ares__qcache_t *qcache,
return ARES_ENOMEM;
}
-static ares_status_t ares__qcache_fetch(ares__qcache_t *qcache,
- const ares_dns_record_t *dnsrec,
- const struct timeval *now,
- unsigned char **buf, size_t *buf_len)
+ares_status_t ares_qcache_fetch(ares_channel_t *channel,
+ const struct timeval *now,
+ const ares_dns_record_t *dnsrec,
+ const ares_dns_record_t **dnsrec_resp)
{
char *key = NULL;
ares__qcache_entry_t *entry;
- ares_status_t status;
+ ares_status_t status = ARES_SUCCESS;
- if (qcache == NULL || dnsrec == NULL) {
+ if (channel == NULL || dnsrec == NULL || dnsrec_resp == NULL) {
return ARES_EFORMERR;
}
- ares__qcache_expire(qcache, now);
+ if (channel->qcache == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ ares__qcache_expire(channel->qcache, now);
key = ares__qcache_calc_key(dnsrec);
if (key == NULL) {
@@ -405,7 +418,7 @@ static ares_status_t ares__qcache_fetch(ares__qcache_t *qcache,
goto done;
}
- entry = ares__htable_strvp_get_direct(qcache->cache, key);
+ entry = ares__htable_strvp_get_direct(channel->qcache->cache, key);
if (entry == NULL) {
status = ARES_ENOTFOUND;
goto done;
@@ -414,7 +427,7 @@ static ares_status_t ares__qcache_fetch(ares__qcache_t *qcache,
ares_dns_record_write_ttl_decrement(
entry->dnsrec, (unsigned int)(now->tv_sec - entry->insert_ts));
- status = ares_dns_write(entry->dnsrec, buf, buf_len);
+ *dnsrec_resp = entry->dnsrec;
done:
ares_free(key);
@@ -429,27 +442,3 @@ ares_status_t ares_qcache_insert(ares_channel_t *channel,
return ares__qcache_insert(channel->qcache, dnsrec, query->qbuf, query->qlen,
now);
}
-
-ares_status_t ares_qcache_fetch(ares_channel_t *channel,
- const struct timeval *now,
- const unsigned char *qbuf, size_t qlen,
- unsigned char **abuf, size_t *alen)
-{
- ares_status_t status;
- ares_dns_record_t *dnsrec = NULL;
-
- if (channel->qcache == NULL) {
- return ARES_ENOTFOUND;
- }
-
- status = ares_dns_parse(qbuf, qlen, 0, &dnsrec);
- if (status != ARES_SUCCESS) {
- goto done;
- }
-
- status = ares__qcache_fetch(channel->qcache, dnsrec, now, abuf, alen);
-
-done:
- ares_dns_record_destroy(dnsrec);
- return status;
-}
diff --git a/deps/cares/src/lib/ares_query.c b/deps/cares/src/lib/ares_query.c
index 098e6789471809..0eea80e7fc1e59 100644
--- a/deps/cares/src/lib/ares_query.c
+++ b/deps/cares/src/lib/ares_query.c
@@ -37,103 +37,116 @@
#include "ares_dns.h"
#include "ares_private.h"
-struct qquery {
- ares_callback callback;
- void *arg;
-};
+typedef struct {
+ ares_callback_dnsrec callback;
+ void *arg;
+} ares_query_dnsrec_arg_t;
-static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf,
- int alen);
-
-ares_status_t ares_query_qid(ares_channel_t *channel, const char *name,
- int dnsclass, int type, ares_callback callback,
- void *arg, unsigned short *qid)
+static void ares_query_dnsrec_cb(void *arg, ares_status_t status,
+ size_t timeouts,
+ const ares_dns_record_t *dnsrec)
{
- struct qquery *qquery;
- unsigned char *qbuf;
- int qlen;
- int rd;
- ares_status_t status;
-
- /* Compose the query. */
- rd = !(channel->flags & ARES_FLAG_NORECURSE);
- status = (ares_status_t)ares_create_query(
- name, dnsclass, type, 0, rd, &qbuf, &qlen,
- (channel->flags & ARES_FLAG_EDNS) ? (int)channel->ednspsz : 0);
+ ares_query_dnsrec_arg_t *qquery = arg;
+
if (status != ARES_SUCCESS) {
- if (qbuf != NULL) {
- ares_free(qbuf);
+ qquery->callback(qquery->arg, status, timeouts, dnsrec);
+ } else {
+ size_t ancount;
+ ares_dns_rcode_t rcode;
+ /* Pull the response code and answer count from the packet and convert any
+ * errors.
+ */
+ rcode = ares_dns_record_get_rcode(dnsrec);
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ status = ares_dns_query_reply_tostatus(rcode, ancount);
+ qquery->callback(qquery->arg, status, timeouts, dnsrec);
+ }
+ ares_free(qquery);
+}
+
+static ares_status_t ares_query_int(ares_channel_t *channel, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type,
+ ares_callback_dnsrec callback, void *arg,
+ unsigned short *qid)
+{
+ ares_status_t status;
+ ares_dns_record_t *dnsrec = NULL;
+ ares_dns_flags_t flags = 0;
+ ares_query_dnsrec_arg_t *qquery = NULL;
+
+ if (channel == NULL || name == NULL || callback == NULL) {
+ status = ARES_EFORMERR;
+ if (callback != NULL) {
+ callback(arg, status, 0, NULL);
}
- callback(arg, (int)status, 0, NULL, 0);
return status;
}
- /* Allocate and fill in the query structure. */
- qquery = ares_malloc(sizeof(struct qquery));
- if (!qquery) {
- ares_free_string(qbuf);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return ARES_ENOMEM;
+ if (!(channel->flags & ARES_FLAG_NORECURSE)) {
+ flags |= ARES_FLAG_RD;
}
+
+ status = ares_dns_record_create_query(
+ &dnsrec, name, dnsclass, type, 0, flags,
+ (size_t)(channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0);
+ if (status != ARES_SUCCESS) {
+ callback(arg, status, 0, NULL);
+ return status;
+ }
+
+ qquery = ares_malloc(sizeof(*qquery));
+ if (qquery == NULL) {
+ status = ARES_ENOMEM;
+ callback(arg, status, 0, NULL);
+ ares_dns_record_destroy(dnsrec);
+ return status;
+ }
+
qquery->callback = callback;
qquery->arg = arg;
/* Send it off. qcallback will be called when we get an answer. */
- status = ares_send_ex(channel, qbuf, (size_t)qlen, qcallback, qquery, qid);
- ares_free_string(qbuf);
+ status = ares_send_dnsrec(channel, dnsrec, ares_query_dnsrec_cb, qquery, qid);
+ ares_dns_record_destroy(dnsrec);
return status;
}
-void ares_query(ares_channel_t *channel, const char *name, int dnsclass,
- int type, ares_callback callback, void *arg)
+ares_status_t ares_query_dnsrec(ares_channel_t *channel, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type,
+ ares_callback_dnsrec callback, void *arg,
+ unsigned short *qid)
{
+ ares_status_t status;
+
if (channel == NULL) {
- return;
+ return ARES_EFORMERR;
}
+
ares__channel_lock(channel);
- ares_query_qid(channel, name, dnsclass, type, callback, arg, NULL);
+ status = ares_query_int(channel, name, dnsclass, type, callback, arg, qid);
ares__channel_unlock(channel);
+ return status;
}
-static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf,
- int alen)
+void ares_query(ares_channel_t *channel, const char *name, int dnsclass,
+ int type, ares_callback callback, void *arg)
{
- struct qquery *qquery = (struct qquery *)arg;
- size_t ancount;
- int rcode;
+ void *carg = NULL;
- if (status != ARES_SUCCESS) {
- qquery->callback(qquery->arg, status, timeouts, abuf, alen);
- } else {
- /* Pull the response code and answer count from the packet. */
- rcode = DNS_HEADER_RCODE(abuf);
- ancount = DNS_HEADER_ANCOUNT(abuf);
-
- /* Convert errors. */
- switch (rcode) {
- case NOERROR:
- status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA;
- break;
- case FORMERR:
- status = ARES_EFORMERR;
- break;
- case SERVFAIL:
- status = ARES_ESERVFAIL;
- break;
- case NXDOMAIN:
- status = ARES_ENOTFOUND;
- break;
- case NOTIMP:
- status = ARES_ENOTIMP;
- break;
- case REFUSED:
- status = ARES_EREFUSED;
- break;
- default:
- break;
- }
- qquery->callback(qquery->arg, status, timeouts, abuf, alen);
+ if (channel == NULL) {
+ return;
}
- ares_free(qquery);
+
+ carg = ares__dnsrec_convert_arg(callback, arg);
+ if (carg == NULL) {
+ callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ return;
+ }
+
+ ares_query_dnsrec(channel, name, (ares_dns_class_t)dnsclass,
+ (ares_dns_rec_type_t)type, ares__dnsrec_convert_cb, carg,
+ NULL);
}
diff --git a/deps/cares/src/lib/ares_search.c b/deps/cares/src/lib/ares_search.c
index 429c7e1db0de26..4fd909cd4f8b9f 100644
--- a/deps/cares/src/lib/ares_search.c
+++ b/deps/cares/src/lib/ares_search.c
@@ -33,209 +33,437 @@
#include "ares.h"
#include "ares_private.h"
+#include "ares_dns.h"
struct search_query {
- /* Arguments passed to ares_search */
- ares_channel_t *channel;
- char *name; /* copied into an allocated buffer */
- int dnsclass;
- int type;
- ares_callback callback;
- void *arg;
- char **domains; /* duplicate for ares_reinit() safety */
- size_t ndomains;
-
- int status_as_is; /* error status from trying as-is */
- size_t next_domain; /* next search domain to try */
- ares_bool_t trying_as_is; /* current query is for name as-is */
- size_t timeouts; /* number of timeouts we saw for this request */
+ /* Arguments passed to ares_search_dnsrec() */
+ ares_channel_t *channel;
+ ares_callback_dnsrec callback;
+ void *arg;
+
+ /* Duplicate of DNS record passed to ares_search_dnsrec() */
+ ares_dns_record_t *dnsrec;
+
+ /* Search order for names */
+ char **names;
+ size_t names_cnt;
+
+ /* State tracking progress through the search query */
+ size_t next_name_idx; /* next name index being attempted */
+ size_t timeouts; /* number of timeouts we saw for this request */
ares_bool_t ever_got_nodata; /* did we ever get ARES_ENODATA along the way? */
};
-static void search_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen);
+static void squery_free(struct search_query *squery)
+{
+ if (squery == NULL) {
+ return;
+ }
+ ares__strsplit_free(squery->names, squery->names_cnt);
+ ares_dns_record_destroy(squery->dnsrec);
+ ares_free(squery);
+}
+
+/* End a search query by invoking the user callback and freeing the
+ * search_query structure.
+ */
static void end_squery(struct search_query *squery, ares_status_t status,
- unsigned char *abuf, size_t alen);
+ const ares_dns_record_t *dnsrec)
+{
+ squery->callback(squery->arg, status, squery->timeouts, dnsrec);
+ squery_free(squery);
+}
+
+static void search_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec);
-static void ares_search_int(ares_channel_t *channel, const char *name,
- int dnsclass, int type, ares_callback callback,
- void *arg)
+static ares_status_t ares_search_next(ares_channel_t *channel,
+ struct search_query *squery,
+ ares_bool_t *skip_cleanup)
{
- struct search_query *squery;
- char *s;
- const char *p;
- ares_status_t status;
- size_t ndots;
+ ares_status_t status;
- /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
- if (ares__is_onion_domain(name)) {
- callback(arg, ARES_ENOTFOUND, 0, NULL, 0);
- return;
+ *skip_cleanup = ARES_FALSE;
+
+ /* Misuse check */
+ if (squery->next_name_idx >= squery->names_cnt) {
+ return ARES_EFORMERR;
}
- /* If name only yields one domain to search, then we don't have
- * to keep extra state, so just do an ares_query().
- */
- status = ares__single_domain(channel, name, &s);
+ status = ares_dns_record_query_set_name(
+ squery->dnsrec, 0, squery->names[squery->next_name_idx++]);
if (status != ARES_SUCCESS) {
- callback(arg, (int)status, 0, NULL, 0);
+ return status;
+ }
+
+ status =
+ ares_send_dnsrec(channel, squery->dnsrec, search_callback, squery, NULL);
+
+ if (status != ARES_EFORMERR) {
+ *skip_cleanup = ARES_TRUE;
+ }
+
+ return status;
+}
+
+static void search_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
+{
+ struct search_query *squery = (struct search_query *)arg;
+ ares_channel_t *channel = squery->channel;
+ ares_dns_rcode_t rcode;
+ size_t ancount;
+ ares_status_t mystatus;
+ ares_bool_t skip_cleanup = ARES_FALSE;
+
+ squery->timeouts += timeouts;
+
+ if (status != ARES_SUCCESS) {
+ end_squery(squery, status, dnsrec);
return;
}
- if (s) {
- ares_query(channel, s, dnsclass, type, callback, arg);
- ares_free(s);
+
+ rcode = ares_dns_record_get_rcode(dnsrec);
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ mystatus = ares_dns_query_reply_tostatus(rcode, ancount);
+
+ if (mystatus != ARES_ENODATA && mystatus != ARES_ESERVFAIL &&
+ mystatus != ARES_ENOTFOUND) {
+ end_squery(squery, mystatus, dnsrec);
return;
}
- /* Allocate a search_query structure to hold the state necessary for
- * doing multiple lookups.
+ /* If we ever get ARES_ENODATA along the way, record that; if the search
+ * should run to the very end and we got at least one ARES_ENODATA,
+ * then callers like ares_gethostbyname() may want to try a T_A search
+ * even if the last domain we queried for T_AAAA resource records
+ * returned ARES_ENOTFOUND.
*/
- squery = ares_malloc_zero(sizeof(*squery));
- if (!squery) {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ if (mystatus == ARES_ENODATA) {
+ squery->ever_got_nodata = ARES_TRUE;
+ }
+
+ if (squery->next_name_idx < squery->names_cnt) {
+ mystatus = ares_search_next(channel, squery, &skip_cleanup);
+ if (mystatus != ARES_SUCCESS && !skip_cleanup) {
+ end_squery(squery, mystatus, NULL);
+ }
return;
}
- squery->channel = channel;
- squery->name = ares_strdup(name);
- if (!squery->name) {
- ares_free(squery);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
+
+
+ /* We have no more domains to search, return an appropriate response. */
+ if (mystatus == ARES_ENOTFOUND && squery->ever_got_nodata) {
+ end_squery(squery, ARES_ENODATA, NULL);
return;
}
- /* Duplicate domains for safety during ares_reinit() */
- if (channel->ndomains) {
- squery->domains =
- ares__strsplit_duplicate(channel->domains, channel->ndomains);
- if (squery->domains == NULL) {
- ares_free(squery->name);
- ares_free(squery);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return;
+ end_squery(squery, mystatus, NULL);
+}
+
+/* Determine if the domain should be looked up as-is, or if it is eligible
+ * for search by appending domains */
+static ares_bool_t ares__search_eligible(const ares_channel_t *channel,
+ const char *name)
+{
+ size_t len = ares_strlen(name);
+
+ /* Name ends in '.', cannot search */
+ if (len && name[len - 1] == '.') {
+ return ARES_FALSE;
+ }
+
+ if (channel->flags & ARES_FLAG_NOSEARCH) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+ares_status_t ares__search_name_list(const ares_channel_t *channel,
+ const char *name, char ***names,
+ size_t *names_len)
+{
+ ares_status_t status;
+ char **list = NULL;
+ size_t list_len = 0;
+ char *alias = NULL;
+ size_t ndots = 0;
+ size_t idx = 0;
+ const char *p;
+ size_t i;
+
+ /* Perform HOSTALIASES resolution */
+ status = ares__lookup_hostaliases(channel, name, &alias);
+ if (status == ARES_SUCCESS) {
+ /* If hostalias succeeds, there is no searching, it is used as-is */
+ list_len = 1;
+ list = ares_malloc_zero(sizeof(*list) * list_len);
+ if (list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- squery->ndomains = channel->ndomains;
+ list[0] = alias;
+ alias = NULL;
+ goto done;
+ } else if (status != ARES_ENOTFOUND) {
+ goto done;
}
- squery->dnsclass = dnsclass;
- squery->type = type;
- squery->status_as_is = -1;
- squery->callback = callback;
- squery->arg = arg;
- squery->timeouts = 0;
- squery->ever_got_nodata = ARES_FALSE;
+ /* See if searching is eligible at all, if not, look up as-is only */
+ if (!ares__search_eligible(channel, name)) {
+ list_len = 1;
+ list = ares_malloc_zero(sizeof(*list) * list_len);
+ if (list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ list[0] = ares_strdup(name);
+ if (list[0] == NULL) {
+ status = ARES_ENOMEM;
+ } else {
+ status = ARES_SUCCESS;
+ }
+ goto done;
+ }
- /* Count the number of dots in name. */
+ /* Count the number of dots in name */
ndots = 0;
- for (p = name; *p; p++) {
+ for (p = name; *p != 0; p++) {
if (*p == '.') {
ndots++;
}
}
- /* If ndots is at least the channel ndots threshold (usually 1),
- * then we try the name as-is first. Otherwise, we try the name
- * as-is last.
- */
- if (ndots >= channel->ndots || squery->ndomains == 0) {
- /* Try the name as-is first. */
- squery->next_domain = 0;
- squery->trying_as_is = ARES_TRUE;
- ares_query(channel, name, dnsclass, type, search_callback, squery);
- } else {
- /* Try the name as-is last; start with the first search domain. */
- squery->next_domain = 1;
- squery->trying_as_is = ARES_FALSE;
- status = ares__cat_domain(name, squery->domains[0], &s);
- if (status == ARES_SUCCESS) {
- ares_query(channel, s, dnsclass, type, search_callback, squery);
- ares_free(s);
- } else {
- /* failed, free the malloc()ed memory */
- ares_free(squery->name);
- ares_free(squery);
- callback(arg, (int)status, 0, NULL, 0);
+ /* Allocate an entry for each search domain, plus one for as-is */
+ list_len = channel->ndomains + 1;
+ list = ares_malloc_zero(sizeof(*list) * list_len);
+ if (list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ /* Set status here, its possible there are no search domains at all, so
+ * status may be ARES_ENOTFOUND from ares__lookup_hostaliases(). */
+ status = ARES_SUCCESS;
+
+ /* Try as-is first */
+ if (ndots >= channel->ndots) {
+ list[idx] = ares_strdup(name);
+ if (list[idx] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ idx++;
+ }
+
+ /* Append each search suffix to the name */
+ for (i = 0; i < channel->ndomains; i++) {
+ status = ares__cat_domain(name, channel->domains[i], &list[idx]);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
+ idx++;
}
+
+ /* Try as-is last */
+ if (ndots < channel->ndots) {
+ list[idx] = ares_strdup(name);
+ if (list[idx] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ idx++;
+ }
+
+
+done:
+ if (status == ARES_SUCCESS) {
+ *names = list;
+ *names_len = list_len;
+ } else {
+ ares__strsplit_free(list, list_len);
+ }
+
+ ares_free(alias);
+ return status;
}
-void ares_search(ares_channel_t *channel, const char *name, int dnsclass,
- int type, ares_callback callback, void *arg)
+static ares_status_t ares_search_int(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback, void *arg)
{
- if (channel == NULL) {
- return;
+ struct search_query *squery = NULL;
+ const char *name;
+ ares_status_t status = ARES_SUCCESS;
+ ares_bool_t skip_cleanup = ARES_FALSE;
+
+ /* Extract the name for the search. Note that searches are only supported for
+ * DNS records containing a single query.
+ */
+ if (ares_dns_record_query_cnt(dnsrec) != 1) {
+ status = ARES_EBADQUERY;
+ goto fail;
}
- ares__channel_lock(channel);
- ares_search_int(channel, name, dnsclass, type, callback, arg);
- ares__channel_unlock(channel);
+
+ status = ares_dns_record_query_get(dnsrec, 0, &name, NULL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
+ if (ares__is_onion_domain(name)) {
+ status = ARES_ENOTFOUND;
+ goto fail;
+ }
+
+ /* Allocate a search_query structure to hold the state necessary for
+ * doing multiple lookups.
+ */
+ squery = ares_malloc_zero(sizeof(*squery));
+ if (squery == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ squery->channel = channel;
+
+ /* Duplicate DNS record since, name will need to be rewritten */
+ squery->dnsrec = ares_dns_record_duplicate(dnsrec);
+ if (squery->dnsrec == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ squery->callback = callback;
+ squery->arg = arg;
+ squery->timeouts = 0;
+ squery->ever_got_nodata = ARES_FALSE;
+
+ status =
+ ares__search_name_list(channel, name, &squery->names, &squery->names_cnt);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares_search_next(channel, squery, &skip_cleanup);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ return status;
+
+fail:
+ if (!skip_cleanup) {
+ squery_free(squery);
+ callback(arg, status, 0, NULL);
+ }
+ return status;
}
-static void search_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen)
+/* Callback argument structure passed to ares__dnsrec_convert_cb(). */
+typedef struct {
+ ares_callback callback;
+ void *arg;
+} dnsrec_convert_arg_t;
+
+/*! Function to create callback arg for converting from ares_callback_dnsrec
+ * to ares_calback */
+void *ares__dnsrec_convert_arg(ares_callback callback, void *arg)
{
- struct search_query *squery = (struct search_query *)arg;
- ares_channel_t *channel = squery->channel;
- char *s;
+ dnsrec_convert_arg_t *carg = ares_malloc_zero(sizeof(*carg));
+ if (carg == NULL) {
+ return NULL;
+ }
+ carg->callback = callback;
+ carg->arg = arg;
+ return carg;
+}
- squery->timeouts += (size_t)timeouts;
+/*! Callback function used to convert from the ares_callback_dnsrec prototype to
+ * the ares_callback prototype, by writing the result and passing that to
+ * the inner callback.
+ */
+void ares__dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
+{
+ dnsrec_convert_arg_t *carg = arg;
+ unsigned char *abuf = NULL;
+ size_t alen = 0;
- /* Stop searching unless we got a non-fatal error. */
- if (status != ARES_ENODATA && status != ARES_ESERVFAIL &&
- status != ARES_ENOTFOUND) {
- end_squery(squery, (ares_status_t)status, abuf, (size_t)alen);
- } else {
- /* Save the status if we were trying as-is. */
- if (squery->trying_as_is) {
- squery->status_as_is = status;
+ if (dnsrec != NULL) {
+ ares_status_t mystatus = ares_dns_write(dnsrec, &abuf, &alen);
+ if (mystatus != ARES_SUCCESS) {
+ status = mystatus;
}
+ }
- /*
- * If we ever get ARES_ENODATA along the way, record that; if the search
- * should run to the very end and we got at least one ARES_ENODATA,
- * then callers like ares_gethostbyname() may want to try a T_A search
- * even if the last domain we queried for T_AAAA resource records
- * returned ARES_ENOTFOUND.
- */
- if (status == ARES_ENODATA) {
- squery->ever_got_nodata = ARES_TRUE;
- }
+ carg->callback(carg->arg, (int)status, (int)timeouts, abuf, (int)alen);
- if (squery->next_domain < squery->ndomains) {
- ares_status_t mystatus;
- /* Try the next domain. */
- mystatus = ares__cat_domain(squery->name,
- squery->domains[squery->next_domain], &s);
- if (mystatus != ARES_SUCCESS) {
- end_squery(squery, mystatus, NULL, 0);
- } else {
- squery->trying_as_is = ARES_FALSE;
- squery->next_domain++;
- ares_query(channel, s, squery->dnsclass, squery->type, search_callback,
- squery);
- ares_free(s);
- }
- } else if (squery->status_as_is == -1) {
- /* Try the name as-is at the end. */
- squery->trying_as_is = ARES_TRUE;
- ares_query(channel, squery->name, squery->dnsclass, squery->type,
- search_callback, squery);
- } else {
- if (squery->status_as_is == ARES_ENOTFOUND && squery->ever_got_nodata) {
- end_squery(squery, ARES_ENODATA, NULL, 0);
- } else {
- end_squery(squery, (ares_status_t)squery->status_as_is, NULL, 0);
- }
- }
+ ares_free(abuf);
+ ares_free(carg);
+}
+
+/* Search for a DNS name with given class and type. Wrapper around
+ * ares_search_int() where the DNS record to search is first constructed.
+ */
+void ares_search(ares_channel_t *channel, const char *name, int dnsclass,
+ int type, ares_callback callback, void *arg)
+{
+ ares_status_t status;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t max_udp_size;
+ ares_dns_flags_t rd_flag;
+ void *carg = NULL;
+ if (channel == NULL || name == NULL) {
+ return;
+ }
+
+ /* For now, ares_search_int() uses the ares_callback prototype. We need to
+ * wrap the callback passed to this function in ares__dnsrec_convert_cb, to
+ * convert from ares_callback_dnsrec to ares_callback. Allocate the convert
+ * arg structure here.
+ */
+ carg = ares__dnsrec_convert_arg(callback, arg);
+ if (carg == NULL) {
+ callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ return;
+ }
+
+ rd_flag = !(channel->flags & ARES_FLAG_NORECURSE) ? ARES_FLAG_RD : 0;
+ max_udp_size = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0;
+ status = ares_dns_record_create_query(
+ &dnsrec, name, (ares_dns_class_t)dnsclass, (ares_dns_rec_type_t)type, 0,
+ rd_flag, max_udp_size);
+ if (status != ARES_SUCCESS) {
+ callback(arg, (int)status, 0, NULL, 0);
+ ares_free(carg);
+ return;
}
+
+ ares__channel_lock(channel);
+ ares_search_int(channel, dnsrec, ares__dnsrec_convert_cb, carg);
+ ares__channel_unlock(channel);
+
+ ares_dns_record_destroy(dnsrec);
}
-static void end_squery(struct search_query *squery, ares_status_t status,
- unsigned char *abuf, size_t alen)
+/* Search for a DNS record. Wrapper around ares_search_int(). */
+ares_status_t ares_search_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback, void *arg)
{
- squery->callback(squery->arg, (int)status, (int)squery->timeouts, abuf,
- (int)alen);
- ares__strsplit_free(squery->domains, squery->ndomains);
- ares_free(squery->name);
- ares_free(squery);
+ ares_status_t status;
+
+ if (channel == NULL || dnsrec == NULL || callback == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__channel_lock(channel);
+ status = ares_search_int(channel, dnsrec, callback, arg);
+ ares__channel_unlock(channel);
+
+ return status;
}
/* Concatenate two domains. */
@@ -260,89 +488,113 @@ ares_status_t ares__cat_domain(const char *name, const char *domain, char **s)
return ARES_SUCCESS;
}
-/* Determine if this name only yields one query. If it does, set *s to
- * the string we should query, in an allocated buffer. If not, set *s
- * to NULL.
- */
-ares_status_t ares__single_domain(const ares_channel_t *channel,
- const char *name, char **s)
+ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel,
+ const char *name, char **alias)
{
- size_t len = ares_strlen(name);
- const char *hostaliases;
- FILE *fp;
- char *line = NULL;
- ares_status_t status;
- size_t linesize;
- const char *p;
- const char *q;
- int error;
+ ares_status_t status = ARES_SUCCESS;
+ const char *hostaliases = NULL;
+ ares__buf_t *buf = NULL;
+ ares__llist_t *lines = NULL;
+ ares__llist_node_t *node;
+
+ if (channel == NULL || name == NULL || alias == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *alias = NULL;
+
+ /* Configuration says to not perform alias lookup */
+ if (channel->flags & ARES_FLAG_NOALIASES) {
+ return ARES_ENOTFOUND;
+ }
+
+ /* If a domain has a '.', its not allowed to perform an alias lookup */
+ if (strchr(name, '.') != NULL) {
+ return ARES_ENOTFOUND;
+ }
- /* If the name contains a trailing dot, then the single query is the name
- * sans the trailing dot.
+ hostaliases = getenv("HOSTALIASES");
+ if (hostaliases == NULL) {
+ status = ARES_ENOTFOUND;
+ goto done;
+ }
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_load_file(hostaliases, buf);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* The HOSTALIASES file is structured as one alias per line. The first
+ * field in the line is the simple hostname with no periods, followed by
+ * whitespace, then the full domain name, e.g.:
+ *
+ * c-ares www.c-ares.org
+ * curl www.curl.se
*/
- if ((len > 0) && (name[len - 1] == '.')) {
- *s = ares_strdup(name);
- return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
- }
-
- if (!(channel->flags & ARES_FLAG_NOALIASES) && !strchr(name, '.')) {
- /* The name might be a host alias. */
- hostaliases = getenv("HOSTALIASES");
- if (hostaliases) {
- fp = fopen(hostaliases, "r");
- if (fp) {
- while ((status = ares__read_line(fp, &line, &linesize)) ==
- ARES_SUCCESS) {
- if (strncasecmp(line, name, len) != 0 || !ISSPACE(line[len])) {
- continue;
- }
- p = line + len;
- while (ISSPACE(*p)) {
- p++;
- }
- if (*p) {
- q = p + 1;
- while (*q && !ISSPACE(*q)) {
- q++;
- }
- *s = ares_malloc((size_t)(q - p + 1));
- if (*s) {
- memcpy(*s, p, (size_t)(q - p));
- (*s)[q - p] = 0;
- }
- ares_free(line);
- fclose(fp);
- return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
- }
- }
- ares_free(line);
- fclose(fp);
- if (status != ARES_SUCCESS && status != ARES_EOF) {
- return status;
- }
- } else {
- error = ERRNO;
- switch (error) {
- case ENOENT:
- case ESRCH:
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
- strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n", hostaliases));
- *s = NULL;
- return ARES_EFILE;
- }
- }
- }
+
+ status = ares__buf_split(buf, (const unsigned char *)"\n", 1,
+ ARES_BUF_SPLIT_TRIM, 0, &lines);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- if (channel->flags & ARES_FLAG_NOSEARCH || channel->ndomains == 0) {
- /* No domain search to do; just try the name as-is. */
- *s = ares_strdup(name);
- return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
+ for (node = ares__llist_node_first(lines); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *line = ares__llist_node_val(node);
+ char hostname[64] = "";
+ char fqdn[256] = "";
+
+ /* Pull off hostname */
+ ares__buf_tag(line);
+ ares__buf_consume_nonwhitespace(line);
+ if (ares__buf_tag_fetch_string(line, hostname, sizeof(hostname)) !=
+ ARES_SUCCESS) {
+ continue;
+ }
+
+ /* Match hostname */
+ if (strcasecmp(hostname, name) != 0) {
+ continue;
+ }
+
+ /* consume whitespace */
+ ares__buf_consume_whitespace(line, ARES_TRUE);
+
+ /* pull off fqdn */
+ ares__buf_tag(line);
+ ares__buf_consume_nonwhitespace(line);
+ if (ares__buf_tag_fetch_string(line, fqdn, sizeof(fqdn)) != ARES_SUCCESS ||
+ ares_strlen(fqdn) == 0) {
+ continue;
+ }
+
+ /* Validate characterset */
+ if (!ares__is_hostname(fqdn)) {
+ continue;
+ }
+
+ *alias = ares_strdup(fqdn);
+ if (*alias == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ /* Good! */
+ status = ARES_SUCCESS;
+ goto done;
}
- *s = NULL;
- return ARES_SUCCESS;
+ status = ARES_ENOTFOUND;
+
+done:
+ ares__buf_destroy(buf);
+ ares__llist_destroy(lines);
+
+ return status;
}
diff --git a/deps/cares/src/lib/ares_send.c b/deps/cares/src/lib/ares_send.c
index 6cefdb6a36a87e..54f2b504d50cac 100644
--- a/deps/cares/src/lib/ares_send.c
+++ b/deps/cares/src/lib/ares_send.c
@@ -48,52 +48,47 @@ static unsigned short generate_unique_qid(ares_channel_t *channel)
return id;
}
-ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf,
- size_t qlen, ares_callback callback, void *arg,
- unsigned short *qid)
+static ares_status_t ares_send_dnsrec_int(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback,
+ void *arg, unsigned short *qid)
{
- struct query *query;
- size_t packetsz;
- struct timeval now = ares__tvnow();
- ares_status_t status;
- unsigned short id = generate_unique_qid(channel);
- unsigned char *abuf = NULL;
- size_t alen = 0;
+ struct query *query;
+ size_t packetsz;
+ struct timeval now = ares__tvnow();
+ ares_status_t status;
+ unsigned short id = generate_unique_qid(channel);
+ const ares_dns_record_t *dnsrec_resp = NULL;
- /* Verify that the query is at least long enough to hold the header. */
- if (qlen < HFIXEDSZ || qlen >= (1 << 16)) {
- callback(arg, ARES_EBADQUERY, 0, NULL, 0);
- return ARES_EBADQUERY;
- }
if (ares__slist_len(channel->servers) == 0) {
- callback(arg, ARES_ENOSERVER, 0, NULL, 0);
+ callback(arg, ARES_ENOSERVER, 0, NULL);
return ARES_ENOSERVER;
}
/* Check query cache */
- status = ares_qcache_fetch(channel, &now, qbuf, qlen, &abuf, &alen);
+ status = ares_qcache_fetch(channel, &now, dnsrec, &dnsrec_resp);
if (status != ARES_ENOTFOUND) {
/* ARES_SUCCESS means we retrieved the cache, anything else is a critical
* failure, all result in termination */
- callback(arg, (int)status, 0, abuf, (int)alen);
- ares_free(abuf);
+ callback(arg, status, 0, dnsrec_resp);
return status;
}
/* Allocate space for query and allocated fields. */
query = ares_malloc(sizeof(struct query));
if (!query) {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ callback(arg, ARES_ENOMEM, 0, NULL);
return ARES_ENOMEM;
}
memset(query, 0, sizeof(*query));
query->channel = channel;
- query->qbuf = ares_malloc(qlen);
- if (!query->qbuf) {
+
+ status = ares_dns_write(dnsrec, &query->qbuf, &query->qlen);
+ if (status != ARES_SUCCESS) {
ares_free(query);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return ARES_ENOMEM;
+ callback(arg, status, 0, NULL);
+ return status;
}
query->qid = id;
@@ -103,8 +98,6 @@ ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf,
/* Ignore first 2 bytes, assign our own query id */
query->qbuf[0] = (unsigned char)((id >> 8) & 0xFF);
query->qbuf[1] = (unsigned char)(id & 0xFF);
- memcpy(query->qbuf + 2, qbuf + 2, qlen - 2);
- query->qlen = qlen;
/* Fill in query arguments. */
query->callback = callback;
@@ -114,7 +107,8 @@ ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf,
query->try_count = 0;
packetsz = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : PACKETSZ;
- query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > packetsz;
+ query->using_tcp =
+ (channel->flags & ARES_FLAG_USEVC) || query->qlen > packetsz;
query->error_status = ARES_SUCCESS;
query->timeouts = 0;
@@ -127,7 +121,7 @@ ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf,
query->node_all_queries =
ares__llist_insert_last(channel->all_queries, query);
if (query->node_all_queries == NULL) {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ callback(arg, ARES_ENOMEM, 0, NULL);
ares__free_query(query);
return ARES_ENOMEM;
}
@@ -136,7 +130,7 @@ ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf,
* responses quickly.
*/
if (!ares__htable_szvp_insert(channel->queries_by_qid, query->qid, query)) {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ callback(arg, ARES_ENOMEM, 0, NULL);
ares__free_query(query);
return ARES_ENOMEM;
}
@@ -150,18 +144,60 @@ ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf,
return status;
}
+ares_status_t ares_send_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback, void *arg,
+ unsigned short *qid)
+{
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__channel_lock(channel);
+
+ status = ares_send_dnsrec_int(channel, dnsrec, callback, arg, qid);
+
+ ares__channel_unlock(channel);
+
+ return status;
+}
+
void ares_send(ares_channel_t *channel, const unsigned char *qbuf, int qlen,
ares_callback callback, void *arg)
{
+ ares_dns_record_t *dnsrec = NULL;
+ ares_status_t status;
+ void *carg = NULL;
+
if (channel == NULL) {
return;
}
- ares__channel_lock(channel);
+ /* Verify that the query is at least long enough to hold the header. */
+ if (qlen < HFIXEDSZ || qlen >= (1 << 16)) {
+ callback(arg, ARES_EBADQUERY, 0, NULL, 0);
+ return;
+ }
- ares_send_ex(channel, qbuf, (size_t)qlen, callback, arg, NULL);
+ status = ares_dns_parse(qbuf, (size_t)qlen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ callback(arg, (int)status, 0, NULL, 0);
+ return;
+ }
- ares__channel_unlock(channel);
+ carg = ares__dnsrec_convert_arg(callback, arg);
+ if (carg == NULL) {
+ status = ARES_ENOMEM;
+ ares_dns_record_destroy(dnsrec);
+ callback(arg, (int)status, 0, NULL, 0);
+ return;
+ }
+
+ ares_send_dnsrec(channel, dnsrec, ares__dnsrec_convert_cb, carg, NULL);
+
+ ares_dns_record_destroy(dnsrec);
}
size_t ares_queue_active_queries(ares_channel_t *channel)
diff --git a/deps/cares/src/lib/ares_str.c b/deps/cares/src/lib/ares_str.c
index 80660136dac8e1..5f25cfeaff041e 100644
--- a/deps/cares/src/lib/ares_str.c
+++ b/deps/cares/src/lib/ares_str.c
@@ -110,6 +110,54 @@ ares_bool_t ares_str_isnum(const char *str)
return ARES_TRUE;
}
+void ares__str_rtrim(char *str)
+{
+ size_t len;
+ size_t i;
+
+ if (str == NULL) {
+ return;
+ }
+
+ len = ares_strlen(str);
+ for (i = len; i > 0; i--) {
+ if (!ares__isspace(str[i - 1])) {
+ break;
+ }
+ }
+ str[i] = 0;
+}
+
+void ares__str_ltrim(char *str)
+{
+ size_t i;
+ size_t len;
+
+ if (str == NULL) {
+ return;
+ }
+
+ for (i = 0; str[i] != 0 && ares__isspace(str[i]); i++) {
+ /* Do nothing */
+ }
+
+ if (i == 0) {
+ return;
+ }
+
+ len = ares_strlen(str);
+ if (i != len) {
+ memmove(str, str + i, len - i);
+ }
+ str[len - i] = 0;
+}
+
+void ares__str_trim(char *str)
+{
+ ares__str_ltrim(str);
+ ares__str_rtrim(str);
+}
+
/* tolower() is locale-specific. Use a lookup table fast conversion that only
* operates on ASCII */
static const unsigned char ares__tolower_lookup[] = {
@@ -151,3 +199,71 @@ ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val,
}
return ARES_TRUE;
}
+
+ares_bool_t ares__isspace(int ch)
+{
+ switch (ch) {
+ case '\r':
+ case '\t':
+ case ' ':
+ case '\v':
+ case '\f':
+ case '\n':
+ return ARES_TRUE;
+ default:
+ break;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares__isprint(int ch)
+{
+ if (ch >= 0x20 && ch <= 0x7E) {
+ return ARES_TRUE;
+ }
+ return ARES_FALSE;
+}
+
+/* Character set allowed by hostnames. This is to include the normal
+ * domain name character set plus:
+ * - underscores which are used in SRV records.
+ * - Forward slashes such as are used for classless in-addr.arpa
+ * delegation (CNAMEs)
+ * - Asterisks may be used for wildcard domains in CNAMEs as seen in the
+ * real world.
+ * While RFC 2181 section 11 does state not to do validation,
+ * that applies to servers, not clients. Vulnerabilities have been
+ * reported when this validation is not performed. Security is more
+ * important than edge-case compatibility (which is probably invalid
+ * anyhow). */
+ares_bool_t ares__is_hostnamech(int ch)
+{
+ /* [A-Za-z0-9-*._/]
+ * Don't use isalnum() as it is locale-specific
+ */
+ if (ch >= 'A' && ch <= 'Z') {
+ return ARES_TRUE;
+ }
+ if (ch >= 'a' && ch <= 'z') {
+ return ARES_TRUE;
+ }
+ if (ch >= '0' && ch <= '9') {
+ return ARES_TRUE;
+ }
+ if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*') {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+ares_bool_t ares__is_hostname(const char *str)
+{
+ size_t i;
+ for (i = 0; str[i] != 0; i++) {
+ if (!ares__is_hostnamech(str[i])) {
+ return ARES_FALSE;
+ }
+ }
+ return ARES_TRUE;
+}
diff --git a/deps/cares/src/lib/ares_str.h b/deps/cares/src/lib/ares_str.h
index 2bf32d0d253da7..8d869073d8153c 100644
--- a/deps/cares/src/lib/ares_str.h
+++ b/deps/cares/src/lib/ares_str.h
@@ -24,8 +24,8 @@
*
* SPDX-License-Identifier: MIT
*/
-#ifndef HEADER_CARES_STRDUP_H
-#define HEADER_CARES_STRDUP_H
+#ifndef __ARES_STR_H
+#define __ARES_STR_H
#include "ares_setup.h"
#include "ares.h"
@@ -48,8 +48,19 @@ size_t ares_strcpy(char *dest, const char *src, size_t dest_size);
ares_bool_t ares_str_isnum(const char *str);
+void ares__str_ltrim(char *str);
+void ares__str_rtrim(char *str);
+void ares__str_trim(char *str);
+
unsigned char ares__tolower(unsigned char c);
ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val,
size_t len);
-#endif /* HEADER_CARES_STRDUP_H */
+ares_bool_t ares__isspace(int ch);
+ares_bool_t ares__isprint(int ch);
+ares_bool_t ares__is_hostnamech(int ch);
+
+ares_bool_t ares__is_hostname(const char *str);
+
+
+#endif /* __ARES_STR_H */
diff --git a/deps/cares/src/lib/ares_strsplit.c b/deps/cares/src/lib/ares_strsplit.c
index 5ec615c76482ed..395bf1ebb9a5ec 100644
--- a/deps/cares/src/lib/ares_strsplit.c
+++ b/deps/cares/src/lib/ares_strsplit.c
@@ -94,7 +94,7 @@ char **ares__strsplit(const char *in, const char *delms, size_t *num_elm)
status = ares__buf_split(
buf, (const unsigned char *)delms, ares_strlen(delms),
- ARES_BUF_SPLIT_NO_DUPLICATES | ARES_BUF_SPLIT_CASE_INSENSITIVE, &llist);
+ ARES_BUF_SPLIT_NO_DUPLICATES | ARES_BUF_SPLIT_CASE_INSENSITIVE, 0, &llist);
if (status != ARES_SUCCESS) {
goto done;
}
diff --git a/deps/cares/src/lib/ares_sysconfig.c b/deps/cares/src/lib/ares_sysconfig.c
index 825008b7b8a543..474534512af191 100644
--- a/deps/cares/src/lib/ares_sysconfig.c
+++ b/deps/cares/src/lib/ares_sysconfig.c
@@ -954,7 +954,7 @@ static ares_status_t ares__init_sysconfig_libresolv(ares_sysconfig_t *sysconfig)
}
}
- if (res.ndots > 0) {
+ if (res.ndots >= 0) {
sysconfig->ndots = (size_t)res.ndots;
}
if (res.retry > 0) {
@@ -1059,6 +1059,10 @@ static ares_status_t ares_sysconfig_apply(ares_channel_t *channel,
channel->rotate = sysconfig->rotate;
}
+ if (sysconfig->usevc) {
+ channel->flags |= ARES_FLAG_USEVC;
+ }
+
return ARES_SUCCESS;
}
diff --git a/deps/cares/src/lib/ares_sysconfig_files.c b/deps/cares/src/lib/ares_sysconfig_files.c
index 9802c7e54a5419..557888bc740a39 100644
--- a/deps/cares/src/lib/ares_sysconfig_files.c
+++ b/deps/cares/src/lib/ares_sysconfig_files.c
@@ -134,7 +134,7 @@ static ares_status_t parse_sort(ares__buf_t *buf, struct apattern *pat)
ares__buf_tag(buf);
/* Consume ip address */
- if (ares__buf_consume_charset(buf, ip_charset, sizeof(ip_charset)) == 0) {
+ if (ares__buf_consume_charset(buf, ip_charset, sizeof(ip_charset) - 1) == 0) {
return ARES_EBADSTR;
}
@@ -162,8 +162,8 @@ static ares_status_t parse_sort(ares__buf_t *buf, struct apattern *pat)
ares__buf_tag(buf);
/* Consume mask */
- if (ares__buf_consume_charset(buf, ipv4_charset, sizeof(ipv4_charset)) ==
- 0) {
+ if (ares__buf_consume_charset(buf, ipv4_charset,
+ sizeof(ipv4_charset) - 1) == 0) {
return ARES_EBADSTR;
}
@@ -241,7 +241,7 @@ ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort,
/* Split on space or semicolon */
status = ares__buf_split(buf, (const unsigned char *)" ;", 2,
- ARES_BUF_SPLIT_NONE, &list);
+ ARES_BUF_SPLIT_NONE, 0, &list);
if (status != ARES_SUCCESS) {
goto done;
}
@@ -282,7 +282,8 @@ ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort,
return status;
}
-static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str)
+static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str,
+ size_t max_domains)
{
if (sysconfig->domains && sysconfig->ndomains > 0) {
/* if we already have some domains present, free them first */
@@ -296,410 +297,515 @@ static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str)
return ARES_ENOMEM;
}
+ /* Truncate if necessary */
+ if (max_domains && sysconfig->ndomains > max_domains) {
+ size_t i;
+ for (i = max_domains; i < sysconfig->ndomains; i++) {
+ ares_free(sysconfig->domains[i]);
+ sysconfig->domains[i] = NULL;
+ }
+ sysconfig->ndomains = max_domains;
+ }
+
return ARES_SUCCESS;
}
-static ares_status_t config_domain(ares_sysconfig_t *sysconfig, char *str)
+static ares_status_t buf_fetch_string(ares__buf_t *buf, char *str,
+ size_t str_len)
{
- char *q;
-
- /* Set a single search domain. */
- q = str;
- while (*q && !ISSPACE(*q)) {
- q++;
- }
- *q = '\0';
+ ares_status_t status;
+ ares__buf_tag(buf);
+ ares__buf_consume(buf, ares__buf_len(buf));
- return config_search(sysconfig, str);
+ status = ares__buf_tag_fetch_string(buf, str, str_len);
+ return status;
}
-static ares_status_t config_lookup(ares_sysconfig_t *sysconfig, const char *str,
- const char *bindch, const char *altbindch,
- const char *filech)
+static ares_status_t config_lookup(ares_sysconfig_t *sysconfig,
+ ares__buf_t *buf, const char *separators)
{
- char lookups[3];
- char *l;
- const char *p;
- ares_bool_t found;
-
- if (altbindch == NULL) {
- altbindch = bindch;
+ ares_status_t status;
+ char lookupstr[32];
+ size_t lookupstr_cnt = 0;
+ ares__llist_t *lookups = NULL;
+ ares__llist_node_t *node;
+ size_t separators_len = ares_strlen(separators);
+
+ status = ares__buf_split(buf, (const unsigned char *)separators,
+ separators_len, ARES_BUF_SPLIT_TRIM, 0, &lookups);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- /* Set the lookup order. Only the first letter of each work
- * is relevant, and it has to be "b" for DNS or "f" for the
- * host file. Ignore everything else.
- */
- l = lookups;
- p = str;
- found = ARES_FALSE;
- while (*p) {
- if ((*p == *bindch || *p == *altbindch || *p == *filech) &&
- l < lookups + 2) {
- if (*p == *bindch || *p == *altbindch) {
- *l++ = 'b';
- } else {
- *l++ = 'f';
- }
- found = ARES_TRUE;
+ memset(lookupstr, 0, sizeof(lookupstr));
+
+ for (node = ares__llist_node_first(lookups); node != NULL;
+ node = ares__llist_node_next(node)) {
+ char value[128];
+ char ch;
+ ares__buf_t *valbuf = ares__llist_node_val(node);
+
+ status = buf_fetch_string(valbuf, value, sizeof(value));
+ if (status != ARES_SUCCESS) {
+ continue;
}
- while (*p && !ISSPACE(*p) && (*p != ',')) {
- p++;
+
+ if (strcasecmp(value, "dns") == 0 || strcasecmp(value, "bind") == 0 ||
+ strcasecmp(value, "resolv") == 0 || strcasecmp(value, "resolve") == 0) {
+ ch = 'b';
+ } else if (strcasecmp(value, "files") == 0 ||
+ strcasecmp(value, "file") == 0 ||
+ strcasecmp(value, "local") == 0) {
+ ch = 'f';
+ } else {
+ continue;
}
- while (*p && (ISSPACE(*p) || (*p == ','))) {
- p++;
+
+ /* Look for a duplicate and ignore */
+ if (memchr(lookupstr, ch, lookupstr_cnt) == NULL) {
+ lookupstr[lookupstr_cnt++] = ch;
}
}
- if (!found) {
- return ARES_ENOTINITIALIZED;
+
+ if (lookupstr_cnt) {
+ ares_free(sysconfig->lookups);
+ sysconfig->lookups = ares_strdup(lookupstr);
+ if (sysconfig->lookups == NULL) {
+ return ARES_ENOMEM;
+ }
}
- *l = '\0';
- ares_free(sysconfig->lookups);
- sysconfig->lookups = ares_strdup(lookups);
- if (sysconfig->lookups == NULL) {
- return ARES_ENOMEM;
+ status = ARES_SUCCESS;
+
+done:
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
}
- return ARES_SUCCESS;
+ ares__llist_destroy(lookups);
+ return status;
}
-static const char *try_option(const char *p, const char *q, const char *opt)
+static ares_status_t process_option(ares_sysconfig_t *sysconfig,
+ ares__buf_t *option)
{
- size_t len = ares_strlen(opt);
- return ((size_t)(q - p) >= len && !strncmp(p, opt, len)) ? &p[len] : NULL;
+ ares__llist_t *kv = NULL;
+ char key[32] = "";
+ char val[32] = "";
+ unsigned int valint = 0;
+ ares_status_t status;
+
+ /* Split on : */
+ status = ares__buf_split(option, (const unsigned char *)":", 1,
+ ARES_BUF_SPLIT_TRIM, 2, &kv);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = buf_fetch_string(ares__llist_first_val(kv), key, sizeof(key));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ if (ares__llist_len(kv) == 2) {
+ status = buf_fetch_string(ares__llist_last_val(kv), val, sizeof(val));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ valint = (unsigned int)strtoul(val, NULL, 10);
+ }
+
+ if (strcmp(key, "ndots") == 0) {
+ sysconfig->ndots = valint;
+ } else if (strcmp(key, "retrans") == 0 || strcmp(key, "timeout") == 0) {
+ if (valint == 0) {
+ return ARES_EFORMERR;
+ }
+ sysconfig->timeout_ms = valint * 1000;
+ } else if (strcmp(key, "retry") == 0 || strcmp(key, "attempts") == 0) {
+ if (valint == 0) {
+ return ARES_EFORMERR;
+ }
+ sysconfig->tries = valint;
+ } else if (strcmp(key, "rotate") == 0) {
+ sysconfig->rotate = ARES_TRUE;
+ } else if (strcmp(key, "use-vc") == 0 || strcmp(key, "usevc") == 0) {
+ sysconfig->usevc = ARES_TRUE;
+ }
+
+done:
+ ares__llist_destroy(kv);
+ return status;
}
static ares_status_t set_options(ares_sysconfig_t *sysconfig, const char *str)
{
- const char *p;
- const char *q;
- const char *val;
+ ares__buf_t *buf = NULL;
+ ares__llist_t *options = NULL;
+ ares_status_t status;
+ ares__llist_node_t *node;
- if (str == NULL) {
- return ARES_SUCCESS;
+ buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str));
+ if (buf == NULL) {
+ return ARES_ENOMEM;
}
- p = str;
- while (*p) {
- q = p;
- while (*q && !ISSPACE(*q)) {
- q++;
- }
- val = try_option(p, q, "ndots:");
- if (val) {
- sysconfig->ndots = strtoul(val, NULL, 10);
- }
+ status = ares__buf_split(buf, (const unsigned char *)" \t", 2,
+ ARES_BUF_SPLIT_TRIM, 0, &options);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- // Outdated option.
- val = try_option(p, q, "retrans:");
- if (val) {
- sysconfig->timeout_ms = strtoul(val, NULL, 10);
- }
+ for (node = ares__llist_node_first(options); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *valbuf = ares__llist_node_val(node);
- val = try_option(p, q, "timeout:");
- if (val) {
- sysconfig->timeout_ms = strtoul(val, NULL, 10) * 1000;
+ status = process_option(sysconfig, valbuf);
+ /* Out of memory is the only fatal condition */
+ if (status == ARES_ENOMEM) {
+ goto done;
}
+ }
- // Outdated option.
- val = try_option(p, q, "retry:");
- if (val) {
- sysconfig->tries = strtoul(val, NULL, 10);
- }
+ status = ARES_SUCCESS;
- val = try_option(p, q, "attempts:");
- if (val) {
- sysconfig->tries = strtoul(val, NULL, 10);
- }
+done:
+ ares__llist_destroy(options);
+ ares__buf_destroy(buf);
+ return status;
+}
- val = try_option(p, q, "rotate");
- if (val) {
- sysconfig->rotate = ARES_TRUE;
+ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig)
+{
+ const char *localdomain;
+ const char *res_options;
+ ares_status_t status;
+
+ localdomain = getenv("LOCALDOMAIN");
+ if (localdomain) {
+ char *temp = ares_strdup(localdomain);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
}
+ status = config_search(sysconfig, temp, 1);
+ ares_free(temp);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
- p = q;
- while (ISSPACE(*p)) {
- p++;
+ res_options = getenv("RES_OPTIONS");
+ if (res_options) {
+ status = set_options(sysconfig, res_options);
+ if (status != ARES_SUCCESS) {
+ return status;
}
}
return ARES_SUCCESS;
}
-static char *try_config(char *s, const char *opt, char scc)
+/* Configuration Files:
+ * /etc/resolv.conf
+ * - All Unix-like systems
+ * - Comments start with ; or #
+ * - Lines have a keyword followed by a value that is interpreted specific
+ * to the keyword:
+ * - Keywords:
+ * - nameserver - IP address of nameserver with optional port (using a :
+ * prefix). If using an ipv6 address and specifying a port, the ipv6
+ * address must be encapsulated in brackets. For link-local ipv6
+ * addresses, the interface can also be specified with a % prefix. e.g.:
+ * "nameserver [fe80::1]:1234%iface"
+ * This keyword may be specified multiple times.
+ * - search - whitespace separated list of domains
+ * - domain - obsolete, same as search except only a single domain
+ * - lookup / hostresorder - local, bind, file, files
+ * - sortlist - whitespace separated ip-address/netmask pairs
+ * - options - options controlling resolver variables
+ * - ndots:n - set ndots option
+ * - timeout:n (retrans:n) - timeout per query attempt in seconds
+ * - attempts:n (retry:n) - number of times resolver will send query
+ * - rotate - round-robin selection of name servers
+ * - use-vc / usevc - force tcp
+ * /etc/nsswitch.conf
+ * - Modern Linux, FreeBSD, HP-UX, Solaris
+ * - Search order set via:
+ * "hosts: files dns mdns4_minimal mdns4"
+ * - files is /etc/hosts
+ * - dns is dns
+ * - mdns4_minimal does mdns only if ending in .local
+ * - mdns4 does not limit to domains ending in .local
+ * /etc/netsvc.conf
+ * - AIX
+ * - Search order set via:
+ * "hosts = local , bind"
+ * - bind is dns
+ * - local is /etc/hosts
+ * /etc/svc.conf
+ * - Tru64
+ * - Same format as /etc/netsvc.conf
+ * /etc/host.conf
+ * - Early FreeBSD, Early Linux
+ * - Not worth supporting, format varied based on system, FreeBSD used
+ * just a line per search order, Linux used "order " and a comma
+ * delimited list of "bind" and "hosts"
+ */
+
+
+/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other
+ * conditions are ignored. Users may mess up config files, but we want to
+ * process anything we can. */
+static ares_status_t parse_resolvconf_line(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line)
{
- size_t len;
- char *p;
- char *q;
+ char option[32];
+ char value[512];
+ ares_status_t status = ARES_SUCCESS;
- if (!s || !opt) {
- /* no line or no option */
- return NULL; /* LCOV_EXCL_LINE */
+ /* Ignore lines beginning with a comment */
+ if (ares__buf_begins_with(line, (const unsigned char *)"#", 1) ||
+ ares__buf_begins_with(line, (const unsigned char *)";", 1)) {
+ return ARES_SUCCESS;
}
- /* Hash '#' character is always used as primary comment char, additionally
- a not-NUL secondary comment char will be considered when specified. */
+ ares__buf_tag(line);
- /* trim line comment */
- p = s;
- if (scc) {
- while (*p && (*p != '#') && (*p != scc)) {
- p++;
- }
- } else {
- while (*p && (*p != '#')) {
- p++;
- }
+ /* Shouldn't be possible, but if it happens, ignore the line. */
+ if (ares__buf_consume_nonwhitespace(line) == 0) {
+ return ARES_SUCCESS;
}
- *p = '\0';
- /* trim trailing whitespace */
- q = p - 1;
- while ((q >= s) && ISSPACE(*q)) {
- q--;
+ status = ares__buf_tag_fetch_string(line, option, sizeof(option));
+ if (status != ARES_SUCCESS) {
+ return ARES_SUCCESS;
}
- *++q = '\0';
- /* skip leading whitespace */
- p = s;
- while (*p && ISSPACE(*p)) {
- p++;
- }
+ ares__buf_consume_whitespace(line, ARES_TRUE);
- if (!*p) {
- /* empty line */
- return NULL;
+ status = buf_fetch_string(line, value, sizeof(value));
+ if (status != ARES_SUCCESS) {
+ return ARES_SUCCESS;
}
- if ((len = ares_strlen(opt)) == 0) {
- /* empty option */
- return NULL; /* LCOV_EXCL_LINE */
+ ares__str_trim(value);
+ if (*value == 0) {
+ return ARES_SUCCESS;
}
- if (strncmp(p, opt, len) != 0) {
- /* line and option do not match */
- return NULL;
+ /* At this point we have a string option and a string value, both trimmed
+ * of leading and trailing whitespace. Lets try to evaluate them */
+ if (strcmp(option, "domain") == 0) {
+ /* Domain is legacy, don't overwrite an existing config set by search */
+ if (sysconfig->domains == NULL) {
+ status = config_search(sysconfig, value, 1);
+ }
+ } else if (strcmp(option, "lookup") == 0 ||
+ strcmp(option, "hostresorder") == 0) {
+ ares__buf_tag_rollback(line);
+ status = config_lookup(sysconfig, line, " \t");
+ } else if (strcmp(option, "search") == 0) {
+ status = config_search(sysconfig, value, 0);
+ } else if (strcmp(option, "nameserver") == 0) {
+ status =
+ ares__sconfig_append_fromstr(&sysconfig->sconfig, value, ARES_TRUE);
+ } else if (strcmp(option, "sortlist") == 0) {
+ /* Ignore all failures except ENOMEM. If the sysadmin set a bad
+ * sortlist, just ignore the sortlist, don't cause an inoperable
+ * channel */
+ status =
+ ares__parse_sortlist(&sysconfig->sortlist, &sysconfig->nsortlist, value);
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ } else if (strcmp(option, "options") == 0) {
+ status = set_options(sysconfig, value);
}
- /* skip over given option name */
- p += len;
+ return status;
+}
+
+/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other
+ * conditions are ignored. Users may mess up config files, but we want to
+ * process anything we can. */
+static ares_status_t parse_nsswitch_line(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line)
+{
+ char option[32];
+ ares__buf_t *buf;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_t *sects = NULL;
- if (!*p) {
- /* no option value */
- return NULL; /* LCOV_EXCL_LINE */
+ /* Ignore lines beginning with a comment */
+ if (ares__buf_begins_with(line, (const unsigned char *)"#", 1)) {
+ return ARES_SUCCESS;
}
- if ((opt[len - 1] != ':') && (opt[len - 1] != '=') && !ISSPACE(*p)) {
- /* whitespace between option name and value is mandatory
- for given option names which do not end with ':' or '=' */
- return NULL;
+ /* database : values (space delimited) */
+ status = ares__buf_split(line, (const unsigned char *)":", 1,
+ ARES_BUF_SPLIT_TRIM, 2, §s);
+
+ if (status != ARES_SUCCESS || ares__llist_len(sects) != 2) {
+ goto done;
}
- /* skip over whitespace */
- while (*p && ISSPACE(*p)) {
- p++;
+ buf = ares__llist_first_val(sects);
+ status = buf_fetch_string(buf, option, sizeof(option));
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- if (!*p) {
- /* no option value */
- return NULL;
+ /* Only support "hosts:" */
+ if (strcmp(option, "hosts") != 0) {
+ goto done;
}
- /* return pointer to option value */
- return p;
+ /* Values are space separated */
+ buf = ares__llist_last_val(sects);
+ status = config_lookup(sysconfig, buf, " \t");
+
+done:
+ ares__llist_destroy(sects);
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ return status;
}
-ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig)
+/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other
+ * conditions are ignored. Users may mess up config files, but we want to
+ * process anything we can. */
+static ares_status_t parse_svcconf_line(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line)
{
- const char *localdomain;
- const char *res_options;
- ares_status_t status;
+ char option[32];
+ ares__buf_t *buf;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_t *sects = NULL;
- localdomain = getenv("LOCALDOMAIN");
- if (localdomain) {
- char *temp = ares_strdup(localdomain);
- if (temp == NULL) {
- return ARES_ENOMEM;
- }
- status = config_domain(sysconfig, temp);
- ares_free(temp);
- if (status != ARES_SUCCESS) {
- return status;
- }
+ /* Ignore lines beginning with a comment */
+ if (ares__buf_begins_with(line, (const unsigned char *)"#", 1)) {
+ return ARES_SUCCESS;
}
- res_options = getenv("RES_OPTIONS");
- if (res_options) {
- status = set_options(sysconfig, res_options);
- if (status != ARES_SUCCESS) {
- return status;
- }
+ /* database = values (comma delimited)*/
+ status = ares__buf_split(line, (const unsigned char *)"=", 1,
+ ARES_BUF_SPLIT_TRIM, 2, §s);
+
+ if (status != ARES_SUCCESS || ares__llist_len(sects) != 2) {
+ goto done;
}
- return ARES_SUCCESS;
+ buf = ares__llist_first_val(sects);
+ status = buf_fetch_string(buf, option, sizeof(option));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Only support "hosts=" */
+ if (strcmp(option, "hosts") != 0) {
+ goto done;
+ }
+
+ /* Values are comma separated */
+ buf = ares__llist_last_val(sects);
+ status = config_lookup(sysconfig, buf, ",");
+
+done:
+ ares__llist_destroy(sects);
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ return status;
}
-ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel,
- ares_sysconfig_t *sysconfig)
+typedef ares_status_t (*line_callback_t)(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line);
+
+/* Should only return:
+ * ARES_ENOTFOUND - file not found
+ * ARES_EFILE - error reading file (perms)
+ * ARES_ENOMEM - out of memory
+ * ARES_SUCCESS - file processed, doesn't necessarily mean it was a good
+ * file, but we're not erroring out if we can't parse
+ * something (or anything at all) */
+static ares_status_t process_config_lines(const char *filename,
+ ares_sysconfig_t *sysconfig,
+ line_callback_t cb)
{
- char *p;
- FILE *fp = NULL;
- char *line = NULL;
- size_t linesize = 0;
- int error;
- const char *resolvconf_path;
- ares_status_t status = ARES_SUCCESS;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_node_t *node;
+ ares__llist_t *lines = NULL;
+ ares__buf_t *buf = NULL;
- /* Support path for resolvconf filename set by ares_init_options */
- if (channel->resolvconf_path) {
- resolvconf_path = channel->resolvconf_path;
- } else {
- resolvconf_path = PATH_RESOLV_CONF;
- }
-
- fp = fopen(resolvconf_path, "r");
- if (fp) {
- while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) {
- if ((p = try_config(line, "domain", ';'))) {
- status = config_domain(sysconfig, p);
- } else if ((p = try_config(line, "lookup", ';'))) {
- status = config_lookup(sysconfig, p, "bind", NULL, "file");
- } else if ((p = try_config(line, "search", ';'))) {
- status = config_search(sysconfig, p);
- } else if ((p = try_config(line, "nameserver", ';'))) {
- status =
- ares__sconfig_append_fromstr(&sysconfig->sconfig, p, ARES_TRUE);
- } else if ((p = try_config(line, "sortlist", ';'))) {
- /* Ignore all failures except ENOMEM. If the sysadmin set a bad
- * sortlist, just ignore the sortlist, don't cause an inoperable
- * channel */
- status =
- ares__parse_sortlist(&sysconfig->sortlist, &sysconfig->nsortlist, p);
- if (status != ARES_ENOMEM) {
- status = ARES_SUCCESS;
- }
- } else if ((p = try_config(line, "options", ';'))) {
- status = set_options(sysconfig, p);
- } else {
- status = ARES_SUCCESS;
- }
- if (status != ARES_SUCCESS) {
- fclose(fp);
- goto done;
- }
- }
- fclose(fp);
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- if (status != ARES_EOF) {
- goto done;
- }
- } else {
- error = ERRNO;
- switch (error) {
- case ENOENT:
- case ESRCH:
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
- strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n", PATH_RESOLV_CONF));
- status = ARES_EFILE;
- goto done;
- }
+ status = ares__buf_load_file(filename, buf);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
+ status = ares__buf_split(buf, (const unsigned char *)"\n", 1,
+ ARES_BUF_SPLIT_TRIM, 0, &lines);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */
- fp = fopen("/etc/nsswitch.conf", "r");
- if (fp) {
- while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) {
- if ((p = try_config(line, "hosts:", '\0'))) {
- (void)config_lookup(sysconfig, p, "dns", "resolve", "files");
- }
- }
- fclose(fp);
- if (status != ARES_EOF) {
+ for (node = ares__llist_node_first(lines); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *line = ares__llist_node_val(node);
+
+ status = cb(sysconfig, line);
+ if (status != ARES_SUCCESS) {
goto done;
}
- } else {
- error = ERRNO;
- switch (error) {
- case ENOENT:
- case ESRCH:
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
- strerror(error)));
- DEBUGF(
- fprintf(stderr, "Error opening file: %s\n", "/etc/nsswitch.conf"));
- break;
- }
- /* ignore error, maybe we will get luck in next if clause */
}
+done:
+ ares__buf_destroy(buf);
+ ares__llist_destroy(lines);
- /* Linux / GNU libc 2.x and possibly others have host.conf */
- fp = fopen("/etc/host.conf", "r");
- if (fp) {
- while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) {
- if ((p = try_config(line, "order", '\0'))) {
- /* ignore errors */
- (void)config_lookup(sysconfig, p, "bind", NULL, "hosts");
- }
- }
- fclose(fp);
- if (status != ARES_EOF) {
- goto done;
- }
- } else {
- error = ERRNO;
- switch (error) {
- case ENOENT:
- case ESRCH:
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
- strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/host.conf"));
- break;
- }
+ return status;
+}
+
+ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel,
+ ares_sysconfig_t *sysconfig)
+{
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Resolv.conf */
+ status = process_config_lines((channel->resolvconf_path != NULL)
+ ? channel->resolvconf_path
+ : PATH_RESOLV_CONF,
+ sysconfig, parse_resolvconf_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
- /* ignore error, maybe we will get luck in next if clause */
+ /* Nsswitch.conf */
+ status =
+ process_config_lines("/etc/nsswitch.conf", sysconfig, parse_nsswitch_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
}
+ /* netsvc.conf */
+ status =
+ process_config_lines("/etc/netsvc.conf", sysconfig, parse_svcconf_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
- /* Tru64 uses /etc/svc.conf */
- fp = fopen("/etc/svc.conf", "r");
- if (fp) {
- while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) {
- if ((p = try_config(line, "hosts=", '\0'))) {
- /* ignore errors */
- (void)config_lookup(sysconfig, p, "bind", NULL, "local");
- }
- }
- fclose(fp);
- if (status != ARES_EOF) {
- goto done;
- }
- } else {
- error = ERRNO;
- switch (error) {
- case ENOENT:
- case ESRCH:
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
- strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/svc.conf"));
- break;
- }
- /* ignore error */
+ /* svc.conf */
+ status = process_config_lines("/etc/svc.conf", sysconfig, parse_svcconf_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
}
status = ARES_SUCCESS;
done:
- ares_free(line);
-
return status;
}
diff --git a/deps/cares/src/lib/ares_update_servers.c b/deps/cares/src/lib/ares_update_servers.c
index dd24fbfdd4675c..fce791476327c3 100644
--- a/deps/cares/src/lib/ares_update_servers.c
+++ b/deps/cares/src/lib/ares_update_servers.c
@@ -266,8 +266,8 @@ static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig)
} else {
/* IPv6 */
const unsigned char ipv6_charset[] = "ABCDEFabcdef0123456789.:";
- if (ares__buf_consume_charset(buf, ipv6_charset, sizeof(ipv6_charset)) ==
- 0) {
+ if (ares__buf_consume_charset(buf, ipv6_charset,
+ sizeof(ipv6_charset) - 1) == 0) {
return ARES_EBADSTR;
}
}
@@ -318,8 +318,8 @@ static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig)
ares__buf_tag(buf);
- if (ares__buf_consume_charset(buf, iface_charset, sizeof(iface_charset)) ==
- 0) {
+ if (ares__buf_consume_charset(buf, iface_charset,
+ sizeof(iface_charset) - 1) == 0) {
return ARES_EBADSTR;
}
@@ -463,7 +463,7 @@ ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig,
}
status = ares__buf_split(buf, (const unsigned char *)" ,", 2,
- ARES_BUF_SPLIT_NONE, &list);
+ ARES_BUF_SPLIT_NONE, 0, &list);
if (status != ARES_SUCCESS) {
goto done;
}
@@ -1080,7 +1080,7 @@ static ares_status_t set_servers_csv(ares_channel_t *channel, const char *_csv)
if (ares_strlen(_csv) == 0) {
/* blank all servers */
- return (ares_status_t)ares_set_servers_ports(channel, NULL);
+ return ares__servers_update(channel, NULL, ARES_TRUE);
}
status = ares__sconfig_append_fromstr(&slist, _csv, ARES_FALSE);
diff --git a/deps/cares/src/lib/setup_once.h b/deps/cares/src/lib/setup_once.h
index 8341b348e7a9e0..a6168c9aed5365 100644
--- a/deps/cares/src/lib/setup_once.h
+++ b/deps/cares/src/lib/setup_once.h
@@ -274,7 +274,7 @@ Error Missing_definition_of_macro_sread
#define ISPRINT(x) (isprint((int)((unsigned char)x)))
#define ISUPPER(x) (isupper((int)((unsigned char)x)))
#define ISLOWER(x) (islower((int)((unsigned char)x)))
-#define ISASCII(x) (isascii((int)((unsigned char)x)))
+#define ISASCII(x) (((unsigned char)x) <= 127 ? 1 : 0)
#define ISBLANK(x) \
(int)((((unsigned char)x) == ' ') || (((unsigned char)x) == '\t'))
diff --git a/deps/cares/src/tools/CMakeLists.txt b/deps/cares/src/tools/CMakeLists.txt
index 13aefe135e9105..fb795a91741aaf 100644
--- a/deps/cares/src/tools/CMakeLists.txt
+++ b/deps/cares/src/tools/CMakeLists.txt
@@ -19,7 +19,7 @@ IF (CARES_BUILD_TOOLS)
C_STANDARD 90
)
- TARGET_COMPILE_DEFINITIONS (ahost PRIVATE HAVE_CONFIG_H=1)
+ TARGET_COMPILE_DEFINITIONS (ahost PRIVATE HAVE_CONFIG_H=1 CARES_NO_DEPRECATED)
TARGET_LINK_LIBRARIES (ahost PRIVATE ${PROJECT_NAME})
IF (CARES_INSTALL)
INSTALL (TARGETS ahost COMPONENT Tools ${TARGETS_INST_DEST})
@@ -40,7 +40,7 @@ IF (CARES_BUILD_TOOLS)
C_STANDARD 90
)
- TARGET_COMPILE_DEFINITIONS (adig PRIVATE HAVE_CONFIG_H=1)
+ TARGET_COMPILE_DEFINITIONS (adig PRIVATE HAVE_CONFIG_H=1 CARES_NO_DEPRECATED)
TARGET_LINK_LIBRARIES (adig PRIVATE ${PROJECT_NAME})
IF (CARES_INSTALL)
INSTALL (TARGETS adig COMPONENT Tools ${TARGETS_INST_DEST})
diff --git a/deps/cares/src/tools/Makefile.am b/deps/cares/src/tools/Makefile.am
index 729658d79a76da..ba7a672f89faf5 100644
--- a/deps/cares/src/tools/Makefile.am
+++ b/deps/cares/src/tools/Makefile.am
@@ -15,7 +15,8 @@ noinst_PROGRAMS =$(PROGS)
AM_CPPFLAGS += -I$(top_builddir)/include \
-I$(top_builddir)/src/lib \
-I$(top_srcdir)/include \
- -I$(top_srcdir)/src/lib
+ -I$(top_srcdir)/src/lib \
+ -DCARES_NO_DEPRECATED
include Makefile.inc
diff --git a/deps/cares/src/tools/Makefile.in b/deps/cares/src/tools/Makefile.in
index f0602fe172fdbb..0b7a310baaab5d 100644
--- a/deps/cares/src/tools/Makefile.in
+++ b/deps/cares/src/tools/Makefile.in
@@ -228,7 +228,7 @@ AM_CFLAGS = @AM_CFLAGS@
# might possibly already be installed in the system.
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir)/include \
-I$(top_builddir)/src/lib -I$(top_srcdir)/include \
- -I$(top_srcdir)/src/lib
+ -I$(top_srcdir)/src/lib -DCARES_NO_DEPRECATED
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
AR = @AR@
AS = @AS@
@@ -310,6 +310,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
diff --git a/deps/corepack/CHANGELOG.md b/deps/corepack/CHANGELOG.md
index 439f6fd3b8e968..f5cef27cc047f9 100644
--- a/deps/corepack/CHANGELOG.md
+++ b/deps/corepack/CHANGELOG.md
@@ -1,5 +1,56 @@
# Changelog
+## [0.28.0](https://github.com/nodejs/corepack/compare/v0.27.0...v0.28.0) (2024-04-20)
+
+
+### ⚠ BREAKING CHANGES
+
+* call `executePackageManagerRequest` directly ([#430](https://github.com/nodejs/corepack/issues/430))
+
+### Bug Fixes
+
+* call `executePackageManagerRequest` directly ([#430](https://github.com/nodejs/corepack/issues/430)) ([0f9b748](https://github.com/nodejs/corepack/commit/0f9b74864048d5dc150a63cc582966af0c5f363f))
+
+## [0.27.0](https://github.com/nodejs/corepack/compare/v0.26.0...v0.27.0) (2024-04-19)
+
+
+### ⚠ BREAKING CHANGES
+
+* attempting to download a version from the npm registry (or a mirror) that was published using the now deprecated PGP signature without providing a hash will trigger an error. Users can disable the signature verification using a environment variable.
+
+### Features
+
+* separate read and write operations on lastKnownGood.json ([#446](https://github.com/nodejs/corepack/issues/446)) ([c449adc](https://github.com/nodejs/corepack/commit/c449adc81822a604ee8f00ae2b53fc411535f96d))
+* update package manager versions ([#425](https://github.com/nodejs/corepack/issues/425)) ([1423190](https://github.com/nodejs/corepack/commit/142319056424b1e0da2bdbe801c52c5910023707))
+* update package manager versions ([#462](https://github.com/nodejs/corepack/issues/462)) ([56816c2](https://github.com/nodejs/corepack/commit/56816c2b7ebc9926f07048b0ec4ff6025bb4e293))
+* verify integrity signature when downloading from npm registry ([#432](https://github.com/nodejs/corepack/issues/432)) ([e561dd0](https://github.com/nodejs/corepack/commit/e561dd00bbacc5bc15a492fc36574fa0e37bff7b))
+
+
+### Bug Fixes
+
+* add path to `package.json` in error message ([#456](https://github.com/nodejs/corepack/issues/456)) ([32a93ea](https://github.com/nodejs/corepack/commit/32a93ea4f51eb7db7dc95a16c5719695edf4b53e))
+* correctly set `Dispatcher` prototype for `ProxyAgent` ([#451](https://github.com/nodejs/corepack/issues/451)) ([73d9a1e](https://github.com/nodejs/corepack/commit/73d9a1e2d2f84906bf01952f1dca8adab576b7bf))
+* download fewer metadata from npm registry ([#436](https://github.com/nodejs/corepack/issues/436)) ([082fabf](https://github.com/nodejs/corepack/commit/082fabf8b15658e69e4fb62bb854fe9aace78b70))
+* hash check when downloading Yarn Berry from npm ([#439](https://github.com/nodejs/corepack/issues/439)) ([4672162](https://github.com/nodejs/corepack/commit/467216281e1719a739d0eeea370b335adfb37b8d))
+* Incorrect authorization prefix for basic auth, and undocumented env var ([#454](https://github.com/nodejs/corepack/issues/454)) ([2d63536](https://github.com/nodejs/corepack/commit/2d63536413971d43f570deb035845aa0bd5202f0))
+* re-add support for custom registries with auth ([#397](https://github.com/nodejs/corepack/issues/397)) ([d267753](https://github.com/nodejs/corepack/commit/d2677538cdb613fcab6d2a45bb07f349bdc65c2b))
+
+## [0.26.0](https://github.com/nodejs/corepack/compare/v0.25.2...v0.26.0) (2024-03-08)
+
+
+### Features
+
+* Pins the package manager as it's used for the first time ([#413](https://github.com/nodejs/corepack/issues/413)) ([8b6c6d4](https://github.com/nodejs/corepack/commit/8b6c6d4b2b7a9d61ae6c33c07e12354bd5afc2ba))
+* update package manager versions ([#415](https://github.com/nodejs/corepack/issues/415)) ([e8edba7](https://github.com/nodejs/corepack/commit/e8edba771bca6fb10c855c04eee8102ffa792d58))
+
+
+### Bug Fixes
+
+* group the download prompt together ([#391](https://github.com/nodejs/corepack/issues/391)) ([00506b2](https://github.com/nodejs/corepack/commit/00506b2a15dd87ec03240578077a35b7980e00c1))
+* ignore `EROFS` errors ([#421](https://github.com/nodejs/corepack/issues/421)) ([b7ec137](https://github.com/nodejs/corepack/commit/b7ec137210efd35c3461321b6434e3e13a87d42f))
+* improve support for `COREPACK_NPM_REGISTRY` with Yarn Berry ([#396](https://github.com/nodejs/corepack/issues/396)) ([47be27c](https://github.com/nodejs/corepack/commit/47be27c9db988e10f651d23b3f53bcf55318a894))
+* Windows malicious file analysis waiting problem ([#398](https://github.com/nodejs/corepack/issues/398)) ([295a1cd](https://github.com/nodejs/corepack/commit/295a1cdb9cbbbce8434e8d82b96eb63e57c46c1a))
+
## [0.25.2](https://github.com/nodejs/corepack/compare/v0.25.1...v0.25.2) (2024-02-21)
diff --git a/deps/corepack/README.md b/deps/corepack/README.md
index 2f5819d913eb37..42dc8c19085e88 100644
--- a/deps/corepack/README.md
+++ b/deps/corepack/README.md
@@ -1,5 +1,7 @@
# corepack
+[](https://slack-invite.openjsf.org/)
+
Corepack is a zero-runtime-dependency Node.js script that acts as a bridge
between Node.js projects and the package managers they are intended to be used
with during development. In practical terms, **Corepack lets you use Yarn, npm,
@@ -54,7 +56,7 @@ projects, `pnpm install` in pnpm projects, and `npm` in npm projects. Corepack
will catch these calls, and depending on the situation:
- **If the local project is configured for the package manager you're using**,
- Corepack will silently download and cache the latest compatible version.
+ Corepack will download and cache the latest compatible version.
- **If the local project is configured for a different package manager**,
Corepack will request you to run the command again using the right package
@@ -235,6 +237,12 @@ same major line. Should you need to upgrade to a new major, use an explicit
package manager, and to not update the Last Known Good version when it
downloads a new version of the same major line.
+- `COREPACK_ENABLE_AUTO_PIN` can be set to `0` to prevent Corepack from
+ updating the `packageManager` field when it detects that the local package
+ doesn't list it. In general we recommend to always list a `packageManager`
+ field (which you can easily set through `corepack use [name]@[version]`), as
+ it ensures that your project installs are always deterministic.
+
- `COREPACK_ENABLE_DOWNLOAD_PROMPT` can be set to `0` to
prevent Corepack showing the URL when it needs to download software, or can be
set to `1` to have the URL shown. By default, when Corepack is called
@@ -288,6 +296,9 @@ same major line. Should you need to upgrade to a new major, use an explicit
- `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` are supported through
[`node-proxy-agent`](https://github.com/TooTallNate/node-proxy-agent).
+- `COREPACK_INTEGRITY_KEYS` can be set to an empty string to instruct Corepack
+ to skip integrity checks, or a JSON string containing custom keys.
+
## Troubleshooting
### Networking
@@ -303,10 +314,6 @@ There are a wide variety of networking issues that can occur while running `core
See [`CONTRIBUTING.md`](./CONTRIBUTING.md).
-## Design
-
-See [`DESIGN.md`](/DESIGN.md).
-
## License (MIT)
See [`LICENSE.md`](./LICENSE.md).
diff --git a/deps/corepack/dist/lib/corepack.cjs b/deps/corepack/dist/lib/corepack.cjs
index 3d8e819e7997e7..f81b561ce54d87 100644
--- a/deps/corepack/dist/lib/corepack.cjs
+++ b/deps/corepack/dist/lib/corepack.cjs
@@ -4316,78 +4316,9 @@ var require_proxy_from_env = __commonJS({
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/symbols.js
-var require_symbols = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/symbols.js"(exports, module2) {
- module2.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")
- };
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/errors.js
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/errors.js
var require_errors = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/errors.js"(exports, module2) {
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/errors.js"(exports, module2) {
"use strict";
var UndiciError = class extends Error {
constructor(message) {
@@ -4563,6 +4494,15 @@ var require_errors = __commonJS({
this.headers = headers;
}
};
+ var SecureProxyConnectionError = class extends UndiciError {
+ constructor(cause, message, options) {
+ super(message, { cause, ...options ?? {} });
+ this.name = "SecureProxyConnectionError";
+ this.message = message || "Secure Proxy Connection failed";
+ this.code = "UND_ERR_PRX_TLS";
+ this.cause = cause;
+ }
+ };
module2.exports = {
AbortError,
HTTPParserError,
@@ -4584,4716 +4524,4094 @@ var require_errors = __commonJS({
ResponseContentLengthMismatchError,
BalancedPoolMissingUpstreamError,
ResponseExceededMaxSizeError,
- RequestRetryError
+ RequestRetryError,
+ SecureProxyConnectionError
};
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher.js
-var require_dispatcher = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/symbols.js
+var require_symbols = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/symbols.js"(exports, module2) {
+ module2.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"),
+ kResume: Symbol("resume"),
+ kOnError: Symbol("on error"),
+ 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"),
+ kRetryHandlerDefaultRetry: Symbol("retry agent default retry"),
+ kConstruct: Symbol("constructable"),
+ kListeners: Symbol("listeners"),
+ kHTTPContext: Symbol("http context"),
+ kMaxConcurrentStreams: Symbol("max concurrent streams")
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/constants.js
+var require_constants2 = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/constants.js"(exports, module2) {
"use strict";
- var EventEmitter = require("node:events");
- var Dispatcher = class extends EventEmitter {
- dispatch() {
- throw new Error("not implemented");
- }
- close() {
- throw new Error("not implemented");
- }
- destroy() {
- throw new Error("not implemented");
- }
+ var headerNameLowerCasedRecord = {};
+ var 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;
+ }
+ Object.setPrototypeOf(headerNameLowerCasedRecord, null);
+ module2.exports = {
+ wellknownHeaderNames,
+ headerNameLowerCasedRecord
};
- module2.exports = Dispatcher;
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher-base.js
-var require_dispatcher_base = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher-base.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/tree.js
+var require_tree = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/tree.js"(exports, module2) {
"use strict";
- var Dispatcher = require_dispatcher();
var {
- ClientDestroyedError,
- ClientClosedError,
- InvalidArgumentError
- } = require_errors();
- var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols();
- var kDestroyed = Symbol("destroyed");
- var kClosed = Symbol("closed");
- var kOnDestroyed = Symbol("onDestroyed");
- var kOnClosed = Symbol("onClosed");
- var kInterceptedDispatch = Symbol("Intercepted Dispatch");
- var DispatcherBase = class 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");
- }
- }
+ wellknownHeaderNames,
+ headerNameLowerCasedRecord
+ } = require_constants2();
+ var TstNode = class _TstNode {
+ /** @type {any} */
+ value = null;
+ /** @type {null | TstNode} */
+ left = null;
+ /** @type {null | TstNode} */
+ middle = null;
+ /** @type {null | TstNode} */
+ right = null;
+ /** @type {number} */
+ code;
+ /**
+ * @param {string} key
+ * @param {any} value
+ * @param {number} index
+ */
+ constructor(key, value, index) {
+ if (index === void 0 || index >= key.length) {
+ throw new TypeError("Unreachable");
}
- this[kInterceptors] = newInterceptors;
- }
- close(callback) {
- if (callback === void 0) {
- return new Promise((resolve, reject) => {
- this.close((err, data) => {
- return err ? reject(err) : resolve(data);
- });
- });
+ const code = this.code = key.charCodeAt(index);
+ if (code > 127) {
+ throw new TypeError("key must be ascii string");
}
- if (typeof callback !== "function") {
- throw new InvalidArgumentError("invalid callback");
+ if (key.length !== ++index) {
+ this.middle = new _TstNode(key, value, index);
+ } else {
+ this.value = value;
}
- if (this[kDestroyed]) {
- queueMicrotask(() => callback(new ClientDestroyedError(), null));
- return;
+ }
+ /**
+ * @param {string} key
+ * @param {any} value
+ */
+ add(key, value) {
+ const length = key.length;
+ if (length === 0) {
+ throw new TypeError("Unreachable");
}
- if (this[kClosed]) {
- if (this[kOnClosed]) {
- this[kOnClosed].push(callback);
+ let index = 0;
+ let node = this;
+ while (true) {
+ const code = key.charCodeAt(index);
+ if (code > 127) {
+ throw new TypeError("key must be ascii string");
+ }
+ if (node.code === code) {
+ if (length === ++index) {
+ node.value = value;
+ break;
+ } else if (node.middle !== null) {
+ node = node.middle;
+ } else {
+ node.middle = new _TstNode(key, value, index);
+ break;
+ }
+ } else if (node.code < code) {
+ if (node.left !== null) {
+ node = node.left;
+ } else {
+ node.left = new _TstNode(key, value, index);
+ break;
+ }
+ } else if (node.right !== null) {
+ node = node.right;
} else {
- queueMicrotask(() => callback(null, null));
+ node.right = new _TstNode(key, value, index);
+ break;
}
- 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);
- }
- };
- this[kClose]().then(() => this.destroy()).then(() => {
- queueMicrotask(onClosed);
- });
}
- destroy(err, callback) {
- if (typeof err === "function") {
- callback = err;
- err = null;
- }
- if (callback === void 0) {
- return new Promise((resolve, reject) => {
- this.destroy(err, (err2, data) => {
- return err2 ? (
- /* istanbul ignore next: should never error */
- reject(err2)
- ) : 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));
+ /**
+ * @param {Uint8Array} key
+ * @return {TstNode | null}
+ */
+ search(key) {
+ const keylength = key.length;
+ let index = 0;
+ let node = this;
+ while (node !== null && index < keylength) {
+ let code = key[index];
+ if (code <= 90 && code >= 65) {
+ code |= 32;
}
- 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);
+ while (node !== null) {
+ if (code === node.code) {
+ if (keylength === ++index) {
+ return node;
+ }
+ node = node.middle;
+ break;
+ }
+ node = node.code < code ? node.left : node.right;
}
- };
- 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);
+ return null;
}
- 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;
+ };
+ var TernarySearchTree = class {
+ /** @type {TstNode | null} */
+ node = null;
+ /**
+ * @param {string} key
+ * @param {any} value
+ * */
+ insert(key, value) {
+ if (this.node === null) {
+ this.node = new TstNode(key, value, 0);
+ } else {
+ this.node.add(key, value);
}
}
+ /**
+ * @param {Uint8Array} key
+ * @return {any}
+ */
+ lookup(key) {
+ return this.node?.search(key)?.value ?? null;
+ }
+ };
+ var tree = new TernarySearchTree();
+ for (let i = 0; i < wellknownHeaderNames.length; ++i) {
+ const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]];
+ tree.insert(key, key);
+ }
+ module2.exports = {
+ TernarySearchTree,
+ tree
};
- module2.exports = DispatcherBase;
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/node/fixed-queue.js
-var require_fixed_queue = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/node/fixed-queue.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/util.js
+var require_util = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/util.js"(exports, module2) {
"use strict";
- var kSize = 2048;
- var kMask = kSize - 1;
- var FixedCircularBuffer = class {
- constructor() {
- this.bottom = 0;
- this.top = 0;
- this.list = new Array(kSize);
- this.next = null;
- }
- isEmpty() {
- return this.top === this.bottom;
+ var assert3 = require("node:assert");
+ var { kDestroyed, kBodyUsed, kListeners } = require_symbols();
+ var { IncomingMessage } = require("node:http");
+ var stream = require("node:stream");
+ var net = require("node:net");
+ var { InvalidArgumentError } = require_errors();
+ var { Blob: Blob2 } = require("node:buffer");
+ var nodeUtil = require("node:util");
+ var { stringify } = require("node:querystring");
+ var { headerNameLowerCasedRecord } = require_constants2();
+ var { tree } = require_tree();
+ var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v));
+ function nop() {
+ }
+ function isStream(obj) {
+ return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function";
+ }
+ function isBlobLike(object) {
+ if (object === null) {
+ return false;
+ } else if (object instanceof Blob2) {
+ return true;
+ } else if (typeof object !== "object") {
+ return false;
+ } else {
+ const sTag = object[Symbol.toStringTag];
+ return (sTag === "Blob" || sTag === "File") && ("stream" in object && typeof object.stream === "function" || "arrayBuffer" in object && typeof object.arrayBuffer === "function");
}
- isFull() {
- return (this.top + 1 & kMask) === this.bottom;
+ }
+ function buildURL(url, queryParams) {
+ if (url.includes("?") || url.includes("#")) {
+ throw new Error('Query params cannot be passed when url already contains "?" or "#".');
}
- push(data) {
- this.list[this.top] = data;
- this.top = this.top + 1 & kMask;
+ const stringified = stringify(queryParams);
+ if (stringified) {
+ url += "?" + stringified;
}
- shift() {
- const nextItem = this.list[this.bottom];
- if (nextItem === void 0)
- return null;
- this.list[this.bottom] = void 0;
- this.bottom = this.bottom + 1 & kMask;
- return nextItem;
+ 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;
}
- };
- module2.exports = class FixedQueue {
- constructor() {
- this.head = this.tail = new FixedCircularBuffer();
+ if (!url || typeof url !== "object") {
+ throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object.");
}
- isEmpty() {
- return this.head.isEmpty();
+ if (!/^https?:/.test(url.origin || url.protocol)) {
+ throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`.");
}
- push(data) {
- if (this.head.isFull()) {
- this.head = this.head.next = new FixedCircularBuffer();
+ 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.");
}
- this.head.push(data);
- }
- shift() {
- const tail = this.tail;
- const next = tail.shift();
- if (tail.isEmpty() && tail.next !== null) {
- this.tail = tail.next;
+ if (url.path != null && typeof url.path !== "string") {
+ throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined.");
}
- return next;
+ 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 path10 = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`;
+ if (origin.endsWith("/")) {
+ origin = origin.substring(0, origin.length - 1);
+ }
+ if (path10 && !path10.startsWith("/")) {
+ path10 = `/${path10}`;
+ }
+ url = new URL(origin + path10);
}
- };
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-stats.js
-var require_pool_stats = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-stats.js"(exports, module2) {
- var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols();
- var kPool = Symbol("pool");
- var PoolStats = class {
- constructor(pool) {
- this[kPool] = pool;
+ return url;
+ }
+ function parseOrigin(url) {
+ url = parseURL(url);
+ if (url.pathname !== "/" || url.search || url.hash) {
+ throw new InvalidArgumentError("invalid url");
}
- get connected() {
- return this[kPool][kConnected];
+ return url;
+ }
+ function getHostname(host) {
+ if (host[0] === "[") {
+ const idx2 = host.indexOf("]");
+ assert3(idx2 !== -1);
+ return host.substring(1, idx2);
}
- get free() {
- return this[kPool][kFree];
+ const idx = host.indexOf(":");
+ if (idx === -1)
+ return host;
+ return host.substring(0, idx);
+ }
+ function getServerName(host) {
+ if (!host) {
+ return null;
}
- get pending() {
- return this[kPool][kPending];
+ assert3.strictEqual(typeof host, "string");
+ const servername = getHostname(host);
+ if (net.isIP(servername)) {
+ return "";
}
- get queued() {
- return this[kPool][kQueued];
+ return servername;
+ }
+ function deepClone(obj) {
+ return JSON.parse(JSON.stringify(obj));
+ }
+ function isAsyncIterable(obj) {
+ return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function");
+ }
+ 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;
}
- get running() {
- return this[kPool][kRunning];
+ return null;
+ }
+ function isDestroyed(body) {
+ return body && !!(body.destroyed || body[kDestroyed] || stream.isDestroyed?.(body));
+ }
+ function isReadableAborted(stream2) {
+ const state = stream2?._readableState;
+ return isDestroyed(stream2) && state && !state.endEmitted;
+ }
+ function destroy(stream2, err) {
+ if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) {
+ return;
}
- get size() {
- return this[kPool][kSize];
+ if (typeof stream2.destroy === "function") {
+ if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) {
+ stream2.socket = null;
+ }
+ stream2.destroy(err);
+ } else if (err) {
+ queueMicrotask(() => {
+ stream2.emit("error", err);
+ });
}
- };
- module2.exports = PoolStats;
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-base.js
-var require_pool_base = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-base.js"(exports, module2) {
- "use strict";
- var DispatcherBase = require_dispatcher_base();
- var FixedQueue = require_fixed_queue();
- var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols();
- var PoolStats = require_pool_stats();
- var kClients = Symbol("clients");
- var kNeedDrain = Symbol("needDrain");
- var kQueue = Symbol("queue");
- var kClosedResolve = Symbol("closed resolve");
- var kOnDrain = Symbol("onDrain");
- var kOnConnect = Symbol("onConnect");
- var kOnDisconnect = Symbol("onDisconnect");
- var kOnConnectionError = Symbol("onConnectionError");
- var kGetDispatcher = Symbol("get dispatcher");
- var kAddClient = Symbol("add client");
- var kRemoveClient = Symbol("remove client");
- var kStats = Symbol("stats");
- var PoolBase = class 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 (stream2.destroyed !== true) {
+ stream2[kDestroyed] = true;
+ }
+ }
+ var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/;
+ function parseKeepAliveTimeout(val) {
+ const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR);
+ return m ? parseInt(m[1], 10) * 1e3 : null;
+ }
+ function headerNameToString(value) {
+ return typeof value === "string" ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() : tree.lookup(value) ?? value.toString("latin1").toLowerCase();
+ }
+ function bufferToLowerCasedHeaderName(value) {
+ return tree.lookup(value) ?? value.toString("latin1").toLowerCase();
+ }
+ function parseHeaders(headers, obj) {
+ if (obj === void 0)
+ obj = {};
+ for (let i = 0; i < headers.length; i += 2) {
+ const key = headerNameToString(headers[i]);
+ let val = obj[key];
+ if (val) {
+ if (typeof val === "string") {
+ val = [val];
+ obj[key] = val;
}
- if (pool[kClosedResolve] && queue.isEmpty()) {
- Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]);
+ val.push(headers[i + 1].toString("utf8"));
+ } else {
+ const headersValue = headers[i + 1];
+ if (typeof headersValue === "string") {
+ obj[key] = headersValue;
+ } else {
+ obj[key] = Array.isArray(headersValue) ? headersValue.map((x) => x.toString("utf8")) : headersValue.toString("utf8");
}
- };
- 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];
+ if ("content-length" in obj && "content-disposition" in obj) {
+ obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1");
}
- get [kConnected]() {
- return this[kClients].filter((client) => client[kConnected]).length;
+ return obj;
+ }
+ function parseRawHeaders(headers) {
+ const len = headers.length;
+ const ret = new Array(len);
+ let hasContentLength = false;
+ let contentDispositionIdx = -1;
+ let key;
+ let val;
+ let kLen = 0;
+ for (let n = 0; n < headers.length; n += 2) {
+ key = headers[n];
+ val = headers[n + 1];
+ typeof key !== "string" && (key = key.toString());
+ typeof val !== "string" && (val = val.toString("utf8"));
+ kLen = key.length;
+ if (kLen === 14 && key[7] === "-" && (key === "content-length" || key.toLowerCase() === "content-length")) {
+ hasContentLength = true;
+ } else if (kLen === 19 && key[7] === "-" && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) {
+ contentDispositionIdx = n + 1;
+ }
+ ret[n] = key;
+ ret[n + 1] = val;
}
- get [kFree]() {
- return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length;
+ if (hasContentLength && contentDispositionIdx !== -1) {
+ ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1");
}
- get [kPending]() {
- let ret = this[kQueued];
- for (const { [kPending]: pending } of this[kClients]) {
- ret += pending;
- }
- return ret;
+ return ret;
+ }
+ function isBuffer(buffer) {
+ return buffer instanceof Uint8Array || Buffer.isBuffer(buffer);
+ }
+ function validateHandler(handler, method, upgrade) {
+ if (!handler || typeof handler !== "object") {
+ throw new InvalidArgumentError("handler must be an object");
}
- get [kRunning]() {
- let ret = 0;
- for (const { [kRunning]: running } of this[kClients]) {
- ret += running;
- }
- return ret;
+ if (typeof handler.onConnect !== "function") {
+ throw new InvalidArgumentError("invalid onConnect method");
}
- get [kSize]() {
- let ret = this[kQueued];
- for (const { [kSize]: size } of this[kClients]) {
- ret += size;
- }
- return ret;
+ if (typeof handler.onError !== "function") {
+ throw new InvalidArgumentError("invalid onError method");
}
- get stats() {
- return this[kStats];
+ if (typeof handler.onBodySent !== "function" && handler.onBodySent !== void 0) {
+ throw new InvalidArgumentError("invalid onBodySent method");
}
- async [kClose]() {
- if (this[kQueue].isEmpty()) {
- return Promise.all(this[kClients].map((c) => c.close()));
- } else {
- return new Promise((resolve) => {
- this[kClosedResolve] = resolve;
- });
+ if (upgrade || method === "CONNECT") {
+ if (typeof handler.onUpgrade !== "function") {
+ throw new InvalidArgumentError("invalid onUpgrade method");
}
- }
- async [kDestroy](err) {
- while (true) {
- const item = this[kQueue].shift();
- if (!item) {
- break;
- }
- item.handler.onError(err);
+ } else {
+ if (typeof handler.onHeaders !== "function") {
+ throw new InvalidArgumentError("invalid onHeaders method");
}
- 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]();
+ if (typeof handler.onData !== "function") {
+ throw new InvalidArgumentError("invalid onData method");
+ }
+ if (typeof handler.onComplete !== "function") {
+ throw new InvalidArgumentError("invalid onComplete method");
}
- 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]);
+ }
+ function isDisturbed(body) {
+ return !!(body && (stream.isDisturbed(body) || body[kBodyUsed]));
+ }
+ function isErrored(body) {
+ return !!(body && stream.isErrored(body));
+ }
+ function isReadable(body) {
+ return !!(body && stream.isReadable(body));
+ }
+ 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
+ };
+ }
+ function ReadableStreamFrom(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();
+ controller.byobRequest?.respond(0);
+ });
+ } else {
+ const buf = Buffer.isBuffer(value) ? value : Buffer.from(value);
+ if (buf.byteLength) {
+ controller.enqueue(new Uint8Array(buf));
+ }
}
- });
+ return controller.desiredSize > 0;
+ },
+ async cancel(reason) {
+ await iterator.return();
+ },
+ type: "bytes"
}
- return this;
+ );
+ }
+ 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 addAbortListener(signal, listener) {
+ if ("addEventListener" in signal) {
+ signal.addEventListener("abort", listener, { once: true });
+ return () => signal.removeEventListener("abort", listener);
}
- [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);
+ signal.addListener("abort", listener);
+ return () => signal.removeListener("abort", listener);
+ }
+ var hasToWellFormed = typeof String.prototype.toWellFormed === "function";
+ var hasIsWellFormed = typeof String.prototype.isWellFormed === "function";
+ function toUSVString(val) {
+ return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val);
+ }
+ function isUSVString(val) {
+ return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}`;
+ }
+ function isTokenCharCode(c) {
+ switch (c) {
+ case 34:
+ case 40:
+ case 41:
+ case 44:
+ case 47:
+ case 58:
+ case 59:
+ case 60:
+ case 61:
+ case 62:
+ case 63:
+ case 64:
+ case 91:
+ case 92:
+ case 93:
+ case 123:
+ case 125:
+ return false;
+ default:
+ return c >= 33 && c <= 126;
}
- };
+ }
+ 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;
+ }
+ var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
+ function isValidHeaderChar(characters) {
+ return !headerCharRegex.test(characters);
+ }
+ 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;
+ }
+ function addListener(obj, name, listener) {
+ const listeners = obj[kListeners] ??= [];
+ listeners.push([name, listener]);
+ obj.on(name, listener);
+ return obj;
+ }
+ function removeAllListeners(obj) {
+ for (const [name, listener] of obj[kListeners] ?? []) {
+ obj.removeListener(name, listener);
+ }
+ obj[kListeners] = null;
+ }
+ function errorRequest(client, request, err) {
+ try {
+ request.onError(err);
+ assert3(request.aborted);
+ } catch (err2) {
+ client.emit("error", err2);
+ }
+ }
+ var kEnumerableProperty = /* @__PURE__ */ Object.create(null);
+ kEnumerableProperty.enumerable = true;
module2.exports = {
- PoolBase,
- kClients,
- kNeedDrain,
- kAddClient,
- kRemoveClient,
- kGetDispatcher
- };
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/constants.js
-var require_constants2 = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/constants.js"(exports, module2) {
- "use strict";
- var headerNameLowerCasedRecord = {};
- var 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;
- }
- Object.setPrototypeOf(headerNameLowerCasedRecord, null);
- module2.exports = {
- wellknownHeaderNames,
- headerNameLowerCasedRecord
+ kEnumerableProperty,
+ nop,
+ isDisturbed,
+ isErrored,
+ isReadable,
+ toUSVString,
+ isUSVString,
+ isReadableAborted,
+ isBlobLike,
+ parseOrigin,
+ parseURL,
+ getServerName,
+ isStream,
+ isIterable,
+ isAsyncIterable,
+ isDestroyed,
+ headerNameToString,
+ bufferToLowerCasedHeaderName,
+ addListener,
+ removeAllListeners,
+ errorRequest,
+ parseRawHeaders,
+ parseHeaders,
+ parseKeepAliveTimeout,
+ destroy,
+ bodyLength,
+ deepClone,
+ ReadableStreamFrom,
+ isBuffer,
+ validateHandler,
+ getSocketInfo,
+ isFormDataLike,
+ buildURL,
+ addAbortListener,
+ isValidHTTPToken,
+ isValidHeaderChar,
+ isTokenCharCode,
+ parseRangeHeader,
+ nodeMajor,
+ nodeMinor,
+ nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13,
+ safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"]
};
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/tree.js
-var require_tree = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/tree.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/readable.js
+var require_readable = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/readable.js"(exports, module2) {
"use strict";
- var {
- wellknownHeaderNames,
- headerNameLowerCasedRecord
- } = require_constants2();
- var TstNode = class _TstNode {
- /** @type {any} */
- value = null;
- /** @type {null | TstNode} */
- left = null;
- /** @type {null | TstNode} */
- middle = null;
- /** @type {null | TstNode} */
- right = null;
- /** @type {number} */
- code;
- /**
- * @param {Uint8Array} key
- * @param {any} value
- * @param {number} index
- */
- constructor(key, value, index) {
- if (index === void 0 || index >= key.length) {
- throw new TypeError("Unreachable");
+ var assert3 = require("node:assert");
+ var { Readable: Readable2 } = require("node:stream");
+ var { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require_errors();
+ var util = require_util();
+ var { ReadableStreamFrom } = require_util();
+ var kConsume = Symbol("kConsume");
+ var kReading = Symbol("kReading");
+ var kBody = Symbol("kBody");
+ var kAbort = Symbol("kAbort");
+ var kContentType = Symbol("kContentType");
+ var kContentLength = Symbol("kContentLength");
+ var noop = () => {
+ };
+ var BodyReadable = class extends Readable2 {
+ constructor({
+ resume,
+ abort,
+ contentType = "",
+ contentLength,
+ 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;
+ this[kContentLength] = contentLength;
+ this[kReading] = false;
+ }
+ destroy(err) {
+ if (!err && !this._readableState.endEmitted) {
+ err = new RequestAbortedError();
}
- this.code = key[index];
- if (key.length !== ++index) {
- this.middle = new _TstNode(key, value, index);
- } else {
- this.value = value;
+ if (err) {
+ this[kAbort]();
}
+ return super.destroy(err);
}
- /**
- * @param {Uint8Array} key
- * @param {any} value
- * @param {number} index
- */
- add(key, value, index) {
- if (index === void 0 || index >= key.length) {
- throw new TypeError("Unreachable");
+ _destroy(err, callback) {
+ setImmediate(() => {
+ callback(err);
+ });
+ }
+ on(ev, ...args) {
+ if (ev === "data" || ev === "readable") {
+ this[kReading] = true;
}
- const code = key[index];
- if (this.code === code) {
- if (key.length === ++index) {
- this.value = value;
- } else if (this.middle !== null) {
- this.middle.add(key, value, index);
- } else {
- this.middle = new _TstNode(key, value, index);
- }
- } else if (this.code < code) {
- if (this.left !== null) {
- this.left.add(key, value, index);
- } else {
- this.left = new _TstNode(key, value, index);
+ 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) {
+ 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() {
+ 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]) {
+ this[kBody].getReader();
+ assert3(this[kBody].locked);
}
- } else if (this.right !== null) {
- this.right.add(key, value, index);
- } else {
- this.right = new _TstNode(key, value, index);
}
+ return this[kBody];
}
- /**
- * @param {Uint8Array} key
- * @return {TstNode | null}
- */
- search(key) {
- const keylength = key.length;
- let index = 0;
- let node = this;
- while (node !== null && index < keylength) {
- let code = key[index];
- if (code >= 65 && code <= 90) {
- code |= 32;
+ async dump(opts) {
+ let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024;
+ const signal = opts?.signal;
+ if (signal != null && (typeof signal !== "object" || !("aborted" in signal))) {
+ throw new InvalidArgumentError("signal must be an AbortSignal");
+ }
+ signal?.throwIfAborted();
+ if (this._readableState.closeEmitted) {
+ return null;
+ }
+ return await new Promise((resolve, reject) => {
+ if (this[kContentLength] > limit) {
+ this.destroy(new AbortError());
}
- while (node !== null) {
- if (code === node.code) {
- if (keylength === ++index) {
- return node;
- }
- node = node.middle;
- break;
+ const onAbort = () => {
+ this.destroy(signal.reason ?? new AbortError());
+ };
+ signal?.addEventListener("abort", onAbort);
+ this.on("close", function() {
+ signal?.removeEventListener("abort", onAbort);
+ if (signal?.aborted) {
+ reject(signal.reason ?? new AbortError());
+ } else {
+ resolve(null);
}
- node = node.code < code ? node.left : node.right;
- }
- }
- return null;
+ }).on("error", noop).on("data", function(chunk) {
+ limit -= chunk.length;
+ if (limit <= 0) {
+ this.destroy();
+ }
+ }).resume();
+ });
}
};
- var TernarySearchTree = class {
- /** @type {TstNode | null} */
- node = null;
- /**
- * @param {Uint8Array} key
- * @param {any} value
- * */
- insert(key, value) {
- if (this.node === null) {
- this.node = new TstNode(key, value, 0);
+ function isLocked(self2) {
+ return self2[kBody] && self2[kBody].locked === true || self2[kConsume];
+ }
+ function isUnusable(self2) {
+ return util.isDisturbed(self2) || isLocked(self2);
+ }
+ async function consume(stream, type) {
+ assert3(!stream[kConsume]);
+ return new Promise((resolve, reject) => {
+ if (isUnusable(stream)) {
+ const rState = stream._readableState;
+ if (rState.destroyed && rState.closeEmitted === false) {
+ stream.on("error", (err) => {
+ reject(err);
+ }).on("close", () => {
+ reject(new TypeError("unusable"));
+ });
+ } else {
+ reject(rState.errored ?? new TypeError("unusable"));
+ }
} else {
- this.node.add(key, value, 0);
+ queueMicrotask(() => {
+ 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());
+ }
+ });
+ consumeStart(stream[kConsume]);
+ });
}
+ });
+ }
+ function consumeStart(consume2) {
+ if (consume2.body === null) {
+ return;
}
- /**
- * @param {Uint8Array} key
- */
- lookup(key) {
- return this.node?.search(key)?.value ?? null;
+ const { _readableState: state } = consume2.stream;
+ if (state.bufferIndex) {
+ const start = state.bufferIndex;
+ const end = state.buffer.length;
+ for (let n = start; n < end; n++) {
+ consumePush(consume2, state.buffer[n]);
+ }
+ } else {
+ for (const chunk of state.buffer) {
+ consumePush(consume2, chunk);
+ }
+ }
+ if (state.endEmitted) {
+ consumeEnd(this[kConsume]);
+ } else {
+ consume2.stream.on("end", function() {
+ consumeEnd(this[kConsume]);
+ });
+ }
+ consume2.stream.resume();
+ while (consume2.stream.read() != null) {
}
- };
- var tree = new TernarySearchTree();
- for (let i = 0; i < wellknownHeaderNames.length; ++i) {
- const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]];
- tree.insert(Buffer.from(key), key);
}
- module2.exports = {
- TernarySearchTree,
- tree
- };
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/util.js
-var require_util = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/util.js"(exports, module2) {
- "use strict";
- var assert3 = require("node:assert");
- var { kDestroyed, kBodyUsed } = require_symbols();
- var { IncomingMessage } = require("node:http");
- var stream = require("node:stream");
- var net = require("node:net");
- var { InvalidArgumentError } = require_errors();
- var { Blob: Blob2 } = require("node:buffer");
- var nodeUtil = require("node:util");
- var { stringify } = require("node:querystring");
- var { headerNameLowerCasedRecord } = require_constants2();
- var { tree } = require_tree();
- var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v));
- function nop() {
+ function chunksDecode(chunks, length) {
+ if (chunks.length === 0 || length === 0) {
+ return "";
+ }
+ const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length);
+ const bufferLength = buffer.length;
+ const start = bufferLength > 2 && buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191 ? 3 : 0;
+ return buffer.utf8Slice(start, bufferLength);
}
- function isStream(obj) {
- return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function";
+ function consumeEnd(consume2) {
+ const { type, body, resolve, stream, length } = consume2;
+ try {
+ if (type === "text") {
+ resolve(chunksDecode(body, length));
+ } else if (type === "json") {
+ resolve(JSON.parse(chunksDecode(body, length)));
+ } 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") {
+ resolve(new Blob(body, { type: stream[kContentType] }));
+ }
+ consumeFinish(consume2);
+ } catch (err) {
+ stream.destroy(err);
+ }
}
- function isBlobLike(object) {
- return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]);
+ function consumePush(consume2, chunk) {
+ consume2.length += chunk.length;
+ consume2.body.push(chunk);
}
- function buildURL(url, queryParams) {
- if (url.includes("?") || url.includes("#")) {
- throw new Error('Query params cannot be passed when url already contains "?" or "#".');
+ function consumeFinish(consume2, err) {
+ if (consume2.body === null) {
+ return;
}
- const stringified = stringify(queryParams);
- if (stringified) {
- url += "?" + stringified;
+ if (err) {
+ consume2.reject(err);
+ } else {
+ consume2.resolve();
}
- return url;
+ consume2.type = null;
+ consume2.stream = null;
+ consume2.resolve = null;
+ consume2.reject = null;
+ consume2.length = 0;
+ consume2.body = null;
}
- 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:`.");
+ module2.exports = { Readable: BodyReadable, chunksDecode };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/util.js
+var require_util2 = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/util.js"(exports, module2) {
+ var assert3 = require("node:assert");
+ var {
+ ResponseStatusCodeError
+ } = require_errors();
+ var { chunksDecode } = require_readable();
+ var CHUNK_LIMIT = 128 * 1024;
+ async function getResolveErrorBodyCallback({ callback, body, contentType, statusCode, statusMessage, headers }) {
+ assert3(body);
+ let chunks = [];
+ let length = 0;
+ for await (const chunk of body) {
+ chunks.push(chunk);
+ length += chunk.length;
+ if (length > CHUNK_LIMIT) {
+ chunks = null;
+ break;
}
- 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:`.");
+ const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`;
+ if (statusCode === 204 || !contentType || !chunks) {
+ queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers)));
+ return;
}
- 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 path10 = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`;
- if (origin.endsWith("/")) {
- origin = origin.substring(0, origin.length - 1);
- }
- if (path10 && !path10.startsWith("/")) {
- path10 = `/${path10}`;
+ const stackTraceLimit = Error.stackTraceLimit;
+ Error.stackTraceLimit = 0;
+ let payload;
+ try {
+ if (isContentTypeApplicationJson(contentType)) {
+ payload = JSON.parse(chunksDecode(chunks, length));
+ } else if (isContentTypeText(contentType)) {
+ payload = chunksDecode(chunks, length);
}
- url = new URL(origin + path10);
- }
- return url;
- }
- function parseOrigin(url) {
- url = parseURL(url);
- if (url.pathname !== "/" || url.search || url.hash) {
- throw new InvalidArgumentError("invalid url");
+ } catch {
+ } finally {
+ Error.stackTraceLimit = stackTraceLimit;
}
- return url;
+ queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers, payload)));
}
- function getHostname(host) {
- if (host[0] === "[") {
- const idx2 = host.indexOf("]");
- assert3(idx2 !== -1);
- return host.substring(1, idx2);
+ var isContentTypeApplicationJson = (contentType) => {
+ return contentType.length > 15 && contentType[11] === "/" && contentType[0] === "a" && contentType[1] === "p" && contentType[2] === "p" && contentType[3] === "l" && contentType[4] === "i" && contentType[5] === "c" && contentType[6] === "a" && contentType[7] === "t" && contentType[8] === "i" && contentType[9] === "o" && contentType[10] === "n" && contentType[12] === "j" && contentType[13] === "s" && contentType[14] === "o" && contentType[15] === "n";
+ };
+ var isContentTypeText = (contentType) => {
+ return contentType.length > 4 && contentType[4] === "/" && contentType[0] === "t" && contentType[1] === "e" && contentType[2] === "x" && contentType[3] === "t";
+ };
+ module2.exports = {
+ getResolveErrorBodyCallback,
+ isContentTypeApplicationJson,
+ isContentTypeText
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/abort-signal.js
+var require_abort_signal = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/abort-signal.js"(exports, module2) {
+ var { addAbortListener } = require_util();
+ var { RequestAbortedError } = require_errors();
+ var kListener = Symbol("kListener");
+ var kSignal = Symbol("kSignal");
+ function abort(self2) {
+ if (self2.abort) {
+ self2.abort(self2[kSignal]?.reason);
+ } else {
+ self2.reason = self2[kSignal]?.reason ?? new RequestAbortedError();
}
- const idx = host.indexOf(":");
- if (idx === -1)
- return host;
- return host.substring(0, idx);
+ removeSignal(self2);
}
- function getServerName(host) {
- if (!host) {
- return null;
- }
- assert3.strictEqual(typeof host, "string");
- const servername = getHostname(host);
- if (net.isIP(servername)) {
- return "";
+ function addSignal(self2, signal) {
+ self2.reason = null;
+ self2[kSignal] = null;
+ self2[kListener] = null;
+ if (!signal) {
+ return;
}
- return servername;
- }
- function deepClone(obj) {
- return JSON.parse(JSON.stringify(obj));
- }
- function isAsyncIterable(obj) {
- return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function");
- }
- 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;
+ if (signal.aborted) {
+ abort(self2);
+ return;
}
- return null;
- }
- function isDestroyed(stream2) {
- return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]);
- }
- function isReadableAborted(stream2) {
- const state = stream2?._readableState;
- return isDestroyed(stream2) && state && !state.endEmitted;
+ self2[kSignal] = signal;
+ self2[kListener] = () => {
+ abort(self2);
+ };
+ addAbortListener(self2[kSignal], self2[kListener]);
}
- function destroy(stream2, err) {
- if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) {
+ function removeSignal(self2) {
+ if (!self2[kSignal]) {
return;
}
- if (typeof stream2.destroy === "function") {
- if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) {
- stream2.socket = null;
+ if ("removeEventListener" in self2[kSignal]) {
+ self2[kSignal].removeEventListener("abort", self2[kListener]);
+ } else {
+ self2[kSignal].removeListener("abort", self2[kListener]);
+ }
+ self2[kSignal] = null;
+ self2[kListener] = null;
+ }
+ module2.exports = {
+ addSignal,
+ removeSignal
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-request.js
+var require_api_request = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-request.js"(exports, module2) {
+ "use strict";
+ var assert3 = require("node:assert");
+ var { Readable: Readable2 } = require_readable();
+ var { InvalidArgumentError } = require_errors();
+ var util = require_util();
+ var { getResolveErrorBodyCallback } = require_util2();
+ var { AsyncResource } = require("node:async_hooks");
+ var { addSignal, removeSignal } = require_abort_signal();
+ var RequestHandler = class 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;
}
- stream2.destroy(err);
- } else if (err) {
- process.nextTick((stream3, err2) => {
- stream3.emit("error", err2);
- }, stream2, 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);
}
- if (stream2.destroyed !== true) {
- stream2[kDestroyed] = true;
+ onConnect(abort, context) {
+ if (this.reason) {
+ abort(this.reason);
+ return;
+ }
+ assert3(this.callback);
+ this.abort = abort;
+ this.context = context;
}
- }
- var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/;
- function parseKeepAliveTimeout(val) {
- const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR);
- return m ? parseInt(m[1], 10) * 1e3 : null;
- }
- function headerNameToString(value) {
- return typeof value === "string" ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() : tree.lookup(value) ?? value.toString("latin1").toLowerCase();
- }
- function bufferToLowerCasedHeaderName(value) {
- return tree.lookup(value) ?? value.toString("latin1").toLowerCase();
- }
- function parseHeaders(headers, obj) {
- if (!Array.isArray(headers))
- return headers;
- if (obj === void 0)
- obj = {};
- for (let i = 0; i < headers.length; i += 2) {
- const key = headerNameToString(headers[i]);
- let val = obj[key];
- if (val) {
- if (typeof val === "string") {
- val = [val];
- obj[key] = val;
+ 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 });
}
- val.push(headers[i + 1].toString("utf8"));
- } else {
- const headersValue = headers[i + 1];
- if (typeof headersValue === "string") {
- obj[key] = headersValue;
+ return;
+ }
+ const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers;
+ const contentType = parsedHeaders["content-type"];
+ const contentLength = parsedHeaders["content-length"];
+ const body = new Readable2({ resume, abort, contentType, contentLength, 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 {
- obj[key] = Array.isArray(headersValue) ? headersValue.map((x) => x.toString("utf8")) : headersValue.toString("utf8");
+ this.runInAsyncScope(callback, null, null, {
+ statusCode,
+ headers,
+ trailers: this.trailers,
+ opaque,
+ body,
+ context
+ });
}
}
}
- if ("content-length" in obj && "content-disposition" in obj) {
- obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1");
+ onData(chunk) {
+ const { res } = this;
+ return res.push(chunk);
}
- return obj;
- }
- 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);
+ 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) {
+ this.callback = null;
+ queueMicrotask(() => {
+ this.runInAsyncScope(callback, null, err, { opaque });
+ });
+ }
+ if (res) {
+ this.res = null;
+ queueMicrotask(() => {
+ util.destroy(res, err);
+ });
+ }
+ if (body) {
+ this.body = null;
+ util.destroy(body, err);
}
}
- if (hasContentLength && contentDispositionIdx !== -1) {
- ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1");
+ };
+ function request(opts, callback) {
+ if (callback === void 0) {
+ 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?.opaque;
+ queueMicrotask(() => callback(err, { opaque }));
}
- return ret;
}
- function isBuffer(buffer) {
- return buffer instanceof Uint8Array || Buffer.isBuffer(buffer);
- }
- function validateHandler(handler, method, upgrade) {
- if (!handler || typeof handler !== "object") {
- throw new InvalidArgumentError("handler must be an object");
+ module2.exports = request;
+ module2.exports.RequestHandler = RequestHandler;
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-stream.js
+var require_api_stream = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-stream.js"(exports, module2) {
+ "use strict";
+ var assert3 = require("node:assert");
+ var { finished, PassThrough } = require("node:stream");
+ var { InvalidArgumentError, InvalidReturnValueError } = require_errors();
+ var util = require_util();
+ var { getResolveErrorBodyCallback } = require_util2();
+ var { AsyncResource } = require("node:async_hooks");
+ var { addSignal, removeSignal } = require_abort_signal();
+ var StreamHandler = class 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);
}
- if (typeof handler.onConnect !== "function") {
- throw new InvalidArgumentError("invalid onConnect method");
+ onConnect(abort, context) {
+ if (this.reason) {
+ abort(this.reason);
+ return;
+ }
+ assert3(this.callback);
+ this.abort = abort;
+ this.context = context;
}
- if (typeof handler.onError !== "function") {
- throw new InvalidArgumentError("invalid onError method");
+ 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");
+ }
+ finished(res, { readable: false }, (err) => {
+ const { callback: callback2, res: res2, opaque: opaque2, trailers, abort } = this;
+ this.res = null;
+ if (err || !res2.readable) {
+ util.destroy(res2, err);
+ }
+ this.callback = null;
+ this.runInAsyncScope(callback2, null, err || null, { opaque: opaque2, trailers });
+ if (err) {
+ abort();
+ }
+ });
+ }
+ res.on("drain", resume);
+ this.res = res;
+ const needDrain = res.writableNeedDrain !== void 0 ? res.writableNeedDrain : res._writableState?.needDrain;
+ return needDrain !== true;
}
- if (typeof handler.onBodySent !== "function" && handler.onBodySent !== void 0) {
- throw new InvalidArgumentError("invalid onBodySent method");
+ onData(chunk) {
+ const { res } = this;
+ return res ? res.write(chunk) : true;
}
- if (upgrade || method === "CONNECT") {
- if (typeof handler.onUpgrade !== "function") {
- throw new InvalidArgumentError("invalid onUpgrade method");
+ onComplete(trailers) {
+ const { res } = this;
+ removeSignal(this);
+ if (!res) {
+ return;
}
- } else {
- if (typeof handler.onHeaders !== "function") {
- throw new InvalidArgumentError("invalid onHeaders method");
+ this.trailers = util.parseHeaders(trailers);
+ res.end();
+ }
+ onError(err) {
+ const { res, callback, opaque, body } = this;
+ 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 });
+ });
}
- if (typeof handler.onData !== "function") {
- throw new InvalidArgumentError("invalid onData method");
+ if (body) {
+ this.body = null;
+ util.destroy(body, err);
}
- if (typeof handler.onComplete !== "function") {
- throw new InvalidArgumentError("invalid onComplete method");
+ }
+ };
+ function stream(opts, factory, callback) {
+ if (callback === void 0) {
+ 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?.opaque;
+ queueMicrotask(() => callback(err, { opaque }));
}
}
- function isDisturbed(body) {
- return !!(body && (stream.isDisturbed(body) || body[kBodyUsed]));
- }
- function isErrored(body) {
- return !!(body && stream.isErrored(body));
- }
- function isReadable(body) {
- return !!(body && stream.isReadable(body));
- }
- 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
- };
- }
- function ReadableStreamFrom(iterable) {
- let iterator;
- return new ReadableStream(
- {
- async start() {
- iterator = iterable[Symbol.asyncIterator]();
+ module2.exports = stream;
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-pipeline.js
+var require_api_pipeline = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-pipeline.js"(exports, module2) {
+ "use strict";
+ var {
+ Readable: Readable2,
+ Duplex,
+ PassThrough
+ } = require("node:stream");
+ var {
+ InvalidArgumentError,
+ InvalidReturnValueError,
+ RequestAbortedError
+ } = require_errors();
+ var util = require_util();
+ var { AsyncResource } = require("node:async_hooks");
+ var { addSignal, removeSignal } = require_abort_signal();
+ var assert3 = require("node:assert");
+ var kResume = Symbol("resume");
+ var PipelineRequest = class extends Readable2 {
+ constructor() {
+ super({ autoDestroy: true });
+ this[kResume] = null;
+ }
+ _read() {
+ const { [kResume]: resume } = this;
+ if (resume) {
+ this[kResume] = null;
+ resume();
+ }
+ }
+ _destroy(err, callback) {
+ this._read();
+ callback(err);
+ }
+ };
+ var PipelineResponse = class extends Readable2 {
+ constructor(resume) {
+ super({ autoDestroy: true });
+ this[kResume] = resume;
+ }
+ _read() {
+ this[kResume]();
+ }
+ _destroy(err, callback) {
+ if (!err && !this._readableState.endEmitted) {
+ err = new RequestAbortedError();
+ }
+ callback(err);
+ }
+ };
+ var PipelineHandler = class 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;
+ 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?.resume) {
+ body.resume();
+ }
},
- async pull(controller) {
- const { done, value } = await iterator.next();
- if (done) {
- queueMicrotask(() => {
- controller.close();
- controller.byobRequest?.respond(0);
- });
+ write: (chunk, encoding, callback) => {
+ const { req } = this;
+ if (req.push(chunk, encoding) || req._readableState.destroyed) {
+ callback();
} else {
- const buf = Buffer.isBuffer(value) ? value : Buffer.from(value);
- if (buf.byteLength) {
- controller.enqueue(new Uint8Array(buf));
- }
+ req[kResume] = callback;
}
- return controller.desiredSize > 0;
- },
- async cancel(reason) {
- await iterator.return();
},
- type: "bytes"
+ 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;
+ req.push(null);
+ });
+ this.res = null;
+ addSignal(this, signal);
+ }
+ onConnect(abort, context) {
+ const { ret, res } = this;
+ if (this.reason) {
+ abort(this.reason);
+ return;
}
- );
- }
- 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 addAbortListener(signal, listener) {
- if ("addEventListener" in signal) {
- signal.addEventListener("abort", listener, { once: true });
- return () => signal.removeEventListener("abort", listener);
+ assert3(!res, "pipeline cannot be retried");
+ assert3(!ret.destroyed);
+ this.abort = abort;
+ this.context = context;
}
- signal.addListener("abort", listener);
- return () => signal.removeListener("abort", listener);
- }
- var hasToWellFormed = !!String.prototype.toWellFormed;
- function toUSVString(val) {
- if (hasToWellFormed) {
- return `${val}`.toWellFormed();
- } else if (nodeUtil.toUSVString) {
- return nodeUtil.toUSVString(val);
+ 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: body2 } = this;
+ if (!ret.push(chunk) && body2.pause) {
+ body2.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;
}
- return `${val}`;
- }
- function isTokenCharCode(c) {
- switch (c) {
- case 34:
- case 40:
- case 41:
- case 44:
- case 47:
- case 58:
- case 59:
- case 60:
- case 61:
- case 62:
- case 63:
- case 64:
- case 91:
- case 92:
- case 93:
- case 123:
- case 125:
- return false;
- default:
- return c >= 33 && c <= 126;
+ 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);
+ }
+ };
+ 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);
}
}
- function isValidHTTPToken(characters) {
- if (characters.length === 0) {
- return false;
+ module2.exports = pipeline;
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-upgrade.js
+var require_api_upgrade = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-upgrade.js"(exports, module2) {
+ "use strict";
+ var { InvalidArgumentError, SocketError } = require_errors();
+ var { AsyncResource } = require("node:async_hooks");
+ var util = require_util();
+ var { addSignal, removeSignal } = require_abort_signal();
+ var assert3 = require("node:assert");
+ var UpgradeHandler = class extends AsyncResource {
+ constructor(opts, callback) {
+ if (!opts || typeof opts !== "object") {
+ throw new InvalidArgumentError("invalid opts");
+ }
+ if (typeof callback !== "function") {
+ throw new InvalidArgumentError("invalid callback");
+ }
+ const { signal, opaque, responseHeaders } = opts;
+ if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") {
+ throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget");
+ }
+ super("UNDICI_UPGRADE");
+ this.responseHeaders = responseHeaders || null;
+ this.opaque = opaque || null;
+ this.callback = callback;
+ this.abort = null;
+ this.context = null;
+ addSignal(this, signal);
}
- for (let i = 0; i < characters.length; ++i) {
- if (!isTokenCharCode(characters.charCodeAt(i))) {
- return false;
+ onConnect(abort, context) {
+ if (this.reason) {
+ abort(this.reason);
+ return;
+ }
+ assert3(this.callback);
+ this.abort = abort;
+ this.context = null;
+ }
+ onHeaders() {
+ throw new SocketError("bad upgrade", null);
+ }
+ onUpgrade(statusCode, rawHeaders, socket) {
+ const { callback, opaque, context } = this;
+ assert3.strictEqual(statusCode, 101);
+ removeSignal(this);
+ this.callback = null;
+ const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders);
+ this.runInAsyncScope(callback, null, null, {
+ headers,
+ socket,
+ opaque,
+ context
+ });
+ }
+ onError(err) {
+ const { callback, opaque } = this;
+ removeSignal(this);
+ if (callback) {
+ this.callback = null;
+ queueMicrotask(() => {
+ this.runInAsyncScope(callback, null, err, { opaque });
+ });
}
}
- return true;
+ };
+ function upgrade(opts, callback) {
+ if (callback === void 0) {
+ 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?.opaque;
+ queueMicrotask(() => callback(err, { opaque }));
+ }
}
- 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;
- }
- var kEnumerableProperty = /* @__PURE__ */ Object.create(null);
- kEnumerableProperty.enumerable = true;
- module2.exports = {
- kEnumerableProperty,
- nop,
- isDisturbed,
- isErrored,
- isReadable,
- toUSVString,
- isReadableAborted,
- isBlobLike,
- parseOrigin,
- parseURL,
- getServerName,
- isStream,
- isIterable,
- isAsyncIterable,
- isDestroyed,
- headerNameToString,
- bufferToLowerCasedHeaderName,
- parseRawHeaders,
- parseHeaders,
- parseKeepAliveTimeout,
- destroy,
- bodyLength,
- deepClone,
- ReadableStreamFrom,
- isBuffer,
- validateHandler,
- getSocketInfo,
- isFormDataLike,
- buildURL,
- addAbortListener,
- isValidHTTPToken,
- isTokenCharCode,
- parseRangeHeader,
- nodeMajor,
- nodeMinor,
- nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13,
- safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"]
- };
+ module2.exports = upgrade;
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/diagnostics.js
-var require_diagnostics = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/diagnostics.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-connect.js
+var require_api_connect = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-connect.js"(exports, module2) {
"use strict";
- var diagnosticsChannel = require("node:diagnostics_channel");
- var util = require("node:util");
- var undiciDebugLog = util.debuglog("undici");
- var fetchDebuglog = util.debuglog("fetch");
- var websocketDebuglog = util.debuglog("websocket");
- var isClientSet = false;
- var channels = {
- // Client
- beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"),
- connected: diagnosticsChannel.channel("undici:client:connected"),
- connectError: diagnosticsChannel.channel("undici:client:connectError"),
- sendHeaders: diagnosticsChannel.channel("undici:client:sendHeaders"),
- // Request
- create: diagnosticsChannel.channel("undici:request:create"),
- bodySent: diagnosticsChannel.channel("undici:request:bodySent"),
- headers: diagnosticsChannel.channel("undici:request:headers"),
- trailers: diagnosticsChannel.channel("undici:request:trailers"),
- error: diagnosticsChannel.channel("undici:request:error"),
- // WebSocket
- open: diagnosticsChannel.channel("undici:websocket:open"),
- close: diagnosticsChannel.channel("undici:websocket:close"),
- socketError: diagnosticsChannel.channel("undici:websocket:socket_error"),
- ping: diagnosticsChannel.channel("undici:websocket:ping"),
- pong: diagnosticsChannel.channel("undici:websocket:pong")
- };
- if (undiciDebugLog.enabled || fetchDebuglog.enabled) {
- const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog;
- diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => {
- const {
- connectParams: { version: version2, protocol, port, host }
- } = evt;
- debuglog(
- "connecting to %s using %s%s",
- `${host}${port ? `:${port}` : ""}`,
- protocol,
- version2
- );
- });
- diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => {
- const {
- connectParams: { version: version2, protocol, port, host }
- } = evt;
- debuglog(
- "connected to %s using %s%s",
- `${host}${port ? `:${port}` : ""}`,
- protocol,
- version2
- );
- });
- diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => {
- const {
- connectParams: { version: version2, protocol, port, host },
- error
- } = evt;
- debuglog(
- "connection to %s using %s%s errored - %s",
- `${host}${port ? `:${port}` : ""}`,
- protocol,
- version2,
- error.message
- );
- });
- diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => {
- const {
- request: { method, path: path10, origin }
- } = evt;
- debuglog("sending request to %s %s/%s", method, origin, path10);
- });
- diagnosticsChannel.channel("undici:request:headers").subscribe((evt) => {
- const {
- request: { method, path: path10, origin },
- response: { statusCode }
- } = evt;
- debuglog(
- "received response to %s %s/%s - HTTP %d",
- method,
- origin,
- path10,
- statusCode
- );
- });
- diagnosticsChannel.channel("undici:request:trailers").subscribe((evt) => {
- const {
- request: { method, path: path10, origin }
- } = evt;
- debuglog("trailers received from %s %s/%s", method, origin, path10);
- });
- diagnosticsChannel.channel("undici:request:error").subscribe((evt) => {
- const {
- request: { method, path: path10, origin },
- error
- } = evt;
- debuglog(
- "request to %s %s/%s errored - %s",
- method,
- origin,
- path10,
- error.message
- );
- });
- isClientSet = true;
- }
- if (websocketDebuglog.enabled) {
- if (!isClientSet) {
- const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog;
- diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => {
- const {
- connectParams: { version: version2, protocol, port, host }
- } = evt;
- debuglog(
- "connecting to %s%s using %s%s",
- host,
- port ? `:${port}` : "",
- protocol,
- version2
- );
- });
- diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => {
- const {
- connectParams: { version: version2, protocol, port, host }
- } = evt;
- debuglog(
- "connected to %s%s using %s%s",
- host,
- port ? `:${port}` : "",
- protocol,
- version2
- );
- });
- diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => {
- const {
- connectParams: { version: version2, protocol, port, host },
- error
- } = evt;
- debuglog(
- "connection to %s%s using %s%s errored - %s",
- host,
- port ? `:${port}` : "",
- protocol,
- version2,
- error.message
- );
+ var assert3 = require("node:assert");
+ var { AsyncResource } = require("node:async_hooks");
+ var { InvalidArgumentError, SocketError } = require_errors();
+ var util = require_util();
+ var { addSignal, removeSignal } = require_abort_signal();
+ var ConnectHandler = class extends AsyncResource {
+ constructor(opts, callback) {
+ if (!opts || typeof opts !== "object") {
+ throw new InvalidArgumentError("invalid opts");
+ }
+ if (typeof callback !== "function") {
+ throw new InvalidArgumentError("invalid callback");
+ }
+ const { signal, opaque, responseHeaders } = opts;
+ if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") {
+ throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget");
+ }
+ super("UNDICI_CONNECT");
+ this.opaque = opaque || null;
+ this.responseHeaders = responseHeaders || null;
+ this.callback = callback;
+ this.abort = null;
+ addSignal(this, signal);
+ }
+ onConnect(abort, context) {
+ if (this.reason) {
+ abort(this.reason);
+ return;
+ }
+ assert3(this.callback);
+ this.abort = abort;
+ this.context = context;
+ }
+ onHeaders() {
+ throw new SocketError("bad connect", null);
+ }
+ onUpgrade(statusCode, rawHeaders, socket) {
+ const { callback, opaque, context } = this;
+ removeSignal(this);
+ this.callback = null;
+ let headers = rawHeaders;
+ if (headers != null) {
+ headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders);
+ }
+ this.runInAsyncScope(callback, null, null, {
+ statusCode,
+ headers,
+ socket,
+ opaque,
+ context
});
- diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => {
- const {
- request: { method, path: path10, origin }
- } = evt;
- debuglog("sending request to %s %s/%s", method, origin, path10);
+ }
+ onError(err) {
+ const { callback, opaque } = this;
+ removeSignal(this);
+ if (callback) {
+ this.callback = null;
+ queueMicrotask(() => {
+ this.runInAsyncScope(callback, null, err, { opaque });
+ });
+ }
+ }
+ };
+ function connect(opts, callback) {
+ if (callback === void 0) {
+ return new Promise((resolve, reject) => {
+ connect.call(this, opts, (err, data) => {
+ return err ? reject(err) : resolve(data);
+ });
});
}
- diagnosticsChannel.channel("undici:websocket:open").subscribe((evt) => {
- const {
- address: { address, port }
- } = evt;
- websocketDebuglog("connection opened %s%s", address, port ? `:${port}` : "");
- });
- diagnosticsChannel.channel("undici:websocket:close").subscribe((evt) => {
- const { websocket, code, reason } = evt;
- websocketDebuglog(
- "closed connection to %s - %s %s",
- websocket.url,
- code,
- reason
- );
- });
- diagnosticsChannel.channel("undici:websocket:socket_error").subscribe((err) => {
- websocketDebuglog("connection errored - %s", err.message);
- });
- diagnosticsChannel.channel("undici:websocket:ping").subscribe((evt) => {
- websocketDebuglog("ping received");
- });
- diagnosticsChannel.channel("undici:websocket:pong").subscribe((evt) => {
- websocketDebuglog("pong received");
- });
+ try {
+ const connectHandler = new ConnectHandler(opts, callback);
+ this.dispatch({ ...opts, method: "CONNECT" }, connectHandler);
+ } catch (err) {
+ if (typeof callback !== "function") {
+ throw err;
+ }
+ const opaque = opts?.opaque;
+ queueMicrotask(() => callback(err, { opaque }));
+ }
}
- module2.exports = {
- channels
- };
+ module2.exports = connect;
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/timers.js
-var require_timers = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/timers.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/index.js
+var require_api = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/index.js"(exports, module2) {
"use strict";
- var fastNow = Date.now();
- var fastNowTimeout;
- var 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?.refresh) {
- fastNowTimeout.refresh();
- } else {
- clearTimeout(fastNowTimeout);
- fastNowTimeout = setTimeout(onTimeout, 1e3);
- if (fastNowTimeout.unref) {
- fastNowTimeout.unref();
- }
- }
- }
- var Timeout = class {
- constructor(callback, delay, opaque) {
- this.callback = callback;
- this.delay = delay;
- this.opaque = opaque;
- 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;
- }
- };
- module2.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);
- }
- }
- };
+ module2.exports.request = require_api_request();
+ module2.exports.stream = require_api_stream();
+ module2.exports.pipeline = require_api_pipeline();
+ module2.exports.upgrade = require_api_upgrade();
+ module2.exports.connect = require_api_connect();
}
});
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/streamsearch/sbmh.js
-var require_sbmh = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/streamsearch/sbmh.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/dispatcher.js
+var require_dispatcher = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/dispatcher.js"(exports, module2) {
"use strict";
- var EventEmitter = require("node:events").EventEmitter;
- var inherits = require("node:util").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);
- this._lookbehind_size = 0;
- this._needle = needle;
- this._bufpos = 0;
- this._lookbehind = Buffer.alloc(needleLength);
- for (var i = 0; i < needleLength - 1; ++i) {
- 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);
+ var EventEmitter = require("node:events");
+ var Dispatcher = class extends EventEmitter {
+ dispatch() {
+ throw new Error("not implemented");
}
- 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];
- let pos = -this._lookbehind_size;
- let ch;
- if (pos < 0) {
- 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];
- }
- if (pos < 0) {
- while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) {
- ++pos;
- }
- }
- if (pos >= 0) {
- this.emit("info", false, this._lookbehind, 0, this._lookbehind_size);
- this._lookbehind_size = 0;
- } else {
- const bytesToCutOff = this._lookbehind_size + pos;
- if (bytesToCutOff > 0) {
- 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;
- 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);
+ close() {
+ throw new Error("not implemented");
+ }
+ destroy() {
+ throw new Error("not implemented");
+ }
+ compose(...args) {
+ const interceptors = Array.isArray(args[0]) ? args[0] : args;
+ let dispatch = this.dispatch.bind(this);
+ for (const interceptor of interceptors) {
+ if (interceptor == null) {
+ continue;
+ }
+ if (typeof interceptor !== "function") {
+ throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`);
+ }
+ dispatch = interceptor(dispatch);
+ if (dispatch == null || typeof dispatch !== "function" || dispatch.length !== 2) {
+ throw new TypeError("invalid interceptor");
+ }
}
- return this._bufpos = pos + needleLength;
- } else {
- pos = len - needleLength;
+ return new ComposedDispatcher(this, dispatch);
}
- while (pos < len && (data[pos] !== needle[0] || Buffer.compare(
- data.subarray(pos, pos + len - pos),
- needle.subarray(0, len - pos)
- ) !== 0)) {
- ++pos;
+ };
+ var ComposedDispatcher = class extends Dispatcher {
+ #dispatcher = null;
+ #dispatch = null;
+ constructor(dispatcher, dispatch) {
+ super();
+ this.#dispatcher = dispatcher;
+ this.#dispatch = dispatch;
}
- if (pos < len) {
- data.copy(this._lookbehind, 0, pos, pos + (len - pos));
- this._lookbehind_size = len - pos;
+ dispatch(...args) {
+ this.#dispatch(...args);
}
- if (pos > 0) {
- this.emit("info", false, data, this._bufpos, pos < len ? pos : len);
+ close(...args) {
+ return this.#dispatcher.close(...args);
}
- 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) {
- if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) {
- return false;
- }
+ destroy(...args) {
+ return this.#dispatcher.destroy(...args);
}
- return true;
};
- module2.exports = SBMH;
- }
-});
-
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js
-var require_PartStream = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js"(exports, module2) {
- "use strict";
- var inherits = require("node:util").inherits;
- var ReadableStream2 = require("node:stream").Readable;
- function PartStream(opts) {
- ReadableStream2.call(this, opts);
- }
- inherits(PartStream, ReadableStream2);
- PartStream.prototype._read = function(n) {
- };
- module2.exports = PartStream;
+ module2.exports = Dispatcher;
}
});
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/getLimit.js
-var require_getLimit = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/getLimit.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js
+var require_dispatcher_base = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports, module2) {
"use strict";
- module2.exports = function getLimit(limits, name, defaultLimit) {
- if (!limits || limits[name] === void 0 || limits[name] === null) {
- return defaultLimit;
+ var Dispatcher = require_dispatcher();
+ var {
+ ClientDestroyedError,
+ ClientClosedError,
+ InvalidArgumentError
+ } = require_errors();
+ var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols();
+ var kDestroyed = Symbol("destroyed");
+ var kClosed = Symbol("closed");
+ var kOnDestroyed = Symbol("onDestroyed");
+ var kOnClosed = Symbol("onClosed");
+ var kInterceptedDispatch = Symbol("Intercepted Dispatch");
+ var DispatcherBase = class extends Dispatcher {
+ constructor() {
+ super();
+ this[kDestroyed] = false;
+ this[kOnDestroyed] = null;
+ this[kClosed] = false;
+ this[kOnClosed] = [];
}
- if (typeof limits[name] !== "number" || isNaN(limits[name])) {
- throw new TypeError("Limit " + name + " is not a valid number");
+ get destroyed() {
+ return this[kDestroyed];
}
- return limits[name];
- };
- }
-});
-
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js
-var require_HeaderParser = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js"(exports, module2) {
- "use strict";
- var EventEmitter = require("node:events").EventEmitter;
- var inherits = require("node:util").inherits;
- var getLimit = require_getLimit();
- var StreamSearch = require_sbmh();
- var B_DCRLF = Buffer.from("\r\n\r\n");
- var RE_CRLF = /\r\n/g;
- var RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/;
- function HeaderParser(cfg) {
- EventEmitter.call(this);
- cfg = cfg || {};
- const self2 = this;
- this.nread = 0;
- this.maxed = false;
- this.npairs = 0;
- this.maxHeaderPairs = getLimit(cfg, "maxHeaderPairs", 2e3);
- 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 && !self2.maxed) {
- if (self2.nread + end - start >= self2.maxHeaderSize) {
- end = self2.maxHeaderSize - self2.nread + start;
- self2.nread = self2.maxHeaderSize;
- self2.maxed = true;
- } else {
- self2.nread += end - start;
- }
- self2.buffer += data.toString("binary", start, end);
- }
- if (isMatch) {
- self2._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;
+ get closed() {
+ return this[kClosed];
}
- const lines = this.buffer.split(RE_CRLF);
- const len = lines.length;
- let m, h;
- for (var i = 0; i < len; ++i) {
- if (lines[i].length === 0) {
- continue;
- }
- if (lines[i][0] === " " || lines[i][0] === " ") {
- if (h) {
- this.header[h][this.header[h].length - 1] += lines[i];
- continue;
+ 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");
+ }
}
}
- 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;
- }
+ this[kInterceptors] = newInterceptors;
}
- };
- module2.exports = HeaderParser;
- }
-});
-
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js
-var require_Dicer = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js"(exports, module2) {
- "use strict";
- var WritableStream = require("node:stream").Writable;
- var inherits = require("node:util").inherits;
- var StreamSearch = require_sbmh();
- var PartStream = require_PartStream();
- var HeaderParser = require_HeaderParser();
- var DASH = 45;
- var B_ONEDASH = Buffer.from("-");
- var B_CRLF = Buffer.from("\r\n");
- var 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 = void 0;
- }
- 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 = void 0;
- this._cb = void 0;
- this._ignoreData = false;
- this._partOpts = { highWaterMark: cfg.partHwm };
- this._pause = false;
- const self2 = this;
- this._hparser = new HeaderParser(cfg);
- this._hparser.on("header", function(header) {
- self2._inHeader = false;
- self2._part.emit("header", header);
- });
- }
- inherits(Dicer, WritableStream);
- Dicer.prototype.emit = function(ev) {
- if (ev === "finish" && !this._realFinish) {
- if (!this._finished) {
- const self2 = this;
- process.nextTick(function() {
- self2.emit("error", new Error("Unexpected end of multipart data"));
- if (self2._part && !self2._ignoreData) {
- const type = self2._isPreamble ? "Preamble" : "Part";
- self2._part.emit("error", new Error(type + " terminated early due to unexpected end of multipart data"));
- self2._part.push(null);
- process.nextTick(function() {
- self2._realFinish = true;
- self2.emit("finish");
- self2._realFinish = false;
- });
- return;
- }
- self2._realFinish = true;
- self2.emit("finish");
- self2._realFinish = false;
+ close(callback) {
+ if (callback === void 0) {
+ return new Promise((resolve, reject) => {
+ this.close((err, data) => {
+ return err ? reject(err) : resolve(data);
+ });
});
}
- } else {
- WritableStream.prototype.emit.apply(this, arguments);
- }
- };
- Dicer.prototype._write = function(data, encoding, cb) {
- if (!this._hparser && !this._bparser) {
- return cb();
- }
- if (this._headerFirst && this._isPreamble) {
- if (!this._part) {
- this._part = new PartStream(this._partOpts);
- if (this._events.preamble) {
- this.emit("preamble", this._part);
- } else {
- this._ignore();
- }
+ if (typeof callback !== "function") {
+ throw new InvalidArgumentError("invalid callback");
}
- const r = this._hparser.push(data);
- if (!this._inHeader && r !== void 0 && r < data.length) {
- data = data.slice(r);
- } else {
- return cb();
+ if (this[kDestroyed]) {
+ queueMicrotask(() => callback(new ClientDestroyedError(), null));
+ return;
}
- }
- 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 = void 0;
- this._bparser = void 0;
- this._hparser = void 0;
- };
- Dicer.prototype.setBoundary = function(boundary) {
- const self2 = this;
- this._bparser = new StreamSearch("\r\n--" + boundary);
- this._bparser.on("info", function(isMatch, data, start, end) {
- self2._oninfo(isMatch, data, start, end);
- });
- };
- Dicer.prototype._ignore = function() {
- if (this._part && !this._ignoreData) {
- this._ignoreData = true;
- this._part.on("error", EMPTY_FN);
- this._part.resume();
- }
- };
- Dicer.prototype._oninfo = function(isMatch, data, start, end) {
- let buf;
- const self2 = 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;
+ if (this[kClosed]) {
+ if (this[kOnClosed]) {
+ this[kOnClosed].push(callback);
} else {
- if (this._dashes) {
- buf = B_ONEDASH;
- }
- this._dashes = 0;
- break;
- }
- }
- if (this._dashes === 2) {
- if (start + i < end && this._events.trailer) {
- this.emit("trailer", data.slice(start + i, end));
- }
- this.reset();
- this._finished = true;
- if (self2._parts === 0) {
- self2._realFinish = true;
- self2.emit("finish");
- self2._realFinish = false;
+ queueMicrotask(() => callback(null, null));
}
- }
- if (this._dashes) {
return;
}
- }
- if (this._justMatched) {
- this._justMatched = false;
- }
- if (!this._part) {
- this._part = new PartStream(this._partOpts);
- this._part._read = function(n) {
- self2._unpause();
+ 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);
+ }
};
- if (this._isPreamble && this._events.preamble) {
- this.emit("preamble", this._part);
- } else if (this._isPreamble !== true && this._events.part) {
- this.emit("part", this._part);
- } else {
- this._ignore();
- }
- if (!this._isPreamble) {
- this._inHeader = true;
- }
+ this[kClose]().then(() => this.destroy()).then(() => {
+ queueMicrotask(onClosed);
+ });
}
- 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 !== void 0 && r < end) {
- this._oninfo(false, data, start + r, end);
- }
+ destroy(err, callback) {
+ if (typeof err === "function") {
+ callback = err;
+ err = null;
}
- }
- if (isMatch) {
- this._hparser.reset();
- if (this._isPreamble) {
- this._isPreamble = false;
- } else {
- if (start !== end) {
- ++this._parts;
- this._part.on("end", function() {
- if (--self2._parts === 0) {
- if (self2._finished) {
- self2._realFinish = true;
- self2.emit("finish");
- self2._realFinish = false;
- } else {
- self2._unpause();
- }
- }
+ if (callback === void 0) {
+ return new Promise((resolve, reject) => {
+ this.destroy(err, (err2, data) => {
+ return err2 ? (
+ /* istanbul ignore next: should never error */
+ reject(err2)
+ ) : resolve(data);
});
- }
+ });
}
- this._part.push(null);
- this._part = void 0;
- 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 = void 0;
- cb();
- }
- };
- module2.exports = Dicer;
- }
-});
-
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/decodeText.js
-var require_decodeText = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/decodeText.js"(exports, module2) {
- "use strict";
- var utf8Decoder = new TextDecoder("utf-8");
- var textDecoders = /* @__PURE__ */ 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":
- 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 === void 0) {
- lc = true;
- charset = charset.toLowerCase();
- continue;
- }
- return decoders.other.bind(charset);
- }
- }
- }
- var 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 callback !== "function") {
+ throw new InvalidArgumentError("invalid callback");
}
- if (typeof data === "string") {
- data = Buffer.from(data, sourceEncoding);
+ if (this[kDestroyed]) {
+ if (this[kOnDestroyed]) {
+ this[kOnDestroyed].push(callback);
+ } else {
+ queueMicrotask(() => callback(null, null));
+ }
+ return;
}
- return data.ucs2Slice(0, data.length);
- },
- base64: (data, sourceEncoding) => {
- if (data.length === 0) {
- return "";
+ if (!err) {
+ err = new ClientDestroyedError();
}
- if (typeof data === "string") {
- data = Buffer.from(data, sourceEncoding);
+ 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);
+ }
+ };
+ 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);
}
- return data.base64Slice(0, data.length);
- },
- other: (data, sourceEncoding) => {
- if (data.length === 0) {
- return "";
+ let dispatch = this[kDispatch].bind(this);
+ for (let i = this[kInterceptors].length - 1; i >= 0; i--) {
+ dispatch = this[kInterceptors][i](dispatch);
}
- if (typeof data === "string") {
- data = Buffer.from(data, sourceEncoding);
+ this[kInterceptedDispatch] = dispatch;
+ return dispatch(opts, handler);
+ }
+ dispatch(opts, handler) {
+ if (!handler || typeof handler !== "object") {
+ throw new InvalidArgumentError("handler must be an object");
}
- if (textDecoders.has(exports.toString())) {
- try {
- return textDecoders.get(exports).decode(data);
- } catch (e) {
+ 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;
}
- return typeof data === "string" ? data : data.toString();
}
};
- function decodeText(text, sourceEncoding, destEncoding) {
- if (text) {
- return getDecoder(destEncoding)(text, sourceEncoding);
- }
- return text;
- }
- module2.exports = decodeText;
+ module2.exports = DispatcherBase;
}
});
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/parseParams.js
-var require_parseParams = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/parseParams.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/fixed-queue.js
+var require_fixed_queue = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/fixed-queue.js"(exports, module2) {
"use strict";
- var decodeText = require_decodeText();
- var RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g;
- var EncodedLookup = {
- "%00": "\0",
- "%01": "",
- "%02": "",
- "%03": "",
- "%04": "",
- "%05": "",
- "%06": "",
- "%07": "\x07",
- "%08": "\b",
- "%09": " ",
- "%0a": "\n",
- "%0A": "\n",
- "%0b": "\v",
- "%0B": "\v",
- "%0c": "\f",
- "%0C": "\f",
- "%0d": "\r",
- "%0D": "\r",
- "%0e": "",
- "%0E": "",
- "%0f": "",
- "%0F": "",
- "%10": "",
- "%11": "",
- "%12": "",
- "%13": "",
- "%14": "",
- "%15": "",
- "%16": "",
- "%17": "",
- "%18": "",
- "%19": "",
- "%1a": "",
- "%1A": "",
- "%1b": "\x1B",
- "%1B": "\x1B",
- "%1c": "",
- "%1C": "",
- "%1d": "",
- "%1D": "",
- "%1e": "",
- "%1E": "",
- "%1f": "",
- "%1F": "",
- "%20": " ",
- "%21": "!",
- "%22": '"',
- "%23": "#",
- "%24": "$",
- "%25": "%",
- "%26": "&",
- "%27": "'",
- "%28": "(",
- "%29": ")",
- "%2a": "*",
- "%2A": "*",
- "%2b": "+",
- "%2B": "+",
- "%2c": ",",
- "%2C": ",",
- "%2d": "-",
- "%2D": "-",
- "%2e": ".",
- "%2E": ".",
- "%2f": "/",
- "%2F": "/",
- "%30": "0",
- "%31": "1",
- "%32": "2",
- "%33": "3",
- "%34": "4",
- "%35": "5",
- "%36": "6",
- "%37": "7",
- "%38": "8",
- "%39": "9",
- "%3a": ":",
- "%3A": ":",
- "%3b": ";",
- "%3B": ";",
- "%3c": "<",
- "%3C": "<",
- "%3d": "=",
- "%3D": "=",
- "%3e": ">",
- "%3E": ">",
- "%3f": "?",
- "%3F": "?",
- "%40": "@",
- "%41": "A",
- "%42": "B",
- "%43": "C",
- "%44": "D",
- "%45": "E",
- "%46": "F",
- "%47": "G",
- "%48": "H",
- "%49": "I",
- "%4a": "J",
- "%4A": "J",
- "%4b": "K",
- "%4B": "K",
- "%4c": "L",
- "%4C": "L",
- "%4d": "M",
- "%4D": "M",
- "%4e": "N",
- "%4E": "N",
- "%4f": "O",
- "%4F": "O",
- "%50": "P",
- "%51": "Q",
- "%52": "R",
- "%53": "S",
- "%54": "T",
- "%55": "U",
- "%56": "V",
- "%57": "W",
- "%58": "X",
- "%59": "Y",
- "%5a": "Z",
- "%5A": "Z",
- "%5b": "[",
- "%5B": "[",
- "%5c": "\\",
- "%5C": "\\",
- "%5d": "]",
- "%5D": "]",
- "%5e": "^",
- "%5E": "^",
- "%5f": "_",
- "%5F": "_",
- "%60": "`",
- "%61": "a",
- "%62": "b",
- "%63": "c",
- "%64": "d",
- "%65": "e",
- "%66": "f",
- "%67": "g",
- "%68": "h",
- "%69": "i",
- "%6a": "j",
- "%6A": "j",
- "%6b": "k",
- "%6B": "k",
- "%6c": "l",
- "%6C": "l",
- "%6d": "m",
- "%6D": "m",
- "%6e": "n",
- "%6E": "n",
- "%6f": "o",
- "%6F": "o",
- "%70": "p",
- "%71": "q",
- "%72": "r",
- "%73": "s",
- "%74": "t",
- "%75": "u",
- "%76": "v",
- "%77": "w",
- "%78": "x",
- "%79": "y",
- "%7a": "z",
- "%7A": "z",
- "%7b": "{",
- "%7B": "{",
- "%7c": "|",
- "%7C": "|",
- "%7d": "}",
- "%7D": "}",
- "%7e": "~",
- "%7E": "~",
- "%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];
- }
- var STATE_KEY = 0;
- var STATE_VALUE = 1;
- var STATE_CHARSET = 2;
- var 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) {
- 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, void 0];
- 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] === void 0) {
- res[p] = tmp;
- } else {
- res[p][1] = tmp;
- }
- tmp = "";
- ++p;
- continue;
- } else if (!inquote && (char === " " || char === " ")) {
- continue;
- }
- }
- tmp += char;
+ var kSize = 2048;
+ var kMask = kSize - 1;
+ var FixedCircularBuffer = class {
+ constructor() {
+ this.bottom = 0;
+ this.top = 0;
+ this.list = new Array(kSize);
+ this.next = null;
}
- if (charset && tmp.length) {
- tmp = decodeText(
- tmp.replace(RE_ENCODED, encodedReplacer),
- "binary",
- charset
- );
- } else if (tmp) {
- tmp = decodeText(tmp, "binary", "utf8");
+ isEmpty() {
+ return this.top === this.bottom;
}
- if (res[p] === void 0) {
- if (tmp) {
- res[p] = tmp;
- }
- } else {
- res[p][1] = tmp;
+ isFull() {
+ return (this.top + 1 & kMask) === this.bottom;
}
- return res;
- }
- module2.exports = parseParams;
- }
-});
-
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/basename.js
-var require_basename = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/basename.js"(exports, module2) {
- "use strict";
- module2.exports = function basename(path10) {
- if (typeof path10 !== "string") {
- return "";
+ push(data) {
+ this.list[this.top] = data;
+ this.top = this.top + 1 & kMask;
}
- for (var i = path10.length - 1; i >= 0; --i) {
- switch (path10.charCodeAt(i)) {
- case 47:
- case 92:
- path10 = path10.slice(i + 1);
- return path10 === ".." || path10 === "." ? "" : path10;
- }
+ shift() {
+ const nextItem = this.list[this.bottom];
+ if (nextItem === void 0)
+ return null;
+ this.list[this.bottom] = void 0;
+ this.bottom = this.bottom + 1 & kMask;
+ return nextItem;
}
- return path10 === ".." || path10 === "." ? "" : path10;
};
- }
-});
-
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/multipart.js
-var require_multipart = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/multipart.js"(exports, module2) {
- "use strict";
- var { Readable: Readable2 } = require("node:stream");
- var { inherits } = require("node:util");
- var Dicer = require_Dicer();
- var parseParams = require_parseParams();
- var decodeText = require_decodeText();
- var basename = require_basename();
- var getLimit = require_getLimit();
- var RE_BOUNDARY = /^boundary$/i;
- var RE_FIELD = /^form-data$/i;
- var RE_CHARSET = /^charset$/i;
- var RE_FILENAME = /^filename$/i;
- var RE_NAME = /^name$/i;
- Multipart.detect = /^multipart\/form-data/i;
- function Multipart(boy, cfg) {
- let i;
- let len;
- const self2 = this;
- let boundary;
- const limits = cfg.limits;
- const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => contentType === "application/octet-stream" || fileName !== void 0);
- 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;
- }
+ module2.exports = class FixedQueue {
+ constructor() {
+ this.head = this.tail = new FixedCircularBuffer();
}
- function checkFinished() {
- if (nends === 0 && finished && !boy._done) {
- finished = false;
- self2.end();
- }
+ isEmpty() {
+ return this.head.isEmpty();
}
- if (typeof boundary !== "string") {
- throw new Error("Multipart: Boundary not found");
+ push(data) {
+ if (this.head.isFull()) {
+ this.head = this.head.next = new FixedCircularBuffer();
+ }
+ this.head.push(data);
}
- 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", 2e3);
- 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 = void 0;
- 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() {
- self2._needDrain = false;
- if (self2._cb && !self2._pause) {
- const cb = self2._cb;
- self2._cb = void 0;
- cb();
+ shift() {
+ const tail = this.tail;
+ const next = tail.shift();
+ if (tail.isEmpty() && tail.next !== null) {
+ this.tail = tail.next;
}
- }).on("part", function onPart(part) {
- if (++self2._nparts > partsLimit) {
- self2.parser.removeListener("part", onPart);
- self2.parser.on("part", skipPart);
- boy.hitPartsLimit = true;
- boy.emit("partsLimit");
- return skipPart(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 === void 0) {
- contype = "text/plain";
- }
- if (charset === void 0) {
- 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)) {
- if (nfiles === filesLimit) {
- if (!boy.hitFilesLimit) {
- boy.hitFilesLimit = true;
- boy.emit("filesLimit");
- }
- return skipPart(part);
- }
- ++nfiles;
- if (!boy._events.file) {
- self2.parser._ignore();
- return;
- }
- ++nends;
- const file = new FileStream(fileOpts);
- curFile = file;
- file.on("end", function() {
- --nends;
- self2._pause = false;
- checkFinished();
- if (self2._cb && !self2._needDrain) {
- const cb = self2._cb;
- self2._cb = void 0;
- cb();
- }
- });
- file._read = function(n) {
- if (!self2._pause) {
- return;
- }
- self2._pause = false;
- if (self2._cb && !self2._needDrain) {
- const cb = self2._cb;
- self2._cb = void 0;
- 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)) {
- self2._pause = true;
- }
- file.bytesRead = nsize;
- };
- onEnd = function() {
- curFile = void 0;
- file.push(null);
- };
- } else {
- 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 = void 0;
- if (buffer.length) {
- buffer = decodeText(buffer, "binary", charset);
- }
- boy.emit("field", fieldname, buffer, false, truncated, encoding, contype);
- --nends;
- checkFinished();
- };
- }
- 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 self2 = this;
- if (self2.parser.writable) {
- self2.parser.end();
- } else if (!self2._boy._done) {
- process.nextTick(function() {
- self2._boy._done = true;
- self2._boy.emit("finish");
- });
+ return next;
}
};
- function skipPart(part) {
- part.resume();
- }
- function FileStream(opts) {
- Readable2.call(this, opts);
- this.bytesRead = 0;
- this.truncated = false;
- }
- inherits(FileStream, Readable2);
- FileStream.prototype._read = function(n) {
- };
- module2.exports = Multipart;
}
});
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/Decoder.js
-var require_Decoder = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/Decoder.js"(exports, module2) {
- "use strict";
- var RE_PLUS = /\+/g;
- var 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 = void 0;
- }
- Decoder.prototype.write = function(str) {
- str = str.replace(RE_PLUS, " ");
- let res = "";
- let i = 0;
- let p = 0;
- const len = str.length;
- for (; i < len; ++i) {
- if (this.buffer !== void 0) {
- if (!HEX[str.charCodeAt(i)]) {
- res += "%" + this.buffer;
- this.buffer = void 0;
- --i;
- } else {
- this.buffer += str[i];
- ++p;
- if (this.buffer.length === 2) {
- res += String.fromCharCode(parseInt(this.buffer, 16));
- this.buffer = void 0;
- }
- }
- } else if (str[i] === "%") {
- if (i > p) {
- res += str.substring(p, i);
- p = i;
- }
- this.buffer = "";
- ++p;
- }
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool-stats.js
+var require_pool_stats = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool-stats.js"(exports, module2) {
+ var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols();
+ var kPool = Symbol("pool");
+ var PoolStats = class {
+ constructor(pool) {
+ this[kPool] = pool;
+ }
+ get connected() {
+ return this[kPool][kConnected];
}
- if (p < len && this.buffer === void 0) {
- res += str.substring(p);
+ 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];
}
- return res;
- };
- Decoder.prototype.reset = function() {
- this.buffer = void 0;
};
- module2.exports = Decoder;
+ module2.exports = PoolStats;
}
});
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/urlencoded.js
-var require_urlencoded = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/urlencoded.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool-base.js
+var require_pool_base = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool-base.js"(exports, module2) {
"use strict";
- var Decoder = require_Decoder();
- var decodeText = require_decodeText();
- var getLimit = require_getLimit();
- var 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) {
- if (Array.isArray(parsedConType[i]) && RE_CHARSET.test(parsedConType[i][0])) {
- charset = parsedConType[i][1].toLowerCase();
- break;
- }
- }
- if (charset === void 0) {
- 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 = void 0;
- for (i = p; i < len; ++i) {
- if (!this._checkingBytes) {
- ++p;
- }
- if (data[i] === 61) {
- idxeq = i;
- break;
- } else if (data[i] === 38) {
- idxamp = i;
- break;
- }
- if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {
- this._hitLimit = true;
+ var DispatcherBase = require_dispatcher_base();
+ var FixedQueue = require_fixed_queue();
+ var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols();
+ var PoolStats = require_pool_stats();
+ var kClients = Symbol("clients");
+ var kNeedDrain = Symbol("needDrain");
+ var kQueue = Symbol("queue");
+ var kClosedResolve = Symbol("closed resolve");
+ var kOnDrain = Symbol("onDrain");
+ var kOnConnect = Symbol("onConnect");
+ var kOnDisconnect = Symbol("onDisconnect");
+ var kOnConnectionError = Symbol("onConnectionError");
+ var kGetDispatcher = Symbol("get dispatcher");
+ var kAddClient = Symbol("add client");
+ var kRemoveClient = Symbol("remove client");
+ var kStats = Symbol("stats");
+ var PoolBase = class 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;
- } else if (this._checkingBytes) {
- ++this._bytesKey;
- }
- }
- if (idxeq !== void 0) {
- 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 !== void 0) {
- ++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) {
- if (i > p) {
- this._key += this.decoder.write(data.toString("binary", p, i));
- }
- p = i;
- if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {
- this._checkingBytes = false;
- this._keyTrunc = true;
}
- } else {
- if (p < len) {
- this._key += this.decoder.write(data.toString("binary", p));
- }
- p = len;
+ pool[kQueued]--;
+ needDrain = !this.dispatch(item.opts, item.handler);
}
- } else {
- idxamp = void 0;
- for (i = p; i < len; ++i) {
- if (!this._checkingBytes) {
- ++p;
- }
- if (data[i] === 38) {
- idxamp = i;
- break;
- }
- if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {
- this._hitLimit = true;
- break;
- } else if (this._checkingBytes) {
- ++this._bytesVal;
- }
+ this[kNeedDrain] = needDrain;
+ if (!this[kNeedDrain] && pool[kNeedDrain]) {
+ pool[kNeedDrain] = false;
+ pool.emit("drain", origin, [pool, ...targets]);
}
- if (idxamp !== void 0) {
- ++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) {
- 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) {
- this._checkingBytes = false;
- this._valTrunc = true;
- }
- } else {
- if (p < len) {
- this._val += this.decoder.write(data.toString("binary", p));
- }
- p = len;
+ 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;
}
- cb();
- };
- UrlEncoded.prototype.end = function() {
- if (this.boy._done) {
- return;
+ get [kRunning]() {
+ let ret = 0;
+ for (const { [kRunning]: running } of this[kClients]) {
+ ret += running;
+ }
+ return ret;
}
- 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
- );
+ get [kSize]() {
+ let ret = this[kQueued];
+ for (const { [kSize]: size } of this[kClients]) {
+ ret += size;
+ }
+ return ret;
}
- this.boy._done = true;
- this.boy.emit("finish");
- };
- module2.exports = UrlEncoded;
- }
-});
-
-// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/main.js
-var require_main = __commonJS({
- ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/main.js"(exports, module2) {
- "use strict";
- var WritableStream = require("node:stream").Writable;
- var { inherits } = require("node:util");
- var Dicer = require_Dicer();
- var MultipartParser = require_multipart();
- var UrlencodedParser = require_urlencoded();
- var parseParams = require_parseParams();
- 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;
+ 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;
+ });
}
- 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);
+ 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]) {
+ queueMicrotask(() => {
+ if (this[kNeedDrain]) {
+ this[kOnDrain](client[kUrl], [this, client]);
+ }
+ });
+ }
+ return this;
}
- if (UrlencodedParser.detect.test(parsed[0])) {
- return new UrlencodedParser(this, cfg);
+ [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);
}
- throw new Error("Unsupported Content-Type.");
};
- Busboy.prototype._write = function(chunk, encoding, cb) {
- this._parser.write(chunk, cb);
+ module2.exports = {
+ PoolBase,
+ kClients,
+ kNeedDrain,
+ kAddClient,
+ kRemoveClient,
+ kGetDispatcher
};
- module2.exports = Busboy;
- module2.exports.default = Busboy;
- module2.exports.Busboy = Busboy;
- module2.exports.Dicer = Dicer;
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/constants.js
-var require_constants3 = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/constants.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/diagnostics.js
+var require_diagnostics = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/diagnostics.js"(exports, module2) {
"use strict";
- var corsSafeListedMethods = ["GET", "HEAD", "POST"];
- var corsSafeListedMethodsSet = new Set(corsSafeListedMethods);
- var nullBodyStatus = [101, 204, 205, 304];
- var redirectStatus = [301, 302, 303, 307, 308];
- var redirectStatusSet = new Set(redirectStatus);
- var 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"
- ];
- var badPortsSet = new Set(badPorts);
- var referrerPolicy = [
- "",
- "no-referrer",
- "no-referrer-when-downgrade",
- "same-origin",
- "origin",
- "strict-origin",
- "origin-when-cross-origin",
- "strict-origin-when-cross-origin",
- "unsafe-url"
- ];
- var referrerPolicySet = new Set(referrerPolicy);
- var requestRedirect = ["follow", "manual", "error"];
- var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"];
- var safeMethodsSet = new Set(safeMethods);
- var requestMode = ["navigate", "same-origin", "no-cors", "cors"];
- var requestCredentials = ["omit", "same-origin", "include"];
- var requestCache = [
- "default",
- "no-store",
- "reload",
- "no-cache",
- "force-cache",
- "only-if-cached"
- ];
- var 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"
- ];
- var requestDuplex = [
- "half"
- ];
- var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"];
- var forbiddenMethodsSet = new Set(forbiddenMethods);
- var subresource = [
- "audio",
- "audioworklet",
- "font",
- "image",
- "manifest",
- "paintworklet",
- "script",
- "style",
- "track",
- "video",
- "xslt",
- ""
- ];
- var subresourceSet = new Set(subresource);
- module2.exports = {
- subresource,
- forbiddenMethods,
- requestBodyHeader,
- referrerPolicy,
- requestRedirect,
- requestMode,
- requestCredentials,
- requestCache,
- redirectStatus,
- corsSafeListedMethods,
- nullBodyStatus,
- safeMethods,
- badPorts,
- requestDuplex,
- subresourceSet,
- badPortsSet,
- redirectStatusSet,
- corsSafeListedMethodsSet,
- safeMethodsSet,
- forbiddenMethodsSet,
- referrerPolicySet
+ var diagnosticsChannel = require("node:diagnostics_channel");
+ var util = require("node:util");
+ var undiciDebugLog = util.debuglog("undici");
+ var fetchDebuglog = util.debuglog("fetch");
+ var websocketDebuglog = util.debuglog("websocket");
+ var isClientSet = false;
+ var channels = {
+ // Client
+ beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"),
+ connected: diagnosticsChannel.channel("undici:client:connected"),
+ connectError: diagnosticsChannel.channel("undici:client:connectError"),
+ sendHeaders: diagnosticsChannel.channel("undici:client:sendHeaders"),
+ // Request
+ create: diagnosticsChannel.channel("undici:request:create"),
+ bodySent: diagnosticsChannel.channel("undici:request:bodySent"),
+ headers: diagnosticsChannel.channel("undici:request:headers"),
+ trailers: diagnosticsChannel.channel("undici:request:trailers"),
+ error: diagnosticsChannel.channel("undici:request:error"),
+ // WebSocket
+ open: diagnosticsChannel.channel("undici:websocket:open"),
+ close: diagnosticsChannel.channel("undici:websocket:close"),
+ socketError: diagnosticsChannel.channel("undici:websocket:socket_error"),
+ ping: diagnosticsChannel.channel("undici:websocket:ping"),
+ pong: diagnosticsChannel.channel("undici:websocket:pong")
};
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/global.js
-var require_global = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/global.js"(exports, module2) {
- "use strict";
- var globalOrigin = Symbol.for("undici.globalOrigin.1");
- function getGlobalOrigin() {
- return globalThis[globalOrigin];
+ if (undiciDebugLog.enabled || fetchDebuglog.enabled) {
+ const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog;
+ diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => {
+ const {
+ connectParams: { version: version2, protocol, port, host }
+ } = evt;
+ debuglog(
+ "connecting to %s using %s%s",
+ `${host}${port ? `:${port}` : ""}`,
+ protocol,
+ version2
+ );
+ });
+ diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => {
+ const {
+ connectParams: { version: version2, protocol, port, host }
+ } = evt;
+ debuglog(
+ "connected to %s using %s%s",
+ `${host}${port ? `:${port}` : ""}`,
+ protocol,
+ version2
+ );
+ });
+ diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => {
+ const {
+ connectParams: { version: version2, protocol, port, host },
+ error
+ } = evt;
+ debuglog(
+ "connection to %s using %s%s errored - %s",
+ `${host}${port ? `:${port}` : ""}`,
+ protocol,
+ version2,
+ error.message
+ );
+ });
+ diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => {
+ const {
+ request: { method, path: path10, origin }
+ } = evt;
+ debuglog("sending request to %s %s/%s", method, origin, path10);
+ });
+ diagnosticsChannel.channel("undici:request:headers").subscribe((evt) => {
+ const {
+ request: { method, path: path10, origin },
+ response: { statusCode }
+ } = evt;
+ debuglog(
+ "received response to %s %s/%s - HTTP %d",
+ method,
+ origin,
+ path10,
+ statusCode
+ );
+ });
+ diagnosticsChannel.channel("undici:request:trailers").subscribe((evt) => {
+ const {
+ request: { method, path: path10, origin }
+ } = evt;
+ debuglog("trailers received from %s %s/%s", method, origin, path10);
+ });
+ diagnosticsChannel.channel("undici:request:error").subscribe((evt) => {
+ const {
+ request: { method, path: path10, origin },
+ error
+ } = evt;
+ debuglog(
+ "request to %s %s/%s errored - %s",
+ method,
+ origin,
+ path10,
+ error.message
+ );
+ });
+ isClientSet = true;
}
- function setGlobalOrigin(newOrigin) {
- if (newOrigin === void 0) {
- Object.defineProperty(globalThis, globalOrigin, {
- value: void 0,
- writable: true,
- enumerable: false,
- configurable: false
+ if (websocketDebuglog.enabled) {
+ if (!isClientSet) {
+ const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog;
+ diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => {
+ const {
+ connectParams: { version: version2, protocol, port, host }
+ } = evt;
+ debuglog(
+ "connecting to %s%s using %s%s",
+ host,
+ port ? `:${port}` : "",
+ protocol,
+ version2
+ );
+ });
+ diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => {
+ const {
+ connectParams: { version: version2, protocol, port, host }
+ } = evt;
+ debuglog(
+ "connected to %s%s using %s%s",
+ host,
+ port ? `:${port}` : "",
+ protocol,
+ version2
+ );
+ });
+ diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => {
+ const {
+ connectParams: { version: version2, protocol, port, host },
+ error
+ } = evt;
+ debuglog(
+ "connection to %s%s using %s%s errored - %s",
+ host,
+ port ? `:${port}` : "",
+ protocol,
+ version2,
+ error.message
+ );
+ });
+ diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => {
+ const {
+ request: { method, path: path10, origin }
+ } = evt;
+ debuglog("sending request to %s %s/%s", method, origin, path10);
});
- 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
+ diagnosticsChannel.channel("undici:websocket:open").subscribe((evt) => {
+ const {
+ address: { address, port }
+ } = evt;
+ websocketDebuglog("connection opened %s%s", address, port ? `:${port}` : "");
+ });
+ diagnosticsChannel.channel("undici:websocket:close").subscribe((evt) => {
+ const { websocket, code, reason } = evt;
+ websocketDebuglog(
+ "closed connection to %s - %s %s",
+ websocket.url,
+ code,
+ reason
+ );
+ });
+ diagnosticsChannel.channel("undici:websocket:socket_error").subscribe((err) => {
+ websocketDebuglog("connection errored - %s", err.message);
+ });
+ diagnosticsChannel.channel("undici:websocket:ping").subscribe((evt) => {
+ websocketDebuglog("ping received");
+ });
+ diagnosticsChannel.channel("undici:websocket:pong").subscribe((evt) => {
+ websocketDebuglog("pong received");
});
}
module2.exports = {
- getGlobalOrigin,
- setGlobalOrigin
+ channels
};
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/dataURL.js
-var require_dataURL = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/dataURL.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/request.js
+var require_request = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/request.js"(exports, module2) {
+ "use strict";
+ var {
+ InvalidArgumentError,
+ NotSupportedError
+ } = require_errors();
var assert3 = require("node:assert");
- var encoder = new TextEncoder();
- var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/;
- var HTTP_WHITESPACE_REGEX = /[\u000A|\u000D|\u0009|\u0020]/;
- var ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g;
- var HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/;
- function dataURLProcessor(dataURL) {
- assert3(dataURL.protocol === "data:");
- let input = URLSerializer(dataURL, true);
- input = input.slice(5);
- const position = { position: 0 };
- let mimeType = collectASequenceOfCodePointsFast(
- ",",
- input,
- position
- );
- const mimeTypeLength = mimeType.length;
- mimeType = removeASCIIWhitespace(mimeType, true, true);
- if (position.position >= input.length) {
- return "failure";
+ var {
+ isValidHTTPToken,
+ isValidHeaderChar,
+ isStream,
+ destroy,
+ isBuffer,
+ isFormDataLike,
+ isIterable,
+ isBlobLike,
+ buildURL,
+ validateHandler,
+ getServerName
+ } = require_util();
+ var { channels } = require_diagnostics();
+ var { headerNameLowerCasedRecord } = require_constants2();
+ var invalidPathRegex = /[^\u0021-\u00ff]/;
+ var kHandler = Symbol("handler");
+ var Request = class {
+ constructor(origin, {
+ path: path10,
+ method,
+ body,
+ headers,
+ query,
+ idempotent,
+ blocking,
+ upgrade,
+ headersTimeout,
+ bodyTimeout,
+ reset,
+ throwOnError,
+ expectContinue,
+ servername
+ }, handler) {
+ if (typeof path10 !== "string") {
+ throw new InvalidArgumentError("path must be a string");
+ } else if (path10[0] !== "/" && !(path10.startsWith("http://") || path10.startsWith("https://")) && method !== "CONNECT") {
+ throw new InvalidArgumentError("path must be an absolute URL or start with a slash");
+ } else if (invalidPathRegex.exec(path10) !== null) {
+ throw new InvalidArgumentError("invalid request path");
+ }
+ if (typeof method !== "string") {
+ throw new InvalidArgumentError("method must be a string");
+ } else if (!isValidHTTPToken(method)) {
+ 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 (isStream(body)) {
+ this.body = body;
+ const rState = this.body._readableState;
+ if (!rState || !rState.autoDestroy) {
+ this.endHandler = function autoDestroy() {
+ 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 (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 (isFormDataLike(body) || isIterable(body) || 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 ? buildURL(path10, query) : path10;
+ 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 = [];
+ 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") {
+ if (headers[Symbol.iterator]) {
+ for (const header of headers) {
+ if (!Array.isArray(header) || header.length !== 2) {
+ throw new InvalidArgumentError("headers must be in key-value pair format");
+ }
+ processHeader(this, header[0], header[1]);
+ }
+ } else {
+ const keys = Object.keys(headers);
+ for (let i = 0; i < keys.length; ++i) {
+ processHeader(this, keys[i], headers[keys[i]]);
+ }
+ }
+ } else if (headers != null) {
+ throw new InvalidArgumentError("headers must be an object or an array");
+ }
+ validateHandler(handler, method, upgrade);
+ this.servername = servername || getServerName(this.host);
+ this[kHandler] = handler;
+ if (channels.create.hasSubscribers) {
+ channels.create.publish({ request: this });
+ }
}
- position.position++;
- const encodedBody = input.slice(mimeTypeLength + 1);
- let body = stringPercentDecode(encodedBody);
- if (/;(\u0020){0,}base64$/i.test(mimeType)) {
- const stringBody = isomorphicDecode(body);
- body = forgivingBase64(stringBody);
- if (body === "failure") {
- return "failure";
+ onBodySent(chunk) {
+ if (this[kHandler].onBodySent) {
+ try {
+ return this[kHandler].onBodySent(chunk);
+ } catch (err) {
+ this.abort(err);
+ }
}
- mimeType = mimeType.slice(0, -6);
- mimeType = mimeType.replace(/(\u0020)+$/, "");
- mimeType = mimeType.slice(0, -1);
}
- if (mimeType.startsWith(";")) {
- mimeType = "text/plain" + mimeType;
+ onRequestSent() {
+ if (channels.bodySent.hasSubscribers) {
+ channels.bodySent.publish({ request: this });
+ }
+ if (this[kHandler].onRequestSent) {
+ try {
+ return this[kHandler].onRequestSent();
+ } catch (err) {
+ this.abort(err);
+ }
+ }
}
- let mimeTypeRecord = parseMIMEType(mimeType);
- if (mimeTypeRecord === "failure") {
- mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII");
+ onConnect(abort) {
+ assert3(!this.aborted);
+ assert3(!this.completed);
+ if (this.error) {
+ abort(this.error);
+ } else {
+ this.abort = abort;
+ return this[kHandler].onConnect(abort);
+ }
}
- return { mimeType: mimeTypeRecord, body };
- }
- function URLSerializer(url, excludeFragment = false) {
- if (!excludeFragment) {
- return url.href;
+ onResponseStarted() {
+ return this[kHandler].onResponseStarted?.();
}
- const href = url.href;
- const hashLength = url.hash.length;
- const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength);
- if (!hashLength && href.endsWith("#")) {
- return serialized.slice(0, -1);
+ onHeaders(statusCode, headers, resume, statusText) {
+ assert3(!this.aborted);
+ assert3(!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);
+ }
}
- return serialized;
- }
- function collectASequenceOfCodePoints(condition, input, position) {
- let result = "";
- while (position.position < input.length && condition(input[position.position])) {
- result += input[position.position];
- position.position++;
+ onData(chunk) {
+ assert3(!this.aborted);
+ assert3(!this.completed);
+ try {
+ return this[kHandler].onData(chunk);
+ } catch (err) {
+ this.abort(err);
+ return false;
+ }
}
- return result;
- }
- 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);
- }
- function stringPercentDecode(input) {
- const bytes = encoder.encode(input);
- return percentDecode(bytes);
- }
- function isHexCharByte(byte) {
- return byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102;
- }
- function hexByteToNumber(byte) {
- return (
- // 0-9
- byte >= 48 && byte <= 57 ? byte - 48 : (byte & 223) - 55
- );
- }
- function percentDecode(input) {
- const length = input.length;
- const output = new Uint8Array(length);
- let j = 0;
- for (let i = 0; i < length; ++i) {
- const byte = input[i];
- if (byte !== 37) {
- output[j++] = byte;
- } else if (byte === 37 && !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))) {
- output[j++] = 37;
- } else {
- output[j++] = hexByteToNumber(input[i + 1]) << 4 | hexByteToNumber(input[i + 2]);
- i += 2;
- }
- }
- return length === j ? output : output.subarray(0, j);
- }
- function parseMIMEType(input) {
- input = removeHTTPWhitespace(input, true, true);
- const position = { position: 0 };
- const type = collectASequenceOfCodePointsFast(
- "/",
- input,
- position
- );
- if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) {
- return "failure";
- }
- if (position.position > input.length) {
- return "failure";
- }
- position.position++;
- let subtype = collectASequenceOfCodePointsFast(
- ";",
- input,
- position
- );
- subtype = removeHTTPWhitespace(subtype, false, true);
- if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) {
- return "failure";
+ onUpgrade(statusCode, headers, socket) {
+ assert3(!this.aborted);
+ assert3(!this.completed);
+ return this[kHandler].onUpgrade(statusCode, headers, socket);
}
- const typeLowercase = type.toLowerCase();
- const subtypeLowercase = subtype.toLowerCase();
- const mimeType = {
- type: typeLowercase,
- subtype: subtypeLowercase,
- /** @type {Map} */
- parameters: /* @__PURE__ */ new Map(),
- // https://mimesniff.spec.whatwg.org/#mime-type-essence
- essence: `${typeLowercase}/${subtypeLowercase}`
- };
- while (position.position < input.length) {
- position.position++;
- collectASequenceOfCodePoints(
- // https://fetch.spec.whatwg.org/#http-whitespace
- (char) => HTTP_WHITESPACE_REGEX.test(char),
- input,
- position
- );
- let parameterName = collectASequenceOfCodePoints(
- (char) => char !== ";" && char !== "=",
- input,
- position
- );
- parameterName = parameterName.toLowerCase();
- if (position.position < input.length) {
- if (input[position.position] === ";") {
- continue;
- }
- position.position++;
+ onComplete(trailers) {
+ this.onFinally();
+ assert3(!this.aborted);
+ this.completed = true;
+ if (channels.trailers.hasSubscribers) {
+ channels.trailers.publish({ request: this, trailers });
}
- if (position.position > input.length) {
- break;
+ try {
+ return this[kHandler].onComplete(trailers);
+ } catch (err) {
+ this.onError(err);
}
- let parameterValue = null;
- if (input[position.position] === '"') {
- parameterValue = collectAnHTTPQuotedString(input, position, true);
- collectASequenceOfCodePointsFast(
- ";",
- input,
- position
- );
- } else {
- parameterValue = collectASequenceOfCodePointsFast(
- ";",
- input,
- position
- );
- parameterValue = removeHTTPWhitespace(parameterValue, false, true);
- if (parameterValue.length === 0) {
- continue;
- }
+ }
+ onError(error) {
+ this.onFinally();
+ if (channels.error.hasSubscribers) {
+ channels.error.publish({ request: this, error });
}
- 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);
+ if (this.aborted) {
+ return;
}
+ this.aborted = true;
+ return this[kHandler].onError(error);
}
- return mimeType;
- }
- function forgivingBase64(data) {
- data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, "");
- let dataLength = data.length;
- if (dataLength % 4 === 0) {
- if (data.charCodeAt(dataLength - 1) === 61) {
- --dataLength;
- if (data.charCodeAt(dataLength - 1) === 61) {
- --dataLength;
- }
+ 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;
}
}
- if (dataLength % 4 === 1) {
- return "failure";
+ addHeader(key, value) {
+ processHeader(this, key, value);
+ return this;
}
- if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) {
- return "failure";
+ };
+ function processHeader(request, key, val) {
+ if (val && (typeof val === "object" && !Array.isArray(val))) {
+ throw new InvalidArgumentError(`invalid ${key} header`);
+ } else if (val === void 0) {
+ return;
}
- const buffer = Buffer.from(data, "base64");
- return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
- }
- function collectAnHTTPQuotedString(input, position, extractValue) {
- const positionStart = position.position;
- let value = "";
- assert3(input[position.position] === '"');
- position.position++;
- while (true) {
- value += collectASequenceOfCodePoints(
- (char) => char !== '"' && char !== "\\",
- input,
- position
- );
- if (position.position >= input.length) {
- break;
+ let headerName = headerNameLowerCasedRecord[key];
+ if (headerName === void 0) {
+ headerName = key.toLowerCase();
+ if (headerNameLowerCasedRecord[headerName] === void 0 && !isValidHTTPToken(headerName)) {
+ throw new InvalidArgumentError("invalid header key");
}
- const quoteOrBackslash = input[position.position];
- position.position++;
- if (quoteOrBackslash === "\\") {
- if (position.position >= input.length) {
- value += "\\";
- break;
+ }
+ if (Array.isArray(val)) {
+ const arr = [];
+ for (let i = 0; i < val.length; i++) {
+ if (typeof val[i] === "string") {
+ if (!isValidHeaderChar(val[i])) {
+ throw new InvalidArgumentError(`invalid ${key} header`);
+ }
+ arr.push(val[i]);
+ } else if (val[i] === null) {
+ arr.push("");
+ } else if (typeof val[i] === "object") {
+ throw new InvalidArgumentError(`invalid ${key} header`);
+ } else {
+ arr.push(`${val[i]}`);
}
- value += input[position.position];
- position.position++;
- } else {
- assert3(quoteOrBackslash === '"');
- break;
}
+ val = arr;
+ } else if (typeof val === "string") {
+ if (!isValidHeaderChar(val)) {
+ throw new InvalidArgumentError(`invalid ${key} header`);
+ }
+ } else if (val === null) {
+ val = "";
+ } else if (typeof val === "object") {
+ throw new InvalidArgumentError(`invalid ${key} header`);
+ } else {
+ val = `${val}`;
}
- if (extractValue) {
- return value;
- }
- return input.slice(positionStart, position.position);
- }
- function serializeAMimeType(mimeType) {
- assert3(mimeType !== "failure");
- const { parameters, essence } = mimeType;
- let serialization = essence;
- for (let [name, value] of parameters.entries()) {
- serialization += ";";
- serialization += name;
- serialization += "=";
- if (!HTTP_TOKEN_CODEPOINTS.test(value)) {
- value = value.replace(/(\\|")/g, "\\$1");
- value = '"' + value;
- value += '"';
+ if (request.host === null && headerName === "host") {
+ if (typeof val !== "string") {
+ throw new InvalidArgumentError("invalid host header");
}
- serialization += value;
+ request.host = val;
+ } else if (request.contentLength === null && headerName === "content-length") {
+ request.contentLength = parseInt(val, 10);
+ if (!Number.isFinite(request.contentLength)) {
+ throw new InvalidArgumentError("invalid content-length header");
+ }
+ } else if (request.contentType === null && headerName === "content-type") {
+ request.contentType = val;
+ request.headers.push(key, val);
+ } else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") {
+ throw new InvalidArgumentError(`invalid ${headerName} header`);
+ } else if (headerName === "connection") {
+ const value = typeof val === "string" ? val.toLowerCase() : null;
+ if (value !== "close" && value !== "keep-alive") {
+ throw new InvalidArgumentError("invalid connection header");
+ }
+ if (value === "close") {
+ request.reset = true;
+ }
+ } else if (headerName === "expect") {
+ throw new NotSupportedError("expect header not supported");
+ } else {
+ request.headers.push(key, val);
}
- return serialization;
- }
- function isHTTPWhiteSpace(char) {
- return char === 13 || char === 10 || char === 9 || char === 32;
- }
- function removeHTTPWhitespace(str, leading = true, trailing = true) {
- return removeChars(str, leading, trailing, isHTTPWhiteSpace);
- }
- function isASCIIWhitespace(char) {
- return char === 13 || char === 10 || char === 9 || char === 12 || char === 32;
- }
- function removeASCIIWhitespace(str, leading = true, trailing = true) {
- return removeChars(str, leading, trailing, isASCIIWhitespace);
}
- function removeChars(str, leading, trailing, predicate) {
- let lead = 0;
- let trail = str.length - 1;
- if (leading) {
- while (lead < str.length && predicate(str.charCodeAt(lead)))
- lead++;
- }
- if (trailing) {
- while (trail > 0 && predicate(str.charCodeAt(trail)))
- trail--;
- }
- return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1);
- }
- function isomorphicDecode(input) {
- const length = input.length;
- if ((2 << 15) - 1 > length) {
- return String.fromCharCode.apply(null, input);
- }
- let result = "";
- let i = 0;
- let addition = (2 << 15) - 1;
- while (i < length) {
- if (i + addition > length) {
- addition = length - i;
- }
- result += String.fromCharCode.apply(null, input.subarray(i, i += addition));
- }
- return result;
- }
- function minimizeSupportedMimeType(mimeType) {
- switch (mimeType.essence) {
- case "application/ecmascript":
- case "application/javascript":
- case "application/x-ecmascript":
- case "application/x-javascript":
- case "text/ecmascript":
- case "text/javascript":
- case "text/javascript1.0":
- case "text/javascript1.1":
- case "text/javascript1.2":
- case "text/javascript1.3":
- case "text/javascript1.4":
- case "text/javascript1.5":
- case "text/jscript":
- case "text/livescript":
- case "text/x-ecmascript":
- case "text/x-javascript":
- return "text/javascript";
- case "application/json":
- case "text/json":
- return "application/json";
- case "image/svg+xml":
- return "image/svg+xml";
- case "text/xml":
- case "application/xml":
- return "application/xml";
- }
- if (mimeType.subtype.endsWith("+json")) {
- return "application/json";
- }
- if (mimeType.subtype.endsWith("+xml")) {
- return "application/xml";
- }
- return "";
- }
- module2.exports = {
- dataURLProcessor,
- URLSerializer,
- collectASequenceOfCodePoints,
- collectASequenceOfCodePointsFast,
- stringPercentDecode,
- parseMIMEType,
- collectAnHTTPQuotedString,
- serializeAMimeType,
- removeChars,
- minimizeSupportedMimeType
- };
+ module2.exports = Request;
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/util.js
-var require_util2 = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/util.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/connect.js
+var require_connect = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/connect.js"(exports, module2) {
"use strict";
- var { Transform } = require("node:stream");
- var zlib = require("node:zlib");
- var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants3();
- var { getGlobalOrigin } = require_global();
- var { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = require_dataURL();
- var { performance } = require("node:perf_hooks");
- var { isBlobLike, toUSVString, ReadableStreamFrom, isValidHTTPToken } = require_util();
+ var net = require("node:net");
var assert3 = require("node:assert");
- var { isUint8Array } = require("util/types");
- var crypto;
- try {
- crypto = require("node:crypto");
- } catch {
- }
- function responseURL(response) {
- const urlList = response.urlList;
- const length = urlList.length;
- return length === 0 ? null : urlList[length - 1].toString();
- }
- function responseLocationURL(response, requestFragment) {
- if (!redirectStatusSet.has(response.status)) {
- return null;
- }
- let location = response.headersList.get("location", true);
- if (location !== null && isValidHeaderValue(location)) {
- location = new URL(location, responseURL(response));
- }
- if (location && !location.hash) {
- location.hash = requestFragment;
- }
- return location;
- }
- function requestCurrentURL(request) {
- return request.urlList[request.urlList.length - 1];
- }
- function requestBadPort(request) {
- const url = requestCurrentURL(request);
- if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {
- return "blocked";
- }
- return "allowed";
- }
- function isErrorLike(object) {
- return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException");
- }
- function isValidReasonPhrase(statusText) {
- for (let i = 0; i < statusText.length; ++i) {
- const c = statusText.charCodeAt(i);
- if (!(c === 9 || // HTAB
- c >= 32 && c <= 126 || // SP / VCHAR
- c >= 128 && c <= 255)) {
- return false;
+ var util = require_util();
+ var { InvalidArgumentError, ConnectTimeoutError } = require_errors();
+ var tls;
+ var SessionCache;
+ if (global.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) {
+ SessionCache = class WeakSessionCache {
+ constructor(maxCachedSessions) {
+ this._maxCachedSessions = maxCachedSessions;
+ this._sessionCache = /* @__PURE__ */ new Map();
+ this._sessionRegistry = new global.FinalizationRegistry((key) => {
+ if (this._sessionCache.size < this._maxCachedSessions) {
+ return;
+ }
+ const ref = this._sessionCache.get(key);
+ if (ref !== void 0 && ref.deref() === void 0) {
+ this._sessionCache.delete(key);
+ }
+ });
}
- }
- return true;
- }
- function isValidHeaderName(potentialValue) {
- return isValidHTTPToken(potentialValue);
- }
- function isValidHeaderValue(potentialValue) {
- if (potentialValue.startsWith(" ") || potentialValue.startsWith(" ") || potentialValue.endsWith(" ") || potentialValue.endsWith(" ")) {
- return false;
- }
- if (potentialValue.includes("\0") || potentialValue.includes("\r") || potentialValue.includes("\n")) {
- return false;
- }
- return true;
- }
- function setRequestReferrerPolicyOnRedirect(request, actualResponse) {
- const { headersList } = actualResponse;
- const policyHeader = (headersList.get("referrer-policy", true) ?? "").split(",");
- let policy = "";
- if (policyHeader.length > 0) {
- for (let i = policyHeader.length; i !== 0; i--) {
- const token = policyHeader[i - 1].trim();
- if (referrerPolicyTokens.has(token)) {
- policy = token;
- break;
+ 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);
}
- }
- if (policy !== "") {
- request.referrerPolicy = policy;
- }
- }
- function crossOriginResourcePolicyCheck() {
- return "allowed";
- }
- function corsCheck() {
- return "success";
- }
- function TAOCheck() {
- return "success";
- }
- function appendFetchMetadata(httpRequest) {
- let header = null;
- header = httpRequest.mode;
- httpRequest.headersList.set("sec-fetch-mode", header, true);
- }
- function appendRequestOriginHeader(request) {
- let serializedOrigin = request.origin;
- if (request.responseTainting === "cors" || request.mode === "websocket") {
- if (serializedOrigin) {
- request.headersList.append("origin", serializedOrigin, true);
+ };
+ } else {
+ SessionCache = class SimpleSessionCache {
+ constructor(maxCachedSessions) {
+ this._maxCachedSessions = maxCachedSessions;
+ this._sessionCache = /* @__PURE__ */ new Map();
}
- } else if (request.method !== "GET" && request.method !== "HEAD") {
- switch (request.referrerPolicy) {
- case "no-referrer":
- serializedOrigin = null;
- break;
- case "no-referrer-when-downgrade":
- case "strict-origin":
- case "strict-origin-when-cross-origin":
- if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) {
- serializedOrigin = null;
- }
- break;
- case "same-origin":
- if (!sameOrigin(request, requestCurrentURL(request))) {
- serializedOrigin = null;
- }
- break;
- default:
+ get(sessionKey) {
+ return this._sessionCache.get(sessionKey);
}
- if (serializedOrigin) {
- request.headersList.append("origin", serializedOrigin, true);
+ set(sessionKey, session) {
+ if (this._maxCachedSessions === 0) {
+ return;
+ }
+ if (this._sessionCache.size >= this._maxCachedSessions) {
+ const { value: oldestKey } = this._sessionCache.keys().next();
+ this._sessionCache.delete(oldestKey);
+ }
+ this._sessionCache.set(sessionKey, session);
}
- }
- }
- function coarsenTime(timestamp, crossOriginIsolatedCapability) {
- return timestamp;
+ };
}
- function clampAndCoarsenConnectionTimingInfo(connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) {
- if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) {
- return {
- domainLookupStartTime: defaultStartTime,
- domainLookupEndTime: defaultStartTime,
- connectionStartTime: defaultStartTime,
- connectionEndTime: defaultStartTime,
- secureConnectionStartTime: defaultStartTime,
- ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol
- };
+ 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");
}
- return {
- domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability),
- domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability),
- connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability),
- connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability),
- secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability),
- ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol
- };
- }
- function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) {
- return coarsenTime(performance.now(), crossOriginIsolatedCapability);
- }
- 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
+ const options = { path: socketPath, ...opts };
+ const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions);
+ timeout = timeout == null ? 1e4 : 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 = require("node:tls");
+ }
+ servername = servername || options.servername || util.getServerName(host) || null;
+ const sessionKey = servername || hostname;
+ const session = sessionCache.get(sessionKey) || null;
+ assert3(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(session2) {
+ sessionCache.set(sessionKey, session2);
+ });
+ } else {
+ assert3(!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
+ });
+ }
+ if (options.keepAlive == null || options.keepAlive) {
+ const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : 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;
};
}
- function makePolicyContainer() {
- return {
- referrerPolicy: "strict-origin-when-cross-origin"
+ function setupTimeout(onConnectTimeout2, timeout) {
+ if (!timeout) {
+ return () => {
+ };
+ }
+ let s1 = null;
+ let s2 = null;
+ const timeoutId = setTimeout(() => {
+ s1 = setImmediate(() => {
+ if (process.platform === "win32") {
+ s2 = setImmediate(() => onConnectTimeout2());
+ } else {
+ onConnectTimeout2();
+ }
+ });
+ }, timeout);
+ return () => {
+ clearTimeout(timeoutId);
+ clearImmediate(s1);
+ clearImmediate(s2);
};
}
- function clonePolicyContainer(policyContainer) {
- return {
- referrerPolicy: policyContainer.referrerPolicy
- };
+ function onConnectTimeout(socket) {
+ let message = "Connect Timeout Error";
+ if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) {
+ message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(", ")})`;
+ }
+ util.destroy(socket, new ConnectTimeoutError(message));
}
- function determineRequestsReferrer(request) {
- const policy = request.referrerPolicy;
- assert3(policy);
- let referrerSource = null;
- if (request.referrer === "client") {
- const globalOrigin = getGlobalOrigin();
- if (!globalOrigin || globalOrigin.origin === "null") {
- return "no-referrer";
+ module2.exports = buildConnector;
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/util/timers.js
+var require_timers = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/util/timers.js"(exports, module2) {
+ "use strict";
+ var fastNow = Date.now();
+ var fastNowTimeout;
+ var 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);
}
- referrerSource = new URL(globalOrigin);
- } else if (request.referrer instanceof URL) {
- referrerSource = request.referrer;
- }
- let referrerURL = stripURLForReferrer(referrerSource);
- const referrerOrigin = stripURLForReferrer(referrerSource, true);
- if (referrerURL.toString().length > 4096) {
- referrerURL = referrerOrigin;
- }
- const areSameOrigin = sameOrigin(request, referrerURL);
- const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url);
- 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);
- if (sameOrigin(referrerURL, currentURL)) {
- return referrerURL;
- }
- if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {
- return "no-referrer";
+ if (timer.state === -1) {
+ timer.state = -2;
+ if (idx !== len - 1) {
+ fastTimers[idx] = fastTimers.pop();
+ } else {
+ fastTimers.pop();
}
- return referrerOrigin;
+ len -= 1;
+ } else {
+ idx += 1;
}
- case "strict-origin":
- case "no-referrer-when-downgrade":
- default:
- return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin;
- }
- }
- function stripURLForReferrer(url, originOnly) {
- assert3(url instanceof URL);
- if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") {
- return "no-referrer";
}
- url.username = "";
- url.password = "";
- url.hash = "";
- if (originOnly) {
- url.pathname = "";
- url.search = "";
+ if (fastTimers.length > 0) {
+ refreshTimeout();
}
- return url;
}
- function isURLPotentiallyTrustworthy(url) {
- if (!(url instanceof URL)) {
- return false;
- }
- if (url.href === "about:blank" || url.href === "about:srcdoc") {
- return true;
- }
- if (url.protocol === "data:")
- return true;
- if (url.protocol === "file:")
- return true;
- return isOriginPotentiallyTrustworthy(url.origin);
- function isOriginPotentiallyTrustworthy(origin) {
- if (origin == null || origin === "null")
- return false;
- const originAsURL = new URL(origin);
- if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") {
- 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;
+ function refreshTimeout() {
+ if (fastNowTimeout?.refresh) {
+ fastNowTimeout.refresh();
+ } else {
+ clearTimeout(fastNowTimeout);
+ fastNowTimeout = setTimeout(onTimeout, 1e3);
+ if (fastNowTimeout.unref) {
+ fastNowTimeout.unref();
}
- return false;
}
}
- function bytesMatch(bytes, metadataList) {
- if (crypto === void 0) {
- return true;
- }
- const parsedMetadata = parseMetadata(metadataList);
- if (parsedMetadata === "no metadata") {
- return true;
+ var Timeout = class {
+ constructor(callback, delay, opaque) {
+ this.callback = callback;
+ this.delay = delay;
+ this.opaque = opaque;
+ this.state = -2;
+ this.refresh();
}
- if (parsedMetadata.length === 0) {
- return true;
+ refresh() {
+ if (this.state === -2) {
+ fastTimers.push(this);
+ if (!fastNowTimeout || fastTimers.length === 1) {
+ refreshTimeout();
+ }
+ }
+ this.state = 0;
}
- const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo));
- const strongest = list[0].algo;
- const metadata = list.filter((item) => item.algo === strongest);
- for (const item of metadata) {
- const algorithm = item.algo;
- let expectedValue = item.hash;
- if (expectedValue.endsWith("==")) {
- expectedValue = expectedValue.slice(0, -2);
- }
- let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64");
- if (actualValue.endsWith("==")) {
- actualValue = actualValue.slice(0, -2);
- }
- if (actualValue === expectedValue) {
- return true;
- }
- let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest("base64url");
- if (actualBase64URL.endsWith("==")) {
- actualBase64URL = actualBase64URL.slice(0, -2);
- }
- if (actualBase64URL === expectedValue) {
- return true;
- }
- }
- return false;
- }
- var parseHashWithOptions = /(?sha256|sha384|sha512)-(?[A-Za-z0-9+/]+={0,2}(?=\s|$))( +[!-~]*)?/i;
- function parseMetadata(metadata) {
- const result = [];
- let empty = true;
- const supportedHashes = crypto.getHashes();
- for (const token of metadata.split(" ")) {
- empty = false;
- const parsedToken = parseHashWithOptions.exec(token);
- if (parsedToken === null || parsedToken.groups === void 0) {
- continue;
- }
- const algorithm = parsedToken.groups.algo;
- if (supportedHashes.includes(algorithm.toLowerCase())) {
- result.push(parsedToken.groups);
- }
- }
- if (empty === true) {
- return "no metadata";
- }
- return result;
- }
- function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) {
- }
- function sameOrigin(A, B) {
- if (A.origin === B.origin && A.origin === "null") {
- return true;
- }
- if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) {
- return true;
+ clear() {
+ this.state = -1;
}
- 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";
- }
- var normalizeMethodRecordBase = {
- delete: "DELETE",
- DELETE: "DELETE",
- get: "GET",
- GET: "GET",
- head: "HEAD",
- HEAD: "HEAD",
- options: "OPTIONS",
- OPTIONS: "OPTIONS",
- post: "POST",
- POST: "POST",
- put: "PUT",
- PUT: "PUT"
- };
- var normalizeMethodRecord = {
- ...normalizeMethodRecordBase,
- patch: "patch",
- PATCH: "PATCH"
};
- Object.setPrototypeOf(normalizeMethodRecordBase, null);
- Object.setPrototypeOf(normalizeMethodRecord, null);
- function normalizeMethod(method) {
- return normalizeMethodRecordBase[method.toLowerCase()] ?? method;
- }
- function serializeJavascriptValueToJSONString(value) {
- const result = JSON.stringify(value);
- if (result === void 0) {
- throw new TypeError("Value is not JSON serializable");
- }
- assert3(typeof result === "string");
- return result;
- }
- var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
- function makeIterator(iterator, name, kind, keyIndex = 0, valueIndex = 1) {
- const object = {
- index: 0,
- kind,
- target: iterator
- };
- const iteratorObject = Object.create(esIteratorPrototype);
- Object.defineProperty(iteratorObject, "next", {
- value: function next() {
- if (Object.getPrototypeOf(this) !== iteratorObject) {
- throw new TypeError(
- `'next' called on an object that does not implement interface ${name} Iterator.`
- );
- }
- const { index, kind: kind2, target } = object;
- const values = target();
- const len = values.length;
- if (index >= len) {
- return { value: void 0, done: true };
- }
- const { [keyIndex]: key, [valueIndex]: value } = values[index];
- object.index = index + 1;
- let result;
- switch (kind2) {
- case "key":
- result = key;
- break;
- case "value":
- result = value;
- break;
- case "key+value":
- result = [key, value];
- break;
- }
- return {
- value: result,
- done: false
- };
- },
- writable: true,
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(iteratorObject, Symbol.toStringTag, {
- value: `${name} Iterator`,
- writable: false,
- enumerable: false,
- configurable: true
- });
- return Object.create(iteratorObject);
- }
- async function fullyReadBody(body, processBody, processBodyError) {
- const successSteps = processBody;
- const errorSteps = processBodyError;
- let reader;
- try {
- reader = body.stream.getReader();
- } catch (e) {
- errorSteps(e);
- return;
- }
- try {
- const result = await readAllBytes(reader);
- successSteps(result);
- } catch (e) {
- errorSteps(e);
- }
- }
- function isReadableStreamLike(stream) {
- return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function";
- }
- function readableStreamClose(controller) {
- try {
- controller.close();
- controller.byobRequest?.respond(0);
- } catch (err) {
- if (!err.message.includes("Controller is already closed") && !err.message.includes("ReadableStream is already closed")) {
- throw err;
+ module2.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);
}
}
- }
- function isomorphicEncode(input) {
- for (let i = 0; i < input.length; i++) {
- assert3(input.charCodeAt(i) <= 255);
- }
- return input;
- }
- async function readAllBytes(reader) {
- const bytes = [];
- let byteLength = 0;
- while (true) {
- const { done, value: chunk } = await reader.read();
- if (done) {
- return Buffer.concat(bytes, byteLength);
- }
- if (!isUint8Array(chunk)) {
- throw new TypeError("Received non-Uint8Array chunk");
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/utils.js
+var require_utils = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/utils.js"(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;
}
- bytes.push(chunk);
- byteLength += chunk.length;
- }
- }
- function urlIsLocal(url) {
- assert3("protocol" in url);
- const protocol = url.protocol;
- return protocol === "about:" || protocol === "blob:" || protocol === "data:";
- }
- function urlHasHttpsScheme(url) {
- if (typeof url === "string") {
- return url.startsWith("https:");
- }
- return url.protocol === "https:";
- }
- function urlIsHttpHttpsScheme(url) {
- assert3("protocol" in url);
- const protocol = url.protocol;
- return protocol === "http:" || protocol === "https:";
+ });
+ return res;
}
- function simpleRangeHeaderValue(value, allowWhitespace) {
- const data = value;
- if (!data.startsWith("bytes")) {
- return "failure";
- }
- const position = { position: 5 };
- if (allowWhitespace) {
- collectASequenceOfCodePoints(
- (char) => char === " " || char === " ",
- data,
- position
- );
- }
- if (data.charCodeAt(position.position) !== 61) {
- return "failure";
- }
- position.position++;
- if (allowWhitespace) {
- collectASequenceOfCodePoints(
- (char) => char === " " || char === " ",
- data,
- position
- );
- }
- const rangeStart = collectASequenceOfCodePoints(
- (char) => {
- const code = char.charCodeAt(0);
- return code >= 48 && code <= 57;
- },
- data,
- position
- );
- const rangeStartValue = rangeStart.length ? Number(rangeStart) : null;
- if (allowWhitespace) {
- collectASequenceOfCodePoints(
- (char) => char === " " || char === " ",
- data,
- position
- );
- }
- if (data.charCodeAt(position.position) !== 45) {
- return "failure";
- }
- position.position++;
- if (allowWhitespace) {
- collectASequenceOfCodePoints(
- (char) => char === " " || char === " ",
- data,
- position
- );
- }
- const rangeEnd = collectASequenceOfCodePoints(
- (char) => {
- const code = char.charCodeAt(0);
- return code >= 48 && code <= 57;
- },
- data,
- position
- );
- const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null;
- if (position.position < data.length) {
- return "failure";
- }
- if (rangeEndValue === null && rangeStartValue === null) {
- return "failure";
- }
- if (rangeStartValue > rangeEndValue) {
- return "failure";
- }
- return { rangeStartValue, rangeEndValue };
- }
- function buildContentRange(rangeStart, rangeEnd, fullLength) {
- let contentRange = "bytes ";
- contentRange += isomorphicEncode(`${rangeStart}`);
- contentRange += "-";
- contentRange += isomorphicEncode(`${rangeEnd}`);
- contentRange += "/";
- contentRange += isomorphicEncode(`${fullLength}`);
- return contentRange;
- }
- var InflateStream = class extends Transform {
- _transform(chunk, encoding, callback) {
- if (!this._inflateStream) {
- if (chunk.length === 0) {
- callback();
- return;
- }
- this._inflateStream = (chunk[0] & 15) === 8 ? zlib.createInflate() : zlib.createInflateRaw();
- this._inflateStream.on("data", this.push.bind(this));
- this._inflateStream.on("end", () => this.push(null));
- this._inflateStream.on("error", (err) => this.destroy(err));
- }
- this._inflateStream.write(chunk, encoding, callback);
- }
- _final(callback) {
- if (this._inflateStream) {
- this._inflateStream.end();
- this._inflateStream = null;
- }
- callback();
- }
- };
- function createInflate() {
- return new InflateStream();
- }
- function extractMimeType(headers) {
- let charset = null;
- let essence = null;
- let mimeType = null;
- const values = getDecodeSplit("content-type", headers);
- if (values === null) {
- return "failure";
- }
- for (const value of values) {
- const temporaryMimeType = parseMIMEType(value);
- if (temporaryMimeType === "failure" || temporaryMimeType.essence === "*/*") {
- continue;
- }
- mimeType = temporaryMimeType;
- if (mimeType.essence !== essence) {
- charset = null;
- if (mimeType.parameters.has("charset")) {
- charset = mimeType.parameters.get("charset");
- }
- essence = mimeType.essence;
- } else if (!mimeType.parameters.has("charset") && charset !== null) {
- mimeType.parameters.set("charset", charset);
- }
- }
- if (mimeType == null) {
- return "failure";
- }
- return mimeType;
- }
- function gettingDecodingSplitting(value) {
- const input = value;
- const position = { position: 0 };
- const values = [];
- let temporaryValue = "";
- while (position.position < input.length) {
- temporaryValue += collectASequenceOfCodePoints(
- (char) => char !== '"' && char !== ",",
- input,
- position
- );
- if (position.position < input.length) {
- if (input.charCodeAt(position.position) === 34) {
- temporaryValue += collectAnHTTPQuotedString(
- input,
- position
- );
- if (position.position < input.length) {
- continue;
- }
- } else {
- assert3(input.charCodeAt(position.position) === 44);
- position.position++;
- }
- }
- temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 9 || char === 32);
- values.push(temporaryValue);
- temporaryValue = "";
- }
- return values;
- }
- function getDecodeSplit(name, list) {
- const value = list.get(name, true);
- if (value === null) {
- return null;
- }
- return gettingDecodingSplitting(value);
- }
- module2.exports = {
- isAborted,
- isCancelled,
- createDeferredPromise,
- ReadableStreamFrom,
- toUSVString,
- tryUpgradeRequestToAPotentiallyTrustworthyURL,
- clampAndCoarsenConnectionTimingInfo,
- 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,
- isErrorLike,
- fullyReadBody,
- bytesMatch,
- isReadableStreamLike,
- readableStreamClose,
- isomorphicEncode,
- urlIsLocal,
- urlHasHttpsScheme,
- urlIsHttpHttpsScheme,
- readAllBytes,
- normalizeMethodRecord,
- simpleRangeHeaderValue,
- buildContentRange,
- parseMetadata,
- createInflate,
- extractMimeType
- };
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/symbols.js
-var require_symbols2 = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/symbols.js"(exports, module2) {
- "use strict";
- module2.exports = {
- kUrl: Symbol("url"),
- kHeaders: Symbol("headers"),
- kSignal: Symbol("signal"),
- kState: Symbol("state"),
- kGuard: Symbol("guard"),
- kRealm: Symbol("realm")
- };
+ exports.enumToMap = enumToMap;
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/webidl.js
-var require_webidl = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/webidl.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/constants.js
+var require_constants3 = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/constants.js"(exports) {
"use strict";
- var { types } = require("node:util");
- var { toUSVString } = require_util2();
- var 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 plural2 = context.types.length === 1 ? "" : " one of";
- const message = `${context.argument} could not be converted to${plural2}: ${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}.`
- });
- };
- webidl.brandCheck = function(V, I, opts = void 0) {
- if (opts?.strict !== false) {
- if (!(V instanceof I)) {
- throw new TypeError("Illegal invocation");
- }
- } else {
- if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) {
- throw new TypeError("Illegal invocation");
- }
- }
- };
- 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"
- });
- };
- 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";
- }
- }
- };
+ 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;
+ var utils_1 = require_utils();
+ var ERROR;
+ (function(ERROR2) {
+ ERROR2[ERROR2["OK"] = 0] = "OK";
+ ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL";
+ ERROR2[ERROR2["STRICT"] = 2] = "STRICT";
+ ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED";
+ ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH";
+ ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION";
+ ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD";
+ ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL";
+ ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT";
+ ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION";
+ ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN";
+ ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH";
+ ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE";
+ ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS";
+ ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE";
+ ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING";
+ ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN";
+ ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE";
+ ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE";
+ ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER";
+ ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE";
+ ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED";
+ ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE";
+ ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE";
+ ERROR2[ERROR2["USER"] = 24] = "USER";
+ })(ERROR = exports.ERROR || (exports.ERROR = {}));
+ var TYPE;
+ (function(TYPE2) {
+ TYPE2[TYPE2["BOTH"] = 0] = "BOTH";
+ TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST";
+ TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE";
+ })(TYPE = exports.TYPE || (exports.TYPE = {}));
+ var FLAGS;
+ (function(FLAGS2) {
+ FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE";
+ FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE";
+ FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE";
+ FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED";
+ FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE";
+ FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH";
+ FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY";
+ FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING";
+ FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING";
+ })(FLAGS = exports.FLAGS || (exports.FLAGS = {}));
+ var LENIENT_FLAGS;
+ (function(LENIENT_FLAGS2) {
+ LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS";
+ LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH";
+ LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE";
+ })(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {}));
+ var METHODS;
+ (function(METHODS2) {
+ METHODS2[METHODS2["DELETE"] = 0] = "DELETE";
+ METHODS2[METHODS2["GET"] = 1] = "GET";
+ METHODS2[METHODS2["HEAD"] = 2] = "HEAD";
+ METHODS2[METHODS2["POST"] = 3] = "POST";
+ METHODS2[METHODS2["PUT"] = 4] = "PUT";
+ METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT";
+ METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS";
+ METHODS2[METHODS2["TRACE"] = 7] = "TRACE";
+ METHODS2[METHODS2["COPY"] = 8] = "COPY";
+ METHODS2[METHODS2["LOCK"] = 9] = "LOCK";
+ METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL";
+ METHODS2[METHODS2["MOVE"] = 11] = "MOVE";
+ METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND";
+ METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH";
+ METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH";
+ METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK";
+ METHODS2[METHODS2["BIND"] = 16] = "BIND";
+ METHODS2[METHODS2["REBIND"] = 17] = "REBIND";
+ METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND";
+ METHODS2[METHODS2["ACL"] = 19] = "ACL";
+ METHODS2[METHODS2["REPORT"] = 20] = "REPORT";
+ METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY";
+ METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT";
+ METHODS2[METHODS2["MERGE"] = 23] = "MERGE";
+ METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH";
+ METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY";
+ METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE";
+ METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE";
+ METHODS2[METHODS2["PATCH"] = 28] = "PATCH";
+ METHODS2[METHODS2["PURGE"] = 29] = "PURGE";
+ METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR";
+ METHODS2[METHODS2["LINK"] = 31] = "LINK";
+ METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK";
+ METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE";
+ METHODS2[METHODS2["PRI"] = 34] = "PRI";
+ METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE";
+ METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE";
+ METHODS2[METHODS2["SETUP"] = 37] = "SETUP";
+ METHODS2[METHODS2["PLAY"] = 38] = "PLAY";
+ METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE";
+ METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN";
+ METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER";
+ METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER";
+ METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT";
+ METHODS2[METHODS2["RECORD"] = 44] = "RECORD";
+ METHODS2[METHODS2["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(FINISH2) {
+ FINISH2[FINISH2["SAFE"] = 0] = "SAFE";
+ FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB";
+ FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE";
+ })(FINISH = exports.FINISH || (exports.FINISH = {}));
+ exports.ALPHA = [];
+ for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) {
+ exports.ALPHA.push(String.fromCharCode(i));
+ exports.ALPHA.push(String.fromCharCode(i + 32));
+ }
+ 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: 10,
+ B: 11,
+ C: 12,
+ D: 13,
+ E: 14,
+ F: 15,
+ a: 10,
+ b: 11,
+ c: 12,
+ d: 13,
+ e: 14,
+ f: 15
+ };
+ 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(["%", ";", ":", "&", "=", "+", "$", ","]);
+ exports.STRICT_URL_CHAR = [
+ "!",
+ '"',
+ "$",
+ "%",
+ "&",
+ "'",
+ "(",
+ ")",
+ "*",
+ "+",
+ ",",
+ "-",
+ ".",
+ "/",
+ ":",
+ ";",
+ "<",
+ "=",
+ ">",
+ "@",
+ "[",
+ "\\",
+ "]",
+ "^",
+ "_",
+ "`",
+ "{",
+ "|",
+ "}",
+ "~"
+ ].concat(exports.ALPHANUM);
+ exports.URL_CHAR = exports.STRICT_URL_CHAR.concat([" ", "\f"]);
+ for (let i = 128; i <= 255; i++) {
+ exports.URL_CHAR.push(i);
+ }
+ exports.HEX = exports.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]);
+ exports.STRICT_TOKEN = [
+ "!",
+ "#",
+ "$",
+ "%",
+ "&",
+ "'",
+ "*",
+ "+",
+ "-",
+ ".",
+ "^",
+ "_",
+ "`",
+ "|",
+ "~"
+ ].concat(exports.ALPHANUM);
+ exports.TOKEN = exports.STRICT_TOKEN.concat([" "]);
+ exports.HEADER_CHARS = [" "];
+ for (let i = 32; i <= 255; i++) {
+ if (i !== 127) {
+ exports.HEADER_CHARS.push(i);
+ }
+ }
+ 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_STATE2) {
+ HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL";
+ HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION";
+ HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH";
+ HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING";
+ HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE";
+ HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE";
+ HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE";
+ HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE";
+ HEADER_STATE2[HEADER_STATE2["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
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js
+var require_llhttp_wasm = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports, module2) {
+ var { Buffer: Buffer2 } = require("node:buffer");
+ module2.exports = Buffer2.from("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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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAUNgIUIAAgATYCDEEAIRAMogELIABBADYCHCAAIBQ2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKEBCyAAQQA2AhwgACABNgIUIABBw4+AgAA2AhAgAEEHNgIMQQAhEAygAQtBACEQIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgwMnwELIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgxBACEQDJ4BCyAAQQA2AhwgACAUNgIUIABB/pGAgAA2AhAgAEEHNgIMQQAhEAydAQsgAEEANgIcIAAgATYCFCAAQY6bgIAANgIQIABBBjYCDEEAIRAMnAELIBBBFUYNVyAAQQA2AhwgACABNgIUIABBzI6AgAA2AhAgAEEgNgIMQQAhEAybAQsgAEEANgIAIBBBAWohAUEkIRALIAAgEDoAKSAAKAIEIRAgAEEANgIEIAAgECABEKuAgIAAIhANVCABIQEMPgsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQfGbgIAANgIQIABBBjYCDAyXAQsgAUEVRg1QIABBADYCHCAAIAU2AhQgAEHwjICAADYCECAAQRs2AgxBACEQDJYBCyAAKAIEIQUgAEEANgIEIAAgBSAQEKmAgIAAIgUNASAQQQFqIQULQa0BIRAMewsgAEHBATYCHCAAIAU2AgwgACAQQQFqNgIUQQAhEAyTAQsgACgCBCEGIABBADYCBCAAIAYgEBCpgICAACIGDQEgEEEBaiEGC0GuASEQDHgLIABBwgE2AhwgACAGNgIMIAAgEEEBajYCFEEAIRAMkAELIABBADYCHCAAIAc2AhQgAEGXi4CAADYCECAAQQ02AgxBACEQDI8BCyAAQQA2AhwgACAINgIUIABB45CAgAA2AhAgAEEJNgIMQQAhEAyOAQsgAEEANgIcIAAgCDYCFCAAQZSNgIAANgIQIABBITYCDEEAIRAMjQELQQEhFkEAIRdBACEUQQEhEAsgACAQOgArIAlBAWohCAJAAkAgAC0ALUEQcQ0AAkACQAJAIAAtACoOAwEAAgQLIBZFDQMMAgsgFA0BDAILIBdFDQELIAAoAgQhECAAQQA2AgQgACAQIAgQrYCAgAAiEEUNPSAAQckBNgIcIAAgCDYCFCAAIBA2AgxBACEQDIwBCyAAKAIEIQQgAEEANgIEIAAgBCAIEK2AgIAAIgRFDXYgAEHKATYCHCAAIAg2AhQgACAENgIMQQAhEAyLAQsgACgCBCEEIABBADYCBCAAIAQgCRCtgICAACIERQ10IABBywE2AhwgACAJNgIUIAAgBDYCDEEAIRAMigELIAAoAgQhBCAAQQA2AgQgACAEIAoQrYCAgAAiBEUNciAAQc0BNgIcIAAgCjYCFCAAIAQ2AgxBACEQDIkBCwJAIAstAABBUGoiEEH/AXFBCk8NACAAIBA6ACogC0EBaiEKQbYBIRAMcAsgACgCBCEEIABBADYCBCAAIAQgCxCtgICAACIERQ1wIABBzwE2AhwgACALNgIUIAAgBDYCDEEAIRAMiAELIABBADYCHCAAIAQ2AhQgAEGQs4CAADYCECAAQQg2AgwgAEEANgIAQQAhEAyHAQsgAUEVRg0/IABBADYCHCAAIAw2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDIYBCyAAQYEEOwEoIAAoAgQhECAAQgA3AwAgACAQIAxBAWoiDBCrgICAACIQRQ04IABB0wE2AhwgACAMNgIUIAAgEDYCDEEAIRAMhQELIABBADYCAAtBACEQIABBADYCHCAAIAQ2AhQgAEHYm4CAADYCECAAQQg2AgwMgwELIAAoAgQhECAAQgA3AwAgACAQIAtBAWoiCxCrgICAACIQDQFBxgEhEAxpCyAAQQI6ACgMVQsgAEHVATYCHCAAIAs2AhQgACAQNgIMQQAhEAyAAQsgEEEVRg03IABBADYCHCAAIAQ2AhQgAEGkjICAADYCECAAQRA2AgxBACEQDH8LIAAtADRBAUcNNCAAIAQgAhC8gICAACIQRQ00IBBBFUcNNSAAQdwBNgIcIAAgBDYCFCAAQdWWgIAANgIQIABBFTYCDEEAIRAMfgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQMfQtBACEQDGMLQQIhEAxiC0ENIRAMYQtBDyEQDGALQSUhEAxfC0ETIRAMXgtBFSEQDF0LQRYhEAxcC0EXIRAMWwtBGCEQDFoLQRkhEAxZC0EaIRAMWAtBGyEQDFcLQRwhEAxWC0EdIRAMVQtBHyEQDFQLQSEhEAxTC0EjIRAMUgtBxgAhEAxRC0EuIRAMUAtBLyEQDE8LQTshEAxOC0E9IRAMTQtByAAhEAxMC0HJACEQDEsLQcsAIRAMSgtBzAAhEAxJC0HOACEQDEgLQdEAIRAMRwtB1QAhEAxGC0HYACEQDEULQdkAIRAMRAtB2wAhEAxDC0HkACEQDEILQeUAIRAMQQtB8QAhEAxAC0H0ACEQDD8LQY0BIRAMPgtBlwEhEAw9C0GpASEQDDwLQawBIRAMOwtBwAEhEAw6C0G5ASEQDDkLQa8BIRAMOAtBsQEhEAw3C0GyASEQDDYLQbQBIRAMNQtBtQEhEAw0C0G6ASEQDDMLQb0BIRAMMgtBvwEhEAwxC0HBASEQDDALIABBADYCHCAAIAQ2AhQgAEHpi4CAADYCECAAQR82AgxBACEQDEgLIABB2wE2AhwgACAENgIUIABB+paAgAA2AhAgAEEVNgIMQQAhEAxHCyAAQfgANgIcIAAgDDYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMRgsgAEHRADYCHCAAIAU2AhQgAEGwl4CAADYCECAAQRU2AgxBACEQDEULIABB+QA2AhwgACABNgIUIAAgEDYCDEEAIRAMRAsgAEH4ADYCHCAAIAE2AhQgAEHKmICAADYCECAAQRU2AgxBACEQDEMLIABB5AA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAxCCyAAQdcANgIcIAAgATYCFCAAQcmXgIAANgIQIABBFTYCDEEAIRAMQQsgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMQAsgAEHCADYCHCAAIAE2AhQgAEHjmICAADYCECAAQRU2AgxBACEQDD8LIABBADYCBCAAIA8gDxCxgICAACIERQ0BIABBOjYCHCAAIAQ2AgwgACAPQQFqNgIUQQAhEAw+CyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBEUNACAAQTs2AhwgACAENgIMIAAgAUEBajYCFEEAIRAMPgsgAUEBaiEBDC0LIA9BAWohAQwtCyAAQQA2AhwgACAPNgIUIABB5JKAgAA2AhAgAEEENgIMQQAhEAw7CyAAQTY2AhwgACAENgIUIAAgAjYCDEEAIRAMOgsgAEEuNgIcIAAgDjYCFCAAIAQ2AgxBACEQDDkLIABB0AA2AhwgACABNgIUIABBkZiAgAA2AhAgAEEVNgIMQQAhEAw4CyANQQFqIQEMLAsgAEEVNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMNgsgAEEbNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNQsgAEEPNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNAsgAEELNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMMwsgAEEaNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMgsgAEELNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMQsgAEEKNgIcIAAgATYCFCAAQeSWgIAANgIQIABBFTYCDEEAIRAMMAsgAEEeNgIcIAAgATYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAMLwsgAEEANgIcIAAgEDYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMLgsgAEEENgIcIAAgATYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMLQsgAEEANgIAIAtBAWohCwtBuAEhEAwSCyAAQQA2AgAgEEEBaiEBQfUAIRAMEQsgASEBAkAgAC0AKUEFRw0AQeMAIRAMEQtB4gAhEAwQC0EAIRAgAEEANgIcIABB5JGAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAwoCyAAQQA2AgAgF0EBaiEBQcAAIRAMDgtBASEBCyAAIAE6ACwgAEEANgIAIBdBAWohAQtBKCEQDAsLIAEhAQtBOCEQDAkLAkAgASIPIAJGDQADQAJAIA8tAABBgL6AgABqLQAAIgFBAUYNACABQQJHDQMgD0EBaiEBDAQLIA9BAWoiDyACRw0AC0E+IRAMIgtBPiEQDCELIABBADoALCAPIQEMAQtBCyEQDAYLQTohEAwFCyABQQFqIQFBLSEQDAQLIAAgAToALCAAQQA2AgAgFkEBaiEBQQwhEAwDCyAAQQA2AgAgF0EBaiEBQQohEAwCCyAAQQA2AgALIABBADoALCANIQFBCSEQDAALC0EAIRAgAEEANgIcIAAgCzYCFCAAQc2QgIAANgIQIABBCTYCDAwXC0EAIRAgAEEANgIcIAAgCjYCFCAAQemKgIAANgIQIABBCTYCDAwWC0EAIRAgAEEANgIcIAAgCTYCFCAAQbeQgIAANgIQIABBCTYCDAwVC0EAIRAgAEEANgIcIAAgCDYCFCAAQZyRgIAANgIQIABBCTYCDAwUC0EAIRAgAEEANgIcIAAgATYCFCAAQc2QgIAANgIQIABBCTYCDAwTC0EAIRAgAEEANgIcIAAgATYCFCAAQemKgIAANgIQIABBCTYCDAwSC0EAIRAgAEEANgIcIAAgATYCFCAAQbeQgIAANgIQIABBCTYCDAwRC0EAIRAgAEEANgIcIAAgATYCFCAAQZyRgIAANgIQIABBCTYCDAwQC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwPC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwOC0EAIRAgAEEANgIcIAAgATYCFCAAQcCSgIAANgIQIABBCzYCDAwNC0EAIRAgAEEANgIcIAAgATYCFCAAQZWJgIAANgIQIABBCzYCDAwMC0EAIRAgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDAwLC0EAIRAgAEEANgIcIAAgATYCFCAAQfuPgIAANgIQIABBCjYCDAwKC0EAIRAgAEEANgIcIAAgATYCFCAAQfGZgIAANgIQIABBAjYCDAwJC0EAIRAgAEEANgIcIAAgATYCFCAAQcSUgIAANgIQIABBAjYCDAwIC0EAIRAgAEEANgIcIAAgATYCFCAAQfKVgIAANgIQIABBAjYCDAwHCyAAQQI2AhwgACABNgIUIABBnJqAgAA2AhAgAEEWNgIMQQAhEAwGC0EBIRAMBQtB1AAhECABIgQgAkYNBCADQQhqIAAgBCACQdjCgIAAQQoQxYCAgAAgAygCDCEEIAMoAggOAwEEAgALEMqAgIAAAAsgAEEANgIcIABBtZqAgAA2AhAgAEEXNgIMIAAgBEEBajYCFEEAIRAMAgsgAEEANgIcIAAgBDYCFCAAQcqagIAANgIQIABBCTYCDEEAIRAMAQsCQCABIgQgAkcNAEEiIRAMAQsgAEGJgICAADYCCCAAIAQ2AgRBISEQCyADQRBqJICAgIAAIBALrwEBAn8gASgCACEGAkACQCACIANGDQAgBCAGaiEEIAYgA2ogAmshByACIAZBf3MgBWoiBmohBQNAAkAgAi0AACAELQAARg0AQQIhBAwDCwJAIAYNAEEAIQQgBSECDAMLIAZBf2ohBiAEQQFqIQQgAkEBaiICIANHDQALIAchBiADIQILIABBATYCACABIAY2AgAgACACNgIEDwsgAUEANgIAIAAgBDYCACAAIAI2AgQLCgAgABDHgICAAAvyNgELfyOAgICAAEEQayIBJICAgIAAAkBBACgCoNCAgAANAEEAEMuAgIAAQYDUhIAAayICQdkASQ0AQQAhAwJAQQAoAuDTgIAAIgQNAEEAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEIakFwcUHYqtWqBXMiBDYC4NOAgABBAEEANgL004CAAEEAQQA2AsTTgIAAC0EAIAI2AszTgIAAQQBBgNSEgAA2AsjTgIAAQQBBgNSEgAA2ApjQgIAAQQAgBDYCrNCAgABBAEF/NgKo0ICAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALQYDUhIAAQXhBgNSEgABrQQ9xQQBBgNSEgABBCGpBD3EbIgNqIgRBBGogAkFIaiIFIANrIgNBAXI2AgBBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAQYDUhIAAIAVqQTg2AgQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFLDQACQEEAKAKI0ICAACIGQRAgAEETakFwcSAAQQtJGyICQQN2IgR2IgNBA3FFDQACQAJAIANBAXEgBHJBAXMiBUEDdCIEQbDQgIAAaiIDIARBuNCAgABqKAIAIgQoAggiAkcNAEEAIAZBfiAFd3E2AojQgIAADAELIAMgAjYCCCACIAM2AgwLIARBCGohAyAEIAVBA3QiBUEDcjYCBCAEIAVqIgQgBCgCBEEBcjYCBAwMCyACQQAoApDQgIAAIgdNDQECQCADRQ0AAkACQCADIAR0QQIgBHQiA0EAIANrcnEiA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqIgRBA3QiA0Gw0ICAAGoiBSADQbjQgIAAaigCACIDKAIIIgBHDQBBACAGQX4gBHdxIgY2AojQgIAADAELIAUgADYCCCAAIAU2AgwLIAMgAkEDcjYCBCADIARBA3QiBGogBCACayIFNgIAIAMgAmoiACAFQQFyNgIEAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQQCQAJAIAZBASAHQQN2dCIIcQ0AQQAgBiAIcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCAENgIMIAIgBDYCCCAEIAI2AgwgBCAINgIICyADQQhqIQNBACAANgKc0ICAAEEAIAU2ApDQgIAADAwLQQAoAozQgIAAIglFDQEgCUEAIAlrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqQQJ0QbjSgIAAaigCACIAKAIEQXhxIAJrIQQgACEFAkADQAJAIAUoAhAiAw0AIAVBFGooAgAiA0UNAgsgAygCBEF4cSACayIFIAQgBSAESSIFGyEEIAMgACAFGyEAIAMhBQwACwsgACgCGCEKAkAgACgCDCIIIABGDQAgACgCCCIDQQAoApjQgIAASRogCCADNgIIIAMgCDYCDAwLCwJAIABBFGoiBSgCACIDDQAgACgCECIDRQ0DIABBEGohBQsDQCAFIQsgAyIIQRRqIgUoAgAiAw0AIAhBEGohBSAIKAIQIgMNAAsgC0EANgIADAoLQX8hAiAAQb9/Sw0AIABBE2oiA0FwcSECQQAoAozQgIAAIgdFDQBBACELAkAgAkGAAkkNAEEfIQsgAkH///8HSw0AIANBCHYiAyADQYD+P2pBEHZBCHEiA3QiBCAEQYDgH2pBEHZBBHEiBHQiBSAFQYCAD2pBEHZBAnEiBXRBD3YgAyAEciAFcmsiA0EBdCACIANBFWp2QQFxckEcaiELC0EAIAJrIQQCQAJAAkACQCALQQJ0QbjSgIAAaigCACIFDQBBACEDQQAhCAwBC0EAIQMgAkEAQRkgC0EBdmsgC0EfRht0IQBBACEIA0ACQCAFKAIEQXhxIAJrIgYgBE8NACAGIQQgBSEIIAYNAEEAIQQgBSEIIAUhAwwDCyADIAVBFGooAgAiBiAGIAUgAEEddkEEcWpBEGooAgAiBUYbIAMgBhshAyAAQQF0IQAgBQ0ACwsCQCADIAhyDQBBACEIQQIgC3QiA0EAIANrciAHcSIDRQ0DIANBACADa3FBf2oiAyADQQx2QRBxIgN2IgVBBXZBCHEiACADciAFIAB2IgNBAnZBBHEiBXIgAyAFdiIDQQF2QQJxIgVyIAMgBXYiA0EBdkEBcSIFciADIAV2akECdEG40oCAAGooAgAhAwsgA0UNAQsDQCADKAIEQXhxIAJrIgYgBEkhAAJAIAMoAhAiBQ0AIANBFGooAgAhBQsgBiAEIAAbIQQgAyAIIAAbIQggBSEDIAUNAAsLIAhFDQAgBEEAKAKQ0ICAACACa08NACAIKAIYIQsCQCAIKAIMIgAgCEYNACAIKAIIIgNBACgCmNCAgABJGiAAIAM2AgggAyAANgIMDAkLAkAgCEEUaiIFKAIAIgMNACAIKAIQIgNFDQMgCEEQaiEFCwNAIAUhBiADIgBBFGoiBSgCACIDDQAgAEEQaiEFIAAoAhAiAw0ACyAGQQA2AgAMCAsCQEEAKAKQ0ICAACIDIAJJDQBBACgCnNCAgAAhBAJAAkAgAyACayIFQRBJDQAgBCACaiIAIAVBAXI2AgRBACAFNgKQ0ICAAEEAIAA2ApzQgIAAIAQgA2ogBTYCACAEIAJBA3I2AgQMAQsgBCADQQNyNgIEIAQgA2oiAyADKAIEQQFyNgIEQQBBADYCnNCAgABBAEEANgKQ0ICAAAsgBEEIaiEDDAoLAkBBACgClNCAgAAiACACTQ0AQQAoAqDQgIAAIgMgAmoiBCAAIAJrIgVBAXI2AgRBACAFNgKU0ICAAEEAIAQ2AqDQgIAAIAMgAkEDcjYCBCADQQhqIQMMCgsCQAJAQQAoAuDTgIAARQ0AQQAoAujTgIAAIQQMAQtBAEJ/NwLs04CAAEEAQoCAhICAgMAANwLk04CAAEEAIAFBDGpBcHFB2KrVqgVzNgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgABBgIAEIQQLQQAhAwJAIAQgAkHHAGoiB2oiBkEAIARrIgtxIgggAksNAEEAQTA2AvjTgIAADAoLAkBBACgCwNOAgAAiA0UNAAJAQQAoArjTgIAAIgQgCGoiBSAETQ0AIAUgA00NAQtBACEDQQBBMDYC+NOAgAAMCgtBAC0AxNOAgABBBHENBAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQAJAIAMoAgAiBSAESw0AIAUgAygCBGogBEsNAwsgAygCCCIDDQALC0EAEMuAgIAAIgBBf0YNBSAIIQYCQEEAKALk04CAACIDQX9qIgQgAHFFDQAgCCAAayAEIABqQQAgA2txaiEGCyAGIAJNDQUgBkH+////B0sNBQJAQQAoAsDTgIAAIgNFDQBBACgCuNOAgAAiBCAGaiIFIARNDQYgBSADSw0GCyAGEMuAgIAAIgMgAEcNAQwHCyAGIABrIAtxIgZB/v///wdLDQQgBhDLgICAACIAIAMoAgAgAygCBGpGDQMgACEDCwJAIANBf0YNACACQcgAaiAGTQ0AAkAgByAGa0EAKALo04CAACIEakEAIARrcSIEQf7///8HTQ0AIAMhAAwHCwJAIAQQy4CAgABBf0YNACAEIAZqIQYgAyEADAcLQQAgBmsQy4CAgAAaDAQLIAMhACADQX9HDQUMAwtBACEIDAcLQQAhAAwFCyAAQX9HDQILQQBBACgCxNOAgABBBHI2AsTTgIAACyAIQf7///8HSw0BIAgQy4CAgAAhAEEAEMuAgIAAIQMgAEF/Rg0BIANBf0YNASAAIANPDQEgAyAAayIGIAJBOGpNDQELQQBBACgCuNOAgAAgBmoiAzYCuNOAgAACQCADQQAoArzTgIAATQ0AQQAgAzYCvNOAgAALAkACQAJAAkBBACgCoNCAgAAiBEUNAEHI04CAACEDA0AgACADKAIAIgUgAygCBCIIakYNAiADKAIIIgMNAAwDCwsCQAJAQQAoApjQgIAAIgNFDQAgACADTw0BC0EAIAA2ApjQgIAAC0EAIQNBACAGNgLM04CAAEEAIAA2AsjTgIAAQQBBfzYCqNCAgABBAEEAKALg04CAADYCrNCAgABBAEEANgLU04CAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgQgBkFIaiIFIANrIgNBAXI2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAIAAgBWpBODYCBAwCCyADLQAMQQhxDQAgBCAFSQ0AIAQgAE8NACAEQXggBGtBD3FBACAEQQhqQQ9xGyIFaiIAQQAoApTQgIAAIAZqIgsgBWsiBUEBcjYCBCADIAggBmo2AgRBAEEAKALw04CAADYCpNCAgABBACAFNgKU0ICAAEEAIAA2AqDQgIAAIAQgC2pBODYCBAwBCwJAIABBACgCmNCAgAAiCE8NAEEAIAA2ApjQgIAAIAAhCAsgACAGaiEFQcjTgIAAIQMCQAJAAkACQAJAAkACQANAIAMoAgAgBUYNASADKAIIIgMNAAwCCwsgAy0ADEEIcUUNAQtByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiIFIARLDQMLIAMoAgghAwwACwsgAyAANgIAIAMgAygCBCAGajYCBCAAQXggAGtBD3FBACAAQQhqQQ9xG2oiCyACQQNyNgIEIAVBeCAFa0EPcUEAIAVBCGpBD3EbaiIGIAsgAmoiAmshAwJAIAYgBEcNAEEAIAI2AqDQgIAAQQBBACgClNCAgAAgA2oiAzYClNCAgAAgAiADQQFyNgIEDAMLAkAgBkEAKAKc0ICAAEcNAEEAIAI2ApzQgIAAQQBBACgCkNCAgAAgA2oiAzYCkNCAgAAgAiADQQFyNgIEIAIgA2ogAzYCAAwDCwJAIAYoAgQiBEEDcUEBRw0AIARBeHEhBwJAAkAgBEH/AUsNACAGKAIIIgUgBEEDdiIIQQN0QbDQgIAAaiIARhoCQCAGKAIMIgQgBUcNAEEAQQAoAojQgIAAQX4gCHdxNgKI0ICAAAwCCyAEIABGGiAEIAU2AgggBSAENgIMDAELIAYoAhghCQJAAkAgBigCDCIAIAZGDQAgBigCCCIEIAhJGiAAIAQ2AgggBCAANgIMDAELAkAgBkEUaiIEKAIAIgUNACAGQRBqIgQoAgAiBQ0AQQAhAAwBCwNAIAQhCCAFIgBBFGoiBCgCACIFDQAgAEEQaiEEIAAoAhAiBQ0ACyAIQQA2AgALIAlFDQACQAJAIAYgBigCHCIFQQJ0QbjSgIAAaiIEKAIARw0AIAQgADYCACAADQFBAEEAKAKM0ICAAEF+IAV3cTYCjNCAgAAMAgsgCUEQQRQgCSgCECAGRhtqIAA2AgAgAEUNAQsgACAJNgIYAkAgBigCECIERQ0AIAAgBDYCECAEIAA2AhgLIAYoAhQiBEUNACAAQRRqIAQ2AgAgBCAANgIYCyAHIANqIQMgBiAHaiIGKAIEIQQLIAYgBEF+cTYCBCACIANqIAM2AgAgAiADQQFyNgIEAkAgA0H/AUsNACADQXhxQbDQgIAAaiEEAkACQEEAKAKI0ICAACIFQQEgA0EDdnQiA3ENAEEAIAUgA3I2AojQgIAAIAQhAwwBCyAEKAIIIQMLIAMgAjYCDCAEIAI2AgggAiAENgIMIAIgAzYCCAwDC0EfIQQCQCADQf///wdLDQAgA0EIdiIEIARBgP4/akEQdkEIcSIEdCIFIAVBgOAfakEQdkEEcSIFdCIAIABBgIAPakEQdkECcSIAdEEPdiAEIAVyIAByayIEQQF0IAMgBEEVanZBAXFyQRxqIQQLIAIgBDYCHCACQgA3AhAgBEECdEG40oCAAGohBQJAQQAoAozQgIAAIgBBASAEdCIIcQ0AIAUgAjYCAEEAIAAgCHI2AozQgIAAIAIgBTYCGCACIAI2AgggAiACNgIMDAMLIANBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhAANAIAAiBSgCBEF4cSADRg0CIARBHXYhACAEQQF0IQQgBSAAQQRxakEQaiIIKAIAIgANAAsgCCACNgIAIAIgBTYCGCACIAI2AgwgAiACNgIIDAILIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgsgBkFIaiIIIANrIgNBAXI2AgQgACAIakE4NgIEIAQgBUE3IAVrQQ9xQQAgBUFJakEPcRtqQUFqIgggCCAEQRBqSRsiCEEjNgIEQQBBACgC8NOAgAA2AqTQgIAAQQAgAzYClNCAgABBACALNgKg0ICAACAIQRBqQQApAtDTgIAANwIAIAhBACkCyNOAgAA3AghBACAIQQhqNgLQ04CAAEEAIAY2AszTgIAAQQAgADYCyNOAgABBAEEANgLU04CAACAIQSRqIQMDQCADQQc2AgAgA0EEaiIDIAVJDQALIAggBEYNAyAIIAgoAgRBfnE2AgQgCCAIIARrIgA2AgAgBCAAQQFyNgIEAkAgAEH/AUsNACAAQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgAEEDdnQiAHENAEEAIAUgAHI2AojQgIAAIAMhBQwBCyADKAIIIQULIAUgBDYCDCADIAQ2AgggBCADNgIMIAQgBTYCCAwEC0EfIQMCQCAAQf///wdLDQAgAEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCIIIAhBgIAPakEQdkECcSIIdEEPdiADIAVyIAhyayIDQQF0IAAgA0EVanZBAXFyQRxqIQMLIAQgAzYCHCAEQgA3AhAgA0ECdEG40oCAAGohBQJAQQAoAozQgIAAIghBASADdCIGcQ0AIAUgBDYCAEEAIAggBnI2AozQgIAAIAQgBTYCGCAEIAQ2AgggBCAENgIMDAQLIABBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhCANAIAgiBSgCBEF4cSAARg0DIANBHXYhCCADQQF0IQMgBSAIQQRxakEQaiIGKAIAIggNAAsgBiAENgIAIAQgBTYCGCAEIAQ2AgwgBCAENgIIDAMLIAUoAggiAyACNgIMIAUgAjYCCCACQQA2AhggAiAFNgIMIAIgAzYCCAsgC0EIaiEDDAULIAUoAggiAyAENgIMIAUgBDYCCCAEQQA2AhggBCAFNgIMIAQgAzYCCAtBACgClNCAgAAiAyACTQ0AQQAoAqDQgIAAIgQgAmoiBSADIAJrIgNBAXI2AgRBACADNgKU0ICAAEEAIAU2AqDQgIAAIAQgAkEDcjYCBCAEQQhqIQMMAwtBACEDQQBBMDYC+NOAgAAMAgsCQCALRQ0AAkACQCAIIAgoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAA2AgAgAA0BQQAgB0F+IAV3cSIHNgKM0ICAAAwCCyALQRBBFCALKAIQIAhGG2ogADYCACAARQ0BCyAAIAs2AhgCQCAIKAIQIgNFDQAgACADNgIQIAMgADYCGAsgCEEUaigCACIDRQ0AIABBFGogAzYCACADIAA2AhgLAkACQCAEQQ9LDQAgCCAEIAJqIgNBA3I2AgQgCCADaiIDIAMoAgRBAXI2AgQMAQsgCCACaiIAIARBAXI2AgQgCCACQQNyNgIEIAAgBGogBDYCAAJAIARB/wFLDQAgBEF4cUGw0ICAAGohAwJAAkBBACgCiNCAgAAiBUEBIARBA3Z0IgRxDQBBACAFIARyNgKI0ICAACADIQQMAQsgAygCCCEECyAEIAA2AgwgAyAANgIIIAAgAzYCDCAAIAQ2AggMAQtBHyEDAkAgBEH///8HSw0AIARBCHYiAyADQYD+P2pBEHZBCHEiA3QiBSAFQYDgH2pBEHZBBHEiBXQiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAFciACcmsiA0EBdCAEIANBFWp2QQFxckEcaiEDCyAAIAM2AhwgAEIANwIQIANBAnRBuNKAgABqIQUCQCAHQQEgA3QiAnENACAFIAA2AgBBACAHIAJyNgKM0ICAACAAIAU2AhggACAANgIIIAAgADYCDAwBCyAEQQBBGSADQQF2ayADQR9GG3QhAyAFKAIAIQICQANAIAIiBSgCBEF4cSAERg0BIANBHXYhAiADQQF0IQMgBSACQQRxakEQaiIGKAIAIgINAAsgBiAANgIAIAAgBTYCGCAAIAA2AgwgACAANgIIDAELIAUoAggiAyAANgIMIAUgADYCCCAAQQA2AhggACAFNgIMIAAgAzYCCAsgCEEIaiEDDAELAkAgCkUNAAJAAkAgACAAKAIcIgVBAnRBuNKAgABqIgMoAgBHDQAgAyAINgIAIAgNAUEAIAlBfiAFd3E2AozQgIAADAILIApBEEEUIAooAhAgAEYbaiAINgIAIAhFDQELIAggCjYCGAJAIAAoAhAiA0UNACAIIAM2AhAgAyAINgIYCyAAQRRqKAIAIgNFDQAgCEEUaiADNgIAIAMgCDYCGAsCQAJAIARBD0sNACAAIAQgAmoiA0EDcjYCBCAAIANqIgMgAygCBEEBcjYCBAwBCyAAIAJqIgUgBEEBcjYCBCAAIAJBA3I2AgQgBSAEaiAENgIAAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQMCQAJAQQEgB0EDdnQiCCAGcQ0AQQAgCCAGcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCADNgIMIAIgAzYCCCADIAI2AgwgAyAINgIIC0EAIAU2ApzQgIAAQQAgBDYCkNCAgAALIABBCGohAwsgAUEQaiSAgICAACADCwoAIAAQyYCAgAAL4g0BB38CQCAARQ0AIABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAIAJBAXENACACQQNxRQ0BIAEgASgCACICayIBQQAoApjQgIAAIgRJDQEgAiAAaiEAAkAgAUEAKAKc0ICAAEYNAAJAIAJB/wFLDQAgASgCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgASgCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAwsgAiAGRhogAiAENgIIIAQgAjYCDAwCCyABKAIYIQcCQAJAIAEoAgwiBiABRg0AIAEoAggiAiAESRogBiACNgIIIAIgBjYCDAwBCwJAIAFBFGoiAigCACIEDQAgAUEQaiICKAIAIgQNAEEAIQYMAQsDQCACIQUgBCIGQRRqIgIoAgAiBA0AIAZBEGohAiAGKAIQIgQNAAsgBUEANgIACyAHRQ0BAkACQCABIAEoAhwiBEECdEG40oCAAGoiAigCAEcNACACIAY2AgAgBg0BQQBBACgCjNCAgABBfiAEd3E2AozQgIAADAMLIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZFDQILIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABKAIUIgJFDQEgBkEUaiACNgIAIAIgBjYCGAwBCyADKAIEIgJBA3FBA0cNACADIAJBfnE2AgRBACAANgKQ0ICAACABIABqIAA2AgAgASAAQQFyNgIEDwsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkAgAkECcQ0AAkAgA0EAKAKg0ICAAEcNAEEAIAE2AqDQgIAAQQBBACgClNCAgAAgAGoiADYClNCAgAAgASAAQQFyNgIEIAFBACgCnNCAgABHDQNBAEEANgKQ0ICAAEEAQQA2ApzQgIAADwsCQCADQQAoApzQgIAARw0AQQAgATYCnNCAgABBAEEAKAKQ0ICAACAAaiIANgKQ0ICAACABIABBAXI2AgQgASAAaiAANgIADwsgAkF4cSAAaiEAAkACQCACQf8BSw0AIAMoAggiBCACQQN2IgVBA3RBsNCAgABqIgZGGgJAIAMoAgwiAiAERw0AQQBBACgCiNCAgABBfiAFd3E2AojQgIAADAILIAIgBkYaIAIgBDYCCCAEIAI2AgwMAQsgAygCGCEHAkACQCADKAIMIgYgA0YNACADKAIIIgJBACgCmNCAgABJGiAGIAI2AgggAiAGNgIMDAELAkAgA0EUaiICKAIAIgQNACADQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQACQAJAIAMgAygCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAgsgB0EQQRQgBygCECADRhtqIAY2AgAgBkUNAQsgBiAHNgIYAkAgAygCECICRQ0AIAYgAjYCECACIAY2AhgLIAMoAhQiAkUNACAGQRRqIAI2AgAgAiAGNgIYCyABIABqIAA2AgAgASAAQQFyNgIEIAFBACgCnNCAgABHDQFBACAANgKQ0ICAAA8LIAMgAkF+cTYCBCABIABqIAA2AgAgASAAQQFyNgIECwJAIABB/wFLDQAgAEF4cUGw0ICAAGohAgJAAkBBACgCiNCAgAAiBEEBIABBA3Z0IgBxDQBBACAEIAByNgKI0ICAACACIQAMAQsgAigCCCEACyAAIAE2AgwgAiABNgIIIAEgAjYCDCABIAA2AggPC0EfIQICQCAAQf///wdLDQAgAEEIdiICIAJBgP4/akEQdkEIcSICdCIEIARBgOAfakEQdkEEcSIEdCIGIAZBgIAPakEQdkECcSIGdEEPdiACIARyIAZyayICQQF0IAAgAkEVanZBAXFyQRxqIQILIAEgAjYCHCABQgA3AhAgAkECdEG40oCAAGohBAJAAkBBACgCjNCAgAAiBkEBIAJ0IgNxDQAgBCABNgIAQQAgBiADcjYCjNCAgAAgASAENgIYIAEgATYCCCABIAE2AgwMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGAkADQCAGIgQoAgRBeHEgAEYNASACQR12IQYgAkEBdCECIAQgBkEEcWpBEGoiAygCACIGDQALIAMgATYCACABIAQ2AhggASABNgIMIAEgATYCCAwBCyAEKAIIIgAgATYCDCAEIAE2AgggAUEANgIYIAEgBDYCDCABIAA2AggLQQBBACgCqNCAgABBf2oiAUF/IAEbNgKo0ICAAAsLBAAAAAtOAAJAIAANAD8AQRB0DwsCQCAAQf//A3ENACAAQX9MDQACQCAAQRB2QAAiAEF/Rw0AQQBBMDYC+NOAgABBfw8LIABBEHQPCxDKgICAAAAL8gICA38BfgJAIAJFDQAgACABOgAAIAIgAGoiA0F/aiABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBfWogAToAACADQX5qIAE6AAAgAkEHSQ0AIAAgAToAAyADQXxqIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIFayICQSBJDQAgAa1CgYCAgBB+IQYgAyAFaiEBA0AgASAGNwMYIAEgBjcDECABIAY3AwggASAGNwMAIAFBIGohASACQWBqIgJBH0sNAAsLIAALC45IAQBBgAgLhkgBAAAAAgAAAAMAAAAAAAAAAAAAAAQAAAAFAAAAAAAAAAAAAAAGAAAABwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEludmFsaWQgY2hhciBpbiB1cmwgcXVlcnkAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9ib2R5AENvbnRlbnQtTGVuZ3RoIG92ZXJmbG93AENodW5rIHNpemUgb3ZlcmZsb3cAUmVzcG9uc2Ugb3ZlcmZsb3cASW52YWxpZCBtZXRob2QgZm9yIEhUVFAveC54IHJlcXVlc3QASW52YWxpZCBtZXRob2QgZm9yIFJUU1AveC54IHJlcXVlc3QARXhwZWN0ZWQgU09VUkNFIG1ldGhvZCBmb3IgSUNFL3gueCByZXF1ZXN0AEludmFsaWQgY2hhciBpbiB1cmwgZnJhZ21lbnQgc3RhcnQARXhwZWN0ZWQgZG90AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fc3RhdHVzAEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8=", "base64");
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js
+var require_llhttp_simd_wasm = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports, module2) {
+ var { Buffer: Buffer2 } = require("node:buffer");
+ module2.exports = Buffer2.from("AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB4fICEjJSg/QEFERUZHSElKS0xNT1BRUlPeA1dZW1xdYGJlZmdoaWprbG1vcHFyc3R1dnd4eXp7fH1+gAGCAYUBhgGHAYkBiwGMAY0BjgGPAZABkQGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMBmQKkArAC/gL+AgsgASIEIAJHDfMBQd0BIRAM/wMLIAEiECACRw3dAUHDASEQDP4DCyABIgEgAkcNkAFB9wAhEAz9AwsgASIBIAJHDYYBQe8AIRAM/AMLIAEiASACRw1/QeoAIRAM+wMLIAEiASACRw17QegAIRAM+gMLIAEiASACRw14QeYAIRAM+QMLIAEiASACRw0aQRghEAz4AwsgASIBIAJHDRRBEiEQDPcDCyABIgEgAkcNWUHFACEQDPYDCyABIgEgAkcNSkE/IRAM9QMLIAEiASACRw1IQTwhEAz0AwsgASIBIAJHDUFBMSEQDPMDCyAALQAuQQFGDesDDIcCCyAAIAEiASACEMCAgIAAQQFHDeYBIABCADcDIAznAQsgACABIgEgAhC0gICAACIQDecBIAEhAQz1AgsCQCABIgEgAkcNAEEGIRAM8AMLIAAgAUEBaiIBIAIQu4CAgAAiEA3oASABIQEMMQsgAEIANwMgQRIhEAzVAwsgASIQIAJHDStBHSEQDO0DCwJAIAEiASACRg0AIAFBAWohAUEQIRAM1AMLQQchEAzsAwsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3lAUEIIRAM6wMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQRQhEAzSAwtBCSEQDOoDCyABIQEgACkDIFAN5AEgASEBDPICCwJAIAEiASACRw0AQQshEAzpAwsgACABQQFqIgEgAhC2gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeYBIAEhAQwNCyAAIAEiASACELqAgIAAIhAN5wEgASEBDPACCwJAIAEiASACRw0AQQ8hEAzlAwsgAS0AACIQQTtGDQggEEENRw3oASABQQFqIQEM7wILIAAgASIBIAIQuoCAgAAiEA3oASABIQEM8gILA0ACQCABLQAAQfC1gIAAai0AACIQQQFGDQAgEEECRw3rASAAKAIEIRAgAEEANgIEIAAgECABQQFqIgEQuYCAgAAiEA3qASABIQEM9AILIAFBAWoiASACRw0AC0ESIRAM4gMLIAAgASIBIAIQuoCAgAAiEA3pASABIQEMCgsgASIBIAJHDQZBGyEQDOADCwJAIAEiASACRw0AQRYhEAzgAwsgAEGKgICAADYCCCAAIAE2AgQgACABIAIQuICAgAAiEA3qASABIQFBICEQDMYDCwJAIAEiASACRg0AA0ACQCABLQAAQfC3gIAAai0AACIQQQJGDQACQCAQQX9qDgTlAewBAOsB7AELIAFBAWohAUEIIRAMyAMLIAFBAWoiASACRw0AC0EVIRAM3wMLQRUhEAzeAwsDQAJAIAEtAABB8LmAgABqLQAAIhBBAkYNACAQQX9qDgTeAewB4AHrAewBCyABQQFqIgEgAkcNAAtBGCEQDN0DCwJAIAEiASACRg0AIABBi4CAgAA2AgggACABNgIEIAEhAUEHIRAMxAMLQRkhEAzcAwsgAUEBaiEBDAILAkAgASIUIAJHDQBBGiEQDNsDCyAUIQECQCAULQAAQXNqDhTdAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAgDuAgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQM2gMLAkAgAS0AACIQQTtGDQAgEEENRw3oASABQQFqIQEM5QILIAFBAWohAQtBIiEQDL8DCwJAIAEiECACRw0AQRwhEAzYAwtCACERIBAhASAQLQAAQVBqDjfnAeYBAQIDBAUGBwgAAAAAAAAACQoLDA0OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBESExQAC0EeIRAMvQMLQgIhEQzlAQtCAyERDOQBC0IEIREM4wELQgUhEQziAQtCBiERDOEBC0IHIREM4AELQgghEQzfAQtCCSERDN4BC0IKIREM3QELQgshEQzcAQtCDCERDNsBC0INIREM2gELQg4hEQzZAQtCDyERDNgBC0IKIREM1wELQgshEQzWAQtCDCERDNUBC0INIREM1AELQg4hEQzTAQtCDyERDNIBC0IAIRECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAtAABBUGoON+UB5AEAAQIDBAUGB+YB5gHmAeYB5gHmAeYBCAkKCwwN5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAQ4PEBESE+YBC0ICIREM5AELQgMhEQzjAQtCBCERDOIBC0IFIREM4QELQgYhEQzgAQtCByERDN8BC0IIIREM3gELQgkhEQzdAQtCCiERDNwBC0ILIREM2wELQgwhEQzaAQtCDSERDNkBC0IOIREM2AELQg8hEQzXAQtCCiERDNYBC0ILIREM1QELQgwhEQzUAQtCDSERDNMBC0IOIREM0gELQg8hEQzRAQsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3SAUEfIRAMwAMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQSQhEAynAwtBICEQDL8DCyAAIAEiECACEL6AgIAAQX9qDgW2AQDFAgHRAdIBC0ERIRAMpAMLIABBAToALyAQIQEMuwMLIAEiASACRw3SAUEkIRAMuwMLIAEiDSACRw0eQcYAIRAMugMLIAAgASIBIAIQsoCAgAAiEA3UASABIQEMtQELIAEiECACRw0mQdAAIRAMuAMLAkAgASIBIAJHDQBBKCEQDLgDCyAAQQA2AgQgAEGMgICAADYCCCAAIAEgARCxgICAACIQDdMBIAEhAQzYAQsCQCABIhAgAkcNAEEpIRAMtwMLIBAtAAAiAUEgRg0UIAFBCUcN0wEgEEEBaiEBDBULAkAgASIBIAJGDQAgAUEBaiEBDBcLQSohEAy1AwsCQCABIhAgAkcNAEErIRAMtQMLAkAgEC0AACIBQQlGDQAgAUEgRw3VAQsgAC0ALEEIRg3TASAQIQEMkQMLAkAgASIBIAJHDQBBLCEQDLQDCyABLQAAQQpHDdUBIAFBAWohAQzJAgsgASIOIAJHDdUBQS8hEAyyAwsDQAJAIAEtAAAiEEEgRg0AAkAgEEF2ag4EANwB3AEA2gELIAEhAQzgAQsgAUEBaiIBIAJHDQALQTEhEAyxAwtBMiEQIAEiFCACRg2wAyACIBRrIAAoAgAiAWohFSAUIAFrQQNqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB8LuAgABqLQAARw0BAkAgAUEDRw0AQQYhAQyWAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMsQMLIABBADYCACAUIQEM2QELQTMhECABIhQgAkYNrwMgAiAUayAAKAIAIgFqIRUgFCABa0EIaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfS7gIAAai0AAEcNAQJAIAFBCEcNAEEFIQEMlQMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLADCyAAQQA2AgAgFCEBDNgBC0E0IRAgASIUIAJGDa4DIAIgFGsgACgCACIBaiEVIBQgAWtBBWohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUHQwoCAAGotAABHDQECQCABQQVHDQBBByEBDJQDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAyvAwsgAEEANgIAIBQhAQzXAQsCQCABIgEgAkYNAANAAkAgAS0AAEGAvoCAAGotAAAiEEEBRg0AIBBBAkYNCiABIQEM3QELIAFBAWoiASACRw0AC0EwIRAMrgMLQTAhEAytAwsCQCABIgEgAkYNAANAAkAgAS0AACIQQSBGDQAgEEF2ag4E2QHaAdoB2QHaAQsgAUEBaiIBIAJHDQALQTghEAytAwtBOCEQDKwDCwNAAkAgAS0AACIQQSBGDQAgEEEJRw0DCyABQQFqIgEgAkcNAAtBPCEQDKsDCwNAAkAgAS0AACIQQSBGDQACQAJAIBBBdmoOBNoBAQHaAQALIBBBLEYN2wELIAEhAQwECyABQQFqIgEgAkcNAAtBPyEQDKoDCyABIQEM2wELQcAAIRAgASIUIAJGDagDIAIgFGsgACgCACIBaiEWIBQgAWtBBmohFwJAA0AgFC0AAEEgciABQYDAgIAAai0AAEcNASABQQZGDY4DIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADKkDCyAAQQA2AgAgFCEBC0E2IRAMjgMLAkAgASIPIAJHDQBBwQAhEAynAwsgAEGMgICAADYCCCAAIA82AgQgDyEBIAAtACxBf2oOBM0B1QHXAdkBhwMLIAFBAWohAQzMAQsCQCABIgEgAkYNAANAAkAgAS0AACIQQSByIBAgEEG/f2pB/wFxQRpJG0H/AXEiEEEJRg0AIBBBIEYNAAJAAkACQAJAIBBBnX9qDhMAAwMDAwMDAwEDAwMDAwMDAwMCAwsgAUEBaiEBQTEhEAyRAwsgAUEBaiEBQTIhEAyQAwsgAUEBaiEBQTMhEAyPAwsgASEBDNABCyABQQFqIgEgAkcNAAtBNSEQDKUDC0E1IRAMpAMLAkAgASIBIAJGDQADQAJAIAEtAABBgLyAgABqLQAAQQFGDQAgASEBDNMBCyABQQFqIgEgAkcNAAtBPSEQDKQDC0E9IRAMowMLIAAgASIBIAIQsICAgAAiEA3WASABIQEMAQsgEEEBaiEBC0E8IRAMhwMLAkAgASIBIAJHDQBBwgAhEAygAwsCQANAAkAgAS0AAEF3ag4YAAL+Av4ChAP+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gIA/gILIAFBAWoiASACRw0AC0HCACEQDKADCyABQQFqIQEgAC0ALUEBcUUNvQEgASEBC0EsIRAMhQMLIAEiASACRw3TAUHEACEQDJ0DCwNAAkAgAS0AAEGQwICAAGotAABBAUYNACABIQEMtwILIAFBAWoiASACRw0AC0HFACEQDJwDCyANLQAAIhBBIEYNswEgEEE6Rw2BAyAAKAIEIQEgAEEANgIEIAAgASANEK+AgIAAIgEN0AEgDUEBaiEBDLMCC0HHACEQIAEiDSACRg2aAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQZDCgIAAai0AAEcNgAMgAUEFRg30AiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyaAwtByAAhECABIg0gAkYNmQMgAiANayAAKAIAIgFqIRYgDSABa0EJaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGWwoCAAGotAABHDf8CAkAgAUEJRw0AQQIhAQz1AgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmQMLAkAgASINIAJHDQBByQAhEAyZAwsCQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZJ/ag4HAIADgAOAA4ADgAMBgAMLIA1BAWohAUE+IRAMgAMLIA1BAWohAUE/IRAM/wILQcoAIRAgASINIAJGDZcDIAIgDWsgACgCACIBaiEWIA0gAWtBAWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBoMKAgABqLQAARw39AiABQQFGDfACIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJcDC0HLACEQIAEiDSACRg2WAyACIA1rIAAoAgAiAWohFiANIAFrQQ5qIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaLCgIAAai0AAEcN/AIgAUEORg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyWAwtBzAAhECABIg0gAkYNlQMgAiANayAAKAIAIgFqIRYgDSABa0EPaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUHAwoCAAGotAABHDfsCAkAgAUEPRw0AQQMhAQzxAgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlQMLQc0AIRAgASINIAJGDZQDIAIgDWsgACgCACIBaiEWIA0gAWtBBWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw36AgJAIAFBBUcNAEEEIQEM8AILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJQDCwJAIAEiDSACRw0AQc4AIRAMlAMLAkACQAJAAkAgDS0AACIBQSByIAEgAUG/f2pB/wFxQRpJG0H/AXFBnX9qDhMA/QL9Av0C/QL9Av0C/QL9Av0C/QL9Av0CAf0C/QL9AgID/QILIA1BAWohAUHBACEQDP0CCyANQQFqIQFBwgAhEAz8AgsgDUEBaiEBQcMAIRAM+wILIA1BAWohAUHEACEQDPoCCwJAIAEiASACRg0AIABBjYCAgAA2AgggACABNgIEIAEhAUHFACEQDPoCC0HPACEQDJIDCyAQIQECQAJAIBAtAABBdmoOBAGoAqgCAKgCCyAQQQFqIQELQSchEAz4AgsCQCABIgEgAkcNAEHRACEQDJEDCwJAIAEtAABBIEYNACABIQEMjQELIAFBAWohASAALQAtQQFxRQ3HASABIQEMjAELIAEiFyACRw3IAUHSACEQDI8DC0HTACEQIAEiFCACRg2OAyACIBRrIAAoAgAiAWohFiAUIAFrQQFqIRcDQCAULQAAIAFB1sKAgABqLQAARw3MASABQQFGDccBIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADI4DCwJAIAEiASACRw0AQdUAIRAMjgMLIAEtAABBCkcNzAEgAUEBaiEBDMcBCwJAIAEiASACRw0AQdYAIRAMjQMLAkACQCABLQAAQXZqDgQAzQHNAQHNAQsgAUEBaiEBDMcBCyABQQFqIQFBygAhEAzzAgsgACABIgEgAhCugICAACIQDcsBIAEhAUHNACEQDPICCyAALQApQSJGDYUDDKYCCwJAIAEiASACRw0AQdsAIRAMigMLQQAhFEEBIRdBASEWQQAhEAJAAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgrUAdMBAAECAwQFBgjVAQtBAiEQDAYLQQMhEAwFC0EEIRAMBAtBBSEQDAMLQQYhEAwCC0EHIRAMAQtBCCEQC0EAIRdBACEWQQAhFAzMAQtBCSEQQQEhFEEAIRdBACEWDMsBCwJAIAEiASACRw0AQd0AIRAMiQMLIAEtAABBLkcNzAEgAUEBaiEBDKYCCyABIgEgAkcNzAFB3wAhEAyHAwsCQCABIgEgAkYNACAAQY6AgIAANgIIIAAgATYCBCABIQFB0AAhEAzuAgtB4AAhEAyGAwtB4QAhECABIgEgAkYNhQMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQeLCgIAAai0AAEcNzQEgFEEDRg3MASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyFAwtB4gAhECABIgEgAkYNhAMgAiABayAAKAIAIhRqIRYgASAUa0ECaiEXA0AgAS0AACAUQebCgIAAai0AAEcNzAEgFEECRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyEAwtB4wAhECABIgEgAkYNgwMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQenCgIAAai0AAEcNywEgFEEDRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyDAwsCQCABIgEgAkcNAEHlACEQDIMDCyAAIAFBAWoiASACEKiAgIAAIhANzQEgASEBQdYAIRAM6QILAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AAkACQAJAIBBBuH9qDgsAAc8BzwHPAc8BzwHPAc8BzwECzwELIAFBAWohAUHSACEQDO0CCyABQQFqIQFB0wAhEAzsAgsgAUEBaiEBQdQAIRAM6wILIAFBAWoiASACRw0AC0HkACEQDIIDC0HkACEQDIEDCwNAAkAgAS0AAEHwwoCAAGotAAAiEEEBRg0AIBBBfmoOA88B0AHRAdIBCyABQQFqIgEgAkcNAAtB5gAhEAyAAwsCQCABIgEgAkYNACABQQFqIQEMAwtB5wAhEAz/AgsDQAJAIAEtAABB8MSAgABqLQAAIhBBAUYNAAJAIBBBfmoOBNIB0wHUAQDVAQsgASEBQdcAIRAM5wILIAFBAWoiASACRw0AC0HoACEQDP4CCwJAIAEiASACRw0AQekAIRAM/gILAkAgAS0AACIQQXZqDhq6AdUB1QG8AdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAcoB1QHVAQDTAQsgAUEBaiEBC0EGIRAM4wILA0ACQCABLQAAQfDGgIAAai0AAEEBRg0AIAEhAQyeAgsgAUEBaiIBIAJHDQALQeoAIRAM+wILAkAgASIBIAJGDQAgAUEBaiEBDAMLQesAIRAM+gILAkAgASIBIAJHDQBB7AAhEAz6AgsgAUEBaiEBDAELAkAgASIBIAJHDQBB7QAhEAz5AgsgAUEBaiEBC0EEIRAM3gILAkAgASIUIAJHDQBB7gAhEAz3AgsgFCEBAkACQAJAIBQtAABB8MiAgABqLQAAQX9qDgfUAdUB1gEAnAIBAtcBCyAUQQFqIQEMCgsgFEEBaiEBDM0BC0EAIRAgAEEANgIcIABBm5KAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAz2AgsCQANAAkAgAS0AAEHwyICAAGotAAAiEEEERg0AAkACQCAQQX9qDgfSAdMB1AHZAQAEAdkBCyABIQFB2gAhEAzgAgsgAUEBaiEBQdwAIRAM3wILIAFBAWoiASACRw0AC0HvACEQDPYCCyABQQFqIQEMywELAkAgASIUIAJHDQBB8AAhEAz1AgsgFC0AAEEvRw3UASAUQQFqIQEMBgsCQCABIhQgAkcNAEHxACEQDPQCCwJAIBQtAAAiAUEvRw0AIBRBAWohAUHdACEQDNsCCyABQXZqIgRBFksN0wFBASAEdEGJgIACcUUN0wEMygILAkAgASIBIAJGDQAgAUEBaiEBQd4AIRAM2gILQfIAIRAM8gILAkAgASIUIAJHDQBB9AAhEAzyAgsgFCEBAkAgFC0AAEHwzICAAGotAABBf2oOA8kClAIA1AELQeEAIRAM2AILAkAgASIUIAJGDQADQAJAIBQtAABB8MqAgABqLQAAIgFBA0YNAAJAIAFBf2oOAssCANUBCyAUIQFB3wAhEAzaAgsgFEEBaiIUIAJHDQALQfMAIRAM8QILQfMAIRAM8AILAkAgASIBIAJGDQAgAEGPgICAADYCCCAAIAE2AgQgASEBQeAAIRAM1wILQfUAIRAM7wILAkAgASIBIAJHDQBB9gAhEAzvAgsgAEGPgICAADYCCCAAIAE2AgQgASEBC0EDIRAM1AILA0AgAS0AAEEgRw3DAiABQQFqIgEgAkcNAAtB9wAhEAzsAgsCQCABIgEgAkcNAEH4ACEQDOwCCyABLQAAQSBHDc4BIAFBAWohAQzvAQsgACABIgEgAhCsgICAACIQDc4BIAEhAQyOAgsCQCABIgQgAkcNAEH6ACEQDOoCCyAELQAAQcwARw3RASAEQQFqIQFBEyEQDM8BCwJAIAEiBCACRw0AQfsAIRAM6QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEANAIAQtAAAgAUHwzoCAAGotAABHDdABIAFBBUYNzgEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBB+wAhEAzoAgsCQCABIgQgAkcNAEH8ACEQDOgCCwJAAkAgBC0AAEG9f2oODADRAdEB0QHRAdEB0QHRAdEB0QHRAQHRAQsgBEEBaiEBQeYAIRAMzwILIARBAWohAUHnACEQDM4CCwJAIAEiBCACRw0AQf0AIRAM5wILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNzwEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf0AIRAM5wILIABBADYCACAQQQFqIQFBECEQDMwBCwJAIAEiBCACRw0AQf4AIRAM5gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQfbOgIAAai0AAEcNzgEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf4AIRAM5gILIABBADYCACAQQQFqIQFBFiEQDMsBCwJAIAEiBCACRw0AQf8AIRAM5QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQfzOgIAAai0AAEcNzQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf8AIRAM5QILIABBADYCACAQQQFqIQFBBSEQDMoBCwJAIAEiBCACRw0AQYABIRAM5AILIAQtAABB2QBHDcsBIARBAWohAUEIIRAMyQELAkAgASIEIAJHDQBBgQEhEAzjAgsCQAJAIAQtAABBsn9qDgMAzAEBzAELIARBAWohAUHrACEQDMoCCyAEQQFqIQFB7AAhEAzJAgsCQCABIgQgAkcNAEGCASEQDOICCwJAAkAgBC0AAEG4f2oOCADLAcsBywHLAcsBywEBywELIARBAWohAUHqACEQDMkCCyAEQQFqIQFB7QAhEAzIAgsCQCABIgQgAkcNAEGDASEQDOECCyACIARrIAAoAgAiAWohECAEIAFrQQJqIRQCQANAIAQtAAAgAUGAz4CAAGotAABHDckBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgEDYCAEGDASEQDOECC0EAIRAgAEEANgIAIBRBAWohAQzGAQsCQCABIgQgAkcNAEGEASEQDOACCyACIARrIAAoAgAiAWohFCAEIAFrQQRqIRACQANAIAQtAAAgAUGDz4CAAGotAABHDcgBIAFBBEYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGEASEQDOACCyAAQQA2AgAgEEEBaiEBQSMhEAzFAQsCQCABIgQgAkcNAEGFASEQDN8CCwJAAkAgBC0AAEG0f2oOCADIAcgByAHIAcgByAEByAELIARBAWohAUHvACEQDMYCCyAEQQFqIQFB8AAhEAzFAgsCQCABIgQgAkcNAEGGASEQDN4CCyAELQAAQcUARw3FASAEQQFqIQEMgwILAkAgASIEIAJHDQBBhwEhEAzdAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBiM+AgABqLQAARw3FASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhwEhEAzdAgsgAEEANgIAIBBBAWohAUEtIRAMwgELAkAgASIEIAJHDQBBiAEhEAzcAgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw3EASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiAEhEAzcAgsgAEEANgIAIBBBAWohAUEpIRAMwQELAkAgASIBIAJHDQBBiQEhEAzbAgtBASEQIAEtAABB3wBHDcABIAFBAWohAQyBAgsCQCABIgQgAkcNAEGKASEQDNoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRADQCAELQAAIAFBjM+AgABqLQAARw3BASABQQFGDa8CIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYoBIRAM2QILAkAgASIEIAJHDQBBiwEhEAzZAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBjs+AgABqLQAARw3BASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiwEhEAzZAgsgAEEANgIAIBBBAWohAUECIRAMvgELAkAgASIEIAJHDQBBjAEhEAzYAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw3AASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjAEhEAzYAgsgAEEANgIAIBBBAWohAUEfIRAMvQELAkAgASIEIAJHDQBBjQEhEAzXAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8s+AgABqLQAARw2/ASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjQEhEAzXAgsgAEEANgIAIBBBAWohAUEJIRAMvAELAkAgASIEIAJHDQBBjgEhEAzWAgsCQAJAIAQtAABBt39qDgcAvwG/Ab8BvwG/AQG/AQsgBEEBaiEBQfgAIRAMvQILIARBAWohAUH5ACEQDLwCCwJAIAEiBCACRw0AQY8BIRAM1QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQZHPgIAAai0AAEcNvQEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY8BIRAM1QILIABBADYCACAQQQFqIQFBGCEQDLoBCwJAIAEiBCACRw0AQZABIRAM1AILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQZfPgIAAai0AAEcNvAEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZABIRAM1AILIABBADYCACAQQQFqIQFBFyEQDLkBCwJAIAEiBCACRw0AQZEBIRAM0wILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQZrPgIAAai0AAEcNuwEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZEBIRAM0wILIABBADYCACAQQQFqIQFBFSEQDLgBCwJAIAEiBCACRw0AQZIBIRAM0gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQaHPgIAAai0AAEcNugEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZIBIRAM0gILIABBADYCACAQQQFqIQFBHiEQDLcBCwJAIAEiBCACRw0AQZMBIRAM0QILIAQtAABBzABHDbgBIARBAWohAUEKIRAMtgELAkAgBCACRw0AQZQBIRAM0AILAkACQCAELQAAQb9/ag4PALkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AbkBAbkBCyAEQQFqIQFB/gAhEAy3AgsgBEEBaiEBQf8AIRAMtgILAkAgBCACRw0AQZUBIRAMzwILAkACQCAELQAAQb9/ag4DALgBAbgBCyAEQQFqIQFB/QAhEAy2AgsgBEEBaiEEQYABIRAMtQILAkAgBCACRw0AQZYBIRAMzgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQafPgIAAai0AAEcNtgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZYBIRAMzgILIABBADYCACAQQQFqIQFBCyEQDLMBCwJAIAQgAkcNAEGXASEQDM0CCwJAAkACQAJAIAQtAABBU2oOIwC4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBAbgBuAG4AbgBuAECuAG4AbgBA7gBCyAEQQFqIQFB+wAhEAy2AgsgBEEBaiEBQfwAIRAMtQILIARBAWohBEGBASEQDLQCCyAEQQFqIQRBggEhEAyzAgsCQCAEIAJHDQBBmAEhEAzMAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBqc+AgABqLQAARw20ASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmAEhEAzMAgsgAEEANgIAIBBBAWohAUEZIRAMsQELAkAgBCACRw0AQZkBIRAMywILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQa7PgIAAai0AAEcNswEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZkBIRAMywILIABBADYCACAQQQFqIQFBBiEQDLABCwJAIAQgAkcNAEGaASEQDMoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG0z4CAAGotAABHDbIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGaASEQDMoCCyAAQQA2AgAgEEEBaiEBQRwhEAyvAQsCQCAEIAJHDQBBmwEhEAzJAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBts+AgABqLQAARw2xASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmwEhEAzJAgsgAEEANgIAIBBBAWohAUEnIRAMrgELAkAgBCACRw0AQZwBIRAMyAILAkACQCAELQAAQax/ag4CAAGxAQsgBEEBaiEEQYYBIRAMrwILIARBAWohBEGHASEQDK4CCwJAIAQgAkcNAEGdASEQDMcCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG4z4CAAGotAABHDa8BIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGdASEQDMcCCyAAQQA2AgAgEEEBaiEBQSYhEAysAQsCQCAEIAJHDQBBngEhEAzGAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBus+AgABqLQAARw2uASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBngEhEAzGAgsgAEEANgIAIBBBAWohAUEDIRAMqwELAkAgBCACRw0AQZ8BIRAMxQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNrQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ8BIRAMxQILIABBADYCACAQQQFqIQFBDCEQDKoBCwJAIAQgAkcNAEGgASEQDMQCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUG8z4CAAGotAABHDawBIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGgASEQDMQCCyAAQQA2AgAgEEEBaiEBQQ0hEAypAQsCQCAEIAJHDQBBoQEhEAzDAgsCQAJAIAQtAABBun9qDgsArAGsAawBrAGsAawBrAGsAawBAawBCyAEQQFqIQRBiwEhEAyqAgsgBEEBaiEEQYwBIRAMqQILAkAgBCACRw0AQaIBIRAMwgILIAQtAABB0ABHDakBIARBAWohBAzpAQsCQCAEIAJHDQBBowEhEAzBAgsCQAJAIAQtAABBt39qDgcBqgGqAaoBqgGqAQCqAQsgBEEBaiEEQY4BIRAMqAILIARBAWohAUEiIRAMpgELAkAgBCACRw0AQaQBIRAMwAILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQcDPgIAAai0AAEcNqAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaQBIRAMwAILIABBADYCACAQQQFqIQFBHSEQDKUBCwJAIAQgAkcNAEGlASEQDL8CCwJAAkAgBC0AAEGuf2oOAwCoAQGoAQsgBEEBaiEEQZABIRAMpgILIARBAWohAUEEIRAMpAELAkAgBCACRw0AQaYBIRAMvgILAkACQAJAAkACQCAELQAAQb9/ag4VAKoBqgGqAaoBqgGqAaoBqgGqAaoBAaoBqgECqgGqAQOqAaoBBKoBCyAEQQFqIQRBiAEhEAyoAgsgBEEBaiEEQYkBIRAMpwILIARBAWohBEGKASEQDKYCCyAEQQFqIQRBjwEhEAylAgsgBEEBaiEEQZEBIRAMpAILAkAgBCACRw0AQacBIRAMvQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNpQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQacBIRAMvQILIABBADYCACAQQQFqIQFBESEQDKIBCwJAIAQgAkcNAEGoASEQDLwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHCz4CAAGotAABHDaQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGoASEQDLwCCyAAQQA2AgAgEEEBaiEBQSwhEAyhAQsCQCAEIAJHDQBBqQEhEAy7AgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBxc+AgABqLQAARw2jASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqQEhEAy7AgsgAEEANgIAIBBBAWohAUErIRAMoAELAkAgBCACRw0AQaoBIRAMugILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQcrPgIAAai0AAEcNogEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaoBIRAMugILIABBADYCACAQQQFqIQFBFCEQDJ8BCwJAIAQgAkcNAEGrASEQDLkCCwJAAkACQAJAIAQtAABBvn9qDg8AAQKkAaQBpAGkAaQBpAGkAaQBpAGkAaQBA6QBCyAEQQFqIQRBkwEhEAyiAgsgBEEBaiEEQZQBIRAMoQILIARBAWohBEGVASEQDKACCyAEQQFqIQRBlgEhEAyfAgsCQCAEIAJHDQBBrAEhEAy4AgsgBC0AAEHFAEcNnwEgBEEBaiEEDOABCwJAIAQgAkcNAEGtASEQDLcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHNz4CAAGotAABHDZ8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGtASEQDLcCCyAAQQA2AgAgEEEBaiEBQQ4hEAycAQsCQCAEIAJHDQBBrgEhEAy2AgsgBC0AAEHQAEcNnQEgBEEBaiEBQSUhEAybAQsCQCAEIAJHDQBBrwEhEAy1AgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw2dASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrwEhEAy1AgsgAEEANgIAIBBBAWohAUEqIRAMmgELAkAgBCACRw0AQbABIRAMtAILAkACQCAELQAAQat/ag4LAJ0BnQGdAZ0BnQGdAZ0BnQGdAQGdAQsgBEEBaiEEQZoBIRAMmwILIARBAWohBEGbASEQDJoCCwJAIAQgAkcNAEGxASEQDLMCCwJAAkAgBC0AAEG/f2oOFACcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAEBnAELIARBAWohBEGZASEQDJoCCyAEQQFqIQRBnAEhEAyZAgsCQCAEIAJHDQBBsgEhEAyyAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFB2c+AgABqLQAARw2aASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBsgEhEAyyAgsgAEEANgIAIBBBAWohAUEhIRAMlwELAkAgBCACRw0AQbMBIRAMsQILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQd3PgIAAai0AAEcNmQEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbMBIRAMsQILIABBADYCACAQQQFqIQFBGiEQDJYBCwJAIAQgAkcNAEG0ASEQDLACCwJAAkACQCAELQAAQbt/ag4RAJoBmgGaAZoBmgGaAZoBmgGaAQGaAZoBmgGaAZoBApoBCyAEQQFqIQRBnQEhEAyYAgsgBEEBaiEEQZ4BIRAMlwILIARBAWohBEGfASEQDJYCCwJAIAQgAkcNAEG1ASEQDK8CCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUHkz4CAAGotAABHDZcBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG1ASEQDK8CCyAAQQA2AgAgEEEBaiEBQSghEAyUAQsCQCAEIAJHDQBBtgEhEAyuAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB6s+AgABqLQAARw2WASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtgEhEAyuAgsgAEEANgIAIBBBAWohAUEHIRAMkwELAkAgBCACRw0AQbcBIRAMrQILAkACQCAELQAAQbt/ag4OAJYBlgGWAZYBlgGWAZYBlgGWAZYBlgGWAQGWAQsgBEEBaiEEQaEBIRAMlAILIARBAWohBEGiASEQDJMCCwJAIAQgAkcNAEG4ASEQDKwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDZQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG4ASEQDKwCCyAAQQA2AgAgEEEBaiEBQRIhEAyRAQsCQCAEIAJHDQBBuQEhEAyrAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw2TASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuQEhEAyrAgsgAEEANgIAIBBBAWohAUEgIRAMkAELAkAgBCACRw0AQboBIRAMqgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNkgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQboBIRAMqgILIABBADYCACAQQQFqIQFBDyEQDI8BCwJAIAQgAkcNAEG7ASEQDKkCCwJAAkAgBC0AAEG3f2oOBwCSAZIBkgGSAZIBAZIBCyAEQQFqIQRBpQEhEAyQAgsgBEEBaiEEQaYBIRAMjwILAkAgBCACRw0AQbwBIRAMqAILIAIgBGsgACgCACIBaiEUIAQgAWtBB2ohEAJAA0AgBC0AACABQfTPgIAAai0AAEcNkAEgAUEHRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbwBIRAMqAILIABBADYCACAQQQFqIQFBGyEQDI0BCwJAIAQgAkcNAEG9ASEQDKcCCwJAAkACQCAELQAAQb5/ag4SAJEBkQGRAZEBkQGRAZEBkQGRAQGRAZEBkQGRAZEBkQECkQELIARBAWohBEGkASEQDI8CCyAEQQFqIQRBpwEhEAyOAgsgBEEBaiEEQagBIRAMjQILAkAgBCACRw0AQb4BIRAMpgILIAQtAABBzgBHDY0BIARBAWohBAzPAQsCQCAEIAJHDQBBvwEhEAylAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAELQAAQb9/ag4VAAECA5wBBAUGnAGcAZwBBwgJCgucAQwNDg+cAQsgBEEBaiEBQegAIRAMmgILIARBAWohAUHpACEQDJkCCyAEQQFqIQFB7gAhEAyYAgsgBEEBaiEBQfIAIRAMlwILIARBAWohAUHzACEQDJYCCyAEQQFqIQFB9gAhEAyVAgsgBEEBaiEBQfcAIRAMlAILIARBAWohAUH6ACEQDJMCCyAEQQFqIQRBgwEhEAySAgsgBEEBaiEEQYQBIRAMkQILIARBAWohBEGFASEQDJACCyAEQQFqIQRBkgEhEAyPAgsgBEEBaiEEQZgBIRAMjgILIARBAWohBEGgASEQDI0CCyAEQQFqIQRBowEhEAyMAgsgBEEBaiEEQaoBIRAMiwILAkAgBCACRg0AIABBkICAgAA2AgggACAENgIEQasBIRAMiwILQcABIRAMowILIAAgBSACEKqAgIAAIgENiwEgBSEBDFwLAkAgBiACRg0AIAZBAWohBQyNAQtBwgEhEAyhAgsDQAJAIBAtAABBdmoOBIwBAACPAQALIBBBAWoiECACRw0AC0HDASEQDKACCwJAIAcgAkYNACAAQZGAgIAANgIIIAAgBzYCBCAHIQFBASEQDIcCC0HEASEQDJ8CCwJAIAcgAkcNAEHFASEQDJ8CCwJAAkAgBy0AAEF2ag4EAc4BzgEAzgELIAdBAWohBgyNAQsgB0EBaiEFDIkBCwJAIAcgAkcNAEHGASEQDJ4CCwJAAkAgBy0AAEF2ag4XAY8BjwEBjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAI8BCyAHQQFqIQcLQbABIRAMhAILAkAgCCACRw0AQcgBIRAMnQILIAgtAABBIEcNjQEgAEEAOwEyIAhBAWohAUGzASEQDIMCCyABIRcCQANAIBciByACRg0BIActAABBUGpB/wFxIhBBCk8NzAECQCAALwEyIhRBmTNLDQAgACAUQQpsIhQ7ATIgEEH//wNzIBRB/v8DcUkNACAHQQFqIRcgACAUIBBqIhA7ATIgEEH//wNxQegHSQ0BCwtBACEQIABBADYCHCAAQcGJgIAANgIQIABBDTYCDCAAIAdBAWo2AhQMnAILQccBIRAMmwILIAAgCCACEK6AgIAAIhBFDcoBIBBBFUcNjAEgAEHIATYCHCAAIAg2AhQgAEHJl4CAADYCECAAQRU2AgxBACEQDJoCCwJAIAkgAkcNAEHMASEQDJoCC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgCS0AAEFQag4KlgGVAQABAgMEBQYIlwELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMjgELQQkhEEEBIRRBACEXQQAhFgyNAQsCQCAKIAJHDQBBzgEhEAyZAgsgCi0AAEEuRw2OASAKQQFqIQkMygELIAsgAkcNjgFB0AEhEAyXAgsCQCALIAJGDQAgAEGOgICAADYCCCAAIAs2AgRBtwEhEAz+AQtB0QEhEAyWAgsCQCAEIAJHDQBB0gEhEAyWAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EEaiELA0AgBC0AACAQQfzPgIAAai0AAEcNjgEgEEEERg3pASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHSASEQDJUCCyAAIAwgAhCsgICAACIBDY0BIAwhAQy4AQsCQCAEIAJHDQBB1AEhEAyUAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EBaiEMA0AgBC0AACAQQYHQgIAAai0AAEcNjwEgEEEBRg2OASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHUASEQDJMCCwJAIAQgAkcNAEHWASEQDJMCCyACIARrIAAoAgAiEGohFCAEIBBrQQJqIQsDQCAELQAAIBBBg9CAgABqLQAARw2OASAQQQJGDZABIBBBAWohECAEQQFqIgQgAkcNAAsgACAUNgIAQdYBIRAMkgILAkAgBCACRw0AQdcBIRAMkgILAkACQCAELQAAQbt/ag4QAI8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwEBjwELIARBAWohBEG7ASEQDPkBCyAEQQFqIQRBvAEhEAz4AQsCQCAEIAJHDQBB2AEhEAyRAgsgBC0AAEHIAEcNjAEgBEEBaiEEDMQBCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEG+ASEQDPcBC0HZASEQDI8CCwJAIAQgAkcNAEHaASEQDI8CCyAELQAAQcgARg3DASAAQQE6ACgMuQELIABBAjoALyAAIAQgAhCmgICAACIQDY0BQcIBIRAM9AELIAAtAChBf2oOArcBuQG4AQsDQAJAIAQtAABBdmoOBACOAY4BAI4BCyAEQQFqIgQgAkcNAAtB3QEhEAyLAgsgAEEAOgAvIAAtAC1BBHFFDYQCCyAAQQA6AC8gAEEBOgA0IAEhAQyMAQsgEEEVRg3aASAAQQA2AhwgACABNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAyIAgsCQCAAIBAgAhC0gICAACIEDQAgECEBDIECCwJAIARBFUcNACAAQQM2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAyIAgsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMhwILIBBBFUYN1gEgAEEANgIcIAAgATYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMhgILIAAoAgQhFyAAQQA2AgQgECARp2oiFiEBIAAgFyAQIBYgFBsiEBC1gICAACIURQ2NASAAQQc2AhwgACAQNgIUIAAgFDYCDEEAIRAMhQILIAAgAC8BMEGAAXI7ATAgASEBC0EqIRAM6gELIBBBFUYN0QEgAEEANgIcIAAgATYCFCAAQYOMgIAANgIQIABBEzYCDEEAIRAMggILIBBBFUYNzwEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAMgQILIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDI0BCyAAQQw2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMgAILIBBBFUYNzAEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM/wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIwBCyAAQQ02AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/gELIBBBFUYNyQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM/QELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIsBCyAAQQ42AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/AELIABBADYCHCAAIAE2AhQgAEHAlYCAADYCECAAQQI2AgxBACEQDPsBCyAQQRVGDcUBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPoBCyAAQRA2AhwgACABNgIUIAAgEDYCDEEAIRAM+QELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDPEBCyAAQRE2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM+AELIBBBFUYNwQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM9wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIgBCyAAQRM2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM9gELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDO0BCyAAQRQ2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM9QELIBBBFUYNvQEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM9AELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIYBCyAAQRY2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM8wELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC3gICAACIEDQAgAUEBaiEBDOkBCyAAQRc2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM8gELIABBADYCHCAAIAE2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDPEBC0IBIRELIBBBAWohAQJAIAApAyAiEkL//////////w9WDQAgACASQgSGIBGENwMgIAEhAQyEAQsgAEEANgIcIAAgATYCFCAAQa2JgIAANgIQIABBDDYCDEEAIRAM7wELIABBADYCHCAAIBA2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDO4BCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNcyAAQQU2AhwgACAQNgIUIAAgFDYCDEEAIRAM7QELIABBADYCHCAAIBA2AhQgAEGqnICAADYCECAAQQ82AgxBACEQDOwBCyAAIBAgAhC0gICAACIBDQEgECEBC0EOIRAM0QELAkAgAUEVRw0AIABBAjYCHCAAIBA2AhQgAEGwmICAADYCECAAQRU2AgxBACEQDOoBCyAAQQA2AhwgACAQNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAzpAQsgAUEBaiEQAkAgAC8BMCIBQYABcUUNAAJAIAAgECACELuAgIAAIgENACAQIQEMcAsgAUEVRw26ASAAQQU2AhwgACAQNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAzpAQsCQCABQaAEcUGgBEcNACAALQAtQQJxDQAgAEEANgIcIAAgEDYCFCAAQZaTgIAANgIQIABBBDYCDEEAIRAM6QELIAAgECACEL2AgIAAGiAQIQECQAJAAkACQAJAIAAgECACELOAgIAADhYCAQAEBAQEBAQEBAQEBAQEBAQEBAQDBAsgAEEBOgAuCyAAIAAvATBBwAByOwEwIBAhAQtBJiEQDNEBCyAAQSM2AhwgACAQNgIUIABBpZaAgAA2AhAgAEEVNgIMQQAhEAzpAQsgAEEANgIcIAAgEDYCFCAAQdWLgIAANgIQIABBETYCDEEAIRAM6AELIAAtAC1BAXFFDQFBwwEhEAzOAQsCQCANIAJGDQADQAJAIA0tAABBIEYNACANIQEMxAELIA1BAWoiDSACRw0AC0ElIRAM5wELQSUhEAzmAQsgACgCBCEEIABBADYCBCAAIAQgDRCvgICAACIERQ2tASAAQSY2AhwgACAENgIMIAAgDUEBajYCFEEAIRAM5QELIBBBFUYNqwEgAEEANgIcIAAgATYCFCAAQf2NgIAANgIQIABBHTYCDEEAIRAM5AELIABBJzYCHCAAIAE2AhQgACAQNgIMQQAhEAzjAQsgECEBQQEhFAJAAkACQAJAAkACQAJAIAAtACxBfmoOBwYFBQMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0ErIRAMygELIABBADYCHCAAIBA2AhQgAEGrkoCAADYCECAAQQs2AgxBACEQDOIBCyAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMQQAhEAzhAQsgAEEAOgAsIBAhAQy9AQsgECEBQQEhFAJAAkACQAJAAkAgAC0ALEF7ag4EAwECAAULIAAgAC8BMEEIcjsBMAwDC0ECIRQMAQtBBCEUCyAAQQE6ACwgACAALwEwIBRyOwEwCyAQIQELQSkhEAzFAQsgAEEANgIcIAAgATYCFCAAQfCUgIAANgIQIABBAzYCDEEAIRAM3QELAkAgDi0AAEENRw0AIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHULIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzdAQsgAC0ALUEBcUUNAUHEASEQDMMBCwJAIA4gAkcNAEEtIRAM3AELAkACQANAAkAgDi0AAEF2ag4EAgAAAwALIA5BAWoiDiACRw0AC0EtIRAM3QELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDiEBDHQLIABBLDYCHCAAIA42AhQgACABNgIMQQAhEAzcAQsgACgCBCEBIABBADYCBAJAIAAgASAOELGAgIAAIgENACAOQQFqIQEMcwsgAEEsNgIcIAAgATYCDCAAIA5BAWo2AhRBACEQDNsBCyAAKAIEIQQgAEEANgIEIAAgBCAOELGAgIAAIgQNoAEgDiEBDM4BCyAQQSxHDQEgAUEBaiEQQQEhAQJAAkACQAJAAkAgAC0ALEF7ag4EAwECBAALIBAhAQwEC0ECIQEMAQtBBCEBCyAAQQE6ACwgACAALwEwIAFyOwEwIBAhAQwBCyAAIAAvATBBCHI7ATAgECEBC0E5IRAMvwELIABBADoALCABIQELQTQhEAy9AQsgACAALwEwQSByOwEwIAEhAQwCCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBA0AIAEhAQzHAQsgAEE3NgIcIAAgATYCFCAAIAQ2AgxBACEQDNQBCyAAQQg6ACwgASEBC0EwIRAMuQELAkAgAC0AKEEBRg0AIAEhAQwECyAALQAtQQhxRQ2TASABIQEMAwsgAC0AMEEgcQ2UAUHFASEQDLcBCwJAIA8gAkYNAAJAA0ACQCAPLQAAQVBqIgFB/wFxQQpJDQAgDyEBQTUhEAy6AQsgACkDICIRQpmz5syZs+bMGVYNASAAIBFCCn4iETcDICARIAGtQv8BgyISQn+FVg0BIAAgESASfDcDICAPQQFqIg8gAkcNAAtBOSEQDNEBCyAAKAIEIQIgAEEANgIEIAAgAiAPQQFqIgQQsYCAgAAiAg2VASAEIQEMwwELQTkhEAzPAQsCQCAALwEwIgFBCHFFDQAgAC0AKEEBRw0AIAAtAC1BCHFFDZABCyAAIAFB9/sDcUGABHI7ATAgDyEBC0E3IRAMtAELIAAgAC8BMEEQcjsBMAyrAQsgEEEVRg2LASAAQQA2AhwgACABNgIUIABB8I6AgAA2AhAgAEEcNgIMQQAhEAzLAQsgAEHDADYCHCAAIAE2AgwgACANQQFqNgIUQQAhEAzKAQsCQCABLQAAQTpHDQAgACgCBCEQIABBADYCBAJAIAAgECABEK+AgIAAIhANACABQQFqIQEMYwsgAEHDADYCHCAAIBA2AgwgACABQQFqNgIUQQAhEAzKAQsgAEEANgIcIAAgATYCFCAAQbGRgIAANgIQIABBCjYCDEEAIRAMyQELIABBADYCHCAAIAE2AhQgAEGgmYCAADYCECAAQR42AgxBACEQDMgBCyAAQQA2AgALIABBgBI7ASogACAXQQFqIgEgAhCogICAACIQDQEgASEBC0HHACEQDKwBCyAQQRVHDYMBIABB0QA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAzEAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAzDAQsgAEEANgIcIAAgFDYCFCAAQcGogIAANgIQIABBBzYCDCAAQQA2AgBBACEQDMIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxdCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDMEBC0EAIRAgAEEANgIcIAAgATYCFCAAQYCRgIAANgIQIABBCTYCDAzAAQsgEEEVRg19IABBADYCHCAAIAE2AhQgAEGUjYCAADYCECAAQSE2AgxBACEQDL8BC0EBIRZBACEXQQAhFEEBIRALIAAgEDoAKyABQQFqIQECQAJAIAAtAC1BEHENAAJAAkACQCAALQAqDgMBAAIECyAWRQ0DDAILIBQNAQwCCyAXRQ0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQrYCAgAAiEA0AIAEhAQxcCyAAQdgANgIcIAAgATYCFCAAIBA2AgxBACEQDL4BCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQytAQsgAEHZADYCHCAAIAE2AhQgACAENgIMQQAhEAy9AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMqwELIABB2gA2AhwgACABNgIUIAAgBDYCDEEAIRAMvAELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKkBCyAAQdwANgIcIAAgATYCFCAAIAQ2AgxBACEQDLsBCwJAIAEtAABBUGoiEEH/AXFBCk8NACAAIBA6ACogAUEBaiEBQc8AIRAMogELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKcBCyAAQd4ANgIcIAAgATYCFCAAIAQ2AgxBACEQDLoBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKUEjTw0AIAEhAQxZCyAAQQA2AhwgACABNgIUIABB04mAgAA2AhAgAEEINgIMQQAhEAy5AQsgAEEANgIAC0EAIRAgAEEANgIcIAAgATYCFCAAQZCzgIAANgIQIABBCDYCDAy3AQsgAEEANgIAIBdBAWohAQJAIAAtAClBIUcNACABIQEMVgsgAEEANgIcIAAgATYCFCAAQZuKgIAANgIQIABBCDYCDEEAIRAMtgELIABBADYCACAXQQFqIQECQCAALQApIhBBXWpBC08NACABIQEMVQsCQCAQQQZLDQBBASAQdEHKAHFFDQAgASEBDFULQQAhECAAQQA2AhwgACABNgIUIABB94mAgAA2AhAgAEEINgIMDLUBCyAQQRVGDXEgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMtAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFQLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMswELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMsgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMsQELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFELIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMsAELIABBADYCHCAAIAE2AhQgAEHGioCAADYCECAAQQc2AgxBACEQDK8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDK4BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDK0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDKwBCyAAQQA2AhwgACABNgIUIABB3IiAgAA2AhAgAEEHNgIMQQAhEAyrAQsgEEE/Rw0BIAFBAWohAQtBBSEQDJABC0EAIRAgAEEANgIcIAAgATYCFCAAQf2SgIAANgIQIABBBzYCDAyoAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAynAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAymAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMRgsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAylAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHSADYCHCAAIBQ2AhQgACABNgIMQQAhEAykAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHTADYCHCAAIBQ2AhQgACABNgIMQQAhEAyjAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMQwsgAEHlADYCHCAAIBQ2AhQgACABNgIMQQAhEAyiAQsgAEEANgIcIAAgFDYCFCAAQcOPgIAANgIQIABBBzYCDEEAIRAMoQELIABBADYCHCAAIAE2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKABC0EAIRAgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDAyfAQsgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDEEAIRAMngELIABBADYCHCAAIBQ2AhQgAEH+kYCAADYCECAAQQc2AgxBACEQDJ0BCyAAQQA2AhwgACABNgIUIABBjpuAgAA2AhAgAEEGNgIMQQAhEAycAQsgEEEVRg1XIABBADYCHCAAIAE2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDJsBCyAAQQA2AgAgEEEBaiEBQSQhEAsgACAQOgApIAAoAgQhECAAQQA2AgQgACAQIAEQq4CAgAAiEA1UIAEhAQw+CyAAQQA2AgALQQAhECAAQQA2AhwgACAENgIUIABB8ZuAgAA2AhAgAEEGNgIMDJcBCyABQRVGDVAgAEEANgIcIAAgBTYCFCAAQfCMgIAANgIQIABBGzYCDEEAIRAMlgELIAAoAgQhBSAAQQA2AgQgACAFIBAQqYCAgAAiBQ0BIBBBAWohBQtBrQEhEAx7CyAAQcEBNgIcIAAgBTYCDCAAIBBBAWo2AhRBACEQDJMBCyAAKAIEIQYgAEEANgIEIAAgBiAQEKmAgIAAIgYNASAQQQFqIQYLQa4BIRAMeAsgAEHCATYCHCAAIAY2AgwgACAQQQFqNgIUQQAhEAyQAQsgAEEANgIcIAAgBzYCFCAAQZeLgIAANgIQIABBDTYCDEEAIRAMjwELIABBADYCHCAAIAg2AhQgAEHjkICAADYCECAAQQk2AgxBACEQDI4BCyAAQQA2AhwgACAINgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAyNAQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgCUEBaiEIAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBCAAIBAgCBCtgICAACIQRQ09IABByQE2AhwgACAINgIUIAAgEDYCDEEAIRAMjAELIAAoAgQhBCAAQQA2AgQgACAEIAgQrYCAgAAiBEUNdiAAQcoBNgIcIAAgCDYCFCAAIAQ2AgxBACEQDIsBCyAAKAIEIQQgAEEANgIEIAAgBCAJEK2AgIAAIgRFDXQgAEHLATYCHCAAIAk2AhQgACAENgIMQQAhEAyKAQsgACgCBCEEIABBADYCBCAAIAQgChCtgICAACIERQ1yIABBzQE2AhwgACAKNgIUIAAgBDYCDEEAIRAMiQELAkAgCy0AAEFQaiIQQf8BcUEKTw0AIAAgEDoAKiALQQFqIQpBtgEhEAxwCyAAKAIEIQQgAEEANgIEIAAgBCALEK2AgIAAIgRFDXAgAEHPATYCHCAAIAs2AhQgACAENgIMQQAhEAyIAQsgAEEANgIcIAAgBDYCFCAAQZCzgIAANgIQIABBCDYCDCAAQQA2AgBBACEQDIcBCyABQRVGDT8gAEEANgIcIAAgDDYCFCAAQcyOgIAANgIQIABBIDYCDEEAIRAMhgELIABBgQQ7ASggACgCBCEQIABCADcDACAAIBAgDEEBaiIMEKuAgIAAIhBFDTggAEHTATYCHCAAIAw2AhQgACAQNgIMQQAhEAyFAQsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQdibgIAANgIQIABBCDYCDAyDAQsgACgCBCEQIABCADcDACAAIBAgC0EBaiILEKuAgIAAIhANAUHGASEQDGkLIABBAjoAKAxVCyAAQdUBNgIcIAAgCzYCFCAAIBA2AgxBACEQDIABCyAQQRVGDTcgAEEANgIcIAAgBDYCFCAAQaSMgIAANgIQIABBEDYCDEEAIRAMfwsgAC0ANEEBRw00IAAgBCACELyAgIAAIhBFDTQgEEEVRw01IABB3AE2AhwgACAENgIUIABB1ZaAgAA2AhAgAEEVNgIMQQAhEAx+C0EAIRAgAEEANgIcIABBr4uAgAA2AhAgAEECNgIMIAAgFEEBajYCFAx9C0EAIRAMYwtBAiEQDGILQQ0hEAxhC0EPIRAMYAtBJSEQDF8LQRMhEAxeC0EVIRAMXQtBFiEQDFwLQRchEAxbC0EYIRAMWgtBGSEQDFkLQRohEAxYC0EbIRAMVwtBHCEQDFYLQR0hEAxVC0EfIRAMVAtBISEQDFMLQSMhEAxSC0HGACEQDFELQS4hEAxQC0EvIRAMTwtBOyEQDE4LQT0hEAxNC0HIACEQDEwLQckAIRAMSwtBywAhEAxKC0HMACEQDEkLQc4AIRAMSAtB0QAhEAxHC0HVACEQDEYLQdgAIRAMRQtB2QAhEAxEC0HbACEQDEMLQeQAIRAMQgtB5QAhEAxBC0HxACEQDEALQfQAIRAMPwtBjQEhEAw+C0GXASEQDD0LQakBIRAMPAtBrAEhEAw7C0HAASEQDDoLQbkBIRAMOQtBrwEhEAw4C0GxASEQDDcLQbIBIRAMNgtBtAEhEAw1C0G1ASEQDDQLQboBIRAMMwtBvQEhEAwyC0G/ASEQDDELQcEBIRAMMAsgAEEANgIcIAAgBDYCFCAAQemLgIAANgIQIABBHzYCDEEAIRAMSAsgAEHbATYCHCAAIAQ2AhQgAEH6loCAADYCECAAQRU2AgxBACEQDEcLIABB+AA2AhwgACAMNgIUIABBypiAgAA2AhAgAEEVNgIMQQAhEAxGCyAAQdEANgIcIAAgBTYCFCAAQbCXgIAANgIQIABBFTYCDEEAIRAMRQsgAEH5ADYCHCAAIAE2AhQgACAQNgIMQQAhEAxECyAAQfgANgIcIAAgATYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMQwsgAEHkADYCHCAAIAE2AhQgAEHjl4CAADYCECAAQRU2AgxBACEQDEILIABB1wA2AhwgACABNgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAxBCyAAQQA2AhwgACABNgIUIABBuY2AgAA2AhAgAEEaNgIMQQAhEAxACyAAQcIANgIcIAAgATYCFCAAQeOYgIAANgIQIABBFTYCDEEAIRAMPwsgAEEANgIEIAAgDyAPELGAgIAAIgRFDQEgAEE6NgIcIAAgBDYCDCAAIA9BAWo2AhRBACEQDD4LIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCxgICAACIERQ0AIABBOzYCHCAAIAQ2AgwgACABQQFqNgIUQQAhEAw+CyABQQFqIQEMLQsgD0EBaiEBDC0LIABBADYCHCAAIA82AhQgAEHkkoCAADYCECAAQQQ2AgxBACEQDDsLIABBNjYCHCAAIAQ2AhQgACACNgIMQQAhEAw6CyAAQS42AhwgACAONgIUIAAgBDYCDEEAIRAMOQsgAEHQADYCHCAAIAE2AhQgAEGRmICAADYCECAAQRU2AgxBACEQDDgLIA1BAWohAQwsCyAAQRU2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAw2CyAAQRs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw1CyAAQQ82AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw0CyAAQQs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAwzCyAAQRo2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwyCyAAQQs2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwxCyAAQQo2AhwgACABNgIUIABB5JaAgAA2AhAgAEEVNgIMQQAhEAwwCyAAQR42AhwgACABNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAwvCyAAQQA2AhwgACAQNgIUIABB2o2AgAA2AhAgAEEUNgIMQQAhEAwuCyAAQQQ2AhwgACABNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAwtCyAAQQA2AgAgC0EBaiELC0G4ASEQDBILIABBADYCACAQQQFqIQFB9QAhEAwRCyABIQECQCAALQApQQVHDQBB4wAhEAwRC0HiACEQDBALQQAhECAAQQA2AhwgAEHkkYCAADYCECAAQQc2AgwgACAUQQFqNgIUDCgLIABBADYCACAXQQFqIQFBwAAhEAwOC0EBIQELIAAgAToALCAAQQA2AgAgF0EBaiEBC0EoIRAMCwsgASEBC0E4IRAMCQsCQCABIg8gAkYNAANAAkAgDy0AAEGAvoCAAGotAAAiAUEBRg0AIAFBAkcNAyAPQQFqIQEMBAsgD0EBaiIPIAJHDQALQT4hEAwiC0E+IRAMIQsgAEEAOgAsIA8hAQwBC0ELIRAMBgtBOiEQDAULIAFBAWohAUEtIRAMBAsgACABOgAsIABBADYCACAWQQFqIQFBDCEQDAMLIABBADYCACAXQQFqIQFBCiEQDAILIABBADYCAAsgAEEAOgAsIA0hAUEJIRAMAAsLQQAhECAAQQA2AhwgACALNgIUIABBzZCAgAA2AhAgAEEJNgIMDBcLQQAhECAAQQA2AhwgACAKNgIUIABB6YqAgAA2AhAgAEEJNgIMDBYLQQAhECAAQQA2AhwgACAJNgIUIABBt5CAgAA2AhAgAEEJNgIMDBULQQAhECAAQQA2AhwgACAINgIUIABBnJGAgAA2AhAgAEEJNgIMDBQLQQAhECAAQQA2AhwgACABNgIUIABBzZCAgAA2AhAgAEEJNgIMDBMLQQAhECAAQQA2AhwgACABNgIUIABB6YqAgAA2AhAgAEEJNgIMDBILQQAhECAAQQA2AhwgACABNgIUIABBt5CAgAA2AhAgAEEJNgIMDBELQQAhECAAQQA2AhwgACABNgIUIABBnJGAgAA2AhAgAEEJNgIMDBALQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA8LQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA4LQQAhECAAQQA2AhwgACABNgIUIABBwJKAgAA2AhAgAEELNgIMDA0LQQAhECAAQQA2AhwgACABNgIUIABBlYmAgAA2AhAgAEELNgIMDAwLQQAhECAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMDAsLQQAhECAAQQA2AhwgACABNgIUIABB+4+AgAA2AhAgAEEKNgIMDAoLQQAhECAAQQA2AhwgACABNgIUIABB8ZmAgAA2AhAgAEECNgIMDAkLQQAhECAAQQA2AhwgACABNgIUIABBxJSAgAA2AhAgAEECNgIMDAgLQQAhECAAQQA2AhwgACABNgIUIABB8pWAgAA2AhAgAEECNgIMDAcLIABBAjYCHCAAIAE2AhQgAEGcmoCAADYCECAAQRY2AgxBACEQDAYLQQEhEAwFC0HUACEQIAEiBCACRg0EIANBCGogACAEIAJB2MKAgABBChDFgICAACADKAIMIQQgAygCCA4DAQQCAAsQyoCAgAAACyAAQQA2AhwgAEG1moCAADYCECAAQRc2AgwgACAEQQFqNgIUQQAhEAwCCyAAQQA2AhwgACAENgIUIABBypqAgAA2AhAgAEEJNgIMQQAhEAwBCwJAIAEiBCACRw0AQSIhEAwBCyAAQYmAgIAANgIIIAAgBDYCBEEhIRALIANBEGokgICAgAAgEAuvAQECfyABKAIAIQYCQAJAIAIgA0YNACAEIAZqIQQgBiADaiACayEHIAIgBkF/cyAFaiIGaiEFA0ACQCACLQAAIAQtAABGDQBBAiEEDAMLAkAgBg0AQQAhBCAFIQIMAwsgBkF/aiEGIARBAWohBCACQQFqIgIgA0cNAAsgByEGIAMhAgsgAEEBNgIAIAEgBjYCACAAIAI2AgQPCyABQQA2AgAgACAENgIAIAAgAjYCBAsKACAAEMeAgIAAC/I2AQt/I4CAgIAAQRBrIgEkgICAgAACQEEAKAKg0ICAAA0AQQAQy4CAgABBgNSEgABrIgJB2QBJDQBBACEDAkBBACgC4NOAgAAiBA0AQQBCfzcC7NOAgABBAEKAgISAgIDAADcC5NOAgABBACABQQhqQXBxQdiq1aoFcyIENgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgAALQQAgAjYCzNOAgABBAEGA1ISAADYCyNOAgABBAEGA1ISAADYCmNCAgABBACAENgKs0ICAAEEAQX82AqjQgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAtBgNSEgABBeEGA1ISAAGtBD3FBAEGA1ISAAEEIakEPcRsiA2oiBEEEaiACQUhqIgUgA2siA0EBcjYCAEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgABBgNSEgAAgBWpBODYCBAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEHsAUsNAAJAQQAoAojQgIAAIgZBECAAQRNqQXBxIABBC0kbIgJBA3YiBHYiA0EDcUUNAAJAAkAgA0EBcSAEckEBcyIFQQN0IgRBsNCAgABqIgMgBEG40ICAAGooAgAiBCgCCCICRw0AQQAgBkF+IAV3cTYCiNCAgAAMAQsgAyACNgIIIAIgAzYCDAsgBEEIaiEDIAQgBUEDdCIFQQNyNgIEIAQgBWoiBCAEKAIEQQFyNgIEDAwLIAJBACgCkNCAgAAiB00NAQJAIANFDQACQAJAIAMgBHRBAiAEdCIDQQAgA2tycSIDQQAgA2txQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmoiBEEDdCIDQbDQgIAAaiIFIANBuNCAgABqKAIAIgMoAggiAEcNAEEAIAZBfiAEd3EiBjYCiNCAgAAMAQsgBSAANgIIIAAgBTYCDAsgAyACQQNyNgIEIAMgBEEDdCIEaiAEIAJrIgU2AgAgAyACaiIAIAVBAXI2AgQCQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhBAJAAkAgBkEBIAdBA3Z0IghxDQBBACAGIAhyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAQ2AgwgAiAENgIIIAQgAjYCDCAEIAg2AggLIANBCGohA0EAIAA2ApzQgIAAQQAgBTYCkNCAgAAMDAtBACgCjNCAgAAiCUUNASAJQQAgCWtxQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmpBAnRBuNKAgABqKAIAIgAoAgRBeHEgAmshBCAAIQUCQANAAkAgBSgCECIDDQAgBUEUaigCACIDRQ0CCyADKAIEQXhxIAJrIgUgBCAFIARJIgUbIQQgAyAAIAUbIQAgAyEFDAALCyAAKAIYIQoCQCAAKAIMIgggAEYNACAAKAIIIgNBACgCmNCAgABJGiAIIAM2AgggAyAINgIMDAsLAkAgAEEUaiIFKAIAIgMNACAAKAIQIgNFDQMgAEEQaiEFCwNAIAUhCyADIghBFGoiBSgCACIDDQAgCEEQaiEFIAgoAhAiAw0ACyALQQA2AgAMCgtBfyECIABBv39LDQAgAEETaiIDQXBxIQJBACgCjNCAgAAiB0UNAEEAIQsCQCACQYACSQ0AQR8hCyACQf///wdLDQAgA0EIdiIDIANBgP4/akEQdkEIcSIDdCIEIARBgOAfakEQdkEEcSIEdCIFIAVBgIAPakEQdkECcSIFdEEPdiADIARyIAVyayIDQQF0IAIgA0EVanZBAXFyQRxqIQsLQQAgAmshBAJAAkACQAJAIAtBAnRBuNKAgABqKAIAIgUNAEEAIQNBACEIDAELQQAhAyACQQBBGSALQQF2ayALQR9GG3QhAEEAIQgDQAJAIAUoAgRBeHEgAmsiBiAETw0AIAYhBCAFIQggBg0AQQAhBCAFIQggBSEDDAMLIAMgBUEUaigCACIGIAYgBSAAQR12QQRxakEQaigCACIFRhsgAyAGGyEDIABBAXQhACAFDQALCwJAIAMgCHINAEEAIQhBAiALdCIDQQAgA2tyIAdxIgNFDQMgA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBUEFdkEIcSIAIANyIAUgAHYiA0ECdkEEcSIFciADIAV2IgNBAXZBAnEiBXIgAyAFdiIDQQF2QQFxIgVyIAMgBXZqQQJ0QbjSgIAAaigCACEDCyADRQ0BCwNAIAMoAgRBeHEgAmsiBiAESSEAAkAgAygCECIFDQAgA0EUaigCACEFCyAGIAQgABshBCADIAggABshCCAFIQMgBQ0ACwsgCEUNACAEQQAoApDQgIAAIAJrTw0AIAgoAhghCwJAIAgoAgwiACAIRg0AIAgoAggiA0EAKAKY0ICAAEkaIAAgAzYCCCADIAA2AgwMCQsCQCAIQRRqIgUoAgAiAw0AIAgoAhAiA0UNAyAIQRBqIQULA0AgBSEGIAMiAEEUaiIFKAIAIgMNACAAQRBqIQUgACgCECIDDQALIAZBADYCAAwICwJAQQAoApDQgIAAIgMgAkkNAEEAKAKc0ICAACEEAkACQCADIAJrIgVBEEkNACAEIAJqIgAgBUEBcjYCBEEAIAU2ApDQgIAAQQAgADYCnNCAgAAgBCADaiAFNgIAIAQgAkEDcjYCBAwBCyAEIANBA3I2AgQgBCADaiIDIAMoAgRBAXI2AgRBAEEANgKc0ICAAEEAQQA2ApDQgIAACyAEQQhqIQMMCgsCQEEAKAKU0ICAACIAIAJNDQBBACgCoNCAgAAiAyACaiIEIAAgAmsiBUEBcjYCBEEAIAU2ApTQgIAAQQAgBDYCoNCAgAAgAyACQQNyNgIEIANBCGohAwwKCwJAAkBBACgC4NOAgABFDQBBACgC6NOAgAAhBAwBC0EAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEMakFwcUHYqtWqBXM2AuDTgIAAQQBBADYC9NOAgABBAEEANgLE04CAAEGAgAQhBAtBACEDAkAgBCACQccAaiIHaiIGQQAgBGsiC3EiCCACSw0AQQBBMDYC+NOAgAAMCgsCQEEAKALA04CAACIDRQ0AAkBBACgCuNOAgAAiBCAIaiIFIARNDQAgBSADTQ0BC0EAIQNBAEEwNgL404CAAAwKC0EALQDE04CAAEEEcQ0EAkACQAJAQQAoAqDQgIAAIgRFDQBByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiAESw0DCyADKAIIIgMNAAsLQQAQy4CAgAAiAEF/Rg0FIAghBgJAQQAoAuTTgIAAIgNBf2oiBCAAcUUNACAIIABrIAQgAGpBACADa3FqIQYLIAYgAk0NBSAGQf7///8HSw0FAkBBACgCwNOAgAAiA0UNAEEAKAK404CAACIEIAZqIgUgBE0NBiAFIANLDQYLIAYQy4CAgAAiAyAARw0BDAcLIAYgAGsgC3EiBkH+////B0sNBCAGEMuAgIAAIgAgAygCACADKAIEakYNAyAAIQMLAkAgA0F/Rg0AIAJByABqIAZNDQACQCAHIAZrQQAoAujTgIAAIgRqQQAgBGtxIgRB/v///wdNDQAgAyEADAcLAkAgBBDLgICAAEF/Rg0AIAQgBmohBiADIQAMBwtBACAGaxDLgICAABoMBAsgAyEAIANBf0cNBQwDC0EAIQgMBwtBACEADAULIABBf0cNAgtBAEEAKALE04CAAEEEcjYCxNOAgAALIAhB/v///wdLDQEgCBDLgICAACEAQQAQy4CAgAAhAyAAQX9GDQEgA0F/Rg0BIAAgA08NASADIABrIgYgAkE4ak0NAQtBAEEAKAK404CAACAGaiIDNgK404CAAAJAIANBACgCvNOAgABNDQBBACADNgK804CAAAsCQAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQCAAIAMoAgAiBSADKAIEIghqRg0CIAMoAggiAw0ADAMLCwJAAkBBACgCmNCAgAAiA0UNACAAIANPDQELQQAgADYCmNCAgAALQQAhA0EAIAY2AszTgIAAQQAgADYCyNOAgABBAEF/NgKo0ICAAEEAQQAoAuDTgIAANgKs0ICAAEEAQQA2AtTTgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiBCAGQUhqIgUgA2siA0EBcjYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgAAgACAFakE4NgIEDAILIAMtAAxBCHENACAEIAVJDQAgBCAATw0AIARBeCAEa0EPcUEAIARBCGpBD3EbIgVqIgBBACgClNCAgAAgBmoiCyAFayIFQQFyNgIEIAMgCCAGajYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAU2ApTQgIAAQQAgADYCoNCAgAAgBCALakE4NgIEDAELAkAgAEEAKAKY0ICAACIITw0AQQAgADYCmNCAgAAgACEICyAAIAZqIQVByNOAgAAhAwJAAkACQAJAAkACQAJAA0AgAygCACAFRg0BIAMoAggiAw0ADAILCyADLQAMQQhxRQ0BC0HI04CAACEDA0ACQCADKAIAIgUgBEsNACAFIAMoAgRqIgUgBEsNAwsgAygCCCEDDAALCyADIAA2AgAgAyADKAIEIAZqNgIEIABBeCAAa0EPcUEAIABBCGpBD3EbaiILIAJBA3I2AgQgBUF4IAVrQQ9xQQAgBUEIakEPcRtqIgYgCyACaiICayEDAkAgBiAERw0AQQAgAjYCoNCAgABBAEEAKAKU0ICAACADaiIDNgKU0ICAACACIANBAXI2AgQMAwsCQCAGQQAoApzQgIAARw0AQQAgAjYCnNCAgABBAEEAKAKQ0ICAACADaiIDNgKQ0ICAACACIANBAXI2AgQgAiADaiADNgIADAMLAkAgBigCBCIEQQNxQQFHDQAgBEF4cSEHAkACQCAEQf8BSw0AIAYoAggiBSAEQQN2IghBA3RBsNCAgABqIgBGGgJAIAYoAgwiBCAFRw0AQQBBACgCiNCAgABBfiAId3E2AojQgIAADAILIAQgAEYaIAQgBTYCCCAFIAQ2AgwMAQsgBigCGCEJAkACQCAGKAIMIgAgBkYNACAGKAIIIgQgCEkaIAAgBDYCCCAEIAA2AgwMAQsCQCAGQRRqIgQoAgAiBQ0AIAZBEGoiBCgCACIFDQBBACEADAELA0AgBCEIIAUiAEEUaiIEKAIAIgUNACAAQRBqIQQgACgCECIFDQALIAhBADYCAAsgCUUNAAJAAkAgBiAGKAIcIgVBAnRBuNKAgABqIgQoAgBHDQAgBCAANgIAIAANAUEAQQAoAozQgIAAQX4gBXdxNgKM0ICAAAwCCyAJQRBBFCAJKAIQIAZGG2ogADYCACAARQ0BCyAAIAk2AhgCQCAGKAIQIgRFDQAgACAENgIQIAQgADYCGAsgBigCFCIERQ0AIABBFGogBDYCACAEIAA2AhgLIAcgA2ohAyAGIAdqIgYoAgQhBAsgBiAEQX5xNgIEIAIgA2ogAzYCACACIANBAXI2AgQCQCADQf8BSw0AIANBeHFBsNCAgABqIQQCQAJAQQAoAojQgIAAIgVBASADQQN2dCIDcQ0AQQAgBSADcjYCiNCAgAAgBCEDDAELIAQoAgghAwsgAyACNgIMIAQgAjYCCCACIAQ2AgwgAiADNgIIDAMLQR8hBAJAIANB////B0sNACADQQh2IgQgBEGA/j9qQRB2QQhxIgR0IgUgBUGA4B9qQRB2QQRxIgV0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAQgBXIgAHJrIgRBAXQgAyAEQRVqdkEBcXJBHGohBAsgAiAENgIcIAJCADcCECAEQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiAEEBIAR0IghxDQAgBSACNgIAQQAgACAIcjYCjNCAgAAgAiAFNgIYIAIgAjYCCCACIAI2AgwMAwsgA0EAQRkgBEEBdmsgBEEfRht0IQQgBSgCACEAA0AgACIFKAIEQXhxIANGDQIgBEEddiEAIARBAXQhBCAFIABBBHFqQRBqIggoAgAiAA0ACyAIIAI2AgAgAiAFNgIYIAIgAjYCDCACIAI2AggMAgsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiCyAGQUhqIgggA2siA0EBcjYCBCAAIAhqQTg2AgQgBCAFQTcgBWtBD3FBACAFQUlqQQ9xG2pBQWoiCCAIIARBEGpJGyIIQSM2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAs2AqDQgIAAIAhBEGpBACkC0NOAgAA3AgAgCEEAKQLI04CAADcCCEEAIAhBCGo2AtDTgIAAQQAgBjYCzNOAgABBACAANgLI04CAAEEAQQA2AtTTgIAAIAhBJGohAwNAIANBBzYCACADQQRqIgMgBUkNAAsgCCAERg0DIAggCCgCBEF+cTYCBCAIIAggBGsiADYCACAEIABBAXI2AgQCQCAAQf8BSw0AIABBeHFBsNCAgABqIQMCQAJAQQAoAojQgIAAIgVBASAAQQN2dCIAcQ0AQQAgBSAAcjYCiNCAgAAgAyEFDAELIAMoAgghBQsgBSAENgIMIAMgBDYCCCAEIAM2AgwgBCAFNgIIDAQLQR8hAwJAIABB////B0sNACAAQQh2IgMgA0GA/j9qQRB2QQhxIgN0IgUgBUGA4B9qQRB2QQRxIgV0IgggCEGAgA9qQRB2QQJxIgh0QQ92IAMgBXIgCHJrIgNBAXQgACADQRVqdkEBcXJBHGohAwsgBCADNgIcIARCADcCECADQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiCEEBIAN0IgZxDQAgBSAENgIAQQAgCCAGcjYCjNCAgAAgBCAFNgIYIAQgBDYCCCAEIAQ2AgwMBAsgAEEAQRkgA0EBdmsgA0EfRht0IQMgBSgCACEIA0AgCCIFKAIEQXhxIABGDQMgA0EddiEIIANBAXQhAyAFIAhBBHFqQRBqIgYoAgAiCA0ACyAGIAQ2AgAgBCAFNgIYIAQgBDYCDCAEIAQ2AggMAwsgBSgCCCIDIAI2AgwgBSACNgIIIAJBADYCGCACIAU2AgwgAiADNgIICyALQQhqIQMMBQsgBSgCCCIDIAQ2AgwgBSAENgIIIARBADYCGCAEIAU2AgwgBCADNgIIC0EAKAKU0ICAACIDIAJNDQBBACgCoNCAgAAiBCACaiIFIAMgAmsiA0EBcjYCBEEAIAM2ApTQgIAAQQAgBTYCoNCAgAAgBCACQQNyNgIEIARBCGohAwwDC0EAIQNBAEEwNgL404CAAAwCCwJAIAtFDQACQAJAIAggCCgCHCIFQQJ0QbjSgIAAaiIDKAIARw0AIAMgADYCACAADQFBACAHQX4gBXdxIgc2AozQgIAADAILIAtBEEEUIAsoAhAgCEYbaiAANgIAIABFDQELIAAgCzYCGAJAIAgoAhAiA0UNACAAIAM2AhAgAyAANgIYCyAIQRRqKAIAIgNFDQAgAEEUaiADNgIAIAMgADYCGAsCQAJAIARBD0sNACAIIAQgAmoiA0EDcjYCBCAIIANqIgMgAygCBEEBcjYCBAwBCyAIIAJqIgAgBEEBcjYCBCAIIAJBA3I2AgQgACAEaiAENgIAAkAgBEH/AUsNACAEQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgBEEDdnQiBHENAEEAIAUgBHI2AojQgIAAIAMhBAwBCyADKAIIIQQLIAQgADYCDCADIAA2AgggACADNgIMIAAgBDYCCAwBC0EfIQMCQCAEQf///wdLDQAgBEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCICIAJBgIAPakEQdkECcSICdEEPdiADIAVyIAJyayIDQQF0IAQgA0EVanZBAXFyQRxqIQMLIAAgAzYCHCAAQgA3AhAgA0ECdEG40oCAAGohBQJAIAdBASADdCICcQ0AIAUgADYCAEEAIAcgAnI2AozQgIAAIAAgBTYCGCAAIAA2AgggACAANgIMDAELIARBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhAgJAA0AgAiIFKAIEQXhxIARGDQEgA0EddiECIANBAXQhAyAFIAJBBHFqQRBqIgYoAgAiAg0ACyAGIAA2AgAgACAFNgIYIAAgADYCDCAAIAA2AggMAQsgBSgCCCIDIAA2AgwgBSAANgIIIABBADYCGCAAIAU2AgwgACADNgIICyAIQQhqIQMMAQsCQCAKRQ0AAkACQCAAIAAoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAg2AgAgCA0BQQAgCUF+IAV3cTYCjNCAgAAMAgsgCkEQQRQgCigCECAARhtqIAg2AgAgCEUNAQsgCCAKNgIYAkAgACgCECIDRQ0AIAggAzYCECADIAg2AhgLIABBFGooAgAiA0UNACAIQRRqIAM2AgAgAyAINgIYCwJAAkAgBEEPSw0AIAAgBCACaiIDQQNyNgIEIAAgA2oiAyADKAIEQQFyNgIEDAELIAAgAmoiBSAEQQFyNgIEIAAgAkEDcjYCBCAFIARqIAQ2AgACQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhAwJAAkBBASAHQQN2dCIIIAZxDQBBACAIIAZyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAM2AgwgAiADNgIIIAMgAjYCDCADIAg2AggLQQAgBTYCnNCAgABBACAENgKQ0ICAAAsgAEEIaiEDCyABQRBqJICAgIAAIAMLCgAgABDJgICAAAviDQEHfwJAIABFDQAgAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkAgAkEBcQ0AIAJBA3FFDQEgASABKAIAIgJrIgFBACgCmNCAgAAiBEkNASACIABqIQACQCABQQAoApzQgIAARg0AAkAgAkH/AUsNACABKAIIIgQgAkEDdiIFQQN0QbDQgIAAaiIGRhoCQCABKAIMIgIgBEcNAEEAQQAoAojQgIAAQX4gBXdxNgKI0ICAAAwDCyACIAZGGiACIAQ2AgggBCACNgIMDAILIAEoAhghBwJAAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiAGIAI2AgggAiAGNgIMDAELAkAgAUEUaiICKAIAIgQNACABQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQECQAJAIAEgASgCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAwsgB0EQQRQgBygCECABRhtqIAY2AgAgBkUNAgsgBiAHNgIYAkAgASgCECICRQ0AIAYgAjYCECACIAY2AhgLIAEoAhQiAkUNASAGQRRqIAI2AgAgAiAGNgIYDAELIAMoAgQiAkEDcUEDRw0AIAMgAkF+cTYCBEEAIAA2ApDQgIAAIAEgAGogADYCACABIABBAXI2AgQPCyABIANPDQAgAygCBCICQQFxRQ0AAkACQCACQQJxDQACQCADQQAoAqDQgIAARw0AQQAgATYCoNCAgABBAEEAKAKU0ICAACAAaiIANgKU0ICAACABIABBAXI2AgQgAUEAKAKc0ICAAEcNA0EAQQA2ApDQgIAAQQBBADYCnNCAgAAPCwJAIANBACgCnNCAgABHDQBBACABNgKc0ICAAEEAQQAoApDQgIAAIABqIgA2ApDQgIAAIAEgAEEBcjYCBCABIABqIAA2AgAPCyACQXhxIABqIQACQAJAIAJB/wFLDQAgAygCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgAygCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAgsgAiAGRhogAiAENgIIIAQgAjYCDAwBCyADKAIYIQcCQAJAIAMoAgwiBiADRg0AIAMoAggiAkEAKAKY0ICAAEkaIAYgAjYCCCACIAY2AgwMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEGDAELA0AgAiEFIAQiBkEUaiICKAIAIgQNACAGQRBqIQIgBigCECIEDQALIAVBADYCAAsgB0UNAAJAAkAgAyADKAIcIgRBAnRBuNKAgABqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoAozQgIAAQX4gBHdxNgKM0ICAAAwCCyAHQRBBFCAHKAIQIANGG2ogBjYCACAGRQ0BCyAGIAc2AhgCQCADKAIQIgJFDQAgBiACNgIQIAIgBjYCGAsgAygCFCICRQ0AIAZBFGogAjYCACACIAY2AhgLIAEgAGogADYCACABIABBAXI2AgQgAUEAKAKc0ICAAEcNAUEAIAA2ApDQgIAADwsgAyACQX5xNgIEIAEgAGogADYCACABIABBAXI2AgQLAkAgAEH/AUsNACAAQXhxQbDQgIAAaiECAkACQEEAKAKI0ICAACIEQQEgAEEDdnQiAHENAEEAIAQgAHI2AojQgIAAIAIhAAwBCyACKAIIIQALIAAgATYCDCACIAE2AgggASACNgIMIAEgADYCCA8LQR8hAgJAIABB////B0sNACAAQQh2IgIgAkGA/j9qQRB2QQhxIgJ0IgQgBEGA4B9qQRB2QQRxIgR0IgYgBkGAgA9qQRB2QQJxIgZ0QQ92IAIgBHIgBnJrIgJBAXQgACACQRVqdkEBcXJBHGohAgsgASACNgIcIAFCADcCECACQQJ0QbjSgIAAaiEEAkACQEEAKAKM0ICAACIGQQEgAnQiA3ENACAEIAE2AgBBACAGIANyNgKM0ICAACABIAQ2AhggASABNgIIIAEgATYCDAwBCyAAQQBBGSACQQF2ayACQR9GG3QhAiAEKAIAIQYCQANAIAYiBCgCBEF4cSAARg0BIAJBHXYhBiACQQF0IQIgBCAGQQRxakEQaiIDKAIAIgYNAAsgAyABNgIAIAEgBDYCGCABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAKo0ICAAEF/aiIBQX8gARs2AqjQgIAACwsEAAAAC04AAkAgAA0APwBBEHQPCwJAIABB//8DcQ0AIABBf0wNAAJAIABBEHZAACIAQX9HDQBBAEEwNgL404CAAEF/DwsgAEEQdA8LEMqAgIAAAAvyAgIDfwF+AkAgAkUNACAAIAE6AAAgAiAAaiIDQX9qIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0F9aiABOgAAIANBfmogAToAACACQQdJDQAgACABOgADIANBfGogAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkF8aiABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBeGogATYCACACQXRqIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQXBqIAE2AgAgAkFsaiABNgIAIAJBaGogATYCACACQWRqIAE2AgAgBCADQQRxQRhyIgVrIgJBIEkNACABrUKBgICAEH4hBiADIAVqIQEDQCABIAY3AxggASAGNwMQIAEgBjcDCCABIAY3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAsLjkgBAEGACAuGSAEAAAACAAAAAwAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAYAAAAHAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==", "base64");
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/constants.js
+var require_constants4 = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/constants.js"(exports, module2) {
+ "use strict";
+ var corsSafeListedMethods = ["GET", "HEAD", "POST"];
+ var corsSafeListedMethodsSet = new Set(corsSafeListedMethods);
+ var nullBodyStatus = [101, 204, 205, 304];
+ var redirectStatus = [301, 302, 303, 307, 308];
+ var redirectStatusSet = new Set(redirectStatus);
+ var 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",
+ "4190",
+ "5060",
+ "5061",
+ "6000",
+ "6566",
+ "6665",
+ "6666",
+ "6667",
+ "6668",
+ "6669",
+ "6679",
+ "6697",
+ "10080"
+ ];
+ var badPortsSet = new Set(badPorts);
+ var referrerPolicy = [
+ "",
+ "no-referrer",
+ "no-referrer-when-downgrade",
+ "same-origin",
+ "origin",
+ "strict-origin",
+ "origin-when-cross-origin",
+ "strict-origin-when-cross-origin",
+ "unsafe-url"
+ ];
+ var referrerPolicySet = new Set(referrerPolicy);
+ var requestRedirect = ["follow", "manual", "error"];
+ var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"];
+ var safeMethodsSet = new Set(safeMethods);
+ var requestMode = ["navigate", "same-origin", "no-cors", "cors"];
+ var requestCredentials = ["omit", "same-origin", "include"];
+ var requestCache = [
+ "default",
+ "no-store",
+ "reload",
+ "no-cache",
+ "force-cache",
+ "only-if-cached"
+ ];
+ var 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"
+ ];
+ var requestDuplex = [
+ "half"
+ ];
+ var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"];
+ var forbiddenMethodsSet = new Set(forbiddenMethods);
+ var subresource = [
+ "audio",
+ "audioworklet",
+ "font",
+ "image",
+ "manifest",
+ "paintworklet",
+ "script",
+ "style",
+ "track",
+ "video",
+ "xslt",
+ ""
+ ];
+ var subresourceSet = new Set(subresource);
+ module2.exports = {
+ subresource,
+ forbiddenMethods,
+ requestBodyHeader,
+ referrerPolicy,
+ requestRedirect,
+ requestMode,
+ requestCredentials,
+ requestCache,
+ redirectStatus,
+ corsSafeListedMethods,
+ nullBodyStatus,
+ safeMethods,
+ badPorts,
+ requestDuplex,
+ subresourceSet,
+ badPortsSet,
+ redirectStatusSet,
+ corsSafeListedMethodsSet,
+ safeMethodsSet,
+ forbiddenMethodsSet,
+ referrerPolicySet
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/global.js
+var require_global = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/global.js"(exports, module2) {
+ "use strict";
+ var globalOrigin = Symbol.for("undici.globalOrigin.1");
+ function getGlobalOrigin() {
+ return globalThis[globalOrigin];
+ }
+ function setGlobalOrigin(newOrigin) {
+ if (newOrigin === void 0) {
+ Object.defineProperty(globalThis, globalOrigin, {
+ value: void 0,
+ 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
+ });
+ }
+ module2.exports = {
+ getGlobalOrigin,
+ setGlobalOrigin
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/data-url.js
+var require_data_url = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/data-url.js"(exports, module2) {
+ "use strict";
+ var assert3 = require("node:assert");
+ var encoder = new TextEncoder();
+ var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/;
+ var HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/;
+ var ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g;
+ var HTTP_QUOTED_STRING_TOKENS = /[\u0009\u0020-\u007E\u0080-\u00FF]/;
+ function dataURLProcessor(dataURL) {
+ assert3(dataURL.protocol === "data:");
+ let input = URLSerializer(dataURL, true);
+ input = input.slice(5);
+ const position = { position: 0 };
+ let mimeType = collectASequenceOfCodePointsFast(
+ ",",
+ input,
+ position
+ );
+ const mimeTypeLength = mimeType.length;
+ mimeType = removeASCIIWhitespace(mimeType, true, true);
+ if (position.position >= input.length) {
+ return "failure";
+ }
+ position.position++;
+ const encodedBody = input.slice(mimeTypeLength + 1);
+ let body = stringPercentDecode(encodedBody);
+ if (/;(\u0020){0,}base64$/i.test(mimeType)) {
+ const stringBody = isomorphicDecode(body);
+ body = forgivingBase64(stringBody);
+ if (body === "failure") {
+ return "failure";
+ }
+ mimeType = mimeType.slice(0, -6);
+ mimeType = mimeType.replace(/(\u0020)+$/, "");
+ mimeType = mimeType.slice(0, -1);
+ }
+ if (mimeType.startsWith(";")) {
+ mimeType = "text/plain" + mimeType;
+ }
+ let mimeTypeRecord = parseMIMEType(mimeType);
+ if (mimeTypeRecord === "failure") {
+ mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII");
+ }
+ return { mimeType: mimeTypeRecord, body };
+ }
+ function URLSerializer(url, excludeFragment = false) {
+ if (!excludeFragment) {
+ return url.href;
+ }
+ const href = url.href;
+ const hashLength = url.hash.length;
+ const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength);
+ if (!hashLength && href.endsWith("#")) {
+ return serialized.slice(0, -1);
+ }
+ return serialized;
+ }
+ function collectASequenceOfCodePoints(condition, input, position) {
+ let result = "";
+ while (position.position < input.length && condition(input[position.position])) {
+ result += input[position.position];
+ position.position++;
+ }
+ return result;
+ }
+ 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);
+ }
+ function stringPercentDecode(input) {
+ const bytes = encoder.encode(input);
+ return percentDecode(bytes);
+ }
+ function isHexCharByte(byte) {
+ return byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102;
+ }
+ function hexByteToNumber(byte) {
+ return (
+ // 0-9
+ byte >= 48 && byte <= 57 ? byte - 48 : (byte & 223) - 55
+ );
+ }
+ function percentDecode(input) {
+ const length = input.length;
+ const output = new Uint8Array(length);
+ let j = 0;
+ for (let i = 0; i < length; ++i) {
+ const byte = input[i];
+ if (byte !== 37) {
+ output[j++] = byte;
+ } else if (byte === 37 && !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))) {
+ output[j++] = 37;
+ } else {
+ output[j++] = hexByteToNumber(input[i + 1]) << 4 | hexByteToNumber(input[i + 2]);
+ i += 2;
+ }
+ }
+ return length === j ? output : output.subarray(0, j);
+ }
+ function parseMIMEType(input) {
+ input = removeHTTPWhitespace(input, true, true);
+ const position = { position: 0 };
+ const type = collectASequenceOfCodePointsFast(
+ "/",
+ input,
+ position
+ );
+ if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) {
+ return "failure";
+ }
+ if (position.position > input.length) {
+ return "failure";
+ }
+ position.position++;
+ let subtype = collectASequenceOfCodePointsFast(
+ ";",
+ input,
+ position
+ );
+ subtype = removeHTTPWhitespace(subtype, false, true);
+ if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) {
+ return "failure";
+ }
+ const typeLowercase = type.toLowerCase();
+ const subtypeLowercase = subtype.toLowerCase();
+ const mimeType = {
+ type: typeLowercase,
+ subtype: subtypeLowercase,
+ /** @type {Map} */
+ parameters: /* @__PURE__ */ new Map(),
+ // https://mimesniff.spec.whatwg.org/#mime-type-essence
+ essence: `${typeLowercase}/${subtypeLowercase}`
+ };
+ while (position.position < input.length) {
+ position.position++;
+ collectASequenceOfCodePoints(
+ // https://fetch.spec.whatwg.org/#http-whitespace
+ (char) => HTTP_WHITESPACE_REGEX.test(char),
+ input,
+ position
+ );
+ let parameterName = collectASequenceOfCodePoints(
+ (char) => char !== ";" && char !== "=",
+ input,
+ position
+ );
+ parameterName = parameterName.toLowerCase();
+ if (position.position < input.length) {
+ if (input[position.position] === ";") {
+ continue;
+ }
+ position.position++;
+ }
+ if (position.position > input.length) {
+ break;
+ }
+ let parameterValue = null;
+ if (input[position.position] === '"') {
+ parameterValue = collectAnHTTPQuotedString(input, position, true);
+ collectASequenceOfCodePointsFast(
+ ";",
+ input,
+ position
+ );
+ } else {
+ parameterValue = collectASequenceOfCodePointsFast(
+ ";",
+ input,
+ position
+ );
+ parameterValue = removeHTTPWhitespace(parameterValue, false, true);
+ if (parameterValue.length === 0) {
+ continue;
+ }
+ }
+ 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);
+ }
+ }
+ return mimeType;
+ }
+ function forgivingBase64(data) {
+ data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, "");
+ let dataLength = data.length;
+ if (dataLength % 4 === 0) {
+ if (data.charCodeAt(dataLength - 1) === 61) {
+ --dataLength;
+ if (data.charCodeAt(dataLength - 1) === 61) {
+ --dataLength;
+ }
+ }
+ }
+ if (dataLength % 4 === 1) {
+ return "failure";
+ }
+ if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) {
+ return "failure";
+ }
+ const buffer = Buffer.from(data, "base64");
+ return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
+ }
+ function collectAnHTTPQuotedString(input, position, extractValue) {
+ const positionStart = position.position;
+ let value = "";
+ assert3(input[position.position] === '"');
+ position.position++;
+ while (true) {
+ value += collectASequenceOfCodePoints(
+ (char) => char !== '"' && char !== "\\",
+ input,
+ position
+ );
+ if (position.position >= input.length) {
+ break;
+ }
+ const quoteOrBackslash = input[position.position];
+ position.position++;
+ if (quoteOrBackslash === "\\") {
+ if (position.position >= input.length) {
+ value += "\\";
+ break;
+ }
+ value += input[position.position];
+ position.position++;
+ } else {
+ assert3(quoteOrBackslash === '"');
+ break;
+ }
+ }
+ if (extractValue) {
+ return value;
+ }
+ return input.slice(positionStart, position.position);
+ }
+ function serializeAMimeType(mimeType) {
+ assert3(mimeType !== "failure");
+ const { parameters, essence } = mimeType;
+ let serialization = essence;
+ for (let [name, value] of parameters.entries()) {
+ serialization += ";";
+ serialization += name;
+ serialization += "=";
+ if (!HTTP_TOKEN_CODEPOINTS.test(value)) {
+ value = value.replace(/(\\|")/g, "\\$1");
+ value = '"' + value;
+ value += '"';
+ }
+ serialization += value;
+ }
+ return serialization;
+ }
+ function isHTTPWhiteSpace(char) {
+ return char === 13 || char === 10 || char === 9 || char === 32;
+ }
+ function removeHTTPWhitespace(str, leading = true, trailing = true) {
+ return removeChars(str, leading, trailing, isHTTPWhiteSpace);
+ }
+ function isASCIIWhitespace(char) {
+ return char === 13 || char === 10 || char === 9 || char === 12 || char === 32;
+ }
+ function removeASCIIWhitespace(str, leading = true, trailing = true) {
+ return removeChars(str, leading, trailing, isASCIIWhitespace);
+ }
+ function removeChars(str, leading, trailing, predicate) {
+ let lead = 0;
+ let trail = str.length - 1;
+ if (leading) {
+ while (lead < str.length && predicate(str.charCodeAt(lead)))
+ lead++;
+ }
+ if (trailing) {
+ while (trail > 0 && predicate(str.charCodeAt(trail)))
+ trail--;
+ }
+ return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1);
+ }
+ function isomorphicDecode(input) {
+ const length = input.length;
+ if ((2 << 15) - 1 > length) {
+ return String.fromCharCode.apply(null, input);
+ }
+ let result = "";
+ let i = 0;
+ let addition = (2 << 15) - 1;
+ while (i < length) {
+ if (i + addition > length) {
+ addition = length - i;
+ }
+ result += String.fromCharCode.apply(null, input.subarray(i, i += addition));
+ }
+ return result;
+ }
+ function minimizeSupportedMimeType(mimeType) {
+ switch (mimeType.essence) {
+ case "application/ecmascript":
+ case "application/javascript":
+ case "application/x-ecmascript":
+ case "application/x-javascript":
+ case "text/ecmascript":
+ case "text/javascript":
+ case "text/javascript1.0":
+ case "text/javascript1.1":
+ case "text/javascript1.2":
+ case "text/javascript1.3":
+ case "text/javascript1.4":
+ case "text/javascript1.5":
+ case "text/jscript":
+ case "text/livescript":
+ case "text/x-ecmascript":
+ case "text/x-javascript":
+ return "text/javascript";
+ case "application/json":
+ case "text/json":
+ return "application/json";
+ case "image/svg+xml":
+ return "image/svg+xml";
+ case "text/xml":
+ case "application/xml":
+ return "application/xml";
+ }
+ if (mimeType.subtype.endsWith("+json")) {
+ return "application/json";
+ }
+ if (mimeType.subtype.endsWith("+xml")) {
+ return "application/xml";
+ }
+ return "";
+ }
+ module2.exports = {
+ dataURLProcessor,
+ URLSerializer,
+ collectASequenceOfCodePoints,
+ collectASequenceOfCodePointsFast,
+ stringPercentDecode,
+ parseMIMEType,
+ collectAnHTTPQuotedString,
+ serializeAMimeType,
+ removeChars,
+ minimizeSupportedMimeType,
+ HTTP_TOKEN_CODEPOINTS,
+ isomorphicDecode
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/webidl.js
+var require_webidl = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/webidl.js"(exports, module2) {
+ "use strict";
+ var { types, inspect } = require("node:util");
+ var { toUSVString } = require_util();
+ var 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 plural2 = context.types.length === 1 ? "" : " one of";
+ const message = `${context.argument} could not be converted to${plural2}: ${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}.`
+ });
+ };
+ webidl.brandCheck = function(V, I, opts = void 0) {
+ if (opts?.strict !== false) {
+ if (!(V instanceof I)) {
+ throw new TypeError("Illegal invocation");
+ }
+ } else {
+ if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) {
+ throw new TypeError("Illegal invocation");
+ }
+ }
+ };
+ 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"
+ });
+ };
+ 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";
+ }
+ }
+ };
webidl.util.ConvertToInt = function(V, bitLength, signedness, opts = {}) {
let upperBound;
let lowerBound;
@@ -9319,7 +8637,7 @@ var require_webidl = __commonJS({
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.`
+ message: `Could not convert ${webidl.util.Stringify(V)} to an integer.`
});
}
x = webidl.util.IntegerPart(x);
@@ -9357,15 +8675,28 @@ var require_webidl = __commonJS({
}
return r;
};
+ webidl.util.Stringify = function(V) {
+ const type = webidl.util.Type(V);
+ switch (type) {
+ case "Symbol":
+ return `Symbol(${V.description})`;
+ case "Object":
+ return inspect(V);
+ case "String":
+ return `"${V}"`;
+ default:
+ return `${V}`;
+ }
+ };
webidl.sequenceConverter = function(converter) {
- return (V) => {
+ return (V, Iterable) => {
if (webidl.util.Type(V) !== "Object") {
throw webidl.errors.exception({
header: "Sequence",
message: `Value of type ${webidl.util.Type(V)} is not an Object.`
});
}
- const method = V?.[Symbol.iterator]?.();
+ const method = typeof Iterable === "function" ? Iterable() : V?.[Symbol.iterator]?.();
const seq = [];
if (method === void 0 || typeof method.next !== "function") {
throw webidl.errors.exception({
@@ -9393,7 +8724,7 @@ var require_webidl = __commonJS({
}
const result = {};
if (!types.isProxy(O)) {
- const keys2 = Object.keys(O);
+ const keys2 = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)];
for (const key of keys2) {
const typedKey = keyConverter(key);
const typedValue = valueConverter(O[key]);
@@ -9418,7 +8749,7 @@ var require_webidl = __commonJS({
if (opts.strict !== false && !(V instanceof i)) {
throw webidl.errors.exception({
header: i.name,
- message: `Expected ${V} to be an instance of ${i.name}.`
+ message: `Expected ${webidl.util.Stringify(V)} to be an instance of ${i.name}.`
});
}
return V;
@@ -9520,8 +8851,8 @@ var require_webidl = __commonJS({
webidl.converters.ArrayBuffer = function(V, opts = {}) {
if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) {
throw webidl.errors.conversionFailed({
- prefix: `${V}`,
- argument: `${V}`,
+ prefix: webidl.util.Stringify(V),
+ argument: webidl.util.Stringify(V),
types: ["ArrayBuffer"]
});
}
@@ -9531,13 +8862,19 @@ var require_webidl = __commonJS({
message: "SharedArrayBuffer is not allowed."
});
}
+ if (V.resizable || V.growable) {
+ throw webidl.errors.exception({
+ header: "ArrayBuffer",
+ message: "Received a resizable ArrayBuffer."
+ });
+ }
return V;
};
webidl.converters.TypedArray = function(V, T, opts = {}) {
if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) {
throw webidl.errors.conversionFailed({
prefix: `${T.name}`,
- argument: `${V}`,
+ argument: webidl.util.Stringify(V),
types: [T.name]
});
}
@@ -9547,6 +8884,12 @@ var require_webidl = __commonJS({
message: "SharedArrayBuffer is not allowed."
});
}
+ if (V.buffer.resizable || V.buffer.growable) {
+ throw webidl.errors.exception({
+ header: "ArrayBuffer",
+ message: "Received a resizable ArrayBuffer."
+ });
+ }
return V;
};
webidl.converters.DataView = function(V, opts = {}) {
@@ -9562,1848 +8905,1787 @@ var require_webidl = __commonJS({
message: "SharedArrayBuffer is not allowed."
});
}
- return V;
- };
- webidl.converters.BufferSource = function(V, opts = {}) {
- if (types.isAnyArrayBuffer(V)) {
- return webidl.converters.ArrayBuffer(V, { ...opts, allowShared: false });
- }
- if (types.isTypedArray(V)) {
- return webidl.converters.TypedArray(V, V.constructor, { ...opts, allowShared: false });
- }
- if (types.isDataView(V)) {
- return webidl.converters.DataView(V, opts, { ...opts, allowShared: false });
- }
- 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
- );
- module2.exports = {
- webidl
- };
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/file.js
-var require_file = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/file.js"(exports, module2) {
- "use strict";
- var { Blob: Blob2, File: NativeFile } = require("node:buffer");
- var { types } = require("node:util");
- var { kState } = require_symbols2();
- var { isBlobLike } = require_util2();
- var { webidl } = require_webidl();
- var { parseMIMEType, serializeAMimeType } = require_dataURL();
- var { kEnumerableProperty } = require_util();
- var encoder = new TextEncoder();
- var File = class _File extends Blob2 {
- constructor(fileBits, fileName, options = {}) {
- webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" });
- fileBits = webidl.converters["sequence"](fileBits);
- fileName = webidl.converters.USVString(fileName);
- options = webidl.converters.FilePropertyBag(options);
- const n = fileName;
- let t = options.type;
- let d;
- substep: {
- if (t) {
- t = parseMIMEType(t);
- if (t === "failure") {
- t = "";
- break substep;
- }
- t = serializeAMimeType(t).toLowerCase();
- }
- d = options.lastModified;
- }
- 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;
- }
- };
- var FileLike = class _FileLike {
- constructor(blobLike, fileName, options = {}) {
- const n = fileName;
- const t = options.type;
- const d = options.lastModified ?? Date.now();
- this[kState] = {
- blobLike,
- name: n,
- type: t,
- lastModified: d
- };
- }
- stream(...args) {
- webidl.brandCheck(this, _FileLike);
- return this[kState].blobLike.stream(...args);
- }
- arrayBuffer(...args) {
- webidl.brandCheck(this, _FileLike);
- return this[kState].blobLike.arrayBuffer(...args);
- }
- slice(...args) {
- webidl.brandCheck(this, _FileLike);
- return this[kState].blobLike.slice(...args);
- }
- text(...args) {
- webidl.brandCheck(this, _FileLike);
- return this[kState].blobLike.text(...args);
- }
- get size() {
- webidl.brandCheck(this, _FileLike);
- return this[kState].blobLike.size;
- }
- get type() {
- webidl.brandCheck(this, _FileLike);
- return this[kState].blobLike.type;
- }
- get name() {
- webidl.brandCheck(this, _FileLike);
- return this[kState].name;
- }
- get lastModified() {
- webidl.brandCheck(this, _FileLike);
- return this[kState].lastModified;
- }
- get [Symbol.toStringTag]() {
- return "File";
- }
- };
- Object.defineProperties(File.prototype, {
- [Symbol.toStringTag]: {
- value: "File",
- configurable: true
- },
- name: kEnumerableProperty,
- lastModified: kEnumerableProperty
- });
- webidl.converters.Blob = webidl.interfaceConverter(Blob2);
- webidl.converters.BlobPart = function(V, opts) {
- 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, opts);
- }
+ if (V.buffer.resizable || V.buffer.growable) {
+ throw webidl.errors.exception({
+ header: "ArrayBuffer",
+ message: "Received a resizable ArrayBuffer."
+ });
}
- return webidl.converters.USVString(V, opts);
+ return V;
};
- webidl.converters["sequence"] = webidl.sequenceConverter(
- webidl.converters.BlobPart
- );
- 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"
- }
- ]);
- function processBlobParts(parts, options) {
- const bytes = [];
- for (const element of parts) {
- if (typeof element === "string") {
- let s = element;
- if (options.endings === "native") {
- s = convertLineEndingsNative(s);
- }
- bytes.push(encoder.encode(s));
- } else if (ArrayBuffer.isView(element) || types.isArrayBuffer(element)) {
- if (element.buffer) {
- bytes.push(
- new Uint8Array(element.buffer, element.byteOffset, element.byteLength)
- );
- } else {
- bytes.push(new Uint8Array(element));
- }
- } else if (isBlobLike(element)) {
- bytes.push(element);
- }
+ webidl.converters.BufferSource = function(V, opts = {}) {
+ if (types.isAnyArrayBuffer(V)) {
+ return webidl.converters.ArrayBuffer(V, { ...opts, allowShared: false });
}
- return bytes;
- }
- function convertLineEndingsNative(s) {
- let nativeLineEnding = "\n";
- if (process.platform === "win32") {
- nativeLineEnding = "\r\n";
+ if (types.isTypedArray(V)) {
+ return webidl.converters.TypedArray(V, V.constructor, { ...opts, allowShared: false });
}
- return s.replace(/\r?\n/g, nativeLineEnding);
- }
- function isFileLike(object) {
- return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File";
- }
- module2.exports = { File, FileLike, isFileLike };
+ if (types.isDataView(V)) {
+ return webidl.converters.DataView(V, opts, { ...opts, allowShared: false });
+ }
+ throw new TypeError(`Could not convert ${webidl.util.Stringify(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
+ );
+ module2.exports = {
+ webidl
+ };
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/formdata.js
-var require_formdata = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/formdata.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/util.js
+var require_util3 = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/util.js"(exports, module2) {
"use strict";
- var { isBlobLike, toUSVString, makeIterator } = require_util2();
- var { kState } = require_symbols2();
- var { kEnumerableProperty } = require_util();
- var { File: UndiciFile, FileLike, isFileLike } = require_file();
+ var { Transform } = require("node:stream");
+ var zlib = require("node:zlib");
+ var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants4();
+ var { getGlobalOrigin } = require_global();
+ var { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = require_data_url();
+ var { performance } = require("node:perf_hooks");
+ var { isBlobLike, ReadableStreamFrom, isValidHTTPToken } = require_util();
+ var assert3 = require("node:assert");
+ var { isUint8Array } = require("node:util/types");
var { webidl } = require_webidl();
- var { File: NativeFile } = require("node:buffer");
- var File = NativeFile ?? UndiciFile;
- var FormData = class _FormData {
- constructor(form) {
- if (form !== void 0) {
- throw webidl.errors.conversionFailed({
- prefix: "FormData constructor",
- argument: "Argument 1",
- types: ["undefined"]
- });
+ var supportedHashes = [];
+ var crypto;
+ try {
+ crypto = require("node:crypto");
+ const possibleRelevantHashes = ["sha256", "sha384", "sha512"];
+ supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash));
+ } catch {
+ }
+ function responseURL(response) {
+ const urlList = response.urlList;
+ const length = urlList.length;
+ return length === 0 ? null : urlList[length - 1].toString();
+ }
+ function responseLocationURL(response, requestFragment) {
+ if (!redirectStatusSet.has(response.status)) {
+ return null;
+ }
+ let location = response.headersList.get("location", true);
+ if (location !== null && isValidHeaderValue(location)) {
+ if (!isValidEncodedURL(location)) {
+ location = normalizeBinaryStringToUtf8(location);
}
- this[kState] = [];
+ location = new URL(location, responseURL(response));
}
- append(name, value, filename = void 0) {
- 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'"
- );
+ if (location && !location.hash) {
+ location.hash = requestFragment;
+ }
+ return location;
+ }
+ function isValidEncodedURL(url) {
+ for (let i = 0; i < url.length; ++i) {
+ const code = url.charCodeAt(i);
+ if (code > 126 || // Non-US-ASCII + DEL
+ code < 32) {
+ return false;
}
- 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) : void 0;
- const entry = makeEntry(name, value, filename);
- this[kState].push(entry);
}
- delete(name) {
- webidl.brandCheck(this, _FormData);
- webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" });
- name = webidl.converters.USVString(name);
- this[kState] = this[kState].filter((entry) => entry.name !== name);
+ return true;
+ }
+ function normalizeBinaryStringToUtf8(value) {
+ return Buffer.from(value, "binary").toString("utf8");
+ }
+ function requestCurrentURL(request) {
+ return request.urlList[request.urlList.length - 1];
+ }
+ function requestBadPort(request) {
+ const url = requestCurrentURL(request);
+ if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {
+ return "blocked";
}
- get(name) {
- webidl.brandCheck(this, _FormData);
- webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" });
- name = webidl.converters.USVString(name);
- const idx = this[kState].findIndex((entry) => entry.name === name);
- if (idx === -1) {
- return null;
+ return "allowed";
+ }
+ function isErrorLike(object) {
+ return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException");
+ }
+ function isValidReasonPhrase(statusText) {
+ for (let i = 0; i < statusText.length; ++i) {
+ const c = statusText.charCodeAt(i);
+ if (!(c === 9 || // HTAB
+ c >= 32 && c <= 126 || // SP / VCHAR
+ c >= 128 && c <= 255)) {
+ return false;
}
- return this[kState][idx].value;
}
- getAll(name) {
- webidl.brandCheck(this, _FormData);
- webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" });
- name = webidl.converters.USVString(name);
- return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value);
+ return true;
+ }
+ var isValidHeaderName = isValidHTTPToken;
+ function isValidHeaderValue(potentialValue) {
+ return (potentialValue[0] === " " || potentialValue[0] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue.includes("\n") || potentialValue.includes("\r") || potentialValue.includes("\0")) === false;
+ }
+ function setRequestReferrerPolicyOnRedirect(request, actualResponse) {
+ const { headersList } = actualResponse;
+ const policyHeader = (headersList.get("referrer-policy", true) ?? "").split(",");
+ let policy = "";
+ if (policyHeader.length > 0) {
+ for (let i = policyHeader.length; i !== 0; i--) {
+ const token = policyHeader[i - 1].trim();
+ if (referrerPolicyTokens.has(token)) {
+ policy = token;
+ break;
+ }
+ }
}
- has(name) {
- webidl.brandCheck(this, _FormData);
- webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" });
- name = webidl.converters.USVString(name);
- return this[kState].findIndex((entry) => entry.name === name) !== -1;
+ if (policy !== "") {
+ request.referrerPolicy = policy;
}
- set(name, value, filename = void 0) {
- 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'"
- );
+ }
+ function crossOriginResourcePolicyCheck() {
+ return "allowed";
+ }
+ function corsCheck() {
+ return "success";
+ }
+ function TAOCheck() {
+ return "success";
+ }
+ function appendFetchMetadata(httpRequest) {
+ let header = null;
+ header = httpRequest.mode;
+ httpRequest.headersList.set("sec-fetch-mode", header, true);
+ }
+ function appendRequestOriginHeader(request) {
+ let serializedOrigin = request.origin;
+ if (request.responseTainting === "cors" || request.mode === "websocket") {
+ if (serializedOrigin) {
+ request.headersList.append("origin", serializedOrigin, true);
}
- name = webidl.converters.USVString(name);
- value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value);
- filename = arguments.length === 3 ? toUSVString(filename) : void 0;
- const entry = makeEntry(name, value, filename);
- const idx = this[kState].findIndex((entry2) => entry2.name === name);
- if (idx !== -1) {
- this[kState] = [
- ...this[kState].slice(0, idx),
- entry,
- ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name)
- ];
- } else {
- this[kState].push(entry);
+ } else if (request.method !== "GET" && request.method !== "HEAD") {
+ switch (request.referrerPolicy) {
+ case "no-referrer":
+ serializedOrigin = null;
+ break;
+ case "no-referrer-when-downgrade":
+ case "strict-origin":
+ case "strict-origin-when-cross-origin":
+ if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) {
+ serializedOrigin = null;
+ }
+ break;
+ case "same-origin":
+ if (!sameOrigin(request, requestCurrentURL(request))) {
+ serializedOrigin = null;
+ }
+ break;
+ default:
+ }
+ if (serializedOrigin) {
+ request.headersList.append("origin", serializedOrigin, true);
+ }
+ }
+ }
+ function coarsenTime(timestamp, crossOriginIsolatedCapability) {
+ return timestamp;
+ }
+ function clampAndCoarsenConnectionTimingInfo(connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) {
+ if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) {
+ return {
+ domainLookupStartTime: defaultStartTime,
+ domainLookupEndTime: defaultStartTime,
+ connectionStartTime: defaultStartTime,
+ connectionEndTime: defaultStartTime,
+ secureConnectionStartTime: defaultStartTime,
+ ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol
+ };
+ }
+ return {
+ domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability),
+ domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability),
+ connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability),
+ connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability),
+ secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability),
+ ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol
+ };
+ }
+ function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) {
+ return coarsenTime(performance.now(), crossOriginIsolatedCapability);
+ }
+ 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
+ };
+ }
+ function makePolicyContainer() {
+ return {
+ referrerPolicy: "strict-origin-when-cross-origin"
+ };
+ }
+ function clonePolicyContainer(policyContainer) {
+ return {
+ referrerPolicy: policyContainer.referrerPolicy
+ };
+ }
+ function determineRequestsReferrer(request) {
+ const policy = request.referrerPolicy;
+ assert3(policy);
+ let referrerSource = null;
+ if (request.referrer === "client") {
+ const globalOrigin = getGlobalOrigin();
+ if (!globalOrigin || globalOrigin.origin === "null") {
+ return "no-referrer";
}
+ referrerSource = new URL(globalOrigin);
+ } else if (request.referrer instanceof URL) {
+ referrerSource = request.referrer;
}
- entries() {
- webidl.brandCheck(this, _FormData);
- return makeIterator(
- () => this[kState],
- "FormData",
- "key+value",
- "name",
- "value"
- );
- }
- keys() {
- webidl.brandCheck(this, _FormData);
- return makeIterator(
- () => this[kState],
- "FormData",
- "key",
- "name",
- "value"
- );
- }
- values() {
- webidl.brandCheck(this, _FormData);
- return makeIterator(
- () => this[kState],
- "FormData",
- "value",
- "name",
- "value"
- );
+ let referrerURL = stripURLForReferrer(referrerSource);
+ const referrerOrigin = stripURLForReferrer(referrerSource, true);
+ if (referrerURL.toString().length > 4096) {
+ referrerURL = referrerOrigin;
}
- /**
- * @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.call(thisArg, value, key, this);
+ const areSameOrigin = sameOrigin(request, referrerURL);
+ const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url);
+ 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);
+ if (sameOrigin(referrerURL, currentURL)) {
+ return referrerURL;
+ }
+ if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {
+ return "no-referrer";
+ }
+ return referrerOrigin;
}
+ case "strict-origin":
+ case "no-referrer-when-downgrade":
+ default:
+ return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin;
}
- };
- FormData.prototype[Symbol.iterator] = FormData.prototype.entries;
- Object.defineProperties(FormData.prototype, {
- append: kEnumerableProperty,
- delete: kEnumerableProperty,
- get: kEnumerableProperty,
- getAll: kEnumerableProperty,
- has: kEnumerableProperty,
- set: kEnumerableProperty,
- entries: kEnumerableProperty,
- keys: kEnumerableProperty,
- values: kEnumerableProperty,
- forEach: kEnumerableProperty,
- [Symbol.iterator]: { enumerable: false },
- [Symbol.toStringTag]: {
- value: "FormData",
- configurable: true
+ }
+ function stripURLForReferrer(url, originOnly) {
+ assert3(url instanceof URL);
+ url = new URL(url);
+ if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") {
+ return "no-referrer";
}
- });
- function makeEntry(name, value, filename) {
- name = Buffer.from(name).toString("utf8");
- if (typeof value === "string") {
- value = Buffer.from(value).toString("utf8");
- } else {
- if (!isFileLike(value)) {
- value = value instanceof Blob ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type });
- }
- if (filename !== void 0) {
- 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);
- }
+ url.username = "";
+ url.password = "";
+ url.hash = "";
+ if (originOnly) {
+ url.pathname = "";
+ url.search = "";
}
- return { name, value };
+ return url;
}
- module2.exports = { FormData };
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/body.js
-var require_body = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/body.js"(exports, module2) {
- "use strict";
- var Busboy = require_main();
- var util = require_util();
- var {
- ReadableStreamFrom,
- isBlobLike,
- isReadableStreamLike,
- readableStreamClose,
- createDeferredPromise,
- fullyReadBody,
- extractMimeType
- } = require_util2();
- var { FormData } = require_formdata();
- var { kState } = require_symbols2();
- var { webidl } = require_webidl();
- var { Blob: Blob2, File: NativeFile } = require("node:buffer");
- var { kBodyUsed } = require_symbols();
- var assert3 = require("node:assert");
- var { isErrored } = require_util();
- var { isUint8Array, isArrayBuffer } = require("util/types");
- var { File: UndiciFile } = require_file();
- var { serializeAMimeType } = require_dataURL();
- var File = NativeFile ?? UndiciFile;
- var textEncoder = new TextEncoder();
- var textDecoder = new TextDecoder();
- function extractBody(object, keepalive = false) {
- let stream = null;
- if (object instanceof ReadableStream) {
- stream = object;
- } else if (isBlobLike(object)) {
- stream = object.stream();
- } else {
- stream = new ReadableStream({
- async pull(controller) {
- const buffer = typeof source === "string" ? textEncoder.encode(source) : source;
- if (buffer.byteLength) {
- controller.enqueue(buffer);
- }
- queueMicrotask(() => readableStreamClose(controller));
- },
- start() {
- },
- type: "bytes"
- });
- }
- assert3(isReadableStreamLike(stream));
- let action = null;
- let source = null;
- let length = null;
- let type = null;
- if (typeof object === "string") {
- source = object;
- type = "text/plain;charset=UTF-8";
- } else if (object instanceof URLSearchParams) {
- source = object.toString();
- type = "application/x-www-form-urlencoded;charset=UTF-8";
- } else if (isArrayBuffer(object)) {
- source = new Uint8Array(object.slice());
- } else if (ArrayBuffer.isView(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
-Content-Disposition: form-data`;
- 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");
- const blobParts = [];
- const rn = new Uint8Array([13, 10]);
- length = 0;
- let hasUnknownSizeValue = false;
- for (const [name, value] of object) {
- if (typeof value === "string") {
- const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r
-\r
-${normalizeLinefeeds(value)}\r
-`);
- blobParts.push(chunk2);
- length += chunk2.byteLength;
- } else {
- const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r
-Content-Type: ${value.type || "application/octet-stream"}\r
-\r
-`);
- blobParts.push(chunk2, value, rn);
- if (typeof value.size === "number") {
- length += chunk2.byteLength + value.size + rn.byteLength;
- } else {
- hasUnknownSizeValue = true;
- }
- }
- }
- const chunk = textEncoder.encode(`--${boundary}--`);
- blobParts.push(chunk);
- length += chunk.byteLength;
- if (hasUnknownSizeValue) {
- length = null;
- }
- source = object;
- action = async function* () {
- for (const part of blobParts) {
- if (part.stream) {
- yield* part.stream();
- } else {
- yield part;
- }
- }
- };
- type = `multipart/form-data; boundary=${boundary}`;
- } else if (isBlobLike(object)) {
- source = object;
- length = object.size;
- if (object.type) {
- type = object.type;
- }
- } else if (typeof object[Symbol.asyncIterator] === "function") {
- if (keepalive) {
- throw new TypeError("keepalive");
- }
- 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);
+ function isURLPotentiallyTrustworthy(url) {
+ if (!(url instanceof URL)) {
+ return false;
}
- if (typeof source === "string" || util.isBuffer(source)) {
- length = Buffer.byteLength(source);
+ if (url.href === "about:blank" || url.href === "about:srcdoc") {
+ return true;
}
- if (action != null) {
- let iterator;
- stream = new ReadableStream({
- async start() {
- iterator = action(object)[Symbol.asyncIterator]();
- },
- async pull(controller) {
- const { value, done } = await iterator.next();
- if (done) {
- queueMicrotask(() => {
- controller.close();
- controller.byobRequest?.respond(0);
- });
- } else {
- if (!isErrored(stream)) {
- const buffer = new Uint8Array(value);
- if (buffer.byteLength) {
- controller.enqueue(buffer);
- }
- }
- }
- return controller.desiredSize > 0;
- },
- async cancel(reason) {
- await iterator.return();
- },
- type: "bytes"
- });
+ if (url.protocol === "data:")
+ return true;
+ if (url.protocol === "file:")
+ return true;
+ return isOriginPotentiallyTrustworthy(url.origin);
+ function isOriginPotentiallyTrustworthy(origin) {
+ if (origin == null || origin === "null")
+ return false;
+ const originAsURL = new URL(origin);
+ if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") {
+ 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;
+ }
+ return false;
}
- const body = { stream, source, length };
- return [body, type];
}
- function safelyExtractBody(object, keepalive = false) {
- if (object instanceof ReadableStream) {
- assert3(!util.isDisturbed(object), "The body has already been consumed.");
- assert3(!object.locked, "The stream is locked.");
+ function bytesMatch(bytes, metadataList) {
+ if (crypto === void 0) {
+ return true;
}
- return extractBody(object, keepalive);
- }
- function cloneBody(body) {
- const [out1, out2] = body.stream.tee();
- const out2Clone = structuredClone(out2, { transfer: [out2] });
- const [, finalClone] = out2Clone.tee();
- body.stream = out1;
- return {
- stream: finalClone,
- length: body.length,
- source: body.source
- };
- }
- 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.");
+ const parsedMetadata = parseMetadata(metadataList);
+ if (parsedMetadata === "no metadata") {
+ return true;
+ }
+ if (parsedMetadata.length === 0) {
+ return true;
+ }
+ const strongest = getStrongestMetadata(parsedMetadata);
+ const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest);
+ for (const item of metadata) {
+ const algorithm = item.algo;
+ const expectedValue = item.hash;
+ 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);
}
- stream[kBodyUsed] = true;
- yield* stream;
+ }
+ if (compareBase64Mixed(actualValue, expectedValue)) {
+ return true;
}
}
+ return false;
}
- function throwIfAborted(state) {
- if (state.aborted) {
- throw new DOMException("The operation was aborted.", "AbortError");
+ var parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i;
+ function parseMetadata(metadata) {
+ const result = [];
+ let empty = true;
+ for (const token of metadata.split(" ")) {
+ empty = false;
+ const parsedToken = parseHashWithOptions.exec(token);
+ if (parsedToken === null || parsedToken.groups === void 0 || parsedToken.groups.algo === void 0) {
+ continue;
+ }
+ const algorithm = parsedToken.groups.algo.toLowerCase();
+ if (supportedHashes.includes(algorithm)) {
+ result.push(parsedToken.groups);
+ }
}
+ if (empty === true) {
+ return "no metadata";
+ }
+ return result;
}
- function bodyMixinMethods(instance) {
- const methods = {
- blob() {
- return specConsumeBody(this, (bytes) => {
- let mimeType = bodyMimeType(this);
- if (mimeType === null) {
- mimeType = "";
- } else if (mimeType) {
- mimeType = serializeAMimeType(mimeType);
- }
- return new Blob2([bytes], { type: mimeType });
- }, instance);
- },
- arrayBuffer() {
- return specConsumeBody(this, (bytes) => {
- return new Uint8Array(bytes).buffer;
- }, instance);
- },
- text() {
- return specConsumeBody(this, utf8DecodeBytes, instance);
- },
- json() {
- return specConsumeBody(this, parseJSONFromBytes, instance);
- },
- async formData() {
- webidl.brandCheck(this, instance);
- throwIfAborted(this[kState]);
- const mimeType = bodyMimeType(this);
- if (mimeType !== null && mimeType.essence === "multipart/form-data") {
- const headers = {};
- for (const [key, value] of this.headers)
- headers[key] = 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, mimeType2) => {
- 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: mimeType2 }));
- });
- } else {
- value.on("data", (chunk) => {
- chunks.push(chunk);
- });
- value.on("end", () => {
- responseFormData.append(name, new File(chunks, filename, { type: mimeType2 }));
- });
- }
- });
- 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 (mimeType !== null && mimeType.essence === "application/x-www-form-urlencoded") {
- let entries;
- try {
- let text = "";
- 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) {
- throw new TypeError(void 0, { cause: err });
- }
- const formData = new FormData();
- for (const [name, value] of entries) {
- formData.append(name, value);
- }
- return formData;
- } else {
- await Promise.resolve();
- throwIfAborted(this[kState]);
- throw webidl.errors.exception({
- header: `${instance.name}.formData`,
- message: "Could not parse content as FormData."
- });
- }
+ function getStrongestMetadata(metadataList) {
+ let algorithm = metadataList[0].algo;
+ if (algorithm[3] === "5") {
+ return algorithm;
+ }
+ for (let i = 1; i < metadataList.length; ++i) {
+ const metadata = metadataList[i];
+ if (metadata.algo[3] === "5") {
+ algorithm = "sha512";
+ break;
+ } else if (algorithm[3] === "3") {
+ continue;
+ } else if (metadata.algo[3] === "3") {
+ algorithm = "sha384";
}
- };
- return methods;
+ }
+ return algorithm;
}
- function mixinBody(prototype) {
- Object.assign(prototype.prototype, bodyMixinMethods(prototype));
+ 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;
}
- async function specConsumeBody(object, convertBytesToJSValue, instance) {
- webidl.brandCheck(object, instance);
- throwIfAborted(object[kState]);
- if (bodyUnusable(object[kState].body)) {
- throw new TypeError("Body is unusable");
+ function compareBase64Mixed(actualValue, expectedValue) {
+ if (actualValue.length !== expectedValue.length) {
+ return false;
}
- const promise = createDeferredPromise();
- const errorSteps = (error) => promise.reject(error);
- const successSteps = (data) => {
- try {
- promise.resolve(convertBytesToJSValue(data));
- } catch (e) {
- errorSteps(e);
+ 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;
}
- };
- if (object[kState].body == null) {
- successSteps(new Uint8Array());
- return promise.promise;
}
- await fullyReadBody(object[kState].body, successSteps, errorSteps);
- return promise.promise;
+ return true;
}
- function bodyUnusable(body) {
- return body != null && (body.stream.locked || util.isDisturbed(body.stream));
+ function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) {
}
- function utf8DecodeBytes(buffer) {
- if (buffer.length === 0) {
- return "";
+ function sameOrigin(A, B) {
+ if (A.origin === B.origin && A.origin === "null") {
+ return true;
}
- if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) {
- buffer = buffer.subarray(3);
+ if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) {
+ return true;
}
- const output = textDecoder.decode(buffer);
- return output;
+ return false;
}
- function parseJSONFromBytes(bytes) {
- return JSON.parse(utf8DecodeBytes(bytes));
+ function createDeferredPromise() {
+ let res;
+ let rej;
+ const promise = new Promise((resolve, reject) => {
+ res = resolve;
+ rej = reject;
+ });
+ return { promise, resolve: res, reject: rej };
}
- function bodyMimeType(requestOrResponse) {
- const headers = requestOrResponse[kState].headersList;
- const mimeType = extractMimeType(headers);
- if (mimeType === "failure") {
- return null;
- }
- return mimeType;
+ function isAborted(fetchParams) {
+ return fetchParams.controller.state === "aborted";
}
- module2.exports = {
- extractBody,
- safelyExtractBody,
- cloneBody,
- mixinBody
- };
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/request.js
-var require_request = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/request.js"(exports, module2) {
- "use strict";
- var {
- InvalidArgumentError,
- NotSupportedError
- } = require_errors();
- var assert3 = require("node:assert");
- var { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require_symbols();
- var util = require_util();
- var { channels } = require_diagnostics();
- var { headerNameLowerCasedRecord } = require_constants2();
- var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
- var invalidPathRegex = /[^\u0021-\u00ff]/;
- var kHandler = Symbol("handler");
- var extractBody;
- var Request = class _Request {
- constructor(origin, {
- path: path10,
- method,
- body,
- headers,
- query,
- idempotent,
- blocking,
- upgrade,
- headersTimeout,
- bodyTimeout,
- reset,
- throwOnError,
- expectContinue
- }, handler) {
- if (typeof path10 !== "string") {
- throw new InvalidArgumentError("path must be a string");
- } else if (path10[0] !== "/" && !(path10.startsWith("http://") || path10.startsWith("https://")) && method !== "CONNECT") {
- throw new InvalidArgumentError("path must be an absolute URL or start with a slash");
- } else if (invalidPathRegex.exec(path10) !== null) {
- throw new InvalidArgumentError("invalid request path");
- }
- if (typeof method !== "string") {
- throw new InvalidArgumentError("method must be a string");
- } else if (!util.isValidHTTPToken(method)) {
- 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);
+ function isCancelled(fetchParams) {
+ return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated";
+ }
+ var normalizeMethodRecordBase = {
+ delete: "DELETE",
+ DELETE: "DELETE",
+ get: "GET",
+ GET: "GET",
+ head: "HEAD",
+ HEAD: "HEAD",
+ options: "OPTIONS",
+ OPTIONS: "OPTIONS",
+ post: "POST",
+ POST: "POST",
+ put: "PUT",
+ PUT: "PUT"
+ };
+ var normalizeMethodRecord = {
+ ...normalizeMethodRecordBase,
+ patch: "patch",
+ PATCH: "PATCH"
+ };
+ Object.setPrototypeOf(normalizeMethodRecordBase, null);
+ Object.setPrototypeOf(normalizeMethodRecord, null);
+ function normalizeMethod(method) {
+ return normalizeMethodRecordBase[method.toLowerCase()] ?? method;
+ }
+ function serializeJavascriptValueToJSONString(value) {
+ const result = JSON.stringify(value);
+ if (result === void 0) {
+ throw new TypeError("Value is not JSON serializable");
+ }
+ assert3(typeof result === "string");
+ return result;
+ }
+ var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
+ function createIterator(name, kInternalIterator, keyIndex = 0, valueIndex = 1) {
+ class FastIterableIterator {
+ /** @type {any} */
+ #target;
+ /** @type {'key' | 'value' | 'key+value'} */
+ #kind;
+ /** @type {number} */
+ #index;
+ /**
+ * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object
+ * @param {unknown} target
+ * @param {'key' | 'value' | 'key+value'} kind
+ */
+ constructor(target, kind) {
+ this.#target = target;
+ this.#kind = kind;
+ this.#index = 0;
+ }
+ next() {
+ if (typeof this !== "object" || this === null || !(#target in this)) {
+ throw new TypeError(
+ `'next' called on an object that does not implement interface ${name} Iterator.`
+ );
+ }
+ const index = this.#index;
+ const values = this.#target[kInternalIterator];
+ const len = values.length;
+ if (index >= len) {
+ return {
+ value: void 0,
+ done: true
};
- this.body.on("end", this.endHandler);
}
- this.errorHandler = (err) => {
- if (this.abort) {
- this.abort(err);
- } else {
- this.error = err;
- }
+ const { [keyIndex]: key, [valueIndex]: value } = values[index];
+ this.#index = index + 1;
+ let result;
+ switch (this.#kind) {
+ case "key":
+ result = key;
+ break;
+ case "value":
+ result = value;
+ break;
+ case "key+value":
+ result = [key, value];
+ break;
+ }
+ return {
+ value: result,
+ done: false
};
- 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(path10, query) : path10;
- 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 = "";
- 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]);
+ }
+ delete FastIterableIterator.prototype.constructor;
+ Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype);
+ Object.defineProperties(FastIterableIterator.prototype, {
+ [Symbol.toStringTag]: {
+ writable: false,
+ enumerable: false,
+ configurable: true,
+ value: `${name} Iterator`
+ },
+ next: { writable: true, enumerable: true, configurable: true }
+ });
+ return function(target, kind) {
+ return new FastIterableIterator(target, kind);
+ };
+ }
+ function iteratorMixin(name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) {
+ const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex);
+ const properties = {
+ keys: {
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ value: function keys() {
+ webidl.brandCheck(this, object);
+ return makeIterator(this, "key");
}
- } 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]);
+ },
+ values: {
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ value: function values() {
+ webidl.brandCheck(this, object);
+ return makeIterator(this, "value");
}
- } else if (headers != null) {
- throw new InvalidArgumentError("headers must be an object or an array");
- }
- if (util.isFormDataLike(this.body)) {
- if (!extractBody) {
- extractBody = require_body().extractBody;
+ },
+ entries: {
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ value: function entries() {
+ webidl.brandCheck(this, object);
+ return makeIterator(this, "key+value");
}
- const [bodyStream, contentType] = extractBody(body);
- if (this.contentType == null) {
- this.contentType = contentType;
- this.headers += `content-type: ${contentType}\r
-`;
+ },
+ forEach: {
+ writable: true,
+ enumerable: true,
+ configurable: true,
+ value: function forEach(callbackfn, thisArg = globalThis) {
+ webidl.brandCheck(this, object);
+ webidl.argumentLengthCheck(arguments, 1, { header: `${name}.forEach` });
+ if (typeof callbackfn !== "function") {
+ throw new TypeError(
+ `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.`
+ );
+ }
+ for (const { 0: key, 1: value } of makeIterator(this, "key+value")) {
+ callbackfn.call(thisArg, value, key, this);
+ }
}
- 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
-`;
}
- util.validateHandler(handler, method, upgrade);
- this.servername = util.getServerName(this.host);
- this[kHandler] = handler;
- if (channels.create.hasSubscribers) {
- channels.create.publish({ request: this });
+ };
+ return Object.defineProperties(object.prototype, {
+ ...properties,
+ [Symbol.iterator]: {
+ writable: true,
+ enumerable: false,
+ configurable: true,
+ value: properties.entries.value
+ }
+ });
+ }
+ async function fullyReadBody(body, processBody, processBodyError) {
+ const successSteps = processBody;
+ const errorSteps = processBodyError;
+ let reader;
+ try {
+ reader = body.stream.getReader();
+ } catch (e) {
+ errorSteps(e);
+ return;
+ }
+ try {
+ const result = await readAllBytes(reader);
+ successSteps(result);
+ } catch (e) {
+ errorSteps(e);
+ }
+ }
+ function isReadableStreamLike(stream) {
+ return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function";
+ }
+ function readableStreamClose(controller) {
+ try {
+ controller.close();
+ controller.byobRequest?.respond(0);
+ } catch (err) {
+ if (!err.message.includes("Controller is already closed") && !err.message.includes("ReadableStream is already closed")) {
+ throw err;
}
}
- onBodySent(chunk) {
- if (this[kHandler].onBodySent) {
- try {
- return this[kHandler].onBodySent(chunk);
- } catch (err) {
- this.abort(err);
- }
+ }
+ function isomorphicEncode(input) {
+ for (let i = 0; i < input.length; i++) {
+ assert3(input.charCodeAt(i) <= 255);
+ }
+ return input;
+ }
+ async function readAllBytes(reader) {
+ const bytes = [];
+ let byteLength = 0;
+ while (true) {
+ const { done, value: chunk } = await reader.read();
+ if (done) {
+ return Buffer.concat(bytes, byteLength);
+ }
+ if (!isUint8Array(chunk)) {
+ throw new TypeError("Received non-Uint8Array chunk");
}
+ bytes.push(chunk);
+ byteLength += chunk.length;
+ }
+ }
+ function urlIsLocal(url) {
+ assert3("protocol" in url);
+ const protocol = url.protocol;
+ return protocol === "about:" || protocol === "blob:" || protocol === "data:";
+ }
+ function urlHasHttpsScheme(url) {
+ return typeof url === "string" && url[5] === ":" && url[0] === "h" && url[1] === "t" && url[2] === "t" && url[3] === "p" && url[4] === "s" || url.protocol === "https:";
+ }
+ function urlIsHttpHttpsScheme(url) {
+ assert3("protocol" in url);
+ const protocol = url.protocol;
+ return protocol === "http:" || protocol === "https:";
+ }
+ function simpleRangeHeaderValue(value, allowWhitespace) {
+ const data = value;
+ if (!data.startsWith("bytes")) {
+ return "failure";
+ }
+ const position = { position: 5 };
+ if (allowWhitespace) {
+ collectASequenceOfCodePoints(
+ (char) => char === " " || char === " ",
+ data,
+ position
+ );
+ }
+ if (data.charCodeAt(position.position) !== 61) {
+ return "failure";
+ }
+ position.position++;
+ if (allowWhitespace) {
+ collectASequenceOfCodePoints(
+ (char) => char === " " || char === " ",
+ data,
+ position
+ );
+ }
+ const rangeStart = collectASequenceOfCodePoints(
+ (char) => {
+ const code = char.charCodeAt(0);
+ return code >= 48 && code <= 57;
+ },
+ data,
+ position
+ );
+ const rangeStartValue = rangeStart.length ? Number(rangeStart) : null;
+ if (allowWhitespace) {
+ collectASequenceOfCodePoints(
+ (char) => char === " " || char === " ",
+ data,
+ position
+ );
+ }
+ if (data.charCodeAt(position.position) !== 45) {
+ return "failure";
+ }
+ position.position++;
+ if (allowWhitespace) {
+ collectASequenceOfCodePoints(
+ (char) => char === " " || char === " ",
+ data,
+ position
+ );
+ }
+ const rangeEnd = collectASequenceOfCodePoints(
+ (char) => {
+ const code = char.charCodeAt(0);
+ return code >= 48 && code <= 57;
+ },
+ data,
+ position
+ );
+ const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null;
+ if (position.position < data.length) {
+ return "failure";
+ }
+ if (rangeEndValue === null && rangeStartValue === null) {
+ return "failure";
}
- onRequestSent() {
- if (channels.bodySent.hasSubscribers) {
- channels.bodySent.publish({ request: this });
- }
- if (this[kHandler].onRequestSent) {
- try {
- return this[kHandler].onRequestSent();
- } catch (err) {
- this.abort(err);
+ if (rangeStartValue > rangeEndValue) {
+ return "failure";
+ }
+ return { rangeStartValue, rangeEndValue };
+ }
+ function buildContentRange(rangeStart, rangeEnd, fullLength) {
+ let contentRange = "bytes ";
+ contentRange += isomorphicEncode(`${rangeStart}`);
+ contentRange += "-";
+ contentRange += isomorphicEncode(`${rangeEnd}`);
+ contentRange += "/";
+ contentRange += isomorphicEncode(`${fullLength}`);
+ return contentRange;
+ }
+ var InflateStream = class extends Transform {
+ _transform(chunk, encoding, callback) {
+ if (!this._inflateStream) {
+ if (chunk.length === 0) {
+ callback();
+ return;
}
+ this._inflateStream = (chunk[0] & 15) === 8 ? zlib.createInflate() : zlib.createInflateRaw();
+ this._inflateStream.on("data", this.push.bind(this));
+ this._inflateStream.on("end", () => this.push(null));
+ this._inflateStream.on("error", (err) => this.destroy(err));
}
+ this._inflateStream.write(chunk, encoding, callback);
}
- onConnect(abort) {
- assert3(!this.aborted);
- assert3(!this.completed);
- if (this.error) {
- abort(this.error);
- } else {
- this.abort = abort;
- return this[kHandler].onConnect(abort);
+ _final(callback) {
+ if (this._inflateStream) {
+ this._inflateStream.end();
+ this._inflateStream = null;
}
+ callback();
}
- onResponseStarted() {
- return this[kHandler].onResponseStarted?.();
+ };
+ function createInflate() {
+ return new InflateStream();
+ }
+ function extractMimeType(headers) {
+ let charset = null;
+ let essence = null;
+ let mimeType = null;
+ const values = getDecodeSplit("content-type", headers);
+ if (values === null) {
+ return "failure";
}
- onHeaders(statusCode, headers, resume, statusText) {
- assert3(!this.aborted);
- assert3(!this.completed);
- if (channels.headers.hasSubscribers) {
- channels.headers.publish({ request: this, response: { statusCode, headers, statusText } });
+ for (const value of values) {
+ const temporaryMimeType = parseMIMEType(value);
+ if (temporaryMimeType === "failure" || temporaryMimeType.essence === "*/*") {
+ continue;
}
- try {
- return this[kHandler].onHeaders(statusCode, headers, resume, statusText);
- } catch (err) {
- this.abort(err);
+ mimeType = temporaryMimeType;
+ if (mimeType.essence !== essence) {
+ charset = null;
+ if (mimeType.parameters.has("charset")) {
+ charset = mimeType.parameters.get("charset");
+ }
+ essence = mimeType.essence;
+ } else if (!mimeType.parameters.has("charset") && charset !== null) {
+ mimeType.parameters.set("charset", charset);
}
}
- onData(chunk) {
- assert3(!this.aborted);
- assert3(!this.completed);
- try {
- return this[kHandler].onData(chunk);
- } catch (err) {
- this.abort(err);
- return false;
+ if (mimeType == null) {
+ return "failure";
+ }
+ return mimeType;
+ }
+ function gettingDecodingSplitting(value) {
+ const input = value;
+ const position = { position: 0 };
+ const values = [];
+ let temporaryValue = "";
+ while (position.position < input.length) {
+ temporaryValue += collectASequenceOfCodePoints(
+ (char) => char !== '"' && char !== ",",
+ input,
+ position
+ );
+ if (position.position < input.length) {
+ if (input.charCodeAt(position.position) === 34) {
+ temporaryValue += collectAnHTTPQuotedString(
+ input,
+ position
+ );
+ if (position.position < input.length) {
+ continue;
+ }
+ } else {
+ assert3(input.charCodeAt(position.position) === 44);
+ position.position++;
+ }
}
+ temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 9 || char === 32);
+ values.push(temporaryValue);
+ temporaryValue = "";
}
- onUpgrade(statusCode, headers, socket) {
- assert3(!this.aborted);
- assert3(!this.completed);
- return this[kHandler].onUpgrade(statusCode, headers, socket);
+ return values;
+ }
+ function getDecodeSplit(name, list) {
+ const value = list.get(name, true);
+ if (value === null) {
+ return null;
}
- onComplete(trailers) {
- this.onFinally();
- assert3(!this.aborted);
- this.completed = true;
- if (channels.trailers.hasSubscribers) {
- channels.trailers.publish({ request: this, trailers });
- }
- try {
- return this[kHandler].onComplete(trailers);
- } catch (err) {
- this.onError(err);
- }
+ return gettingDecodingSplitting(value);
+ }
+ var textDecoder = new TextDecoder();
+ function utf8DecodeBytes(buffer) {
+ if (buffer.length === 0) {
+ return "";
}
- 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);
+ if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) {
+ buffer = buffer.subarray(3);
}
- 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;
+ const output = textDecoder.decode(buffer);
+ return output;
+ }
+ module2.exports = {
+ isAborted,
+ isCancelled,
+ isValidEncodedURL,
+ createDeferredPromise,
+ ReadableStreamFrom,
+ tryUpgradeRequestToAPotentiallyTrustworthyURL,
+ clampAndCoarsenConnectionTimingInfo,
+ coarsenedSharedCurrentTime,
+ determineRequestsReferrer,
+ makePolicyContainer,
+ clonePolicyContainer,
+ appendFetchMetadata,
+ appendRequestOriginHeader,
+ TAOCheck,
+ corsCheck,
+ crossOriginResourcePolicyCheck,
+ createOpaqueTimingInfo,
+ setRequestReferrerPolicyOnRedirect,
+ isValidHTTPToken,
+ requestBadPort,
+ requestCurrentURL,
+ responseURL,
+ responseLocationURL,
+ isBlobLike,
+ isURLPotentiallyTrustworthy,
+ isValidReasonPhrase,
+ sameOrigin,
+ normalizeMethod,
+ serializeJavascriptValueToJSONString,
+ iteratorMixin,
+ createIterator,
+ isValidHeaderName,
+ isValidHeaderValue,
+ isErrorLike,
+ fullyReadBody,
+ bytesMatch,
+ isReadableStreamLike,
+ readableStreamClose,
+ isomorphicEncode,
+ urlIsLocal,
+ urlHasHttpsScheme,
+ urlIsHttpHttpsScheme,
+ readAllBytes,
+ normalizeMethodRecord,
+ simpleRangeHeaderValue,
+ buildContentRange,
+ parseMetadata,
+ createInflate,
+ extractMimeType,
+ getDecodeSplit,
+ utf8DecodeBytes
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/symbols.js
+var require_symbols2 = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/symbols.js"(exports, module2) {
+ "use strict";
+ module2.exports = {
+ kUrl: Symbol("url"),
+ kHeaders: Symbol("headers"),
+ kSignal: Symbol("signal"),
+ kState: Symbol("state"),
+ kGuard: Symbol("guard"),
+ kRealm: Symbol("realm"),
+ kDispatcher: Symbol("dispatcher")
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/file.js
+var require_file = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/file.js"(exports, module2) {
+ "use strict";
+ var { EOL } = require("node:os");
+ var { Blob: Blob2, File: NativeFile } = require("node:buffer");
+ var { types } = require("node:util");
+ var { kState } = require_symbols2();
+ var { isBlobLike } = require_util3();
+ var { webidl } = require_webidl();
+ var { parseMIMEType, serializeAMimeType } = require_data_url();
+ var { kEnumerableProperty } = require_util();
+ var encoder = new TextEncoder();
+ var File = class _File extends Blob2 {
+ constructor(fileBits, fileName, options = {}) {
+ webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" });
+ fileBits = webidl.converters["sequence"](fileBits);
+ fileName = webidl.converters.USVString(fileName);
+ options = webidl.converters.FilePropertyBag(options);
+ const n = fileName;
+ let t = options.type;
+ let d;
+ substep: {
+ if (t) {
+ t = parseMIMEType(t);
+ if (t === "failure") {
+ t = "";
+ break substep;
+ }
+ t = serializeAMimeType(t).toLowerCase();
+ }
+ d = options.lastModified;
}
+ super(processBlobParts(fileBits, options), { type: t });
+ this[kState] = {
+ name: n,
+ lastModified: d,
+ type: t
+ };
}
- // TODO: adjust to support H2
- addHeader(key, value) {
- processHeader(this, key, value);
- return this;
- }
- static [kHTTP1BuildRequest](origin, opts, handler) {
- return new _Request(origin, opts, handler);
+ get name() {
+ webidl.brandCheck(this, _File);
+ return this[kState].name;
}
- 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;
+ get lastModified() {
+ webidl.brandCheck(this, _File);
+ return this[kState].lastModified;
}
- 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;
+ get type() {
+ webidl.brandCheck(this, _File);
+ return this[kState].type;
}
};
- function processHeaderValue(key, val, skipAppend) {
- if (val && typeof val === "object") {
- throw new InvalidArgumentError(`invalid ${key} header`);
+ var FileLike = class _FileLike {
+ constructor(blobLike, fileName, options = {}) {
+ const n = fileName;
+ const t = options.type;
+ const d = options.lastModified ?? Date.now();
+ this[kState] = {
+ blobLike,
+ name: n,
+ type: t,
+ lastModified: d
+ };
}
- val = val != null ? `${val}` : "";
- if (headerCharRegex.exec(val) !== null) {
- throw new InvalidArgumentError(`invalid ${key} header`);
+ stream(...args) {
+ webidl.brandCheck(this, _FileLike);
+ return this[kState].blobLike.stream(...args);
}
- return skipAppend ? val : `${key}: ${val}\r
-`;
- }
- function processHeader(request, key, val, skipAppend = false) {
- if (val && (typeof val === "object" && !Array.isArray(val))) {
- throw new InvalidArgumentError(`invalid ${key} header`);
- } else if (val === void 0) {
- return;
+ arrayBuffer(...args) {
+ webidl.brandCheck(this, _FileLike);
+ return this[kState].blobLike.arrayBuffer(...args);
}
- let headerName = headerNameLowerCasedRecord[key];
- if (headerName === void 0) {
- headerName = key.toLowerCase();
- if (headerNameLowerCasedRecord[headerName] === void 0 && !util.isValidHTTPToken(headerName)) {
- throw new InvalidArgumentError("invalid header key");
- }
+ slice(...args) {
+ webidl.brandCheck(this, _FileLike);
+ return this[kState].blobLike.slice(...args);
}
- if (request.host === null && headerName === "host") {
- if (headerCharRegex.exec(val) !== null) {
- throw new InvalidArgumentError(`invalid ${key} header`);
- }
- request.host = val;
- } else if (request.contentLength === null && headerName === "content-length") {
- request.contentLength = parseInt(val, 10);
- if (!Number.isFinite(request.contentLength)) {
- throw new InvalidArgumentError("invalid content-length header");
- }
- } else if (request.contentType === null && headerName === "content-type") {
- request.contentType = val;
- if (skipAppend)
- request.headers[key] = processHeaderValue(key, val, skipAppend);
- else
- request.headers += processHeaderValue(key, val);
- } else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") {
- throw new InvalidArgumentError(`invalid ${headerName} header`);
- } else if (headerName === "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 (headerName === "expect") {
- throw new NotSupportedError("expect header not supported");
- } 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);
+ text(...args) {
+ webidl.brandCheck(this, _FileLike);
+ return this[kState].blobLike.text(...args);
}
- }
- module2.exports = Request;
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/connect.js
-var require_connect = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/connect.js"(exports, module2) {
- "use strict";
- var net = require("node:net");
- var assert3 = require("node:assert");
- var util = require_util();
- var { InvalidArgumentError, ConnectTimeoutError } = require_errors();
- var tls;
- var SessionCache;
- if (global.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) {
- SessionCache = class WeakSessionCache {
- constructor(maxCachedSessions) {
- this._maxCachedSessions = maxCachedSessions;
- this._sessionCache = /* @__PURE__ */ new Map();
- this._sessionRegistry = new global.FinalizationRegistry((key) => {
- if (this._sessionCache.size < this._maxCachedSessions) {
- return;
- }
- const ref = this._sessionCache.get(key);
- if (ref !== void 0 && ref.deref() === void 0) {
- 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 = /* @__PURE__ */ new Map();
- }
- get(sessionKey) {
- return this._sessionCache.get(sessionKey);
- }
- set(sessionKey, session) {
- if (this._maxCachedSessions === 0) {
- return;
- }
- if (this._sessionCache.size >= this._maxCachedSessions) {
- const { value: oldestKey } = this._sessionCache.keys().next();
- this._sessionCache.delete(oldestKey);
- }
- this._sessionCache.set(sessionKey, session);
- }
- };
- }
- 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");
+ get size() {
+ webidl.brandCheck(this, _FileLike);
+ return this[kState].blobLike.size;
}
- const options = { path: socketPath, ...opts };
- const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions);
- timeout = timeout == null ? 1e4 : 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 = require("node:tls");
- }
- servername = servername || options.servername || util.getServerName(host) || null;
- const sessionKey = servername || hostname;
- const session = sessionCache.get(sessionKey) || null;
- assert3(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(session2) {
- sessionCache.set(sessionKey, session2);
- });
- } else {
- assert3(!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
- });
- }
- if (options.keepAlive == null || options.keepAlive) {
- const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : 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;
- };
- }
- function setupTimeout(onConnectTimeout2, timeout) {
- if (!timeout) {
- return () => {
- };
+ get type() {
+ webidl.brandCheck(this, _FileLike);
+ return this[kState].blobLike.type;
+ }
+ get name() {
+ webidl.brandCheck(this, _FileLike);
+ return this[kState].name;
+ }
+ get lastModified() {
+ webidl.brandCheck(this, _FileLike);
+ return this[kState].lastModified;
+ }
+ get [Symbol.toStringTag]() {
+ return "File";
}
- let s1 = null;
- let s2 = null;
- const timeoutId = setTimeout(() => {
- s1 = setImmediate(() => {
- if (process.platform === "win32") {
- s2 = setImmediate(() => onConnectTimeout2());
- } else {
- onConnectTimeout2();
- }
- });
- }, timeout);
- return () => {
- clearTimeout(timeoutId);
- clearImmediate(s1);
- clearImmediate(s2);
- };
- }
- function onConnectTimeout(socket) {
- let message = "Connect Timeout Error";
- if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) {
- message = +` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(", ")})`;
+ };
+ Object.defineProperties(File.prototype, {
+ [Symbol.toStringTag]: {
+ value: "File",
+ configurable: true
+ },
+ name: kEnumerableProperty,
+ lastModified: kEnumerableProperty
+ });
+ webidl.converters.Blob = webidl.interfaceConverter(Blob2);
+ webidl.converters.BlobPart = function(V, opts) {
+ 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, opts);
+ }
}
- util.destroy(socket, new ConnectTimeoutError(message));
- }
- module2.exports = buildConnector;
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/utils.js
-var require_utils = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/utils.js"(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 webidl.converters.USVString(V, opts);
+ };
+ webidl.converters["sequence"] = webidl.sequenceConverter(
+ webidl.converters.BlobPart
+ );
+ webidl.converters.FilePropertyBag = webidl.dictionaryConverter([
+ {
+ key: "lastModified",
+ converter: webidl.converters["long long"],
+ get defaultValue() {
+ return Date.now();
}
- });
- return res;
- }
- exports.enumToMap = enumToMap;
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/constants.js
-var require_constants4 = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/constants.js"(exports) {
- "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;
- var utils_1 = require_utils();
- var ERROR;
- (function(ERROR2) {
- ERROR2[ERROR2["OK"] = 0] = "OK";
- ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL";
- ERROR2[ERROR2["STRICT"] = 2] = "STRICT";
- ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED";
- ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH";
- ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION";
- ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD";
- ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL";
- ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT";
- ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION";
- ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN";
- ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH";
- ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE";
- ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS";
- ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE";
- ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING";
- ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN";
- ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE";
- ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE";
- ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER";
- ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE";
- ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED";
- ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE";
- ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE";
- ERROR2[ERROR2["USER"] = 24] = "USER";
- })(ERROR = exports.ERROR || (exports.ERROR = {}));
- var TYPE;
- (function(TYPE2) {
- TYPE2[TYPE2["BOTH"] = 0] = "BOTH";
- TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST";
- TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE";
- })(TYPE = exports.TYPE || (exports.TYPE = {}));
- var FLAGS;
- (function(FLAGS2) {
- FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE";
- FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE";
- FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE";
- FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED";
- FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE";
- FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH";
- FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY";
- FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING";
- FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING";
- })(FLAGS = exports.FLAGS || (exports.FLAGS = {}));
- var LENIENT_FLAGS;
- (function(LENIENT_FLAGS2) {
- LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS";
- LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH";
- LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE";
- })(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {}));
- var METHODS;
- (function(METHODS2) {
- METHODS2[METHODS2["DELETE"] = 0] = "DELETE";
- METHODS2[METHODS2["GET"] = 1] = "GET";
- METHODS2[METHODS2["HEAD"] = 2] = "HEAD";
- METHODS2[METHODS2["POST"] = 3] = "POST";
- METHODS2[METHODS2["PUT"] = 4] = "PUT";
- METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT";
- METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS";
- METHODS2[METHODS2["TRACE"] = 7] = "TRACE";
- METHODS2[METHODS2["COPY"] = 8] = "COPY";
- METHODS2[METHODS2["LOCK"] = 9] = "LOCK";
- METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL";
- METHODS2[METHODS2["MOVE"] = 11] = "MOVE";
- METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND";
- METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH";
- METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH";
- METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK";
- METHODS2[METHODS2["BIND"] = 16] = "BIND";
- METHODS2[METHODS2["REBIND"] = 17] = "REBIND";
- METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND";
- METHODS2[METHODS2["ACL"] = 19] = "ACL";
- METHODS2[METHODS2["REPORT"] = 20] = "REPORT";
- METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY";
- METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT";
- METHODS2[METHODS2["MERGE"] = 23] = "MERGE";
- METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH";
- METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY";
- METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE";
- METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE";
- METHODS2[METHODS2["PATCH"] = 28] = "PATCH";
- METHODS2[METHODS2["PURGE"] = 29] = "PURGE";
- METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR";
- METHODS2[METHODS2["LINK"] = 31] = "LINK";
- METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK";
- METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE";
- METHODS2[METHODS2["PRI"] = 34] = "PRI";
- METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE";
- METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE";
- METHODS2[METHODS2["SETUP"] = 37] = "SETUP";
- METHODS2[METHODS2["PLAY"] = 38] = "PLAY";
- METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE";
- METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN";
- METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER";
- METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER";
- METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT";
- METHODS2[METHODS2["RECORD"] = 44] = "RECORD";
- METHODS2[METHODS2["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];
+ },
+ {
+ 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"
}
- });
- var FINISH;
- (function(FINISH2) {
- FINISH2[FINISH2["SAFE"] = 0] = "SAFE";
- FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB";
- FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE";
- })(FINISH = exports.FINISH || (exports.FINISH = {}));
- exports.ALPHA = [];
- for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) {
- exports.ALPHA.push(String.fromCharCode(i));
- exports.ALPHA.push(String.fromCharCode(i + 32));
+ ]);
+ function processBlobParts(parts, options) {
+ const bytes = [];
+ for (const element of parts) {
+ if (typeof element === "string") {
+ let s = element;
+ if (options.endings === "native") {
+ s = convertLineEndingsNative(s);
+ }
+ bytes.push(encoder.encode(s));
+ } else if (ArrayBuffer.isView(element) || types.isArrayBuffer(element)) {
+ if (element.buffer) {
+ bytes.push(
+ new Uint8Array(element.buffer, element.byteOffset, element.byteLength)
+ );
+ } else {
+ bytes.push(new Uint8Array(element));
+ }
+ } else if (isBlobLike(element)) {
+ bytes.push(element);
+ }
+ }
+ return bytes;
}
- 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: 10,
- B: 11,
- C: 12,
- D: 13,
- E: 14,
- F: 15,
- a: 10,
- b: 11,
- c: 12,
- d: 13,
- e: 14,
- f: 15
- };
- 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(["%", ";", ":", "&", "=", "+", "$", ","]);
- exports.STRICT_URL_CHAR = [
- "!",
- '"',
- "$",
- "%",
- "&",
- "'",
- "(",
- ")",
- "*",
- "+",
- ",",
- "-",
- ".",
- "/",
- ":",
- ";",
- "<",
- "=",
- ">",
- "@",
- "[",
- "\\",
- "]",
- "^",
- "_",
- "`",
- "{",
- "|",
- "}",
- "~"
- ].concat(exports.ALPHANUM);
- exports.URL_CHAR = exports.STRICT_URL_CHAR.concat([" ", "\f"]);
- for (let i = 128; i <= 255; i++) {
- exports.URL_CHAR.push(i);
+ function convertLineEndingsNative(s) {
+ return s.replace(/\r?\n/g, EOL);
}
- exports.HEX = exports.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]);
- exports.STRICT_TOKEN = [
- "!",
- "#",
- "$",
- "%",
- "&",
- "'",
- "*",
- "+",
- "-",
- ".",
- "^",
- "_",
- "`",
- "|",
- "~"
- ].concat(exports.ALPHANUM);
- exports.TOKEN = exports.STRICT_TOKEN.concat([" "]);
- exports.HEADER_CHARS = [" "];
- for (let i = 32; i <= 255; i++) {
- if (i !== 127) {
- exports.HEADER_CHARS.push(i);
+ function isFileLike(object) {
+ return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File";
+ }
+ module2.exports = { File, FileLike, isFileLike };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/formdata.js
+var require_formdata = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/formdata.js"(exports, module2) {
+ "use strict";
+ var { isBlobLike, iteratorMixin } = require_util3();
+ var { kState } = require_symbols2();
+ var { kEnumerableProperty } = require_util();
+ var { File: UndiciFile, FileLike, isFileLike } = require_file();
+ var { webidl } = require_webidl();
+ var { File: NativeFile } = require("node:buffer");
+ var nodeUtil = require("node:util");
+ var File = NativeFile ?? UndiciFile;
+ var FormData = class _FormData {
+ constructor(form) {
+ if (form !== void 0) {
+ throw webidl.errors.conversionFailed({
+ prefix: "FormData constructor",
+ argument: "Argument 1",
+ types: ["undefined"]
+ });
+ }
+ this[kState] = [];
+ }
+ append(name, value, filename = void 0) {
+ 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'"
+ );
+ }
+ 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) : void 0;
+ const entry = makeEntry(name, value, filename);
+ this[kState].push(entry);
+ }
+ delete(name) {
+ webidl.brandCheck(this, _FormData);
+ webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" });
+ name = webidl.converters.USVString(name);
+ 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);
+ const idx = this[kState].findIndex((entry) => entry.name === name);
+ if (idx === -1) {
+ return null;
+ }
+ return this[kState][idx].value;
+ }
+ getAll(name) {
+ webidl.brandCheck(this, _FormData);
+ webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" });
+ name = webidl.converters.USVString(name);
+ 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);
+ return this[kState].findIndex((entry) => entry.name === name) !== -1;
+ }
+ set(name, value, filename = void 0) {
+ 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'"
+ );
+ }
+ 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) : void 0;
+ const entry = makeEntry(name, value, filename);
+ const idx = this[kState].findIndex((entry2) => entry2.name === name);
+ if (idx !== -1) {
+ this[kState] = [
+ ...this[kState].slice(0, idx),
+ entry,
+ ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name)
+ ];
+ } else {
+ this[kState].push(entry);
+ }
+ }
+ [nodeUtil.inspect.custom](depth, options) {
+ const state = this[kState].reduce((a, b) => {
+ if (a[b.name]) {
+ if (Array.isArray(a[b.name])) {
+ a[b.name].push(b.value);
+ } else {
+ a[b.name] = [a[b.name], b.value];
+ }
+ } else {
+ a[b.name] = b.value;
+ }
+ return a;
+ }, { __proto__: null });
+ options.depth ??= depth;
+ options.colors ??= true;
+ const output = nodeUtil.formatWithOptions(options, state);
+ return `FormData ${output.slice(output.indexOf("]") + 2)}`;
+ }
+ };
+ iteratorMixin("FormData", FormData, kState, "name", "value");
+ Object.defineProperties(FormData.prototype, {
+ append: kEnumerableProperty,
+ delete: kEnumerableProperty,
+ get: kEnumerableProperty,
+ getAll: kEnumerableProperty,
+ has: kEnumerableProperty,
+ set: kEnumerableProperty,
+ [Symbol.toStringTag]: {
+ value: "FormData",
+ configurable: true
+ }
+ });
+ function makeEntry(name, value, filename) {
+ if (typeof value === "string") {
+ } else {
+ if (!isFileLike(value)) {
+ value = value instanceof Blob ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type });
+ }
+ if (filename !== void 0) {
+ 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);
+ }
}
+ return { name, value };
}
- 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_STATE2) {
- HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL";
- HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION";
- HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH";
- HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING";
- HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE";
- HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE";
- HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE";
- HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE";
- HEADER_STATE2[HEADER_STATE2["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
- };
+ module2.exports = { FormData, makeEntry };
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/handler/RedirectHandler.js
-var require_RedirectHandler = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/handler/RedirectHandler.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/formdata-parser.js
+var require_formdata_parser = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/formdata-parser.js"(exports, module2) {
"use strict";
- var util = require_util();
- var { kBodyUsed } = require_symbols();
+ var { isUSVString, bufferToLowerCasedHeaderName } = require_util();
+ var { utf8DecodeBytes } = require_util3();
+ var { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = require_data_url();
+ var { isFileLike, File: UndiciFile } = require_file();
+ var { makeEntry } = require_formdata();
var assert3 = require("node:assert");
- var { InvalidArgumentError } = require_errors();
- var EE = require("node:events");
- var redirectableStatusCodes = [300, 301, 302, 303, 307, 308];
- var kBody = Symbol("body");
- var BodyAsyncIterable = class {
- constructor(body) {
- this[kBody] = body;
- this[kBodyUsed] = false;
+ var { File: NodeFile } = require("node:buffer");
+ var File = globalThis.File ?? NodeFile ?? UndiciFile;
+ var formDataNameBuffer = Buffer.from('form-data; name="');
+ var filenameBuffer = Buffer.from("; filename");
+ var dd = Buffer.from("--");
+ var ddcrlf = Buffer.from("--\r\n");
+ function isAsciiString(chars) {
+ for (let i = 0; i < chars.length; ++i) {
+ if ((chars.charCodeAt(i) & ~127) !== 0) {
+ return false;
+ }
}
- async *[Symbol.asyncIterator]() {
- assert3(!this[kBodyUsed], "disturbed");
- this[kBodyUsed] = true;
- yield* this[kBody];
+ return true;
+ }
+ function validateBoundary(boundary) {
+ const length = boundary.length;
+ if (length < 27 || length > 70) {
+ return false;
}
- };
- var RedirectHandler = class {
- constructor(dispatch, maxRedirections, opts, handler) {
- if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
- throw new InvalidArgumentError("maxRedirections must be a positive number");
+ for (let i = 0; i < length; ++i) {
+ const cp = boundary.charCodeAt(i);
+ if (!(cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 39 || cp === 45 || cp === 95)) {
+ return false;
}
- util.validateHandler(handler, opts.method, opts.upgrade);
- this.dispatch = dispatch;
- this.location = null;
- this.abort = null;
- this.opts = { ...opts, maxRedirections: 0 };
- this.maxRedirections = maxRedirections;
- this.handler = handler;
- this.history = [];
- this.redirectionLimitReached = false;
- if (util.isStream(this.opts.body)) {
- if (util.bodyLength(this.opts.body) === 0) {
- this.opts.body.on("data", function() {
- assert3(false);
- });
+ }
+ return true;
+ }
+ function multipartFormDataParser(input, mimeType) {
+ assert3(mimeType !== "failure" && mimeType.essence === "multipart/form-data");
+ const boundaryString = mimeType.parameters.get("boundary");
+ if (boundaryString === void 0) {
+ return "failure";
+ }
+ const boundary = Buffer.from(`--${boundaryString}`, "utf8");
+ const entryList = [];
+ const position = { position: 0 };
+ if (input[0] === 13 && input[1] === 10) {
+ position.position += 2;
+ }
+ while (true) {
+ if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) {
+ position.position += boundary.length;
+ } else {
+ return "failure";
+ }
+ if (position.position === input.length - 2 && bufferStartsWith(input, dd, position) || position.position === input.length - 4 && bufferStartsWith(input, ddcrlf, position)) {
+ return entryList;
+ }
+ if (input[position.position] !== 13 || input[position.position + 1] !== 10) {
+ return "failure";
+ }
+ position.position += 2;
+ const result = parseMultipartFormDataHeaders(input, position);
+ if (result === "failure") {
+ return "failure";
+ }
+ let { name, filename, contentType, encoding } = result;
+ position.position += 2;
+ let body;
+ {
+ const boundaryIndex = input.indexOf(boundary.subarray(2), position.position);
+ if (boundaryIndex === -1) {
+ return "failure";
}
- if (typeof this.opts.body.readableDidRead !== "boolean") {
- this.opts.body[kBodyUsed] = false;
- EE.prototype.on.call(this.opts.body, "data", function() {
- this[kBodyUsed] = true;
- });
+ body = input.subarray(position.position, boundaryIndex - 4);
+ position.position += body.length;
+ if (encoding === "base64") {
+ body = Buffer.from(body.toString(), "base64");
}
- } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") {
- 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)) {
- this.opts.body = new BodyAsyncIterable(this.opts.body);
}
+ if (input[position.position] !== 13 || input[position.position + 1] !== 10) {
+ return "failure";
+ } else {
+ position.position += 2;
+ }
+ let value;
+ if (filename !== null) {
+ contentType ??= "text/plain";
+ if (!isAsciiString(contentType)) {
+ contentType = "";
+ }
+ value = new File([body], filename, { type: contentType });
+ } else {
+ value = utf8DecodeBytes(Buffer.from(body));
+ }
+ assert3(isUSVString(name));
+ assert3(typeof value === "string" && isUSVString(value) || isFileLike(value));
+ entryList.push(makeEntry(name, value, filename));
}
- onConnect(abort) {
- this.abort = abort;
- this.handler.onConnect(abort, { history: this.history });
+ }
+ function parseMultipartFormDataHeaders(input, position) {
+ let name = null;
+ let filename = null;
+ let contentType = null;
+ let encoding = null;
+ while (true) {
+ if (input[position.position] === 13 && input[position.position + 1] === 10) {
+ if (name === null) {
+ return "failure";
+ }
+ return { name, filename, contentType, encoding };
+ }
+ let headerName = collectASequenceOfBytes(
+ (char) => char !== 10 && char !== 13 && char !== 58,
+ input,
+ position
+ );
+ headerName = removeChars(headerName, true, true, (char) => char === 9 || char === 32);
+ if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) {
+ return "failure";
+ }
+ if (input[position.position] !== 58) {
+ return "failure";
+ }
+ position.position++;
+ collectASequenceOfBytes(
+ (char) => char === 32 || char === 9,
+ input,
+ position
+ );
+ switch (bufferToLowerCasedHeaderName(headerName)) {
+ case "content-disposition": {
+ name = filename = null;
+ if (!bufferStartsWith(input, formDataNameBuffer, position)) {
+ return "failure";
+ }
+ position.position += 17;
+ name = parseMultipartFormDataName(input, position);
+ if (name === null) {
+ return "failure";
+ }
+ if (bufferStartsWith(input, filenameBuffer, position)) {
+ let check = position.position + filenameBuffer.length;
+ if (input[check] === 42) {
+ position.position += 1;
+ check += 1;
+ }
+ if (input[check] !== 61 || input[check + 1] !== 34) {
+ return "failure";
+ }
+ position.position += 12;
+ filename = parseMultipartFormDataName(input, position);
+ if (filename === null) {
+ return "failure";
+ }
+ }
+ break;
+ }
+ case "content-type": {
+ let headerValue = collectASequenceOfBytes(
+ (char) => char !== 10 && char !== 13,
+ input,
+ position
+ );
+ headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32);
+ contentType = isomorphicDecode(headerValue);
+ break;
+ }
+ case "content-transfer-encoding": {
+ let headerValue = collectASequenceOfBytes(
+ (char) => char !== 10 && char !== 13,
+ input,
+ position
+ );
+ headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32);
+ encoding = isomorphicDecode(headerValue);
+ break;
+ }
+ default: {
+ collectASequenceOfBytes(
+ (char) => char !== 10 && char !== 13,
+ input,
+ position
+ );
+ }
+ }
+ if (input[position.position] !== 13 && input[position.position + 1] !== 10) {
+ return "failure";
+ } else {
+ position.position += 2;
+ }
}
- onUpgrade(statusCode, headers, socket) {
- this.handler.onUpgrade(statusCode, headers, socket);
+ }
+ function parseMultipartFormDataName(input, position) {
+ assert3(input[position.position - 1] === 34);
+ let name = collectASequenceOfBytes(
+ (char) => char !== 10 && char !== 13 && char !== 34,
+ input,
+ position
+ );
+ if (input[position.position] !== 34) {
+ return null;
+ } else {
+ position.position++;
}
- onError(error) {
- this.handler.onError(error);
+ name = new TextDecoder().decode(name).replace(/%0A/ig, "\n").replace(/%0D/ig, "\r").replace(/%22/g, '"');
+ return name;
+ }
+ function collectASequenceOfBytes(condition, input, position) {
+ let start = position.position;
+ while (start < input.length && condition(input[start])) {
+ ++start;
}
- onHeaders(statusCode, headers, resume, statusText) {
- this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers);
- if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) {
- if (this.request) {
- this.request.abort(new Error("max redirects"));
+ return input.subarray(position.position, position.position = start);
+ }
+ function removeChars(buf, leading, trailing, predicate) {
+ let lead = 0;
+ let trail = buf.length - 1;
+ if (leading) {
+ while (lead < buf.length && predicate(buf[lead]))
+ lead++;
+ }
+ if (trailing) {
+ while (trail > 0 && predicate(buf[trail]))
+ trail--;
+ }
+ return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1);
+ }
+ function bufferStartsWith(buffer, start, position) {
+ if (buffer.length < start.length) {
+ return false;
+ }
+ for (let i = 0; i < start.length; i++) {
+ if (start[i] !== buffer[position.position + i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ module2.exports = {
+ multipartFormDataParser,
+ validateBoundary
+ };
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/body.js
+var require_body = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/body.js"(exports, module2) {
+ "use strict";
+ var util = require_util();
+ var {
+ ReadableStreamFrom,
+ isBlobLike,
+ isReadableStreamLike,
+ readableStreamClose,
+ createDeferredPromise,
+ fullyReadBody,
+ extractMimeType,
+ utf8DecodeBytes
+ } = require_util3();
+ var { FormData } = require_formdata();
+ var { kState } = require_symbols2();
+ var { webidl } = require_webidl();
+ var { Blob: Blob2 } = require("node:buffer");
+ var assert3 = require("node:assert");
+ var { isErrored } = require_util();
+ var { isArrayBuffer } = require("node:util/types");
+ var { serializeAMimeType } = require_data_url();
+ var { multipartFormDataParser } = require_formdata_parser();
+ var textEncoder = new TextEncoder();
+ function extractBody(object, keepalive = false) {
+ let stream = null;
+ if (object instanceof ReadableStream) {
+ stream = object;
+ } else if (isBlobLike(object)) {
+ stream = object.stream();
+ } else {
+ stream = new ReadableStream({
+ async pull(controller) {
+ const buffer = typeof source === "string" ? textEncoder.encode(source) : source;
+ if (buffer.byteLength) {
+ controller.enqueue(buffer);
+ }
+ queueMicrotask(() => readableStreamClose(controller));
+ },
+ start() {
+ },
+ type: "bytes"
+ });
+ }
+ assert3(isReadableStreamLike(stream));
+ let action = null;
+ let source = null;
+ let length = null;
+ let type = null;
+ if (typeof object === "string") {
+ source = object;
+ type = "text/plain;charset=UTF-8";
+ } else if (object instanceof URLSearchParams) {
+ source = object.toString();
+ type = "application/x-www-form-urlencoded;charset=UTF-8";
+ } else if (isArrayBuffer(object)) {
+ source = new Uint8Array(object.slice());
+ } else if (ArrayBuffer.isView(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
+Content-Disposition: form-data`;
+ 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");
+ const blobParts = [];
+ const rn = new Uint8Array([13, 10]);
+ length = 0;
+ let hasUnknownSizeValue = false;
+ for (const [name, value] of object) {
+ if (typeof value === "string") {
+ const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r
+\r
+${normalizeLinefeeds(value)}\r
+`);
+ blobParts.push(chunk2);
+ length += chunk2.byteLength;
+ } else {
+ const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r
+Content-Type: ${value.type || "application/octet-stream"}\r
+\r
+`);
+ blobParts.push(chunk2, value, rn);
+ if (typeof value.size === "number") {
+ length += chunk2.byteLength + value.size + rn.byteLength;
+ } else {
+ hasUnknownSizeValue = true;
+ }
}
- this.redirectionLimitReached = true;
- this.abort(new Error("max redirects"));
- return;
- }
- 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 path10 = search ? `${pathname}${search}` : pathname;
- this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin);
- this.opts.path = path10;
- this.opts.origin = origin;
- this.opts.maxRedirections = 0;
- this.opts.query = null;
- if (statusCode === 303 && this.opts.method !== "HEAD") {
- this.opts.method = "GET";
- this.opts.body = null;
+ const chunk = textEncoder.encode(`--${boundary}--`);
+ blobParts.push(chunk);
+ length += chunk.byteLength;
+ if (hasUnknownSizeValue) {
+ length = null;
}
- }
- onData(chunk) {
- if (this.location) {
- } else {
- return this.handler.onData(chunk);
+ source = object;
+ action = async function* () {
+ for (const part of blobParts) {
+ if (part.stream) {
+ yield* part.stream();
+ } else {
+ yield part;
+ }
+ }
+ };
+ type = `multipart/form-data; boundary=${boundary}`;
+ } else if (isBlobLike(object)) {
+ source = object;
+ length = object.size;
+ if (object.type) {
+ type = object.type;
}
- }
- onComplete(trailers) {
- if (this.location) {
- this.location = null;
- this.abort = null;
- this.dispatch(this.opts, this);
- } else {
- this.handler.onComplete(trailers);
+ } else if (typeof object[Symbol.asyncIterator] === "function") {
+ if (keepalive) {
+ throw new TypeError("keepalive");
}
- }
- onBodySent(chunk) {
- if (this.handler.onBodySent) {
- this.handler.onBodySent(chunk);
+ 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);
}
- };
- function parseLocation(statusCode, headers) {
- if (redirectableStatusCodes.indexOf(statusCode) === -1) {
- return null;
+ if (typeof source === "string" || util.isBuffer(source)) {
+ length = Buffer.byteLength(source);
}
- for (let i = 0; i < headers.length; i += 2) {
- if (headers[i].length === 8 && util.headerNameToString(headers[i]) === "location") {
- return headers[i + 1];
- }
+ if (action != null) {
+ let iterator;
+ stream = new ReadableStream({
+ async start() {
+ iterator = action(object)[Symbol.asyncIterator]();
+ },
+ async pull(controller) {
+ const { value, done } = await iterator.next();
+ if (done) {
+ queueMicrotask(() => {
+ controller.close();
+ controller.byobRequest?.respond(0);
+ });
+ } else {
+ if (!isErrored(stream)) {
+ const buffer = new Uint8Array(value);
+ if (buffer.byteLength) {
+ controller.enqueue(buffer);
+ }
+ }
+ }
+ return controller.desiredSize > 0;
+ },
+ async cancel(reason) {
+ await iterator.return();
+ },
+ type: "bytes"
+ });
}
+ const body = { stream, source, length };
+ return [body, type];
}
- function shouldRemoveHeader(header, removeContent, unknownOrigin) {
- if (header.length === 4) {
- return util.headerNameToString(header) === "host";
- }
- if (removeContent && util.headerNameToString(header).startsWith("content-")) {
- return true;
+ function safelyExtractBody(object, keepalive = false) {
+ if (object instanceof ReadableStream) {
+ assert3(!util.isDisturbed(object), "The body has already been consumed.");
+ assert3(!object.locked, "The stream is locked.");
}
- if (unknownOrigin && (header.length === 13 || header.length === 6)) {
- const name = util.headerNameToString(header);
- return name === "authorization" || name === "cookie";
+ return extractBody(object, keepalive);
+ }
+ function cloneBody(body) {
+ const [out1, out2] = body.stream.tee();
+ body.stream = out1;
+ return {
+ stream: out2,
+ length: body.length,
+ source: body.source
+ };
+ }
+ function throwIfAborted(state) {
+ if (state.aborted) {
+ throw new DOMException("The operation was aborted.", "AbortError");
}
- return false;
}
- 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]);
- }
+ function bodyMixinMethods(instance) {
+ const methods = {
+ blob() {
+ return consumeBody(this, (bytes) => {
+ let mimeType = bodyMimeType(this);
+ if (mimeType === null) {
+ mimeType = "";
+ } else if (mimeType) {
+ mimeType = serializeAMimeType(mimeType);
+ }
+ return new Blob2([bytes], { type: mimeType });
+ }, instance);
+ },
+ arrayBuffer() {
+ return consumeBody(this, (bytes) => {
+ return new Uint8Array(bytes).buffer;
+ }, instance);
+ },
+ text() {
+ return consumeBody(this, utf8DecodeBytes, instance);
+ },
+ json() {
+ return consumeBody(this, parseJSONFromBytes, instance);
+ },
+ formData() {
+ return consumeBody(this, (value) => {
+ const mimeType = bodyMimeType(this);
+ if (mimeType !== null) {
+ switch (mimeType.essence) {
+ case "multipart/form-data": {
+ const parsed = multipartFormDataParser(value, mimeType);
+ if (parsed === "failure") {
+ throw new TypeError("Failed to parse body as FormData.");
+ }
+ const fd = new FormData();
+ fd[kState] = parsed;
+ return fd;
+ }
+ case "application/x-www-form-urlencoded": {
+ const entries = new URLSearchParams(value.toString());
+ const fd = new FormData();
+ for (const [name, value2] of entries) {
+ fd.append(name, value2);
+ }
+ return fd;
+ }
+ }
+ }
+ throw new TypeError(
+ 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".'
+ );
+ }, instance);
}
- } else if (headers && typeof headers === "object") {
- for (const key of Object.keys(headers)) {
- if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {
- ret.push(key, headers[key]);
- }
+ };
+ return methods;
+ }
+ function mixinBody(prototype) {
+ Object.assign(prototype.prototype, bodyMixinMethods(prototype));
+ }
+ async function consumeBody(object, convertBytesToJSValue, instance) {
+ webidl.brandCheck(object, instance);
+ if (bodyUnusable(object[kState].body)) {
+ throw new TypeError("Body is unusable");
+ }
+ throwIfAborted(object[kState]);
+ const promise = createDeferredPromise();
+ const errorSteps = (error) => promise.reject(error);
+ const successSteps = (data) => {
+ try {
+ promise.resolve(convertBytesToJSValue(data));
+ } catch (e) {
+ errorSteps(e);
}
- } else {
- assert3(headers == null, "headers must be an object or an array");
+ };
+ if (object[kState].body == null) {
+ successSteps(new Uint8Array());
+ return promise.promise;
}
- return ret;
+ await fullyReadBody(object[kState].body, successSteps, errorSteps);
+ return promise.promise;
}
- module2.exports = RedirectHandler;
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/interceptor/redirectInterceptor.js
-var require_redirectInterceptor = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/interceptor/redirectInterceptor.js"(exports, module2) {
- "use strict";
- var RedirectHandler = require_RedirectHandler();
- 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 };
- return dispatch(opts, redirectHandler);
- };
- };
+ function bodyUnusable(body) {
+ return body != null && (body.stream.locked || util.isDisturbed(body.stream));
}
- module2.exports = createRedirectInterceptor;
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js
-var require_llhttp_wasm = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports, module2) {
- var { Buffer: Buffer2 } = require("node:buffer");
- module2.exports = Buffer2.from("AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8=", "base64");
- }
-});
-
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js
-var require_llhttp_simd_wasm = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports, module2) {
- var { Buffer: Buffer2 } = require("node:buffer");
- module2.exports = Buffer2.from("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==", "base64");
+ function parseJSONFromBytes(bytes) {
+ return JSON.parse(utf8DecodeBytes(bytes));
+ }
+ function bodyMimeType(requestOrResponse) {
+ const headers = requestOrResponse[kState].headersList;
+ const mimeType = extractMimeType(headers);
+ if (mimeType === "failure") {
+ return null;
+ }
+ return mimeType;
+ }
+ module2.exports = {
+ extractBody,
+ safelyExtractBody,
+ cloneBody,
+ mixinBody
+ };
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/client.js
-var require_client = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/client.js"(exports, module2) {
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client-h1.js
+var require_client_h1 = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client-h1.js"(exports, module2) {
"use strict";
var assert3 = require("node:assert");
- var net = require("node:net");
- var http = require("node:http");
- var { pipeline } = require("node:stream");
var util = require_util();
var { channels } = require_diagnostics();
var timers = require_timers();
- var Request = require_request();
- var DispatcherBase = require_dispatcher_base();
var {
RequestContentLengthMismatchError,
ResponseContentLengthMismatchError,
- InvalidArgumentError,
RequestAbortedError,
HeadersTimeoutError,
HeadersOverflowError,
@@ -11411,28 +10693,19 @@ var require_client = __commonJS({
InformationalError,
BodyTimeoutError,
HTTPParserError,
- ResponseExceededMaxSizeError,
- ClientDestroyedError
+ ResponseExceededMaxSizeError
} = require_errors();
- var buildConnector = require_connect();
var {
kUrl,
kReset,
- kServerName,
kClient,
- kBusy,
kParser,
- kConnect,
kBlocking,
- kResuming,
kRunning,
kPending,
kSize,
kWriting,
kQueue,
- kConnected,
- kConnecting,
- kNeedDrain,
kNoRef,
kKeepAliveDefaultTimeout,
kHostHeader,
@@ -11448,1664 +10721,2159 @@ var require_client = __commonJS({
kHeadersTimeout,
kBodyTimeout,
kStrictContentLength,
- kConnector,
- kMaxRedirections,
kMaxRequests,
kCounter,
- kClose,
- kDestroy,
- kDispatch,
- kInterceptors,
- kLocalAddress,
kMaxResponseSize,
- kHTTPConnVersion,
- // HTTP2
- kHost,
- kHTTP2Session,
- kHTTP2SessionState,
- kHTTP2BuildRequest,
- kHTTP2CopyHeaders,
- kHTTP1BuildRequest
+ kOnError,
+ kResume,
+ kHTTPContext
} = require_symbols();
- var http2;
- try {
- http2 = require("node:http2");
- } catch {
- http2 = { constants: {} };
+ var constants = require_constants3();
+ var EMPTY_BUF = Buffer.alloc(0);
+ var FastBuffer = Buffer[Symbol.species];
+ var addListener = util.addListener;
+ var removeAllListeners = util.removeAllListeners;
+ var extractBody;
+ async function lazyllhttp() {
+ const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0;
+ let mod;
+ try {
+ mod = await WebAssembly.compile(require_llhttp_simd_wasm());
+ } catch (e) {
+ mod = await WebAssembly.compile(llhttpWasmData || require_llhttp_wasm());
+ }
+ return await WebAssembly.instantiate(mod, {
+ env: {
+ /* eslint-disable camelcase */
+ wasm_on_url: (p, at, len) => {
+ return 0;
+ },
+ wasm_on_status: (p, at, len) => {
+ assert3.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) => {
+ assert3.strictEqual(currentParser.ptr, p);
+ return currentParser.onMessageBegin() || 0;
+ },
+ wasm_on_header_field: (p, at, len) => {
+ assert3.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) => {
+ assert3.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) => {
+ assert3.strictEqual(currentParser.ptr, p);
+ return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0;
+ },
+ wasm_on_body: (p, at, len) => {
+ assert3.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) => {
+ assert3.strictEqual(currentParser.ptr, p);
+ return currentParser.onMessageComplete() || 0;
+ }
+ /* eslint-enable camelcase */
+ }
+ });
}
- var {
- constants: {
- HTTP2_HEADER_AUTHORITY,
- HTTP2_HEADER_METHOD,
- HTTP2_HEADER_PATH,
- HTTP2_HEADER_SCHEME,
- HTTP2_HEADER_CONTENT_LENGTH,
- HTTP2_HEADER_EXPECT,
- HTTP2_HEADER_STATUS
+ var llhttpInstance = null;
+ var llhttpPromise = lazyllhttp();
+ llhttpPromise.catch();
+ var currentParser = null;
+ var currentBufferRef = null;
+ var currentBufferSize = 0;
+ var currentBufferPtr = null;
+ var TIMEOUT_HEADERS = 1;
+ var TIMEOUT_BODY = 2;
+ var TIMEOUT_IDLE = 3;
+ var Parser = class {
+ constructor(client, socket, { exports: exports2 }) {
+ assert3(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0);
+ this.llhttp = exports2;
+ 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];
}
- } = http2;
- var h2ExperimentalWarned = false;
- var FastBuffer = Buffer[Symbol.species];
- var kClosedResolve = Symbol("kClosedResolve");
- var Client = class 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: connect2,
- maxRequestsPerClient,
- localAddress,
- maxResponseSize,
- autoSelectFamily,
- autoSelectFamilyAttemptTimeout,
- // h2
- allowH2,
- maxConcurrentStreams
- } = {}) {
- super();
- if (keepAlive !== void 0) {
- throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead");
+ setTimeout(value, type) {
+ this.timeoutType = type;
+ if (value !== this.timeoutValue) {
+ timers.clearTimeout(this.timeout);
+ if (value) {
+ this.timeout = timers.setTimeout(onParserTimeout, value, this);
+ if (this.timeout.unref) {
+ this.timeout.unref();
+ }
+ } else {
+ this.timeout = null;
+ }
+ this.timeoutValue = value;
+ } else if (this.timeout) {
+ if (this.timeout.refresh) {
+ this.timeout.refresh();
+ }
}
- if (socketTimeout !== void 0) {
- throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead");
+ }
+ resume() {
+ if (this.socket.destroyed || !this.paused) {
+ return;
}
- if (requestTimeout !== void 0) {
- throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead");
+ assert3(this.ptr != null);
+ assert3(currentParser == null);
+ this.llhttp.llhttp_resume(this.ptr);
+ assert3(this.timeoutType === TIMEOUT_BODY);
+ if (this.timeout) {
+ if (this.timeout.refresh) {
+ this.timeout.refresh();
+ }
+ }
+ this.paused = false;
+ this.execute(this.socket.read() || EMPTY_BUF);
+ this.readMore();
+ }
+ readMore() {
+ while (!this.paused && this.ptr) {
+ const chunk = this.socket.read();
+ if (chunk === null) {
+ break;
+ }
+ this.execute(chunk);
+ }
+ }
+ execute(data) {
+ assert3(this.ptr != null);
+ assert3(currentParser == null);
+ assert3(!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);
+ try {
+ let ret;
+ try {
+ currentBufferRef = data;
+ currentParser = this;
+ ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length);
+ } catch (err) {
+ 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 = "";
+ 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 (idleTimeout !== void 0) {
- throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead");
+ }
+ destroy() {
+ assert3(this.ptr != null);
+ assert3(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;
+ if (socket.destroyed) {
+ return -1;
}
- if (maxKeepAliveTimeout !== void 0) {
- throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead");
+ const request = client[kQueue][client[kRunningIdx]];
+ if (!request) {
+ return -1;
}
- if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) {
- throw new InvalidArgumentError("invalid maxHeaderSize");
+ request.onResponseStarted();
+ }
+ 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]);
}
- if (socketPath != null && typeof socketPath !== "string") {
- throw new InvalidArgumentError("invalid socketPath");
+ 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]);
}
- if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) {
- throw new InvalidArgumentError("invalid connectTimeout");
+ const key = this.headers[len - 2];
+ if (key.length === 10) {
+ const headerName = util.bufferToLowerCasedHeaderName(key);
+ if (headerName === "keep-alive") {
+ this.keepAlive += buf.toString();
+ } else if (headerName === "connection") {
+ this.connection += buf.toString();
+ }
+ } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === "content-length") {
+ this.contentLength += buf.toString();
}
- if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) {
- throw new InvalidArgumentError("invalid keepAliveTimeout");
+ this.trackHeader(buf.length);
+ }
+ trackHeader(len) {
+ this.headersSize += len;
+ if (this.headersSize >= this.headersMaxSize) {
+ util.destroy(this.socket, new HeadersOverflowError());
}
- if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) {
- throw new InvalidArgumentError("invalid keepAliveMaxTimeout");
+ }
+ onUpgrade(head) {
+ const { upgrade, client, socket, headers, statusCode } = this;
+ assert3(upgrade);
+ const request = client[kQueue][client[kRunningIdx]];
+ assert3(request);
+ assert3(!socket.destroyed);
+ assert3(socket === client[kSocket]);
+ assert3(!this.paused);
+ assert3(request.upgrade || request.method === "CONNECT");
+ this.statusCode = null;
+ this.statusText = "";
+ this.shouldKeepAlive = null;
+ assert3(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;
+ removeAllListeners(socket);
+ client[kSocket] = null;
+ client[kHTTPContext] = 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);
}
- if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) {
- throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold");
+ client[kResume]();
+ }
+ onHeadersComplete(statusCode, upgrade, shouldKeepAlive) {
+ const { client, socket, headers, statusText } = this;
+ if (socket.destroyed) {
+ return -1;
}
- if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) {
- throw new InvalidArgumentError("headersTimeout must be a positive integer or zero");
+ const request = client[kQueue][client[kRunningIdx]];
+ if (!request) {
+ return -1;
}
- if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) {
- throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero");
+ assert3(!this.upgrade);
+ assert3(this.statusCode < 200);
+ if (statusCode === 100) {
+ util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket)));
+ return -1;
}
- if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") {
- throw new InvalidArgumentError("connect must be a function or an object");
+ if (upgrade && !request.upgrade) {
+ util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket)));
+ return -1;
}
- if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
- throw new InvalidArgumentError("maxRedirections must be a positive number");
+ assert3.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) {
+ if (this.timeout.refresh) {
+ this.timeout.refresh();
+ }
}
- if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) {
- throw new InvalidArgumentError("maxRequestsPerClient must be a positive number");
+ if (request.method === "CONNECT") {
+ assert3(client[kRunning] === 1);
+ this.upgrade = true;
+ return 2;
}
- if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) {
- throw new InvalidArgumentError("localAddress must be valid string IP address");
+ if (upgrade) {
+ assert3(client[kRunning] === 1);
+ this.upgrade = true;
+ return 2;
}
- if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) {
- throw new InvalidArgumentError("maxResponseSize must be a positive number");
+ assert3(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 {
+ socket[kReset] = true;
}
- if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) {
- throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number");
+ const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false;
+ if (request.aborted) {
+ return -1;
}
- if (allowH2 != null && typeof allowH2 !== "boolean") {
- throw new InvalidArgumentError("allowH2 must be a valid boolean value");
+ if (request.method === "HEAD") {
+ return 1;
}
- if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) {
- throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0");
+ if (statusCode < 200) {
+ return 1;
}
- if (typeof connect2 !== "function") {
- connect2 = buildConnector({
- ...tls,
- maxCachedSessions,
- allowH2,
- socketPath,
- timeout: connectTimeout,
- ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0,
- ...connect2
- });
+ if (socket[kBlocking]) {
+ socket[kBlocking] = false;
+ client[kResume]();
}
- this[kInterceptors] = interceptors?.Client && Array.isArray(interceptors.Client) ? interceptors.Client : [createRedirectInterceptor({ maxRedirections })];
- this[kUrl] = util.parseOrigin(url);
- this[kConnector] = connect2;
- this[kSocket] = null;
- this[kPipelining] = pipelining != null ? pipelining : 1;
- this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize;
- this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout;
- this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout;
- this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold;
- this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout];
- this[kServerName] = null;
- this[kLocalAddress] = localAddress != null ? localAddress : null;
- this[kResuming] = 0;
- this[kNeedDrain] = 0;
- this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r
-`;
- this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5;
- this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5;
- this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength;
- this[kMaxRedirections] = maxRedirections;
- this[kMaxRequests] = maxRequestsPerClient;
- this[kClosedResolve] = null;
- this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1;
- this[kHTTPConnVersion] = "h1";
- 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 whether 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}` : ""}`;
- 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;
+ return pause ? constants.ERROR.PAUSED : 0;
}
- /* istanbul ignore: only used for test */
- [kConnect](cb) {
- connect(this);
- this.once("connect", cb);
+ onBody(buf) {
+ const { client, socket, statusCode, maxResponseSize } = this;
+ if (socket.destroyed) {
+ return -1;
+ }
+ const request = client[kQueue][client[kRunningIdx]];
+ assert3(request);
+ assert3.strictEqual(this.timeoutType, TIMEOUT_BODY);
+ if (this.timeout) {
+ if (this.timeout.refresh) {
+ this.timeout.refresh();
+ }
+ }
+ assert3(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;
+ }
}
- [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]) {
- } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) {
- this[kResuming] = 1;
- process.nextTick(resume, this);
- } else {
- resume(this, true);
+ onMessageComplete() {
+ const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this;
+ if (socket.destroyed && (!statusCode || shouldKeepAlive)) {
+ return -1;
}
- if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) {
- this[kNeedDrain] = 2;
+ if (upgrade) {
+ return;
+ }
+ const request = client[kQueue][client[kRunningIdx]];
+ assert3(request);
+ assert3(statusCode >= 100);
+ this.statusCode = null;
+ this.statusText = "";
+ this.bytesRead = 0;
+ this.contentLength = "";
+ this.keepAlive = "";
+ this.connection = "";
+ assert3(this.headers.length % 2 === 0);
+ this.headers = [];
+ this.headersSize = 0;
+ if (statusCode < 200) {
+ return;
+ }
+ 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]) {
+ assert3.strictEqual(client[kRunning], 0);
+ 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) {
+ util.destroy(socket, new InformationalError("reset"));
+ return constants.ERROR.PAUSED;
+ } else if (client[kPipelining] == null || client[kPipelining] === 1) {
+ setImmediate(() => client[kResume]());
+ } else {
+ client[kResume]();
}
- return this[kNeedDrain] < 2;
}
- async [kClose]() {
- return new Promise((resolve) => {
- if (this[kSize]) {
- this[kClosedResolve] = resolve;
- } else {
- resolve(null);
- }
- });
+ };
+ function onParserTimeout(parser) {
+ const { socket, timeoutType, client } = parser;
+ if (timeoutType === TIMEOUT_HEADERS) {
+ if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) {
+ assert3(!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) {
+ assert3(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]);
+ util.destroy(socket, new InformationalError("socket idle timeout"));
}
- async [kDestroy](err) {
- return new Promise((resolve) => {
- const requests = this[kQueue].splice(this[kPendingIdx]);
+ }
+ async function connectH1(client, socket) {
+ client[kSocket] = socket;
+ 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);
+ addListener(socket, "error", function(err) {
+ const parser = this[kParser];
+ assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
+ if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) {
+ parser.onMessageComplete();
+ return;
+ }
+ this[kError] = err;
+ this[kClient][kOnError](err);
+ });
+ addListener(socket, "readable", function() {
+ const parser = this[kParser];
+ if (parser) {
+ parser.readMore();
+ }
+ });
+ addListener(socket, "end", function() {
+ const parser = this[kParser];
+ if (parser.statusCode && !parser.shouldKeepAlive) {
+ parser.onMessageComplete();
+ return;
+ }
+ util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this)));
+ });
+ addListener(socket, "close", function() {
+ const client2 = this[kClient];
+ const parser = this[kParser];
+ if (parser) {
+ if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {
+ parser.onMessageComplete();
+ }
+ this[kParser].destroy();
+ this[kParser] = null;
+ }
+ const err = this[kError] || new SocketError("closed", util.getSocketInfo(this));
+ client2[kSocket] = null;
+ client2[kHTTPContext] = null;
+ if (client2.destroyed) {
+ assert3(client2[kPending] === 0);
+ const requests = client2[kQueue].splice(client2[kRunningIdx]);
for (let i = 0; i < requests.length; i++) {
const request = requests[i];
- errorRequest(this, request, err);
- }
- const callback = () => {
- if (this[kClosedResolve]) {
- this[kClosedResolve]();
- this[kClosedResolve] = null;
- }
- resolve();
- };
- if (this[kHTTP2Session] != null) {
- util.destroy(this[kHTTP2Session], err);
- this[kHTTP2Session] = null;
- this[kHTTP2SessionState] = null;
+ util.errorRequest(client2, request, err);
}
- if (this[kSocket]) {
- util.destroy(this[kSocket].on("close", callback), err);
- } else {
+ } else if (client2[kRunning] > 0 && err.code !== "UND_ERR_INFO") {
+ const request = client2[kQueue][client2[kRunningIdx]];
+ client2[kQueue][client2[kRunningIdx]++] = null;
+ util.errorRequest(client2, request, err);
+ }
+ client2[kPendingIdx] = client2[kRunningIdx];
+ assert3(client2[kRunning] === 0);
+ client2.emit("disconnect", client2[kUrl], [client2], err);
+ client2[kResume]();
+ });
+ let closed = false;
+ socket.on("close", () => {
+ closed = true;
+ });
+ return {
+ version: "h1",
+ defaultPipelining: 1,
+ write(...args) {
+ return writeH1(client, ...args);
+ },
+ resume() {
+ resumeH1(client);
+ },
+ destroy(err, callback) {
+ if (closed) {
queueMicrotask(callback);
+ } else {
+ socket.destroy(err).on("close", callback);
}
- resume(this);
- });
- }
- };
- function onHttp2SessionError(err) {
- assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
- this[kSocket][kError] = err;
- onError(this[kClient], err);
+ },
+ get destroyed() {
+ return socket.destroyed;
+ },
+ busy(request) {
+ if (socket[kWriting] || socket[kReset] || socket[kBlocking]) {
+ return true;
+ }
+ if (request) {
+ if (client[kRunning] > 0 && !request.idempotent) {
+ return true;
+ }
+ if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) {
+ return true;
+ }
+ if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) {
+ return true;
+ }
+ }
+ return false;
+ }
+ };
}
- function onHttp2FrameError(type, code, id) {
- const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`);
- if (id === 0) {
- this[kSocket][kError] = err;
- onError(this[kClient], err);
+ function resumeH1(client) {
+ const socket = client[kSocket];
+ if (socket && !socket.destroyed) {
+ 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);
+ }
+ }
}
}
- function onHttp2SessionEnd() {
- util.destroy(this, new SocketError("other side closed"));
- util.destroy(this[kSocket], new SocketError("other side closed"));
+ function shouldSendContentLength(method) {
+ return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT";
}
- 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) {
- assert3(this[kPending] === 0);
- const requests = client[kQueue].splice(client[kRunningIdx]);
- for (let i = 0; i < requests.length; i++) {
- const request = requests[i];
- errorRequest(this, request, err);
+ function writeH1(client, request) {
+ const { method, path: path10, host, upgrade, blocking, reset } = request;
+ let { body, headers, contentLength } = request;
+ const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH";
+ if (util.isFormDataLike(body)) {
+ if (!extractBody) {
+ extractBody = require_body().extractBody;
}
- } else if (client[kRunning] > 0) {
- const request = client[kQueue][client[kRunningIdx]];
- client[kQueue][client[kRunningIdx]++] = null;
- errorRequest(client, request, err);
- }
- client[kPendingIdx] = client[kRunningIdx];
- assert3(client[kRunning] === 0);
- client.emit(
- "disconnect",
- client[kUrl],
- [client],
- err
- );
- resume(client);
- }
- var constants = require_constants4();
- var createRedirectInterceptor = require_redirectInterceptor();
- var EMPTY_BUF = Buffer.alloc(0);
- async function lazyllhttp() {
- const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0;
- let mod;
- try {
- mod = await WebAssembly.compile(require_llhttp_simd_wasm());
- } catch (e) {
- mod = await WebAssembly.compile(llhttpWasmData || require_llhttp_wasm());
+ const [bodyStream, contentType] = extractBody(body);
+ if (request.contentType == null) {
+ headers.push("content-type", contentType);
+ }
+ body = bodyStream.stream;
+ contentLength = bodyStream.length;
+ } else if (util.isBlobLike(body) && request.contentType == null && body.type) {
+ headers.push("content-type", body.type);
}
- return await WebAssembly.instantiate(mod, {
- env: {
- /* eslint-disable camelcase */
- wasm_on_url: (p, at, len) => {
- return 0;
- },
- wasm_on_status: (p, at, len) => {
- assert3.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) => {
- assert3.strictEqual(currentParser.ptr, p);
- return currentParser.onMessageBegin() || 0;
- },
- wasm_on_header_field: (p, at, len) => {
- assert3.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) => {
- assert3.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) => {
- assert3.strictEqual(currentParser.ptr, p);
- return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0;
- },
- wasm_on_body: (p, at, len) => {
- assert3.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) => {
- assert3.strictEqual(currentParser.ptr, p);
- return currentParser.onMessageComplete() || 0;
- }
- /* eslint-enable camelcase */
+ if (body && typeof body.read === "function") {
+ body.read(0);
+ }
+ const bodyLength = util.bodyLength(body);
+ contentLength = bodyLength ?? contentLength;
+ if (contentLength === null) {
+ contentLength = request.contentLength;
+ }
+ if (contentLength === 0 && !expectsPayload) {
+ contentLength = null;
+ }
+ if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) {
+ if (client[kStrictContentLength]) {
+ util.errorRequest(client, request, new RequestContentLengthMismatchError());
+ return false;
}
- });
- }
- var llhttpInstance = null;
- var llhttpPromise = lazyllhttp();
- llhttpPromise.catch();
- var currentParser = null;
- var currentBufferRef = null;
- var currentBufferSize = 0;
- var currentBufferPtr = null;
- var TIMEOUT_HEADERS = 1;
- var TIMEOUT_BODY = 2;
- var TIMEOUT_IDLE = 3;
- var Parser = class {
- constructor(client, socket, { exports: exports2 }) {
- assert3(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0);
- this.llhttp = exports2;
- 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];
+ process.emitWarning(new RequestContentLengthMismatchError());
}
- setTimeout(value, type) {
- this.timeoutType = type;
- if (value !== this.timeoutValue) {
- timers.clearTimeout(this.timeout);
- if (value) {
- this.timeout = timers.setTimeout(onParserTimeout, value, this);
- if (this.timeout.unref) {
- this.timeout.unref();
+ const socket = client[kSocket];
+ const abort = (err) => {
+ if (request.aborted || request.completed) {
+ return;
+ }
+ util.errorRequest(client, request, err || new RequestAbortedError());
+ util.destroy(body);
+ util.destroy(socket, new InformationalError("aborted"));
+ };
+ try {
+ request.onConnect(abort);
+ } catch (err) {
+ util.errorRequest(client, request, err);
+ }
+ if (request.aborted) {
+ return false;
+ }
+ if (method === "HEAD") {
+ socket[kReset] = true;
+ }
+ if (upgrade || method === "CONNECT") {
+ 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} ${path10} HTTP/1.1\r
+`;
+ if (typeof host === "string") {
+ header += `host: ${host}\r
+`;
+ } else {
+ header += client[kHostHeader];
+ }
+ if (upgrade) {
+ header += `connection: upgrade\r
+upgrade: ${upgrade}\r
+`;
+ } else if (client[kPipelining] && !socket[kReset]) {
+ header += "connection: keep-alive\r\n";
+ } else {
+ header += "connection: close\r\n";
+ }
+ if (Array.isArray(headers)) {
+ for (let n = 0; n < headers.length; n += 2) {
+ const key = headers[n + 0];
+ const val = headers[n + 1];
+ if (Array.isArray(val)) {
+ for (let i = 0; i < val.length; i++) {
+ header += `${key}: ${val[i]}\r
+`;
}
} else {
- this.timeout = null;
- }
- this.timeoutValue = value;
- } else if (this.timeout) {
- if (this.timeout.refresh) {
- this.timeout.refresh();
+ header += `${key}: ${val}\r
+`;
}
}
}
- resume() {
- if (this.socket.destroyed || !this.paused) {
+ if (channels.sendHeaders.hasSubscribers) {
+ channels.sendHeaders.publish({ request, headers: header, socket });
+ }
+ if (!body || bodyLength === 0) {
+ writeBuffer({ abort, body: null, client, request, socket, contentLength, header, expectsPayload });
+ } else if (util.isBuffer(body)) {
+ writeBuffer({ abort, body, client, request, socket, contentLength, header, expectsPayload });
+ } else if (util.isBlobLike(body)) {
+ if (typeof body.stream === "function") {
+ writeIterable({ abort, body: body.stream(), client, request, socket, contentLength, header, expectsPayload });
+ } else {
+ writeBlob({ abort, body, client, request, socket, contentLength, header, expectsPayload });
+ }
+ } else if (util.isStream(body)) {
+ writeStream({ abort, body, client, request, socket, contentLength, header, expectsPayload });
+ } else if (util.isIterable(body)) {
+ writeIterable({ abort, body, client, request, socket, contentLength, header, expectsPayload });
+ } else {
+ assert3(false);
+ }
+ return true;
+ }
+ function writeStream({ abort, body, client, request, socket, contentLength, header, expectsPayload }) {
+ assert3(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined");
+ let finished = false;
+ const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header });
+ const onData = function(chunk) {
+ if (finished) {
return;
}
- assert3(this.ptr != null);
- assert3(currentParser == null);
- this.llhttp.llhttp_resume(this.ptr);
- assert3(this.timeoutType === TIMEOUT_BODY);
- if (this.timeout) {
- if (this.timeout.refresh) {
- this.timeout.refresh();
+ try {
+ if (!writer.write(chunk) && this.pause) {
+ this.pause();
}
+ } catch (err) {
+ util.destroy(this, err);
}
- this.paused = false;
- this.execute(this.socket.read() || EMPTY_BUF);
- this.readMore();
- }
- readMore() {
- while (!this.paused && this.ptr) {
- const chunk = this.socket.read();
- if (chunk === null) {
- break;
- }
- this.execute(chunk);
+ };
+ const onDrain = function() {
+ if (finished) {
+ return;
}
- }
- execute(data) {
- assert3(this.ptr != null);
- assert3(currentParser == null);
- assert3(!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);
+ if (body.resume) {
+ body.resume();
}
- new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data);
- try {
- let ret;
+ };
+ const onClose = function() {
+ queueMicrotask(() => {
+ body.removeListener("error", onFinished);
+ });
+ if (!finished) {
+ const err = new RequestAbortedError();
+ queueMicrotask(() => onFinished(err));
+ }
+ };
+ const onFinished = function(err) {
+ if (finished) {
+ return;
+ }
+ finished = true;
+ assert3(socket.destroyed || socket[kWriting] && client[kRunning] <= 1);
+ socket.off("drain", onDrain).off("error", onFinished);
+ body.removeListener("data", onData).removeListener("end", onFinished).removeListener("close", onClose);
+ if (!err) {
try {
- currentBufferRef = data;
- currentParser = this;
- ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length);
- } catch (err) {
- 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 = "";
- 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));
+ writer.end();
+ } catch (er) {
+ err = er;
}
- } catch (err) {
- util.destroy(socket, err);
}
+ 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", onClose);
+ if (body.resume) {
+ body.resume();
}
- destroy() {
- assert3(this.ptr != null);
- assert3(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;
+ socket.on("drain", onDrain).on("error", onFinished);
+ if (body.errorEmitted ?? body.errored) {
+ setImmediate(() => onFinished(body.errored));
+ } else if (body.endEmitted ?? body.readableEnded) {
+ setImmediate(() => onFinished(null));
}
- onStatus(buf) {
- this.statusText = buf.toString();
+ if (body.closeEmitted ?? body.closed) {
+ setImmediate(onClose);
}
- onMessageBegin() {
- const { socket, client } = this;
- if (socket.destroyed) {
- return -1;
+ }
+ async function writeBuffer({ abort, body, client, request, socket, contentLength, header, expectsPayload }) {
+ try {
+ if (!body) {
+ if (contentLength === 0) {
+ socket.write(`${header}content-length: 0\r
+\r
+`, "latin1");
+ } else {
+ assert3(contentLength === null, "no body must not have content length");
+ socket.write(`${header}\r
+`, "latin1");
+ }
+ } else if (util.isBuffer(body)) {
+ assert3(contentLength === body.byteLength, "buffer body must have content length");
+ socket.cork();
+ socket.write(`${header}content-length: ${contentLength}\r
+\r
+`, "latin1");
+ socket.write(body);
+ socket.uncork();
+ request.onBodySent(body);
+ if (!expectsPayload) {
+ socket[kReset] = true;
+ }
}
- const request = client[kQueue][client[kRunningIdx]];
- if (!request) {
- return -1;
+ request.onRequestSent();
+ client[kResume]();
+ } catch (err) {
+ abort(err);
+ }
+ }
+ async function writeBlob({ abort, body, client, request, socket, contentLength, header, expectsPayload }) {
+ assert3(contentLength === body.size, "blob body must have content length");
+ try {
+ if (contentLength != null && contentLength !== body.size) {
+ throw new RequestContentLengthMismatchError();
}
- request.onResponseStarted();
+ const buffer = Buffer.from(await body.arrayBuffer());
+ socket.cork();
+ socket.write(`${header}content-length: ${contentLength}\r
+\r
+`, "latin1");
+ socket.write(buffer);
+ socket.uncork();
+ request.onBodySent(buffer);
+ request.onRequestSent();
+ if (!expectsPayload) {
+ socket[kReset] = true;
+ }
+ client[kResume]();
+ } catch (err) {
+ abort(err);
}
- 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]);
+ }
+ async function writeIterable({ abort, body, client, request, socket, contentLength, header, expectsPayload }) {
+ assert3(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined");
+ let callback = null;
+ function onDrain() {
+ if (callback) {
+ const cb = callback;
+ callback = null;
+ cb();
}
- this.trackHeader(buf.length);
}
- onHeaderValue(buf) {
- let len = this.headers.length;
- if ((len & 1) === 1) {
- this.headers.push(buf);
- len += 1;
+ const waitForDrain = () => new Promise((resolve, reject) => {
+ assert3(callback === null);
+ if (socket[kError]) {
+ reject(socket[kError]);
} else {
- this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]);
+ callback = resolve;
}
- const key = this.headers[len - 2];
- if (key.length === 10) {
- const headerName = util.bufferToLowerCasedHeaderName(key);
- if (headerName === "keep-alive") {
- this.keepAlive += buf.toString();
- } else if (headerName === "connection") {
- this.connection += buf.toString();
+ });
+ socket.on("close", onDrain).on("drain", onDrain);
+ const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header });
+ try {
+ for await (const chunk of body) {
+ if (socket[kError]) {
+ throw socket[kError];
+ }
+ if (!writer.write(chunk)) {
+ await waitForDrain();
}
- } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === "content-length") {
- this.contentLength += buf.toString();
}
- this.trackHeader(buf.length);
+ writer.end();
+ } catch (err) {
+ writer.destroy(err);
+ } finally {
+ socket.off("close", onDrain).off("drain", onDrain);
}
- trackHeader(len) {
- this.headersSize += len;
- if (this.headersSize >= this.headersMaxSize) {
- util.destroy(this.socket, new HeadersOverflowError());
- }
+ }
+ var AsyncWriter = class {
+ constructor({ abort, 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;
+ this.abort = abort;
+ socket[kWriting] = true;
}
- onUpgrade(head) {
- const { upgrade, client, socket, headers, statusCode } = this;
- assert3(upgrade);
- const request = client[kQueue][client[kRunningIdx]];
- assert3(request);
- assert3(!socket.destroyed);
- assert3(socket === client[kSocket]);
- assert3(!this.paused);
- assert3(request.upgrade || request.method === "CONNECT");
- this.statusCode = null;
- this.statusText = "";
- this.shouldKeepAlive = null;
- assert3(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);
+ write(chunk) {
+ const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this;
+ if (socket[kError]) {
+ throw socket[kError];
}
- resume(client);
- }
- onHeadersComplete(statusCode, upgrade, shouldKeepAlive) {
- const { client, socket, headers, statusText } = this;
if (socket.destroyed) {
- return -1;
+ return false;
}
- const request = client[kQueue][client[kRunningIdx]];
- if (!request) {
- return -1;
+ const len = Buffer.byteLength(chunk);
+ if (!len) {
+ return true;
}
- assert3(!this.upgrade);
- assert3(this.statusCode < 200);
- if (statusCode === 100) {
- util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket)));
- return -1;
+ if (contentLength !== null && bytesWritten + len > contentLength) {
+ if (client[kStrictContentLength]) {
+ throw new RequestContentLengthMismatchError();
+ }
+ process.emitWarning(new RequestContentLengthMismatchError());
}
- if (upgrade && !request.upgrade) {
- util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket)));
- return -1;
+ socket.cork();
+ if (bytesWritten === 0) {
+ if (!expectsPayload) {
+ socket[kReset] = true;
+ }
+ if (contentLength === null) {
+ socket.write(`${header}transfer-encoding: chunked\r
+`, "latin1");
+ } else {
+ socket.write(`${header}content-length: ${contentLength}\r
+\r
+`, "latin1");
+ }
}
- assert3.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) {
- if (this.timeout.refresh) {
- this.timeout.refresh();
+ if (contentLength === null) {
+ socket.write(`\r
+${len.toString(16)}\r
+`, "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) {
+ if (socket[kParser].timeout.refresh) {
+ socket[kParser].timeout.refresh();
+ }
}
}
- if (request.method === "CONNECT") {
- assert3(client[kRunning] === 1);
- this.upgrade = true;
- return 2;
+ return ret;
+ }
+ end() {
+ const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this;
+ request.onRequestSent();
+ socket[kWriting] = false;
+ if (socket[kError]) {
+ throw socket[kError];
}
- if (upgrade) {
- assert3(client[kRunning] === 1);
- this.upgrade = true;
- return 2;
+ if (socket.destroyed) {
+ return;
}
- assert3(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;
- }
+ if (bytesWritten === 0) {
+ if (expectsPayload) {
+ socket.write(`${header}content-length: 0\r
+\r
+`, "latin1");
} else {
- client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout];
+ socket.write(`${header}\r
+`, "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) {
+ if (socket[kParser].timeout.refresh) {
+ socket[kParser].timeout.refresh();
+ }
+ }
+ client[kResume]();
+ }
+ destroy(err) {
+ const { socket, client, abort } = this;
+ socket[kWriting] = false;
+ if (err) {
+ assert3(client[kRunning] <= 1, "pipeline should only contain this request");
+ abort(err);
+ }
+ }
+ };
+ module2.exports = connectH1;
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client-h2.js
+var require_client_h2 = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client-h2.js"(exports, module2) {
+ "use strict";
+ var assert3 = require("node:assert");
+ var { pipeline } = require("node:stream");
+ var util = require_util();
+ var {
+ RequestContentLengthMismatchError,
+ RequestAbortedError,
+ SocketError,
+ InformationalError
+ } = require_errors();
+ var {
+ kUrl,
+ kReset,
+ kClient,
+ kRunning,
+ kPending,
+ kQueue,
+ kPendingIdx,
+ kRunningIdx,
+ kError,
+ kSocket,
+ kStrictContentLength,
+ kOnError,
+ kMaxConcurrentStreams,
+ kHTTP2Session,
+ kResume
+ } = require_symbols();
+ var kOpenStreams = Symbol("open streams");
+ var h2ExperimentalWarned = false;
+ var http2;
+ try {
+ http2 = require("node:http2");
+ } catch {
+ http2 = { constants: {} };
+ }
+ var {
+ constants: {
+ HTTP2_HEADER_AUTHORITY,
+ HTTP2_HEADER_METHOD,
+ HTTP2_HEADER_PATH,
+ HTTP2_HEADER_SCHEME,
+ HTTP2_HEADER_CONTENT_LENGTH,
+ HTTP2_HEADER_EXPECT,
+ HTTP2_HEADER_STATUS
+ }
+ } = http2;
+ function parseH2Headers(headers) {
+ const result = [];
+ for (const [name, value] of Object.entries(headers)) {
+ if (Array.isArray(value)) {
+ for (const subvalue of value) {
+ result.push(Buffer.from(name), Buffer.from(subvalue));
}
} else {
- socket[kReset] = true;
- }
- const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false;
- if (request.aborted) {
- return -1;
+ result.push(Buffer.from(name), Buffer.from(value));
}
- if (request.method === "HEAD") {
- return 1;
+ }
+ return result;
+ }
+ async function connectH2(client, socket) {
+ client[kSocket] = socket;
+ 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[kMaxConcurrentStreams]
+ });
+ session[kOpenStreams] = 0;
+ session[kClient] = client;
+ session[kSocket] = socket;
+ util.addListener(session, "error", onHttp2SessionError);
+ util.addListener(session, "frameError", onHttp2FrameError);
+ util.addListener(session, "end", onHttp2SessionEnd);
+ util.addListener(session, "goaway", onHTTP2GoAway);
+ util.addListener(session, "close", function() {
+ const { [kClient]: client2 } = this;
+ const { [kSocket]: socket2 } = client2;
+ const err = this[kSocket][kError] || this[kError] || new SocketError("closed", util.getSocketInfo(socket2));
+ client2[kHTTP2Session] = null;
+ if (client2.destroyed) {
+ assert3(client2[kPending] === 0);
+ const requests = client2[kQueue].splice(client2[kRunningIdx]);
+ for (let i = 0; i < requests.length; i++) {
+ const request = requests[i];
+ util.errorRequest(client2, request, err);
+ }
}
- if (statusCode < 200) {
- return 1;
+ });
+ session.unref();
+ client[kHTTP2Session] = session;
+ socket[kHTTP2Session] = session;
+ util.addListener(socket, "error", function(err) {
+ assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
+ this[kError] = err;
+ this[kClient][kOnError](err);
+ });
+ util.addListener(socket, "end", function() {
+ util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this)));
+ });
+ util.addListener(socket, "close", function() {
+ const err = this[kError] || new SocketError("closed", util.getSocketInfo(this));
+ client[kSocket] = null;
+ if (this[kHTTP2Session] != null) {
+ this[kHTTP2Session].destroy(err);
}
- if (socket[kBlocking]) {
- socket[kBlocking] = false;
- resume(client);
+ client[kPendingIdx] = client[kRunningIdx];
+ assert3(client[kRunning] === 0);
+ client.emit("disconnect", client[kUrl], [client], err);
+ client[kResume]();
+ });
+ let closed = false;
+ socket.on("close", () => {
+ closed = true;
+ });
+ return {
+ version: "h2",
+ defaultPipelining: Infinity,
+ write(...args) {
+ writeH2(client, ...args);
+ },
+ resume() {
+ },
+ destroy(err, callback) {
+ if (closed) {
+ queueMicrotask(callback);
+ } else {
+ socket.destroy(err).on("close", callback);
+ }
+ },
+ get destroyed() {
+ return socket.destroyed;
+ },
+ busy() {
+ return false;
}
- return pause ? constants.ERROR.PAUSED : 0;
+ };
+ }
+ function onHttp2SessionError(err) {
+ assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
+ this[kSocket][kError] = err;
+ this[kClient][kOnError](err);
+ }
+ function onHttp2FrameError(type, code, id) {
+ if (id === 0) {
+ const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`);
+ this[kSocket][kError] = err;
+ this[kClient][kOnError](err);
}
- onBody(buf) {
- const { client, socket, statusCode, maxResponseSize } = this;
- if (socket.destroyed) {
- return -1;
- }
- const request = client[kQueue][client[kRunningIdx]];
- assert3(request);
- assert3.strictEqual(this.timeoutType, TIMEOUT_BODY);
- if (this.timeout) {
- if (this.timeout.refresh) {
- this.timeout.refresh();
+ }
+ function onHttp2SessionEnd() {
+ const err = new SocketError("other side closed", util.getSocketInfo(this[kSocket]));
+ this.destroy(err);
+ util.destroy(this[kSocket], err);
+ }
+ function onHTTP2GoAway(code) {
+ const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`);
+ this[kSocket][kError] = err;
+ this[kClient][kOnError](err);
+ this.unref();
+ this.destroy();
+ util.destroy(this[kSocket], err);
+ }
+ function shouldSendContentLength(method) {
+ return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT";
+ }
+ function writeH2(client, request) {
+ const session = client[kHTTP2Session];
+ const { body, method, path: path10, host, upgrade, expectContinue, signal, headers: reqHeaders } = request;
+ if (upgrade) {
+ util.errorRequest(client, request, new Error("Upgrade not supported for H2"));
+ return false;
+ }
+ if (request.aborted) {
+ return false;
+ }
+ const headers = {};
+ for (let n = 0; n < reqHeaders.length; n += 2) {
+ const key = reqHeaders[n + 0];
+ const val = reqHeaders[n + 1];
+ if (Array.isArray(val)) {
+ for (let i = 0; i < val.length; i++) {
+ if (headers[key]) {
+ headers[key] += `,${val[i]}`;
+ } else {
+ headers[key] = val[i];
+ }
}
+ } else {
+ headers[key] = val;
}
- assert3(statusCode >= 200);
- if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) {
- util.destroy(socket, new ResponseExceededMaxSizeError());
- return -1;
+ }
+ let stream;
+ const { hostname, port } = client[kUrl];
+ headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ""}`;
+ headers[HTTP2_HEADER_METHOD] = method;
+ const abort = (err) => {
+ if (request.aborted || request.completed) {
+ return;
}
- this.bytesRead += buf.length;
- if (request.onData(buf) === false) {
- return constants.ERROR.PAUSED;
+ err = err || new RequestAbortedError();
+ util.errorRequest(client, request, err);
+ if (stream != null) {
+ util.destroy(stream, err);
}
+ util.destroy(body, err);
+ };
+ try {
+ request.onConnect(abort);
+ } catch (err) {
+ util.errorRequest(client, request, err);
}
- onMessageComplete() {
- const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this;
- if (socket.destroyed && (!statusCode || shouldKeepAlive)) {
- return -1;
+ if (method === "CONNECT") {
+ session.ref();
+ stream = session.request(headers, { endStream: false, signal });
+ if (stream.id && !stream.pending) {
+ request.onUpgrade(null, null, stream);
+ ++session[kOpenStreams];
+ } else {
+ stream.once("ready", () => {
+ request.onUpgrade(null, null, stream);
+ ++session[kOpenStreams];
+ });
}
- if (upgrade) {
+ stream.once("close", () => {
+ session[kOpenStreams] -= 1;
+ if (session[kOpenStreams] === 0)
+ session.unref();
+ });
+ return true;
+ }
+ headers[HTTP2_HEADER_PATH] = path10;
+ headers[HTTP2_HEADER_SCHEME] = "https";
+ const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH";
+ if (body && typeof body.read === "function") {
+ body.read(0);
+ }
+ let contentLength = util.bodyLength(body);
+ if (contentLength == null) {
+ contentLength = request.contentLength;
+ }
+ if (contentLength === 0 || !expectsPayload) {
+ contentLength = null;
+ }
+ if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) {
+ if (client[kStrictContentLength]) {
+ util.errorRequest(client, request, new RequestContentLengthMismatchError());
+ return false;
+ }
+ process.emitWarning(new RequestContentLengthMismatchError());
+ }
+ if (contentLength != null) {
+ assert3(body, "no body must not have content length");
+ headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`;
+ }
+ session.ref();
+ const shouldEndStream = method === "GET" || method === "HEAD" || body === null;
+ 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();
+ }
+ ++session[kOpenStreams];
+ stream.once("response", (headers2) => {
+ const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
+ request.onResponseStarted();
+ if (request.aborted) {
+ const err = new RequestAbortedError();
+ util.errorRequest(client, request, err);
+ util.destroy(stream, err);
return;
}
- const request = client[kQueue][client[kRunningIdx]];
- assert3(request);
- assert3(statusCode >= 100);
- this.statusCode = null;
- this.statusText = "";
- this.bytesRead = 0;
- this.contentLength = "";
- this.keepAlive = "";
- this.connection = "";
- assert3(this.headers.length % 2 === 0);
- this.headers = [];
- this.headersSize = 0;
- if (statusCode < 200) {
+ if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), "") === false) {
+ stream.pause();
+ }
+ stream.on("data", (chunk) => {
+ if (request.onData(chunk) === false) {
+ stream.pause();
+ }
+ });
+ });
+ stream.once("end", () => {
+ if (stream.state?.state == null || stream.state.state < 6) {
+ request.onComplete([]);
return;
}
- if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) {
- util.destroy(socket, new ResponseContentLengthMismatchError());
- return -1;
+ if (session[kOpenStreams] === 0) {
+ session.unref();
}
- request.onComplete(headers);
- client[kQueue][client[kRunningIdx]++] = null;
- if (socket[kWriting]) {
- assert3.strictEqual(client[kRunning], 0);
- 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) {
- util.destroy(socket, new InformationalError("reset"));
- return constants.ERROR.PAUSED;
- } else if (client[kPipelining] === 1) {
- setImmediate(resume, client);
+ abort(new InformationalError("HTTP/2: stream half-closed (remote)"));
+ });
+ stream.once("close", () => {
+ session[kOpenStreams] -= 1;
+ if (session[kOpenStreams] === 0) {
+ session.unref();
+ }
+ });
+ stream.once("error", function(err) {
+ abort(err);
+ });
+ stream.once("frameError", (type, code) => {
+ abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`));
+ });
+ return true;
+ function writeBodyH2() {
+ if (!body || contentLength === 0) {
+ writeBuffer({
+ abort,
+ client,
+ request,
+ contentLength,
+ expectsPayload,
+ h2stream: stream,
+ body: null,
+ socket: client[kSocket]
+ });
+ } else if (util.isBuffer(body)) {
+ writeBuffer({
+ abort,
+ client,
+ request,
+ contentLength,
+ body,
+ expectsPayload,
+ h2stream: stream,
+ socket: client[kSocket]
+ });
+ } else if (util.isBlobLike(body)) {
+ if (typeof body.stream === "function") {
+ writeIterable({
+ abort,
+ client,
+ request,
+ contentLength,
+ expectsPayload,
+ h2stream: stream,
+ body: body.stream(),
+ socket: client[kSocket]
+ });
+ } else {
+ writeBlob({
+ abort,
+ body,
+ client,
+ request,
+ contentLength,
+ expectsPayload,
+ h2stream: stream,
+ 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 {
- resume(client);
+ assert3(false);
}
}
- };
- function onParserTimeout(parser) {
- const { socket, timeoutType, client } = parser;
- if (timeoutType === TIMEOUT_HEADERS) {
- if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) {
- assert3(!parser.paused, "cannot be paused while waiting for headers");
- util.destroy(socket, new HeadersTimeoutError());
+ }
+ function writeBuffer({ abort, h2stream, body, client, request, socket, contentLength, expectsPayload }) {
+ try {
+ if (body != null && util.isBuffer(body)) {
+ assert3(contentLength === body.byteLength, "buffer body must have content length");
+ h2stream.cork();
+ h2stream.write(body);
+ h2stream.uncork();
+ h2stream.end();
+ request.onBodySent(body);
}
- } else if (timeoutType === TIMEOUT_BODY) {
- if (!parser.paused) {
- util.destroy(socket, new BodyTimeoutError());
+ if (!expectsPayload) {
+ socket[kReset] = true;
}
- } else if (timeoutType === TIMEOUT_IDLE) {
- assert3(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]);
- util.destroy(socket, new InformationalError("socket idle timeout"));
- }
- }
- function onSocketReadable() {
- const { [kParser]: parser } = this;
- if (parser) {
- parser.readMore();
+ request.onRequestSent();
+ client[kResume]();
+ } catch (error) {
+ abort(error);
}
}
- function onSocketError(err) {
- const { [kClient]: client, [kParser]: parser } = this;
- assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
- if (client[kHTTPConnVersion] !== "h2") {
- if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) {
- parser.onMessageComplete();
- return;
+ function writeStream({ abort, socket, expectsPayload, h2stream, body, client, request, contentLength }) {
+ assert3(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined");
+ const pipe = pipeline(
+ body,
+ h2stream,
+ (err) => {
+ if (err) {
+ util.destroy(pipe, err);
+ abort(err);
+ } else {
+ util.removeAllListeners(pipe);
+ request.onRequestSent();
+ if (!expectsPayload) {
+ socket[kReset] = true;
+ }
+ client[kResume]();
+ }
}
+ );
+ util.addListener(pipe, "data", onPipeData);
+ function onPipeData(chunk) {
+ request.onBodySent(chunk);
}
- this[kError] = err;
- onError(this[kClient], err);
}
- function onError(client, err) {
- if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") {
- assert3(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);
+ async function writeBlob({ abort, h2stream, body, client, request, socket, contentLength, expectsPayload }) {
+ assert3(contentLength === body.size, "blob body must have content length");
+ try {
+ if (contentLength != null && contentLength !== body.size) {
+ throw new RequestContentLengthMismatchError();
}
- assert3(client[kSize] === 0);
- }
- }
- function onSocketEnd() {
- const { [kParser]: parser, [kClient]: client } = this;
- if (client[kHTTPConnVersion] !== "h2") {
- if (parser.statusCode && !parser.shouldKeepAlive) {
- parser.onMessageComplete();
- return;
+ const buffer = Buffer.from(await body.arrayBuffer());
+ h2stream.cork();
+ h2stream.write(buffer);
+ h2stream.uncork();
+ h2stream.end();
+ request.onBodySent(buffer);
+ request.onRequestSent();
+ if (!expectsPayload) {
+ socket[kReset] = true;
}
+ client[kResume]();
+ } catch (err) {
+ abort(err);
}
- util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this)));
}
- function onSocketClose() {
- const { [kClient]: client, [kParser]: parser } = this;
- if (client[kHTTPConnVersion] === "h1" && parser) {
- if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {
- parser.onMessageComplete();
+ async function writeIterable({ abort, h2stream, body, client, request, socket, contentLength, expectsPayload }) {
+ assert3(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined");
+ let callback = null;
+ function onDrain() {
+ if (callback) {
+ const cb = callback;
+ callback = null;
+ cb();
}
- this[kParser].destroy();
- this[kParser] = null;
}
- const err = this[kError] || new SocketError("closed", util.getSocketInfo(this));
- client[kSocket] = null;
- if (client.destroyed) {
- assert3(client[kPending] === 0);
- const requests = client[kQueue].splice(client[kRunningIdx]);
- for (let i = 0; i < requests.length; i++) {
- const request = requests[i];
- errorRequest(client, request, err);
+ const waitForDrain = () => new Promise((resolve, reject) => {
+ assert3(callback === null);
+ if (socket[kError]) {
+ reject(socket[kError]);
+ } else {
+ callback = resolve;
}
- } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") {
- const request = client[kQueue][client[kRunningIdx]];
- client[kQueue][client[kRunningIdx]++] = null;
- errorRequest(client, request, err);
+ });
+ h2stream.on("close", onDrain).on("drain", onDrain);
+ try {
+ for await (const chunk of body) {
+ if (socket[kError]) {
+ throw socket[kError];
+ }
+ const res = h2stream.write(chunk);
+ request.onBodySent(chunk);
+ if (!res) {
+ await waitForDrain();
+ }
+ }
+ h2stream.end();
+ request.onRequestSent();
+ if (!expectsPayload) {
+ socket[kReset] = true;
+ }
+ client[kResume]();
+ } catch (err) {
+ abort(err);
+ } finally {
+ h2stream.off("close", onDrain).off("drain", onDrain);
}
- client[kPendingIdx] = client[kRunningIdx];
- assert3(client[kRunning] === 0);
- client.emit("disconnect", client[kUrl], [client], err);
- resume(client);
}
- async function connect(client) {
- assert3(!client[kConnecting]);
- assert3(!client[kSocket]);
- let { host, hostname, protocol, port } = client[kUrl];
- if (hostname[0] === "[") {
- const idx = hostname.indexOf("]");
- assert3(idx !== -1);
- const ip = hostname.substring(1, idx);
- assert3(net.isIP(ip));
- hostname = ip;
+ module2.exports = connectH2;
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/handler/redirect-handler.js
+var require_redirect_handler = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/handler/redirect-handler.js"(exports, module2) {
+ "use strict";
+ var util = require_util();
+ var { kBodyUsed } = require_symbols();
+ var assert3 = require("node:assert");
+ var { InvalidArgumentError } = require_errors();
+ var EE = require("node:events");
+ var redirectableStatusCodes = [300, 301, 302, 303, 307, 308];
+ var kBody = Symbol("body");
+ var BodyAsyncIterable = class {
+ constructor(body) {
+ this[kBody] = body;
+ this[kBodyUsed] = false;
}
- client[kConnecting] = true;
- if (channels.beforeConnect.hasSubscribers) {
- channels.beforeConnect.publish({
- connectParams: {
- host,
- hostname,
- protocol,
- port,
- version: client[kHTTPConnVersion],
- servername: client[kServerName],
- localAddress: client[kLocalAddress]
- },
- connector: client[kConnector]
- });
+ async *[Symbol.asyncIterator]() {
+ assert3(!this[kBodyUsed], "disturbed");
+ this[kBodyUsed] = true;
+ yield* this[kBody];
}
- try {
- const socket = await new Promise((resolve, reject) => {
- client[kConnector]({
- host,
- hostname,
- protocol,
- port,
- servername: client[kServerName],
- localAddress: client[kLocalAddress]
- }, (err, socket2) => {
- if (err) {
- reject(err);
- } else {
- resolve(socket2);
- }
- });
- });
- if (client.destroyed) {
- util.destroy(socket.on("error", () => {
- }), new ClientDestroyedError());
- return;
+ };
+ var RedirectHandler = class {
+ constructor(dispatch, maxRedirections, opts, handler) {
+ if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
+ throw new InvalidArgumentError("maxRedirections must be a positive number");
}
- client[kConnecting] = false;
- assert3(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"
+ util.validateHandler(handler, opts.method, opts.upgrade);
+ this.dispatch = dispatch;
+ this.location = null;
+ this.abort = null;
+ this.opts = { ...opts, maxRedirections: 0 };
+ this.maxRedirections = maxRedirections;
+ this.handler = handler;
+ this.history = [];
+ this.redirectionLimitReached = false;
+ if (util.isStream(this.opts.body)) {
+ if (util.bodyLength(this.opts.body) === 0) {
+ this.opts.body.on("data", function() {
+ assert3(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;
+ if (typeof this.opts.body.readableDidRead !== "boolean") {
+ this.opts.body[kBodyUsed] = false;
+ EE.prototype.on.call(this.opts.body, "data", function() {
+ this[kBodyUsed] = true;
+ });
}
- 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,
- version: client[kHTTPConnVersion],
- servername: client[kServerName],
- localAddress: client[kLocalAddress]
- },
- connector: client[kConnector],
- socket
- });
+ } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") {
+ 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)) {
+ this.opts.body = new BodyAsyncIterable(this.opts.body);
}
- client.emit("connect", client[kUrl], [client]);
- } catch (err) {
- if (client.destroyed) {
+ }
+ 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.throwOnMaxRedirect && this.history.length >= this.maxRedirections) {
+ if (this.request) {
+ this.request.abort(new Error("max redirects"));
+ }
+ this.redirectionLimitReached = true;
+ this.abort(new Error("max redirects"));
return;
}
- client[kConnecting] = false;
- if (channels.connectError.hasSubscribers) {
- channels.connectError.publish({
- connectParams: {
- host,
- hostname,
- protocol,
- port,
- version: client[kHTTPConnVersion],
- servername: client[kServerName],
- localAddress: client[kLocalAddress]
- },
- connector: client[kConnector],
- error: err
- });
+ 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);
}
- if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") {
- assert3(client[kRunning] === 0);
- while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {
- const request = client[kQueue][client[kPendingIdx]++];
- errorRequest(client, request, err);
- }
+ const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)));
+ const path10 = search ? `${pathname}${search}` : pathname;
+ this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin);
+ this.opts.path = path10;
+ this.opts.origin = origin;
+ this.opts.maxRedirections = 0;
+ this.opts.query = null;
+ if (statusCode === 303 && this.opts.method !== "HEAD") {
+ this.opts.method = "GET";
+ this.opts.body = null;
+ }
+ }
+ onData(chunk) {
+ if (this.location) {
} else {
- onError(client, err);
+ return this.handler.onData(chunk);
+ }
+ }
+ onComplete(trailers) {
+ if (this.location) {
+ 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].length === 8 && util.headerNameToString(headers[i]) === "location") {
+ return headers[i + 1];
}
- client.emit("connectionError", client[kUrl], [client], err);
}
- resume(client);
- }
- function emitDrain(client) {
- client[kNeedDrain] = 0;
- client.emit("drain", client[kUrl], [client]);
}
- function resume(client, sync) {
- if (client[kResuming] === 2) {
- return;
+ function shouldRemoveHeader(header, removeContent, unknownOrigin) {
+ if (header.length === 4) {
+ return util.headerNameToString(header) === "host";
}
- client[kResuming] = 2;
- _resume(client, sync);
- client[kResuming] = 0;
- if (client[kRunningIdx] > 256) {
- client[kQueue].splice(0, client[kRunningIdx]);
- client[kPendingIdx] -= client[kRunningIdx];
- client[kRunningIdx] = 0;
+ 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;
}
- function _resume(client, sync) {
- while (true) {
- if (client.destroyed) {
- assert3(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;
+ 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]);
}
- 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 request2 = client[kQueue][client[kRunningIdx]];
- const headersTimeout = request2.headersTimeout != null ? request2.headersTimeout : client[kHeadersTimeout];
- socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS);
- }
+ }
+ } else if (headers && typeof headers === "object") {
+ for (const key of Object.keys(headers)) {
+ if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {
+ ret.push(key, headers[key]);
}
}
- if (client[kBusy]) {
- client[kNeedDrain] = 2;
- } else if (client[kNeedDrain] === 2) {
- if (sync) {
- client[kNeedDrain] = 1;
- process.nextTick(emitDrain, client);
- } else {
- emitDrain(client);
+ } else {
+ assert3(headers == null, "headers must be an object or an array");
+ }
+ return ret;
+ }
+ module2.exports = RedirectHandler;
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js
+var require_redirect_interceptor = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js"(exports, module2) {
+ "use strict";
+ var RedirectHandler = require_redirect_handler();
+ function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) {
+ return (dispatch) => {
+ return function Intercept(opts, handler) {
+ const { maxRedirections = defaultMaxRedirections } = opts;
+ if (!maxRedirections) {
+ return dispatch(opts, handler);
}
- continue;
+ const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler);
+ opts = { ...opts, maxRedirections: 0 };
+ return dispatch(opts, redirectHandler);
+ };
+ };
+ }
+ module2.exports = createRedirectInterceptor;
+ }
+});
+
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client.js
+var require_client = __commonJS({
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client.js"(exports, module2) {
+ "use strict";
+ var assert3 = require("node:assert");
+ var net = require("node:net");
+ var http = require("node:http");
+ var util = require_util();
+ var { channels } = require_diagnostics();
+ var Request = require_request();
+ var DispatcherBase = require_dispatcher_base();
+ var {
+ InvalidArgumentError,
+ InformationalError,
+ ClientDestroyedError
+ } = require_errors();
+ var buildConnector = require_connect();
+ var {
+ kUrl,
+ kServerName,
+ kClient,
+ kBusy,
+ kConnect,
+ kResuming,
+ kRunning,
+ kPending,
+ kSize,
+ kQueue,
+ kConnected,
+ kConnecting,
+ kNeedDrain,
+ kKeepAliveDefaultTimeout,
+ kHostHeader,
+ kPendingIdx,
+ kRunningIdx,
+ kError,
+ kPipelining,
+ kKeepAliveTimeoutValue,
+ kMaxHeadersSize,
+ kKeepAliveMaxTimeout,
+ kKeepAliveTimeoutThreshold,
+ kHeadersTimeout,
+ kBodyTimeout,
+ kStrictContentLength,
+ kConnector,
+ kMaxRedirections,
+ kMaxRequests,
+ kCounter,
+ kClose,
+ kDestroy,
+ kDispatch,
+ kInterceptors,
+ kLocalAddress,
+ kMaxResponseSize,
+ kOnError,
+ kHTTPContext,
+ kMaxConcurrentStreams,
+ kResume
+ } = require_symbols();
+ var connectH1 = require_client_h1();
+ var connectH2 = require_client_h2();
+ var deprecatedInterceptorWarned = false;
+ var kClosedResolve = Symbol("kClosedResolve");
+ function getPipelining(client) {
+ return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1;
+ }
+ var Client = class extends DispatcherBase {
+ /**
+ *
+ * @param {string|URL} url
+ * @param {import('../../types/client.js').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: connect2,
+ maxRequestsPerClient,
+ localAddress,
+ maxResponseSize,
+ autoSelectFamily,
+ autoSelectFamilyAttemptTimeout,
+ // h2
+ maxConcurrentStreams,
+ allowH2
+ } = {}) {
+ super();
+ if (keepAlive !== void 0) {
+ throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead");
}
- if (client[kPending] === 0) {
- return;
+ if (socketTimeout !== void 0) {
+ throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead");
}
- if (client[kRunning] >= (client[kPipelining] || 1)) {
- return;
+ if (requestTimeout !== void 0) {
+ throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead");
}
- 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 (idleTimeout !== void 0) {
+ throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead");
+ }
+ if (maxKeepAliveTimeout !== void 0) {
+ 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 (client[kConnecting]) {
- return;
+ if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) {
+ throw new InvalidArgumentError("headersTimeout must be a positive integer or zero");
}
- if (!socket && !client[kHTTP2Session]) {
- connect(client);
- return;
+ if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) {
+ throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero");
}
- if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) {
- return;
+ if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") {
+ throw new InvalidArgumentError("connect must be a function or an object");
}
- if (client[kRunning] > 0 && !request.idempotent) {
- return;
+ if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
+ throw new InvalidArgumentError("maxRedirections must be a positive number");
}
- if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) {
- return;
+ if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) {
+ throw new InvalidArgumentError("maxRequestsPerClient must be a positive number");
}
- if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) {
- return;
+ if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) {
+ throw new InvalidArgumentError("localAddress must be valid string IP address");
}
- if (!request.aborted && write(client, request)) {
- client[kPendingIdx]++;
- } else {
- client[kQueue].splice(client[kPendingIdx], 1);
+ if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) {
+ throw new InvalidArgumentError("maxResponseSize must be a positive number");
}
- }
- }
- function shouldSendContentLength(method) {
- return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT";
- }
- function write(client, request) {
- if (client[kHTTPConnVersion] === "h2") {
- writeH2(client, client[kHTTP2Session], request);
- return;
- }
- const { body, method, path: path10, host, upgrade, headers, blocking, reset } = request;
- const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH";
- if (body && typeof body.read === "function") {
- body.read(0);
- }
- const bodyLength = util.bodyLength(body);
- let contentLength = bodyLength;
- if (contentLength === null) {
- contentLength = request.contentLength;
- }
- if (contentLength === 0 && !expectsPayload) {
- contentLength = null;
- }
- if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) {
- if (client[kStrictContentLength]) {
- errorRequest(client, request, new RequestContentLengthMismatchError());
- return false;
+ if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) {
+ throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number");
}
- 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") {
- socket[kReset] = true;
- }
- if (upgrade || method === "CONNECT") {
- 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} ${path10} HTTP/1.1\r
-`;
- if (typeof host === "string") {
- header += `host: ${host}\r
-`;
- } else {
- header += client[kHostHeader];
- }
- if (upgrade) {
- header += `connection: upgrade\r
-upgrade: ${upgrade}\r
-`;
- } 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 });
- }
- if (!body || bodyLength === 0) {
- if (contentLength === 0) {
- socket.write(`${header}content-length: 0\r
-\r
-`, "latin1");
- } else {
- assert3(contentLength === null, "no body must not have content length");
- socket.write(`${header}\r
-`, "latin1");
+ if (allowH2 != null && typeof allowH2 !== "boolean") {
+ throw new InvalidArgumentError("allowH2 must be a valid boolean value");
}
- request.onRequestSent();
- } else if (util.isBuffer(body)) {
- assert3(contentLength === body.byteLength, "buffer body must have content length");
- socket.cork();
- socket.write(`${header}content-length: ${contentLength}\r
-\r
-`, "latin1");
- socket.write(body);
- socket.uncork();
- request.onBodySent(body);
- request.onRequestSent();
- if (!expectsPayload) {
- socket[kReset] = true;
+ if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) {
+ throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0");
}
- } 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 });
+ if (typeof connect2 !== "function") {
+ connect2 = buildConnector({
+ ...tls,
+ maxCachedSessions,
+ allowH2,
+ socketPath,
+ timeout: connectTimeout,
+ ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0,
+ ...connect2
+ });
}
- } 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 {
- assert3(false);
- }
- return true;
- }
- function writeH2(client, session, request) {
- const { body, method, path: path10, 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;
- }
- if (request.aborted) {
- return false;
- }
- let stream;
- const h2State = client[kHTTP2SessionState];
- headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost];
- headers[HTTP2_HEADER_METHOD] = method;
- try {
- request.onConnect((err) => {
- if (request.aborted || request.completed) {
- return;
- }
- err = err || new RequestAbortedError();
- if (stream != null) {
- util.destroy(stream, err);
- h2State.openStreams -= 1;
- if (h2State.openStreams === 0) {
- session.unref();
- }
+ if (interceptors?.Client && Array.isArray(interceptors.Client)) {
+ this[kInterceptors] = interceptors.Client;
+ if (!deprecatedInterceptorWarned) {
+ deprecatedInterceptorWarned = true;
+ process.emitWarning("Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.", {
+ code: "UNDICI-CLIENT-INTERCEPTOR-DEPRECATED"
+ });
}
- errorRequest(client, request, err);
- });
- } catch (err) {
- errorRequest(client, request, err);
- }
- if (method === "CONNECT") {
- session.ref();
- 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;
- });
+ this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })];
}
- stream.once("close", () => {
- h2State.openStreams -= 1;
- if (h2State.openStreams === 0)
- session.unref();
- });
- return true;
+ this[kUrl] = util.parseOrigin(url);
+ this[kConnector] = connect2;
+ this[kPipelining] = pipelining != null ? pipelining : 1;
+ this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize;
+ this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout;
+ this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout;
+ this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold;
+ this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout];
+ this[kServerName] = null;
+ this[kLocalAddress] = localAddress != null ? localAddress : null;
+ this[kResuming] = 0;
+ this[kNeedDrain] = 0;
+ this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r
+`;
+ this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5;
+ this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5;
+ this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength;
+ this[kMaxRedirections] = maxRedirections;
+ this[kMaxRequests] = maxRequestsPerClient;
+ this[kClosedResolve] = null;
+ this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1;
+ this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100;
+ this[kHTTPContext] = null;
+ this[kQueue] = [];
+ this[kRunningIdx] = 0;
+ this[kPendingIdx] = 0;
+ this[kResume] = (sync) => resume(this, sync);
+ this[kOnError] = (err) => onError(this, err);
}
- headers[HTTP2_HEADER_PATH] = path10;
- headers[HTTP2_HEADER_SCHEME] = "https";
- const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH";
- if (body && typeof body.read === "function") {
- body.read(0);
+ get pipelining() {
+ return this[kPipelining];
}
- let contentLength = util.bodyLength(body);
- if (contentLength == null) {
- contentLength = request.contentLength;
+ set pipelining(value) {
+ this[kPipelining] = value;
+ this[kResume](true);
}
- if (contentLength === 0 || !expectsPayload) {
- contentLength = null;
+ get [kPending]() {
+ return this[kQueue].length - this[kPendingIdx];
}
- 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());
+ get [kRunning]() {
+ return this[kPendingIdx] - this[kRunningIdx];
}
- if (contentLength != null) {
- assert3(body, "no body must not have content length");
- headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`;
+ get [kSize]() {
+ return this[kQueue].length - this[kRunningIdx];
}
- session.ref();
- const shouldEndStream = method === "GET" || method === "HEAD" || body === null;
- 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();
+ get [kConnected]() {
+ return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed;
}
- ++h2State.openStreams;
- stream.once("response", (headers2) => {
- const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
- request.onResponseStarted();
- 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;
- 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);
+ get [kBusy]() {
+ return Boolean(
+ this[kHTTPContext]?.busy(null) || this[kSize] >= (getPipelining(this) || 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 = new Request(origin, opts, handler);
+ this[kQueue].push(request);
+ if (this[kResuming]) {
+ } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) {
+ this[kResuming] = 1;
+ queueMicrotask(() => resume(this));
+ } else {
+ this[kResume](true);
}
- });
- 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);
+ if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) {
+ this[kNeedDrain] = 2;
}
- });
- return true;
- function writeBodyH2() {
- if (!body) {
- request.onRequestSent();
- } else if (util.isBuffer(body)) {
- assert3(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: ""
- });
+ return this[kNeedDrain] < 2;
+ }
+ async [kClose]() {
+ return new Promise((resolve) => {
+ if (this[kSize]) {
+ this[kClosedResolve] = resolve;
} else {
- writeBlob({
- body,
- client,
- request,
- contentLength,
- expectsPayload,
- h2stream: stream,
- header: "",
- socket: client[kSocket]
- });
+ resolve(null);
}
- } 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 {
- assert3(false);
+ });
+ }
+ 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];
+ util.errorRequest(this, request, err);
+ }
+ const callback = () => {
+ if (this[kClosedResolve]) {
+ this[kClosedResolve]();
+ this[kClosedResolve] = null;
+ }
+ resolve(null);
+ };
+ if (this[kHTTPContext]) {
+ this[kHTTPContext].destroy(err, callback);
+ this[kHTTPContext] = null;
+ } else {
+ queueMicrotask(callback);
+ }
+ this[kResume]();
+ });
+ }
+ };
+ var createRedirectInterceptor = require_redirect_interceptor();
+ function onError(client, err) {
+ if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") {
+ assert3(client[kPendingIdx] === client[kRunningIdx]);
+ const requests = client[kQueue].splice(client[kRunningIdx]);
+ for (let i = 0; i < requests.length; i++) {
+ const request = requests[i];
+ util.errorRequest(client, request, err);
}
+ assert3(client[kSize] === 0);
}
}
- function writeStream({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {
- assert3(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined");
- if (client[kHTTPConnVersion] === "h2") {
- let onPipeData = function(chunk) {
- request.onBodySent(chunk);
- };
- const pipe = pipeline(
- body,
- h2stream,
- (err) => {
+ async function connect(client) {
+ assert3(!client[kConnecting]);
+ assert3(!client[kHTTPContext]);
+ let { host, hostname, protocol, port } = client[kUrl];
+ if (hostname[0] === "[") {
+ const idx = hostname.indexOf("]");
+ assert3(idx !== -1);
+ const ip = hostname.substring(1, idx);
+ assert3(net.isIP(ip));
+ hostname = ip;
+ }
+ client[kConnecting] = true;
+ if (channels.beforeConnect.hasSubscribers) {
+ channels.beforeConnect.publish({
+ connectParams: {
+ host,
+ hostname,
+ protocol,
+ port,
+ version: client[kHTTPContext]?.version,
+ 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, socket2) => {
if (err) {
- util.destroy(body, err);
- util.destroy(h2stream, err);
+ reject(err);
} else {
- request.onRequestSent();
+ resolve(socket2);
}
- }
- );
- pipe.on("data", onPipeData);
- pipe.once("end", () => {
- pipe.removeListener("data", onPipeData);
- util.destroy(pipe);
+ });
});
- return;
- }
- let finished = false;
- const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header });
- const onData = function(chunk) {
- if (finished) {
+ if (client.destroyed) {
+ util.destroy(socket.on("error", () => {
+ }), new ClientDestroyedError());
return;
}
+ assert3(socket);
try {
- if (!writer.write(chunk) && this.pause) {
- this.pause();
- }
+ client[kHTTPContext] = socket.alpnProtocol === "h2" ? await connectH2(client, socket) : await connectH1(client, socket);
} catch (err) {
- util.destroy(this, err);
- }
- };
- const onDrain = function() {
- if (finished) {
- return;
- }
- if (body.resume) {
- body.resume();
- }
- };
- const onClose = function() {
- queueMicrotask(() => {
- body.removeListener("error", onFinished);
- });
- if (!finished) {
- const err = new RequestAbortedError();
- queueMicrotask(() => onFinished(err));
- }
- };
- const onFinished = function(err) {
- if (finished) {
- return;
- }
- finished = true;
- assert3(socket.destroyed || socket[kWriting] && client[kRunning] <= 1);
- socket.off("drain", onDrain).off("error", onFinished);
- body.removeListener("data", onData).removeListener("end", onFinished).removeListener("close", onClose);
- 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", onClose);
- if (body.resume) {
- body.resume();
- }
- socket.on("drain", onDrain).on("error", onFinished);
- }
- async function writeBlob({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {
- assert3(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
-\r
-`, "latin1");
- socket.write(buffer);
- socket.uncork();
- }
- request.onBodySent(buffer);
- request.onRequestSent();
- if (!expectsPayload) {
- socket[kReset] = true;
+ socket.destroy().on("error", () => {
+ });
+ throw err;
}
- resume(client);
- } catch (err) {
- util.destroy(isH2 ? h2stream : socket, err);
- }
- }
- async function writeIterable({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {
- assert3(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined");
- let callback = null;
- function onDrain() {
- if (callback) {
- const cb = callback;
- callback = null;
- cb();
+ client[kConnecting] = false;
+ socket[kCounter] = 0;
+ socket[kMaxRequests] = client[kMaxRequests];
+ socket[kClient] = client;
+ socket[kError] = null;
+ if (channels.connected.hasSubscribers) {
+ channels.connected.publish({
+ connectParams: {
+ host,
+ hostname,
+ protocol,
+ port,
+ version: client[kHTTPContext]?.version,
+ servername: client[kServerName],
+ localAddress: client[kLocalAddress]
+ },
+ connector: client[kConnector],
+ socket
+ });
}
- }
- const waitForDrain = () => new Promise((resolve, reject) => {
- assert3(callback === null);
- if (socket[kError]) {
- reject(socket[kError]);
- } else {
- callback = resolve;
+ client.emit("connect", client[kUrl], [client]);
+ } catch (err) {
+ if (client.destroyed) {
+ return;
}
- });
- if (client[kHTTPConnVersion] === "h2") {
- h2stream.on("close", onDrain).on("drain", onDrain);
- try {
- 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);
+ client[kConnecting] = false;
+ if (channels.connectError.hasSubscribers) {
+ channels.connectError.publish({
+ connectParams: {
+ host,
+ hostname,
+ protocol,
+ port,
+ version: client[kHTTPContext]?.version,
+ servername: client[kServerName],
+ localAddress: client[kLocalAddress]
+ },
+ connector: client[kConnector],
+ error: err
+ });
}
- return;
- }
- socket.on("close", onDrain).on("drain", onDrain);
- const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header });
- try {
- for await (const chunk of body) {
- if (socket[kError]) {
- throw socket[kError];
- }
- if (!writer.write(chunk)) {
- await waitForDrain();
+ if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") {
+ assert3(client[kRunning] === 0);
+ while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {
+ const request = client[kQueue][client[kPendingIdx]++];
+ util.errorRequest(client, request, err);
}
+ } else {
+ onError(client, err);
}
- writer.end();
- } catch (err) {
- writer.destroy(err);
- } finally {
- socket.off("close", onDrain).off("drain", onDrain);
+ client.emit("connectionError", client[kUrl], [client], err);
}
+ client[kResume]();
}
- var AsyncWriter = class {
- 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;
+ function emitDrain(client) {
+ client[kNeedDrain] = 0;
+ client.emit("drain", client[kUrl], [client]);
+ }
+ function resume(client, sync) {
+ if (client[kResuming] === 2) {
+ return;
}
- write(chunk) {
- const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this;
- if (socket[kError]) {
- throw socket[kError];
- }
- if (socket.destroyed) {
- return false;
+ client[kResuming] = 2;
+ _resume(client, sync);
+ client[kResuming] = 0;
+ 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) {
+ assert3(client[kPending] === 0);
+ return;
}
- const len = Buffer.byteLength(chunk);
- if (!len) {
- return true;
+ if (client[kClosedResolve] && !client[kSize]) {
+ client[kClosedResolve]();
+ client[kClosedResolve] = null;
+ return;
}
- if (contentLength !== null && bytesWritten + len > contentLength) {
- if (client[kStrictContentLength]) {
- throw new RequestContentLengthMismatchError();
- }
- process.emitWarning(new RequestContentLengthMismatchError());
+ if (client[kHTTPContext]) {
+ client[kHTTPContext].resume();
}
- socket.cork();
- if (bytesWritten === 0) {
- if (!expectsPayload) {
- socket[kReset] = true;
- }
- if (contentLength === null) {
- socket.write(`${header}transfer-encoding: chunked\r
-`, "latin1");
+ if (client[kBusy]) {
+ client[kNeedDrain] = 2;
+ } else if (client[kNeedDrain] === 2) {
+ if (sync) {
+ client[kNeedDrain] = 1;
+ queueMicrotask(() => emitDrain(client));
} else {
- socket.write(`${header}content-length: ${contentLength}\r
-\r
-`, "latin1");
+ emitDrain(client);
}
+ continue;
}
- if (contentLength === null) {
- socket.write(`\r
-${len.toString(16)}\r
-`, "latin1");
+ if (client[kPending] === 0) {
+ return;
}
- this.bytesWritten += len;
- const ret = socket.write(chunk);
- socket.uncork();
- request.onBodySent(chunk);
- if (!ret) {
- if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {
- if (socket[kParser].timeout.refresh) {
- socket[kParser].timeout.refresh();
- }
- }
+ if (client[kRunning] >= (getPipelining(client) || 1)) {
+ return;
}
- return ret;
- }
- end() {
- const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this;
- request.onRequestSent();
- socket[kWriting] = false;
- if (socket[kError]) {
- throw socket[kError];
+ const request = client[kQueue][client[kPendingIdx]];
+ if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) {
+ if (client[kRunning] > 0) {
+ return;
+ }
+ client[kServerName] = request.servername;
+ client[kHTTPContext]?.destroy(new InformationalError("servername changed"), () => {
+ client[kHTTPContext] = null;
+ resume(client);
+ });
}
- if (socket.destroyed) {
+ if (client[kConnecting]) {
return;
}
- if (bytesWritten === 0) {
- if (expectsPayload) {
- socket.write(`${header}content-length: 0\r
-\r
-`, "latin1");
- } else {
- socket.write(`${header}\r
-`, "latin1");
- }
- } else if (contentLength === null) {
- socket.write("\r\n0\r\n\r\n", "latin1");
+ if (!client[kHTTPContext]) {
+ connect(client);
+ return;
}
- if (contentLength !== null && bytesWritten !== contentLength) {
- if (client[kStrictContentLength]) {
- throw new RequestContentLengthMismatchError();
- } else {
- process.emitWarning(new RequestContentLengthMismatchError());
- }
+ if (client[kHTTPContext].destroyed) {
+ return;
}
- if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {
- if (socket[kParser].timeout.refresh) {
- socket[kParser].timeout.refresh();
- }
+ if (client[kHTTPContext].busy(request)) {
+ return;
}
- resume(client);
- }
- destroy(err) {
- const { socket, client } = this;
- socket[kWriting] = false;
- if (err) {
- assert3(client[kRunning] <= 1, "pipeline should only contain this request");
- util.destroy(socket, err);
+ if (!request.aborted && client[kHTTPContext].write(request)) {
+ client[kPendingIdx]++;
+ } else {
+ client[kQueue].splice(client[kPendingIdx], 1);
}
}
- };
- function errorRequest(client, request, err) {
- try {
- request.onError(err);
- assert3(request.aborted);
- } catch (err2) {
- client.emit("error", err2);
- }
}
module2.exports = Client;
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool.js
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool.js
var require_pool = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool.js"(exports, module2) {
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool.js"(exports, module2) {
"use strict";
var {
PoolBase,
@@ -13186,9 +12954,9 @@ var require_pool = __commonJS({
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/agent.js
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/agent.js
var require_agent = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/agent.js"(exports, module2) {
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/agent.js"(exports, module2) {
"use strict";
var { InvalidArgumentError } = require_errors();
var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols();
@@ -13196,7 +12964,7 @@ var require_agent = __commonJS({
var Pool = require_pool();
var Client = require_client();
var util = require_util();
- var createRedirectInterceptor = require_redirectInterceptor();
+ var createRedirectInterceptor = require_redirect_interceptor();
var kOnConnect = Symbol("onConnect");
var kOnDisconnect = Symbol("onDisconnect");
var kOnConnectionError = Symbol("onConnectionError");
@@ -13283,16 +13051,16 @@ var require_agent = __commonJS({
}
});
-// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/proxy-agent.js
+// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/proxy-agent.js
var require_proxy_agent = __commonJS({
- ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/proxy-agent.js"(exports, module2) {
+ ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/proxy-agent.js"(exports, module2) {
"use strict";
var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols();
var { URL: URL2 } = require("node:url");
var Agent = require_agent();
var Pool = require_pool();
var DispatcherBase = require_dispatcher_base();
- var { InvalidArgumentError, RequestAbortedError } = require_errors();
+ var { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require_errors();
var buildConnector = require_connect();
var kAgent = Symbol("proxy agent");
var kClient = Symbol("proxy client");
@@ -13303,42 +13071,26 @@ var require_proxy_agent = __commonJS({
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);
}
- var ProxyAgent = class extends DispatcherBase {
+ var ProxyAgent2 = class extends DispatcherBase {
constructor(opts) {
- super(opts);
- this[kProxy] = buildProxyOptions(opts);
- this[kAgent] = new Agent(opts);
- this[kInterceptors] = 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");
+ super();
+ if (!opts || typeof opts === "object" && !(opts instanceof URL2) && !opts.uri) {
+ throw new InvalidArgumentError("Proxy uri is mandatory");
}
const { clientFactory = defaultFactory } = opts;
if (typeof clientFactory !== "function") {
throw new InvalidArgumentError("Proxy opts.clientFactory must be a function.");
}
+ const url = this.#getUrl(opts);
+ const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url;
+ this[kProxy] = { uri: href, protocol };
+ this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : [];
this[kRequestTls] = opts.requestTls;
this[kProxyTls] = opts.proxyTls;
this[kProxyHeaders] = opts.headers || {};
- const resolvedUrl = new URL2(opts.uri);
- const { origin, port, 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) {
@@ -13350,24 +13102,25 @@ var require_proxy_agent = __commonJS({
}
const connect = buildConnector({ ...opts.proxyTls });
this[kConnectEndpoint] = buildConnector({ ...opts.requestTls });
- this[kClient] = clientFactory(resolvedUrl, { connect });
+ this[kClient] = clientFactory(url, { connect });
this[kAgent] = new Agent({
...opts,
connect: async (opts2, callback) => {
- let requestedHost = opts2.host;
+ let requestedPath = opts2.host;
if (!opts2.port) {
- requestedHost += `:${defaultProtocolPort(opts2.protocol)}`;
+ requestedPath += `:${defaultProtocolPort(opts2.protocol)}`;
}
try {
const { socket, statusCode } = await this[kClient].connect({
origin,
port,
- path: requestedHost,
+ path: requestedPath,
signal: opts2.signal,
headers: {
...this[kProxyHeaders],
- host: requestedHost
- }
+ host: opts2.host
+ },
+ servername: this[kProxyTls]?.servername || proxyHostname
});
if (statusCode !== 200) {
socket.on("error", () => {
@@ -13386,26 +13139,43 @@ var require_proxy_agent = __commonJS({
}
this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback);
} catch (err) {
- callback(err);
+ if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") {
+ callback(new SecureProxyConnectionError(err));
+ } else {
+ callback(err);
+ }
}
}
});
}
dispatch(opts, handler) {
- const { host } = new URL2(opts.origin);
const headers = buildHeaders(opts.headers);
throwIfProxyAuthIsSent(headers);
+ if (headers && !("host" in headers) && !("Host" in headers)) {
+ const { host } = new URL2(opts.origin);
+ headers.host = host;
+ }
return this[kAgent].dispatch(
{
...opts,
- headers: {
- ...headers,
- host
- }
+ headers
},
handler
);
}
+ /**
+ * @param {import('../types/proxy-agent').ProxyAgent.Options | string | URL} opts
+ * @returns {URL}
+ */
+ #getUrl(opts) {
+ if (typeof opts === "string") {
+ return new URL2(opts);
+ } else if (opts instanceof URL2) {
+ return opts;
+ } else {
+ return new URL2(opts.uri);
+ }
+ }
async [kClose]() {
await this[kAgent].close();
await this[kClient].close();
@@ -13431,13 +13201,13 @@ var require_proxy_agent = __commonJS({
throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor");
}
}
- module2.exports = ProxyAgent;
+ module2.exports = ProxyAgent2;
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/high-level-opt.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/high-level-opt.js
var require_high_level_opt = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/high-level-opt.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/high-level-opt.js"(exports, module2) {
"use strict";
var argmap = /* @__PURE__ */ new Map([
["C", "cwd"],
@@ -14978,17 +14748,17 @@ var require_minizlib = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-windows-path.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/normalize-windows-path.js
var require_normalize_windows_path = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-windows-path.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/normalize-windows-path.js"(exports, module2) {
var platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform;
module2.exports = platform !== "win32" ? (p) => p : (p) => p && p.replace(/\\/g, "/");
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/read-entry.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/read-entry.js
var require_read_entry = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/read-entry.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/read-entry.js"(exports, module2) {
"use strict";
var { Minipass } = require_minipass();
var normPath = require_normalize_windows_path();
@@ -15080,9 +14850,9 @@ var require_read_entry = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/types.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/types.js
var require_types = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/types.js"(exports) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/types.js"(exports) {
"use strict";
exports.name = /* @__PURE__ */ new Map([
["0", "File"],
@@ -15127,9 +14897,9 @@ var require_types = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/large-numbers.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/large-numbers.js
var require_large_numbers = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/large-numbers.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/large-numbers.js"(exports, module2) {
"use strict";
var encode = (num, buf) => {
if (!Number.isSafeInteger(num)) {
@@ -15217,9 +14987,9 @@ var require_large_numbers = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/header.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/header.js
var require_header = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/header.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/header.js"(exports, module2) {
"use strict";
var types = require_types();
var pathModule = require("path").posix;
@@ -15437,9 +15207,9 @@ var require_header = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pax.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/pax.js
var require_pax = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pax.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/pax.js"(exports, module2) {
"use strict";
var Header = require_header();
var path10 = require("path");
@@ -15538,9 +15308,9 @@ var require_pax = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-trailing-slashes.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/strip-trailing-slashes.js
var require_strip_trailing_slashes = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-trailing-slashes.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/strip-trailing-slashes.js"(exports, module2) {
module2.exports = (str) => {
let i = str.length - 1;
let slashesStart = -1;
@@ -15553,9 +15323,9 @@ var require_strip_trailing_slashes = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/warn-mixin.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/warn-mixin.js
var require_warn_mixin = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/warn-mixin.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/warn-mixin.js"(exports, module2) {
"use strict";
module2.exports = (Base) => class extends Base {
warn(code, message, data = {}) {
@@ -15583,9 +15353,9 @@ var require_warn_mixin = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/winchars.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/winchars.js
var require_winchars = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/winchars.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/winchars.js"(exports, module2) {
"use strict";
var raw = [
"|",
@@ -15604,9 +15374,9 @@ var require_winchars = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-absolute-path.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/strip-absolute-path.js
var require_strip_absolute_path = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-absolute-path.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/strip-absolute-path.js"(exports, module2) {
var { isAbsolute, parse } = require("path").win32;
module2.exports = (path10) => {
let r = "";
@@ -15622,9 +15392,9 @@ var require_strip_absolute_path = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mode-fix.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/mode-fix.js
var require_mode_fix = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mode-fix.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/mode-fix.js"(exports, module2) {
"use strict";
module2.exports = (mode, isDir, portable) => {
mode &= 4095;
@@ -15647,14 +15417,14 @@ var require_mode_fix = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/write-entry.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/write-entry.js
var require_write_entry = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/write-entry.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/write-entry.js"(exports, module2) {
"use strict";
var { Minipass } = require_minipass();
var Pax = require_pax();
var Header = require_header();
- var fs9 = require("fs");
+ var fs8 = require("fs");
var path10 = require("path");
var normPath = require_normalize_windows_path();
var stripSlash = require_strip_trailing_slashes();
@@ -15757,7 +15527,7 @@ var require_write_entry = __commonJS({
return super.emit(ev, ...data);
}
[LSTAT]() {
- fs9.lstat(this.absolute, (er, stat) => {
+ fs8.lstat(this.absolute, (er, stat) => {
if (er) {
return this.emit("error", er);
}
@@ -15839,7 +15609,7 @@ var require_write_entry = __commonJS({
this.end();
}
[SYMLINK]() {
- fs9.readlink(this.absolute, (er, linkpath) => {
+ fs8.readlink(this.absolute, (er, linkpath) => {
if (er) {
return this.emit("error", er);
}
@@ -15876,7 +15646,7 @@ var require_write_entry = __commonJS({
this[OPENFILE]();
}
[OPENFILE]() {
- fs9.open(this.absolute, "r", (er, fd) => {
+ fs8.open(this.absolute, "r", (er, fd) => {
if (er) {
return this.emit("error", er);
}
@@ -15900,7 +15670,7 @@ var require_write_entry = __commonJS({
}
[READ]() {
const { fd, buf, offset, length, pos } = this;
- fs9.read(fd, buf, offset, length, pos, (er, bytesRead) => {
+ fs8.read(fd, buf, offset, length, pos, (er, bytesRead) => {
if (er) {
return this[CLOSE](() => this.emit("error", er));
}
@@ -15908,7 +15678,7 @@ var require_write_entry = __commonJS({
});
}
[CLOSE](cb) {
- fs9.close(this.fd, cb);
+ fs8.close(this.fd, cb);
}
[ONREAD](bytesRead) {
if (bytesRead <= 0 && this.remain > 0) {
@@ -15972,19 +15742,19 @@ var require_write_entry = __commonJS({
});
var WriteEntrySync = class extends WriteEntry {
[LSTAT]() {
- this[ONLSTAT](fs9.lstatSync(this.absolute));
+ this[ONLSTAT](fs8.lstatSync(this.absolute));
}
[SYMLINK]() {
- this[ONREADLINK](fs9.readlinkSync(this.absolute));
+ this[ONREADLINK](fs8.readlinkSync(this.absolute));
}
[OPENFILE]() {
- this[ONOPENFILE](fs9.openSync(this.absolute, "r"));
+ this[ONOPENFILE](fs8.openSync(this.absolute, "r"));
}
[READ]() {
let threw = true;
try {
const { fd, buf, offset, length, pos } = this;
- const bytesRead = fs9.readSync(fd, buf, offset, length, pos);
+ const bytesRead = fs8.readSync(fd, buf, offset, length, pos);
this[ONREAD](bytesRead);
threw = false;
} finally {
@@ -16001,7 +15771,7 @@ var require_write_entry = __commonJS({
cb();
}
[CLOSE](cb) {
- fs9.closeSync(this.fd);
+ fs8.closeSync(this.fd);
cb();
}
};
@@ -16112,9 +15882,9 @@ var require_write_entry = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pack.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/pack.js
var require_pack = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pack.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/pack.js"(exports, module2) {
"use strict";
var PackJob = class {
constructor(path11, absolute) {
@@ -16156,7 +15926,7 @@ var require_pack = __commonJS({
var WRITEENTRYCLASS = Symbol("writeEntryClass");
var WRITE = Symbol("write");
var ONDRAIN = Symbol("ondrain");
- var fs9 = require("fs");
+ var fs8 = require("fs");
var path10 = require("path");
var warner = require_warn_mixin();
var normPath = require_normalize_windows_path();
@@ -16266,7 +16036,7 @@ var require_pack = __commonJS({
job.pending = true;
this[JOBS] += 1;
const stat = this.follow ? "stat" : "lstat";
- fs9[stat](job.absolute, (er, stat2) => {
+ fs8[stat](job.absolute, (er, stat2) => {
job.pending = false;
this[JOBS] -= 1;
if (er) {
@@ -16287,7 +16057,7 @@ var require_pack = __commonJS({
[READDIR](job) {
job.pending = true;
this[JOBS] += 1;
- fs9.readdir(job.absolute, (er, entries) => {
+ fs8.readdir(job.absolute, (er, entries) => {
job.pending = false;
this[JOBS] -= 1;
if (er) {
@@ -16449,10 +16219,10 @@ var require_pack = __commonJS({
}
[STAT](job) {
const stat = this.follow ? "statSync" : "lstatSync";
- this[ONSTAT](job, fs9[stat](job.absolute));
+ this[ONSTAT](job, fs8[stat](job.absolute));
}
[READDIR](job, stat) {
- this[ONREADDIR](job, fs9.readdirSync(job.absolute));
+ this[ONREADDIR](job, fs8.readdirSync(job.absolute));
}
// gotta get it all in this tick
[PIPE](job) {
@@ -16487,8 +16257,8 @@ var require_fs_minipass = __commonJS({
"use strict";
var MiniPass = require_minipass2();
var EE = require("events").EventEmitter;
- var fs9 = require("fs");
- var writev = fs9.writev;
+ var fs8 = require("fs");
+ var writev = fs8.writev;
if (!writev) {
const binding = process.binding("fs");
const FSReqWrap = binding.FSReqWrap || binding.FSReqCallback;
@@ -16561,7 +16331,7 @@ var require_fs_minipass = __commonJS({
throw new TypeError("this is a readable stream");
}
[_open]() {
- fs9.open(this[_path], "r", (er, fd) => this[_onopen](er, fd));
+ fs8.open(this[_path], "r", (er, fd) => this[_onopen](er, fd));
}
[_onopen](er, fd) {
if (er)
@@ -16581,7 +16351,7 @@ var require_fs_minipass = __commonJS({
const buf = this[_makeBuf]();
if (buf.length === 0)
return process.nextTick(() => this[_onread](null, 0, buf));
- fs9.read(this[_fd], buf, 0, buf.length, null, (er, br, buf2) => this[_onread](er, br, buf2));
+ fs8.read(this[_fd], buf, 0, buf.length, null, (er, br, buf2) => this[_onread](er, br, buf2));
}
}
[_onread](er, br, buf) {
@@ -16595,7 +16365,7 @@ var require_fs_minipass = __commonJS({
if (this[_autoClose] && typeof this[_fd] === "number") {
const fd = this[_fd];
this[_fd] = null;
- fs9.close(fd, (er) => er ? this.emit("error", er) : this.emit("close"));
+ fs8.close(fd, (er) => er ? this.emit("error", er) : this.emit("close"));
}
}
[_onerror](er) {
@@ -16638,7 +16408,7 @@ var require_fs_minipass = __commonJS({
[_open]() {
let threw = true;
try {
- this[_onopen](null, fs9.openSync(this[_path], "r"));
+ this[_onopen](null, fs8.openSync(this[_path], "r"));
threw = false;
} finally {
if (threw)
@@ -16652,7 +16422,7 @@ var require_fs_minipass = __commonJS({
this[_reading] = true;
do {
const buf = this[_makeBuf]();
- const br = buf.length === 0 ? 0 : fs9.readSync(this[_fd], buf, 0, buf.length, null);
+ const br = buf.length === 0 ? 0 : fs8.readSync(this[_fd], buf, 0, buf.length, null);
if (!this[_handleChunk](br, buf))
break;
} while (true);
@@ -16668,7 +16438,7 @@ var require_fs_minipass = __commonJS({
if (this[_autoClose] && typeof this[_fd] === "number") {
const fd = this[_fd];
this[_fd] = null;
- fs9.closeSync(fd);
+ fs8.closeSync(fd);
this.emit("close");
}
}
@@ -16715,7 +16485,7 @@ var require_fs_minipass = __commonJS({
this.emit("error", er);
}
[_open]() {
- fs9.open(
+ fs8.open(
this[_path],
this[_flags],
this[_mode],
@@ -16759,7 +16529,7 @@ var require_fs_minipass = __commonJS({
return true;
}
[_write](buf) {
- fs9.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw));
+ fs8.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw));
}
[_onwrite](er, bw) {
if (er)
@@ -16803,7 +16573,7 @@ var require_fs_minipass = __commonJS({
if (this[_autoClose] && typeof this[_fd] === "number") {
const fd = this[_fd];
this[_fd] = null;
- fs9.close(fd, (er) => er ? this.emit("error", er) : this.emit("close"));
+ fs8.close(fd, (er) => er ? this.emit("error", er) : this.emit("close"));
}
}
};
@@ -16812,7 +16582,7 @@ var require_fs_minipass = __commonJS({
let fd;
if (this[_defaultFlag] && this[_flags] === "r+") {
try {
- fd = fs9.openSync(this[_path], this[_flags], this[_mode]);
+ fd = fs8.openSync(this[_path], this[_flags], this[_mode]);
} catch (er) {
if (er.code === "ENOENT") {
this[_flags] = "w";
@@ -16821,14 +16591,14 @@ var require_fs_minipass = __commonJS({
throw er;
}
} else
- fd = fs9.openSync(this[_path], this[_flags], this[_mode]);
+ fd = fs8.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] = null;
- fs9.closeSync(fd);
+ fs8.closeSync(fd);
this.emit("close");
}
}
@@ -16837,7 +16607,7 @@ var require_fs_minipass = __commonJS({
try {
this[_onwrite](
null,
- fs9.writeSync(this[_fd], buf, 0, buf.length, this[_pos])
+ fs8.writeSync(this[_fd], buf, 0, buf.length, this[_pos])
);
threw = false;
} finally {
@@ -16856,9 +16626,9 @@ var require_fs_minipass = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/parse.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/parse.js
var require_parse2 = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/parse.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/parse.js"(exports, module2) {
"use strict";
var warner = require_warn_mixin();
var Header = require_header();
@@ -17280,13 +17050,13 @@ var require_parse2 = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/list.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/list.js
var require_list = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/list.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/list.js"(exports, module2) {
"use strict";
var hlo = require_high_level_opt();
var Parser = require_parse2();
- var fs9 = require("fs");
+ var fs8 = require("fs");
var fsm = require_fs_minipass();
var path10 = require("path");
var stripSlash = require_strip_trailing_slashes();
@@ -17343,16 +17113,16 @@ var require_list = __commonJS({
let threw = true;
let fd;
try {
- const stat = fs9.statSync(file);
+ const stat = fs8.statSync(file);
const readSize = opt.maxReadSize || 16 * 1024 * 1024;
if (stat.size < readSize) {
- p.end(fs9.readFileSync(file));
+ p.end(fs8.readFileSync(file));
} else {
let pos = 0;
const buf = Buffer.allocUnsafe(readSize);
- fd = fs9.openSync(file, "r");
+ fd = fs8.openSync(file, "r");
while (pos < stat.size) {
- const bytesRead = fs9.readSync(fd, buf, 0, readSize, pos);
+ const bytesRead = fs8.readSync(fd, buf, 0, readSize, pos);
pos += bytesRead;
p.write(buf.slice(0, bytesRead));
}
@@ -17362,7 +17132,7 @@ var require_list = __commonJS({
} finally {
if (threw && fd) {
try {
- fs9.closeSync(fd);
+ fs8.closeSync(fd);
} catch (er) {
}
}
@@ -17375,7 +17145,7 @@ var require_list = __commonJS({
const p = new Promise((resolve, reject) => {
parse.on("error", reject);
parse.on("end", resolve);
- fs9.stat(file, (er, stat) => {
+ fs8.stat(file, (er, stat) => {
if (er) {
reject(er);
} else {
@@ -17394,9 +17164,9 @@ var require_list = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/create.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/create.js
var require_create = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/create.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/create.js"(exports, module2) {
"use strict";
var hlo = require_high_level_opt();
var Pack = require_pack();
@@ -17488,13 +17258,13 @@ var require_create = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/replace.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/replace.js
var require_replace = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/replace.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/replace.js"(exports, module2) {
"use strict";
var hlo = require_high_level_opt();
var Pack = require_pack();
- var fs9 = require("fs");
+ var fs8 = require("fs");
var fsm = require_fs_minipass();
var t = require_list();
var path10 = require("path");
@@ -17520,20 +17290,20 @@ var require_replace = __commonJS({
let position;
try {
try {
- fd = fs9.openSync(opt.file, "r+");
+ fd = fs8.openSync(opt.file, "r+");
} catch (er) {
if (er.code === "ENOENT") {
- fd = fs9.openSync(opt.file, "w+");
+ fd = fs8.openSync(opt.file, "w+");
} else {
throw er;
}
}
- const st = fs9.fstatSync(fd);
+ const st = fs8.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 = fs9.readSync(
+ bytes = fs8.readSync(
fd,
headBuf,
bufPos,
@@ -17565,7 +17335,7 @@ var require_replace = __commonJS({
} finally {
if (threw) {
try {
- fs9.closeSync(fd);
+ fs8.closeSync(fd);
} catch (er) {
}
}
@@ -17585,7 +17355,7 @@ var require_replace = __commonJS({
const getPos = (fd, size, cb_) => {
const cb2 = (er, pos) => {
if (er) {
- fs9.close(fd, (_) => cb_(er));
+ fs8.close(fd, (_) => cb_(er));
} else {
cb_(null, pos);
}
@@ -17602,7 +17372,7 @@ var require_replace = __commonJS({
}
bufPos += bytes;
if (bufPos < 512 && bytes) {
- return fs9.read(
+ return fs8.read(
fd,
headBuf,
bufPos,
@@ -17633,9 +17403,9 @@ var require_replace = __commonJS({
opt.mtimeCache.set(h.path, h.mtime);
}
bufPos = 0;
- fs9.read(fd, headBuf, 0, 512, position, onread);
+ fs8.read(fd, headBuf, 0, 512, position, onread);
};
- fs9.read(fd, headBuf, 0, 512, position, onread);
+ fs8.read(fd, headBuf, 0, 512, position, onread);
};
const promise = new Promise((resolve, reject) => {
p.on("error", reject);
@@ -17643,14 +17413,14 @@ var require_replace = __commonJS({
const onopen = (er, fd) => {
if (er && er.code === "ENOENT" && flag === "r+") {
flag = "w+";
- return fs9.open(opt.file, flag, onopen);
+ return fs8.open(opt.file, flag, onopen);
}
if (er) {
return reject(er);
}
- fs9.fstat(fd, (er2, st) => {
+ fs8.fstat(fd, (er2, st) => {
if (er2) {
- return fs9.close(fd, () => reject(er2));
+ return fs8.close(fd, () => reject(er2));
}
getPos(fd, st.size, (er3, position) => {
if (er3) {
@@ -17667,7 +17437,7 @@ var require_replace = __commonJS({
});
});
};
- fs9.open(opt.file, flag, onopen);
+ fs8.open(opt.file, flag, onopen);
});
return cb ? promise.then(cb, cb) : promise;
};
@@ -17704,9 +17474,9 @@ var require_replace = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/update.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/update.js
var require_update = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/update.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/update.js"(exports, module2) {
"use strict";
var hlo = require_high_level_opt();
var r = require_replace();
@@ -17739,24 +17509,24 @@ var require_update = __commonJS({
var require_opts_arg = __commonJS({
".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/opts-arg.js"(exports, module2) {
var { promisify } = require("util");
- var fs9 = require("fs");
+ var fs8 = require("fs");
var optsArg = (opts) => {
if (!opts)
- opts = { mode: 511, fs: fs9 };
+ opts = { mode: 511, fs: fs8 };
else if (typeof opts === "object")
- opts = { mode: 511, fs: fs9, ...opts };
+ opts = { mode: 511, fs: fs8, ...opts };
else if (typeof opts === "number")
- opts = { mode: opts, fs: fs9 };
+ opts = { mode: opts, fs: fs8 };
else if (typeof opts === "string")
- opts = { mode: parseInt(opts, 8), fs: fs9 };
+ opts = { mode: parseInt(opts, 8), fs: fs8 };
else
throw new TypeError("invalid options argument");
- opts.mkdir = opts.mkdir || opts.fs.mkdir || fs9.mkdir;
+ opts.mkdir = opts.mkdir || opts.fs.mkdir || fs8.mkdir;
opts.mkdirAsync = promisify(opts.mkdir);
- opts.stat = opts.stat || opts.fs.stat || fs9.stat;
+ opts.stat = opts.stat || opts.fs.stat || fs8.stat;
opts.statAsync = promisify(opts.stat);
- opts.statSync = opts.statSync || opts.fs.statSync || fs9.statSync;
- opts.mkdirSync = opts.mkdirSync || opts.fs.mkdirSync || fs9.mkdirSync;
+ opts.statSync = opts.statSync || opts.fs.statSync || fs8.statSync;
+ opts.mkdirSync = opts.mkdirSync || opts.fs.mkdirSync || fs8.mkdirSync;
return opts;
};
module2.exports = optsArg;
@@ -17923,12 +17693,12 @@ var require_mkdirp_native = __commonJS({
// .yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/use-native.js
var require_use_native = __commonJS({
".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/use-native.js"(exports, module2) {
- var fs9 = require("fs");
+ var fs8 = require("fs");
var version2 = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version;
var versArr = version2.replace(/^v/, "").split(".");
var hasNative = +versArr[0] > 10 || +versArr[0] === 10 && +versArr[1] >= 12;
- var useNative = !hasNative ? () => false : (opts) => opts.mkdir === fs9.mkdir;
- var useNativeSync = !hasNative ? () => false : (opts) => opts.mkdirSync === fs9.mkdirSync;
+ var useNative = !hasNative ? () => false : (opts) => opts.mkdir === fs8.mkdir;
+ var useNativeSync = !hasNative ? () => false : (opts) => opts.mkdirSync === fs8.mkdirSync;
module2.exports = { useNative, useNativeSync };
}
});
@@ -17964,14 +17734,14 @@ var require_mkdirp = __commonJS({
var require_chownr = __commonJS({
".yarn/cache/chownr-npm-2.0.0-638f1c9c61-594754e130.zip/node_modules/chownr/chownr.js"(exports, module2) {
"use strict";
- var fs9 = require("fs");
+ var fs8 = require("fs");
var path10 = require("path");
- var LCHOWN = fs9.lchown ? "lchown" : "chown";
- var LCHOWNSYNC = fs9.lchownSync ? "lchownSync" : "chownSync";
- var needEISDIRHandled = fs9.lchown && !process.version.match(/v1[1-9]+\./) && !process.version.match(/v10\.[6-9]/);
+ var LCHOWN = fs8.lchown ? "lchown" : "chown";
+ var LCHOWNSYNC = fs8.lchownSync ? "lchownSync" : "chownSync";
+ var needEISDIRHandled = fs8.lchown && !process.version.match(/v1[1-9]+\./) && !process.version.match(/v10\.[6-9]/);
var lchownSync = (path11, uid, gid) => {
try {
- return fs9[LCHOWNSYNC](path11, uid, gid);
+ return fs8[LCHOWNSYNC](path11, uid, gid);
} catch (er) {
if (er.code !== "ENOENT")
throw er;
@@ -17979,7 +17749,7 @@ var require_chownr = __commonJS({
};
var chownSync = (path11, uid, gid) => {
try {
- return fs9.chownSync(path11, uid, gid);
+ return fs8.chownSync(path11, uid, gid);
} catch (er) {
if (er.code !== "ENOENT")
throw er;
@@ -17989,7 +17759,7 @@ var require_chownr = __commonJS({
if (!er || er.code !== "EISDIR")
cb(er);
else
- fs9.chown(path11, uid, gid, cb);
+ fs8.chown(path11, uid, gid, cb);
} : (_, __, ___, cb) => cb;
var handleEISDirSync = needEISDIRHandled ? (path11, uid, gid) => {
try {
@@ -18001,18 +17771,18 @@ var require_chownr = __commonJS({
}
} : (path11, uid, gid) => lchownSync(path11, uid, gid);
var nodeVersion = process.version;
- var readdir = (path11, options, cb) => fs9.readdir(path11, options, cb);
- var readdirSync = (path11, options) => fs9.readdirSync(path11, options);
+ var readdir = (path11, options, cb) => fs8.readdir(path11, options, cb);
+ var readdirSync = (path11, options) => fs8.readdirSync(path11, options);
if (/^v4\./.test(nodeVersion))
- readdir = (path11, options, cb) => fs9.readdir(path11, cb);
+ readdir = (path11, options, cb) => fs8.readdir(path11, cb);
var chown = (cpath, uid, gid, cb) => {
- fs9[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, (er) => {
+ fs8[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, (er) => {
cb(er && er.code !== "ENOENT" ? er : null);
}));
};
var chownrKid = (p, child, uid, gid, cb) => {
if (typeof child === "string")
- return fs9.lstat(path10.resolve(p, child), (er, stats) => {
+ return fs8.lstat(path10.resolve(p, child), (er, stats) => {
if (er)
return cb(er.code !== "ENOENT" ? er : null);
stats.name = child;
@@ -18056,7 +17826,7 @@ var require_chownr = __commonJS({
var chownrKidSync = (p, child, uid, gid) => {
if (typeof child === "string") {
try {
- const stats = fs9.lstatSync(path10.resolve(p, child));
+ const stats = fs8.lstatSync(path10.resolve(p, child));
stats.name = child;
child = stats;
} catch (er) {
@@ -18091,12 +17861,12 @@ var require_chownr = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mkdir.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/mkdir.js
var require_mkdir = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mkdir.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/mkdir.js"(exports, module2) {
"use strict";
var mkdirp = require_mkdirp();
- var fs9 = require("fs");
+ var fs8 = require("fs");
var path10 = require("path");
var chownr = require_chownr();
var normPath = require_normalize_windows_path();
@@ -18123,7 +17893,7 @@ var require_mkdir = __commonJS({
var cGet = (cache, key) => cache.get(normPath(key));
var cSet = (cache, key, val) => cache.set(normPath(key), val);
var checkCwd = (dir, cb) => {
- fs9.stat(dir, (er, st) => {
+ fs8.stat(dir, (er, st) => {
if (er || !st.isDirectory()) {
er = new CwdError(dir, er && er.code || "ENOTDIR");
}
@@ -18150,7 +17920,7 @@ var require_mkdir = __commonJS({
if (created && doChown) {
chownr(created, uid, gid, (er2) => done(er2));
} else if (needChmod) {
- fs9.chmod(dir, mode, cb);
+ fs8.chmod(dir, mode, cb);
} else {
cb();
}
@@ -18178,22 +17948,22 @@ var require_mkdir = __commonJS({
if (cGet(cache, part)) {
return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb);
}
- fs9.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb));
+ fs8.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb));
};
var onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => (er) => {
if (er) {
- fs9.lstat(part, (statEr, st) => {
+ fs8.lstat(part, (statEr, st) => {
if (statEr) {
statEr.path = statEr.path && normPath(statEr.path);
cb(statEr);
} else if (st.isDirectory()) {
mkdir_(part, parts, mode, cache, unlink, cwd, created, cb);
} else if (unlink) {
- fs9.unlink(part, (er2) => {
+ fs8.unlink(part, (er2) => {
if (er2) {
return cb(er2);
}
- fs9.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb));
+ fs8.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb));
});
} else if (st.isSymbolicLink()) {
return cb(new SymlinkError(part, part + "/" + parts.join("/")));
@@ -18210,7 +17980,7 @@ var require_mkdir = __commonJS({
let ok = false;
let code = "ENOTDIR";
try {
- ok = fs9.statSync(dir).isDirectory();
+ ok = fs8.statSync(dir).isDirectory();
} catch (er) {
code = er.code;
} finally {
@@ -18237,7 +18007,7 @@ var require_mkdir = __commonJS({
chownr.sync(created2, uid, gid);
}
if (needChmod) {
- fs9.chmodSync(dir, mode);
+ fs8.chmodSync(dir, mode);
}
};
if (cache && cGet(cache, dir) === true) {
@@ -18259,17 +18029,17 @@ var require_mkdir = __commonJS({
continue;
}
try {
- fs9.mkdirSync(part, mode);
+ fs8.mkdirSync(part, mode);
created = created || part;
cSet(cache, part, true);
} catch (er) {
- const st = fs9.lstatSync(part);
+ const st = fs8.lstatSync(part);
if (st.isDirectory()) {
cSet(cache, part, true);
continue;
} else if (unlink) {
- fs9.unlinkSync(part);
- fs9.mkdirSync(part, mode);
+ fs8.unlinkSync(part);
+ fs8.mkdirSync(part, mode);
created = created || part;
cSet(cache, part, true);
continue;
@@ -18283,9 +18053,9 @@ var require_mkdir = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-unicode.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/normalize-unicode.js
var require_normalize_unicode = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-unicode.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/normalize-unicode.js"(exports, module2) {
var normalizeCache = /* @__PURE__ */ Object.create(null);
var { hasOwnProperty } = Object.prototype;
module2.exports = (s) => {
@@ -18297,9 +18067,9 @@ var require_normalize_unicode = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/path-reservations.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/path-reservations.js
var require_path_reservations = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/path-reservations.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/path-reservations.js"(exports, module2) {
var assert3 = require("assert");
var normalize = require_normalize_unicode();
var stripSlashes = require_strip_trailing_slashes();
@@ -18411,13 +18181,13 @@ var require_path_reservations = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/get-write-flag.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/get-write-flag.js
var require_get_write_flag = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/get-write-flag.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/get-write-flag.js"(exports, module2) {
var platform = process.env.__FAKE_PLATFORM__ || process.platform;
var isWindows = platform === "win32";
- var fs9 = global.__FAKE_TESTING_FS__ || require("fs");
- var { O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP = 0 } = fs9.constants;
+ var fs8 = global.__FAKE_TESTING_FS__ || require("fs");
+ var { O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP = 0 } = fs8.constants;
var fMapEnabled = isWindows && !!UV_FS_O_FILEMAP;
var fMapLimit = 512 * 1024;
var fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY;
@@ -18425,13 +18195,13 @@ var require_get_write_flag = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/unpack.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/unpack.js
var require_unpack = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/unpack.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/unpack.js"(exports, module2) {
"use strict";
var assert3 = require("assert");
var Parser = require_parse2();
- var fs9 = require("fs");
+ var fs8 = require("fs");
var fsm = require_fs_minipass();
var path10 = require("path");
var mkdir4 = require_mkdir();
@@ -18470,25 +18240,26 @@ var require_unpack = __commonJS({
var getFlag = require_get_write_flag();
var platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform;
var isWindows = platform === "win32";
+ var DEFAULT_MAX_DEPTH = 1024;
var unlinkFile = (path11, cb) => {
if (!isWindows) {
- return fs9.unlink(path11, cb);
+ return fs8.unlink(path11, cb);
}
const name = path11 + ".DELETE." + crypto.randomBytes(16).toString("hex");
- fs9.rename(path11, name, (er) => {
+ fs8.rename(path11, name, (er) => {
if (er) {
return cb(er);
}
- fs9.unlink(name, cb);
+ fs8.unlink(name, cb);
});
};
var unlinkFileSync = (path11) => {
if (!isWindows) {
- return fs9.unlinkSync(path11);
+ return fs8.unlinkSync(path11);
}
const name = path11 + ".DELETE." + crypto.randomBytes(16).toString("hex");
- fs9.renameSync(path11, name);
- fs9.unlinkSync(name);
+ fs8.renameSync(path11, name);
+ fs8.unlinkSync(name);
};
var uint32 = (a, b, c) => a === a >>> 0 ? a : b === b >>> 0 ? b : c;
var cacheKeyNormalize = (path11) => stripSlash(normPath(normalize(path11))).toLowerCase();
@@ -18548,6 +18319,7 @@ var require_unpack = __commonJS({
}
this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ? process.getuid() : null;
this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ? process.getgid() : null;
+ this.maxDepth = typeof opt.maxDepth === "number" ? opt.maxDepth : DEFAULT_MAX_DEPTH;
this.forceChown = opt.forceChown === true;
this.win32 = !!opt.win32 || isWindows;
this.newer = !!opt.newer;
@@ -18580,12 +18352,12 @@ var require_unpack = __commonJS({
}
}
[CHECKPATH](entry) {
+ const p = normPath(entry.path);
+ const parts = p.split("/");
if (this.strip) {
- const parts = normPath(entry.path).split("/");
if (parts.length < this.strip) {
return false;
}
- entry.path = parts.slice(this.strip).join("/");
if (entry.type === "Link") {
const linkparts = normPath(entry.linkpath).split("/");
if (linkparts.length >= this.strip) {
@@ -18594,10 +18366,19 @@ var require_unpack = __commonJS({
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) {
- const p = normPath(entry.path);
- const parts = p.split("/");
if (parts.includes("..") || isWindows && /^[a-z]:\.\.$/i.test(parts[0])) {
this.warn("TAR_ENTRY_ERROR", `path contains '..'`, {
entry,
@@ -18705,7 +18486,7 @@ var require_unpack = __commonJS({
});
stream.on("error", (er) => {
if (stream.fd) {
- fs9.close(stream.fd, () => {
+ fs8.close(stream.fd, () => {
});
}
stream.write = () => true;
@@ -18716,7 +18497,7 @@ var require_unpack = __commonJS({
const done = (er) => {
if (er) {
if (stream.fd) {
- fs9.close(stream.fd, () => {
+ fs8.close(stream.fd, () => {
});
}
this[ONERROR](er, entry);
@@ -18724,7 +18505,7 @@ var require_unpack = __commonJS({
return;
}
if (--actions === 0) {
- fs9.close(stream.fd, (er2) => {
+ fs8.close(stream.fd, (er2) => {
if (er2) {
this[ONERROR](er2, entry);
} else {
@@ -18741,13 +18522,13 @@ var require_unpack = __commonJS({
actions++;
const atime = entry.atime || /* @__PURE__ */ new Date();
const mtime = entry.mtime;
- fs9.futimes(fd, atime, mtime, (er) => er ? fs9.utimes(abs, atime, mtime, (er2) => done(er2 && er)) : done());
+ fs8.futimes(fd, atime, mtime, (er) => er ? fs8.utimes(abs, atime, mtime, (er2) => done(er2 && er)) : done());
}
if (this[DOCHOWN](entry)) {
actions++;
const uid = this[UID](entry);
const gid = this[GID](entry);
- fs9.fchown(fd, uid, gid, (er) => er ? fs9.chown(abs, uid, gid, (er2) => done(er2 && er)) : done());
+ fs8.fchown(fd, uid, gid, (er) => er ? fs8.chown(abs, uid, gid, (er2) => done(er2 && er)) : done());
}
done();
});
@@ -18779,11 +18560,11 @@ var require_unpack = __commonJS({
};
if (entry.mtime && !this.noMtime) {
actions++;
- fs9.utimes(entry.absolute, entry.atime || /* @__PURE__ */ new Date(), entry.mtime, done);
+ fs8.utimes(entry.absolute, entry.atime || /* @__PURE__ */ new Date(), entry.mtime, done);
}
if (this[DOCHOWN](entry)) {
actions++;
- fs9.chown(entry.absolute, this[UID](entry), this[GID](entry), done);
+ fs8.chown(entry.absolute, this[UID](entry), this[GID](entry), done);
}
done();
});
@@ -18871,7 +18652,7 @@ var require_unpack = __commonJS({
afterMakeParent();
};
const afterMakeParent = () => {
- fs9.lstat(entry.absolute, (lstatEr, st) => {
+ fs8.lstat(entry.absolute, (lstatEr, st) => {
if (st && (this.keep || this.newer && st.mtime > entry.mtime)) {
this[SKIP](entry);
done();
@@ -18887,10 +18668,10 @@ var require_unpack = __commonJS({
if (!needChmod) {
return afterChmod();
}
- return fs9.chmod(entry.absolute, entry.mode, afterChmod);
+ return fs8.chmod(entry.absolute, entry.mode, afterChmod);
}
if (entry.absolute !== this.cwd) {
- return fs9.rmdir(entry.absolute, (er) => this[MAKEFS](er, entry, done));
+ return fs8.rmdir(entry.absolute, (er) => this[MAKEFS](er, entry, done));
}
}
if (entry.absolute === this.cwd) {
@@ -18926,7 +18707,7 @@ var require_unpack = __commonJS({
}
}
[LINK](entry, linkpath, link, done) {
- fs9[link](linkpath, entry.absolute, (er) => {
+ fs8[link](linkpath, entry.absolute, (er) => {
if (er) {
this[ONERROR](er, entry);
} else {
@@ -18967,7 +18748,7 @@ var require_unpack = __commonJS({
}
}
}
- const [lstatEr, st] = callSync(() => fs9.lstatSync(entry.absolute));
+ const [lstatEr, st] = callSync(() => fs8.lstatSync(entry.absolute));
if (st && (this.keep || this.newer && st.mtime > entry.mtime)) {
return this[SKIP](entry);
}
@@ -18978,11 +18759,11 @@ var require_unpack = __commonJS({
if (entry.type === "Directory") {
const needChmod = !this.noChmod && entry.mode && (st.mode & 4095) !== entry.mode;
const [er3] = needChmod ? callSync(() => {
- fs9.chmodSync(entry.absolute, entry.mode);
+ fs8.chmodSync(entry.absolute, entry.mode);
}) : [];
return this[MAKEFS](er3, entry);
}
- const [er2] = callSync(() => fs9.rmdirSync(entry.absolute));
+ const [er2] = callSync(() => fs8.rmdirSync(entry.absolute));
this[MAKEFS](er2, entry);
}
const [er] = entry.absolute === this.cwd ? [] : callSync(() => unlinkFileSync(entry.absolute));
@@ -18993,7 +18774,7 @@ var require_unpack = __commonJS({
const oner = (er) => {
let closeError;
try {
- fs9.closeSync(fd);
+ fs8.closeSync(fd);
} catch (e) {
closeError = e;
}
@@ -19004,7 +18785,7 @@ var require_unpack = __commonJS({
};
let fd;
try {
- fd = fs9.openSync(entry.absolute, getFlag(entry.size), mode);
+ fd = fs8.openSync(entry.absolute, getFlag(entry.size), mode);
} catch (er) {
return oner(er);
}
@@ -19015,7 +18796,7 @@ var require_unpack = __commonJS({
}
tx.on("data", (chunk) => {
try {
- fs9.writeSync(fd, chunk, 0, chunk.length);
+ fs8.writeSync(fd, chunk, 0, chunk.length);
} catch (er) {
oner(er);
}
@@ -19026,10 +18807,10 @@ var require_unpack = __commonJS({
const atime = entry.atime || /* @__PURE__ */ new Date();
const mtime = entry.mtime;
try {
- fs9.futimesSync(fd, atime, mtime);
+ fs8.futimesSync(fd, atime, mtime);
} catch (futimeser) {
try {
- fs9.utimesSync(entry.absolute, atime, mtime);
+ fs8.utimesSync(entry.absolute, atime, mtime);
} catch (utimeser) {
er = futimeser;
}
@@ -19039,10 +18820,10 @@ var require_unpack = __commonJS({
const uid = this[UID](entry);
const gid = this[GID](entry);
try {
- fs9.fchownSync(fd, uid, gid);
+ fs8.fchownSync(fd, uid, gid);
} catch (fchowner) {
try {
- fs9.chownSync(entry.absolute, uid, gid);
+ fs8.chownSync(entry.absolute, uid, gid);
} catch (chowner) {
er = er || fchowner;
}
@@ -19061,13 +18842,13 @@ var require_unpack = __commonJS({
}
if (entry.mtime && !this.noMtime) {
try {
- fs9.utimesSync(entry.absolute, entry.atime || /* @__PURE__ */ new Date(), entry.mtime);
+ fs8.utimesSync(entry.absolute, entry.atime || /* @__PURE__ */ new Date(), entry.mtime);
} catch (er2) {
}
}
if (this[DOCHOWN](entry)) {
try {
- fs9.chownSync(entry.absolute, this[UID](entry), this[GID](entry));
+ fs8.chownSync(entry.absolute, this[UID](entry), this[GID](entry));
} catch (er2) {
}
}
@@ -19094,7 +18875,7 @@ var require_unpack = __commonJS({
}
[LINK](entry, linkpath, link, done) {
try {
- fs9[link + "Sync"](linkpath, entry.absolute);
+ fs8[link + "Sync"](linkpath, entry.absolute);
done();
entry.resume();
} catch (er) {
@@ -19107,13 +18888,13 @@ var require_unpack = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/extract.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/extract.js
var require_extract = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/extract.js"(exports, module2) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/extract.js"(exports, module2) {
"use strict";
var hlo = require_high_level_opt();
var Unpack = require_unpack();
- var fs9 = require("fs");
+ var fs8 = require("fs");
var fsm = require_fs_minipass();
var path10 = require("path");
var stripSlash = require_strip_trailing_slashes();
@@ -19157,7 +18938,7 @@ var require_extract = __commonJS({
var extractFileSync = (opt) => {
const u = new Unpack.Sync(opt);
const file = opt.file;
- const stat = fs9.statSync(file);
+ const stat = fs8.statSync(file);
const readSize = opt.maxReadSize || 16 * 1024 * 1024;
const stream = new fsm.ReadStreamSync(file, {
readSize,
@@ -19172,7 +18953,7 @@ var require_extract = __commonJS({
const p = new Promise((resolve, reject) => {
u.on("error", reject);
u.on("close", resolve);
- fs9.stat(file, (er, stat) => {
+ fs8.stat(file, (er, stat) => {
if (er) {
reject(er);
} else {
@@ -19192,9 +18973,9 @@ var require_extract = __commonJS({
}
});
-// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/index.js
+// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/index.js
var require_tar = __commonJS({
- ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/index.js"(exports) {
+ ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/index.js"(exports) {
"use strict";
exports.c = exports.create = require_create();
exports.r = exports.replace = require_replace();
@@ -19218,7 +18999,7 @@ var require_v8_compile_cache = __commonJS({
"use strict";
var Module2 = require("module");
var crypto = require("crypto");
- var fs9 = require("fs");
+ var fs8 = require("fs");
var path10 = require("path");
var vm = require("vm");
var os3 = require("os");
@@ -19280,22 +19061,22 @@ var require_v8_compile_cache = __commonJS({
const mapToStore = JSON.stringify(dump[1]);
try {
mkdirpSync(this._directory);
- fs9.writeFileSync(this._lockFilename, "LOCK", { flag: "wx" });
+ fs8.writeFileSync(this._lockFilename, "LOCK", { flag: "wx" });
} catch (error) {
return false;
}
try {
- fs9.writeFileSync(this._blobFilename, blobToStore);
- fs9.writeFileSync(this._mapFilename, mapToStore);
+ fs8.writeFileSync(this._blobFilename, blobToStore);
+ fs8.writeFileSync(this._mapFilename, mapToStore);
} finally {
- fs9.unlinkSync(this._lockFilename);
+ fs8.unlinkSync(this._lockFilename);
}
return true;
}
_load() {
try {
- this._storedBlob = fs9.readFileSync(this._blobFilename);
- this._storedMap = JSON.parse(fs9.readFileSync(this._mapFilename));
+ this._storedBlob = fs8.readFileSync(this._blobFilename);
+ this._storedMap = JSON.parse(fs8.readFileSync(this._mapFilename));
} catch (e) {
this._storedBlob = Buffer.alloc(0);
this._storedMap = {};
@@ -19416,14 +19197,14 @@ var require_v8_compile_cache = __commonJS({
}
function _mkdirpSync(p, mode) {
try {
- fs9.mkdirSync(p, mode);
+ fs8.mkdirSync(p, mode);
} catch (err0) {
if (err0.code === "ENOENT") {
_mkdirpSync(path10.dirname(p));
_mkdirpSync(p);
} else {
try {
- const stat = fs9.statSync(p);
+ const stat = fs8.statSync(p);
if (!stat.isDirectory()) {
throw err0;
}
@@ -19810,56 +19591,56 @@ var require_polyfills = __commonJS({
}
var chdir;
module2.exports = patch;
- function patch(fs9) {
+ function patch(fs8) {
if (constants.hasOwnProperty("O_SYMLINK") && process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) {
- patchLchmod(fs9);
- }
- if (!fs9.lutimes) {
- patchLutimes(fs9);
- }
- fs9.chown = chownFix(fs9.chown);
- fs9.fchown = chownFix(fs9.fchown);
- fs9.lchown = chownFix(fs9.lchown);
- fs9.chmod = chmodFix(fs9.chmod);
- fs9.fchmod = chmodFix(fs9.fchmod);
- fs9.lchmod = chmodFix(fs9.lchmod);
- fs9.chownSync = chownFixSync(fs9.chownSync);
- fs9.fchownSync = chownFixSync(fs9.fchownSync);
- fs9.lchownSync = chownFixSync(fs9.lchownSync);
- fs9.chmodSync = chmodFixSync(fs9.chmodSync);
- fs9.fchmodSync = chmodFixSync(fs9.fchmodSync);
- fs9.lchmodSync = chmodFixSync(fs9.lchmodSync);
- fs9.stat = statFix(fs9.stat);
- fs9.fstat = statFix(fs9.fstat);
- fs9.lstat = statFix(fs9.lstat);
- fs9.statSync = statFixSync(fs9.statSync);
- fs9.fstatSync = statFixSync(fs9.fstatSync);
- fs9.lstatSync = statFixSync(fs9.lstatSync);
- if (fs9.chmod && !fs9.lchmod) {
- fs9.lchmod = function(path10, mode, cb) {
+ patchLchmod(fs8);
+ }
+ if (!fs8.lutimes) {
+ patchLutimes(fs8);
+ }
+ fs8.chown = chownFix(fs8.chown);
+ fs8.fchown = chownFix(fs8.fchown);
+ fs8.lchown = chownFix(fs8.lchown);
+ fs8.chmod = chmodFix(fs8.chmod);
+ fs8.fchmod = chmodFix(fs8.fchmod);
+ fs8.lchmod = chmodFix(fs8.lchmod);
+ fs8.chownSync = chownFixSync(fs8.chownSync);
+ fs8.fchownSync = chownFixSync(fs8.fchownSync);
+ fs8.lchownSync = chownFixSync(fs8.lchownSync);
+ fs8.chmodSync = chmodFixSync(fs8.chmodSync);
+ fs8.fchmodSync = chmodFixSync(fs8.fchmodSync);
+ fs8.lchmodSync = chmodFixSync(fs8.lchmodSync);
+ fs8.stat = statFix(fs8.stat);
+ fs8.fstat = statFix(fs8.fstat);
+ fs8.lstat = statFix(fs8.lstat);
+ fs8.statSync = statFixSync(fs8.statSync);
+ fs8.fstatSync = statFixSync(fs8.fstatSync);
+ fs8.lstatSync = statFixSync(fs8.lstatSync);
+ if (fs8.chmod && !fs8.lchmod) {
+ fs8.lchmod = function(path10, mode, cb) {
if (cb)
process.nextTick(cb);
};
- fs9.lchmodSync = function() {
+ fs8.lchmodSync = function() {
};
}
- if (fs9.chown && !fs9.lchown) {
- fs9.lchown = function(path10, uid, gid, cb) {
+ if (fs8.chown && !fs8.lchown) {
+ fs8.lchown = function(path10, uid, gid, cb) {
if (cb)
process.nextTick(cb);
};
- fs9.lchownSync = function() {
+ fs8.lchownSync = function() {
};
}
if (platform === "win32") {
- fs9.rename = typeof fs9.rename !== "function" ? fs9.rename : function(fs$rename) {
+ fs8.rename = typeof fs8.rename !== "function" ? fs8.rename : function(fs$rename) {
function rename(from, to, cb) {
var start = Date.now();
var backoff = 0;
fs$rename(from, to, function CB(er) {
if (er && (er.code === "EACCES" || er.code === "EPERM" || er.code === "EBUSY") && Date.now() - start < 6e4) {
setTimeout(function() {
- fs9.stat(to, function(stater, st) {
+ fs8.stat(to, function(stater, st) {
if (stater && stater.code === "ENOENT")
fs$rename(from, to, CB);
else
@@ -19877,9 +19658,9 @@ var require_polyfills = __commonJS({
if (Object.setPrototypeOf)
Object.setPrototypeOf(rename, fs$rename);
return rename;
- }(fs9.rename);
+ }(fs8.rename);
}
- fs9.read = typeof fs9.read !== "function" ? fs9.read : function(fs$read) {
+ fs8.read = typeof fs8.read !== "function" ? fs8.read : function(fs$read) {
function read(fd, buffer, offset, length, position, callback_) {
var callback;
if (callback_ && typeof callback_ === "function") {
@@ -19887,23 +19668,23 @@ var require_polyfills = __commonJS({
callback = function(er, _, __) {
if (er && er.code === "EAGAIN" && eagCounter < 10) {
eagCounter++;
- return fs$read.call(fs9, fd, buffer, offset, length, position, callback);
+ return fs$read.call(fs8, fd, buffer, offset, length, position, callback);
}
callback_.apply(this, arguments);
};
}
- return fs$read.call(fs9, fd, buffer, offset, length, position, callback);
+ return fs$read.call(fs8, fd, buffer, offset, length, position, callback);
}
if (Object.setPrototypeOf)
Object.setPrototypeOf(read, fs$read);
return read;
- }(fs9.read);
- fs9.readSync = typeof fs9.readSync !== "function" ? fs9.readSync : function(fs$readSync) {
+ }(fs8.read);
+ fs8.readSync = typeof fs8.readSync !== "function" ? fs8.readSync : function(fs$readSync) {
return function(fd, buffer, offset, length, position) {
var eagCounter = 0;
while (true) {
try {
- return fs$readSync.call(fs9, fd, buffer, offset, length, position);
+ return fs$readSync.call(fs8, fd, buffer, offset, length, position);
} catch (er) {
if (er.code === "EAGAIN" && eagCounter < 10) {
eagCounter++;
@@ -19913,10 +19694,10 @@ var require_polyfills = __commonJS({
}
}
};
- }(fs9.readSync);
- function patchLchmod(fs10) {
- fs10.lchmod = function(path10, mode, callback) {
- fs10.open(
+ }(fs8.readSync);
+ function patchLchmod(fs9) {
+ fs9.lchmod = function(path10, mode, callback) {
+ fs9.open(
path10,
constants.O_WRONLY | constants.O_SYMLINK,
mode,
@@ -19926,8 +19707,8 @@ var require_polyfills = __commonJS({
callback(err);
return;
}
- fs10.fchmod(fd, mode, function(err2) {
- fs10.close(fd, function(err22) {
+ fs9.fchmod(fd, mode, function(err2) {
+ fs9.close(fd, function(err22) {
if (callback)
callback(err2 || err22);
});
@@ -19935,68 +19716,68 @@ var require_polyfills = __commonJS({
}
);
};
- fs10.lchmodSync = function(path10, mode) {
- var fd = fs10.openSync(path10, constants.O_WRONLY | constants.O_SYMLINK, mode);
+ fs9.lchmodSync = function(path10, mode) {
+ var fd = fs9.openSync(path10, constants.O_WRONLY | constants.O_SYMLINK, mode);
var threw = true;
var ret;
try {
- ret = fs10.fchmodSync(fd, mode);
+ ret = fs9.fchmodSync(fd, mode);
threw = false;
} finally {
if (threw) {
try {
- fs10.closeSync(fd);
+ fs9.closeSync(fd);
} catch (er) {
}
} else {
- fs10.closeSync(fd);
+ fs9.closeSync(fd);
}
}
return ret;
};
}
- function patchLutimes(fs10) {
- if (constants.hasOwnProperty("O_SYMLINK") && fs10.futimes) {
- fs10.lutimes = function(path10, at, mt, cb) {
- fs10.open(path10, constants.O_SYMLINK, function(er, fd) {
+ function patchLutimes(fs9) {
+ if (constants.hasOwnProperty("O_SYMLINK") && fs9.futimes) {
+ fs9.lutimes = function(path10, at, mt, cb) {
+ fs9.open(path10, constants.O_SYMLINK, function(er, fd) {
if (er) {
if (cb)
cb(er);
return;
}
- fs10.futimes(fd, at, mt, function(er2) {
- fs10.close(fd, function(er22) {
+ fs9.futimes(fd, at, mt, function(er2) {
+ fs9.close(fd, function(er22) {
if (cb)
cb(er2 || er22);
});
});
});
};
- fs10.lutimesSync = function(path10, at, mt) {
- var fd = fs10.openSync(path10, constants.O_SYMLINK);
+ fs9.lutimesSync = function(path10, at, mt) {
+ var fd = fs9.openSync(path10, constants.O_SYMLINK);
var ret;
var threw = true;
try {
- ret = fs10.futimesSync(fd, at, mt);
+ ret = fs9.futimesSync(fd, at, mt);
threw = false;
} finally {
if (threw) {
try {
- fs10.closeSync(fd);
+ fs9.closeSync(fd);
} catch (er) {
}
} else {
- fs10.closeSync(fd);
+ fs9.closeSync(fd);
}
}
return ret;
};
- } else if (fs10.futimes) {
- fs10.lutimes = function(_a, _b, _c, cb) {
+ } else if (fs9.futimes) {
+ fs9.lutimes = function(_a, _b, _c, cb) {
if (cb)
process.nextTick(cb);
};
- fs10.lutimesSync = function() {
+ fs9.lutimesSync = function() {
};
}
}
@@ -20004,7 +19785,7 @@ var require_polyfills = __commonJS({
if (!orig)
return orig;
return function(target, mode, cb) {
- return orig.call(fs9, target, mode, function(er) {
+ return orig.call(fs8, target, mode, function(er) {
if (chownErOk(er))
er = null;
if (cb)
@@ -20017,7 +19798,7 @@ var require_polyfills = __commonJS({
return orig;
return function(target, mode) {
try {
- return orig.call(fs9, target, mode);
+ return orig.call(fs8, target, mode);
} catch (er) {
if (!chownErOk(er))
throw er;
@@ -20028,7 +19809,7 @@ var require_polyfills = __commonJS({
if (!orig)
return orig;
return function(target, uid, gid, cb) {
- return orig.call(fs9, target, uid, gid, function(er) {
+ return orig.call(fs8, target, uid, gid, function(er) {
if (chownErOk(er))
er = null;
if (cb)
@@ -20041,7 +19822,7 @@ var require_polyfills = __commonJS({
return orig;
return function(target, uid, gid) {
try {
- return orig.call(fs9, target, uid, gid);
+ return orig.call(fs8, target, uid, gid);
} catch (er) {
if (!chownErOk(er))
throw er;
@@ -20066,14 +19847,14 @@ var require_polyfills = __commonJS({
if (cb)
cb.apply(this, arguments);
}
- return options ? orig.call(fs9, target, options, callback) : orig.call(fs9, target, callback);
+ return options ? orig.call(fs8, target, options, callback) : orig.call(fs8, target, callback);
};
}
function statFixSync(orig) {
if (!orig)
return orig;
return function(target, options) {
- var stats = options ? orig.call(fs9, target, options) : orig.call(fs9, target);
+ var stats = options ? orig.call(fs8, target, options) : orig.call(fs8, target);
if (stats) {
if (stats.uid < 0)
stats.uid += 4294967296;
@@ -20104,7 +19885,7 @@ var require_legacy_streams = __commonJS({
".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/legacy-streams.js"(exports, module2) {
var Stream = require("stream").Stream;
module2.exports = legacy;
- function legacy(fs9) {
+ function legacy(fs8) {
return {
ReadStream,
WriteStream
@@ -20149,7 +19930,7 @@ var require_legacy_streams = __commonJS({
});
return;
}
- fs9.open(this.path, this.flags, this.mode, function(err, fd) {
+ fs8.open(this.path, this.flags, this.mode, function(err, fd) {
if (err) {
self2.emit("error", err);
self2.readable = false;
@@ -20189,7 +19970,7 @@ var require_legacy_streams = __commonJS({
this.busy = false;
this._queue = [];
if (this.fd === null) {
- this._open = fs9.open;
+ this._open = fs8.open;
this._queue.push([this._open, this.path, this.flags, this.mode, void 0]);
this.flush();
}
@@ -20224,7 +20005,7 @@ var require_clone = __commonJS({
// .yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/graceful-fs.js
var require_graceful_fs = __commonJS({
".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/graceful-fs.js"(exports, module2) {
- var fs9 = require("fs");
+ var fs8 = require("fs");
var polyfills = require_polyfills();
var legacy = require_legacy_streams();
var clone = require_clone();
@@ -20256,12 +20037,12 @@ var require_graceful_fs = __commonJS({
m = "GFS4: " + m.split(/\n/).join("\nGFS4: ");
console.error(m);
};
- if (!fs9[gracefulQueue]) {
+ if (!fs8[gracefulQueue]) {
queue = global[gracefulQueue] || [];
- publishQueue(fs9, queue);
- fs9.close = function(fs$close) {
+ publishQueue(fs8, queue);
+ fs8.close = function(fs$close) {
function close(fd, cb) {
- return fs$close.call(fs9, fd, function(err) {
+ return fs$close.call(fs8, fd, function(err) {
if (!err) {
resetQueue();
}
@@ -20273,40 +20054,40 @@ var require_graceful_fs = __commonJS({
value: fs$close
});
return close;
- }(fs9.close);
- fs9.closeSync = function(fs$closeSync) {
+ }(fs8.close);
+ fs8.closeSync = function(fs$closeSync) {
function closeSync(fd) {
- fs$closeSync.apply(fs9, arguments);
+ fs$closeSync.apply(fs8, arguments);
resetQueue();
}
Object.defineProperty(closeSync, previousSymbol, {
value: fs$closeSync
});
return closeSync;
- }(fs9.closeSync);
+ }(fs8.closeSync);
if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) {
process.on("exit", function() {
- debug2(fs9[gracefulQueue]);
- require("assert").equal(fs9[gracefulQueue].length, 0);
+ debug2(fs8[gracefulQueue]);
+ require("assert").equal(fs8[gracefulQueue].length, 0);
});
}
}
var queue;
if (!global[gracefulQueue]) {
- publishQueue(global, fs9[gracefulQueue]);
- }
- module2.exports = patch(clone(fs9));
- if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs9.__patched) {
- module2.exports = patch(fs9);
- fs9.__patched = true;
- }
- function patch(fs10) {
- polyfills(fs10);
- fs10.gracefulify = patch;
- fs10.createReadStream = createReadStream;
- fs10.createWriteStream = createWriteStream;
- var fs$readFile = fs10.readFile;
- fs10.readFile = readFile;
+ publishQueue(global, fs8[gracefulQueue]);
+ }
+ module2.exports = patch(clone(fs8));
+ if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs8.__patched) {
+ module2.exports = patch(fs8);
+ fs8.__patched = true;
+ }
+ function patch(fs9) {
+ polyfills(fs9);
+ fs9.gracefulify = patch;
+ fs9.createReadStream = createReadStream;
+ fs9.createWriteStream = createWriteStream;
+ var fs$readFile = fs9.readFile;
+ fs9.readFile = readFile;
function readFile(path10, options, cb) {
if (typeof options === "function")
cb = options, options = null;
@@ -20322,8 +20103,8 @@ var require_graceful_fs = __commonJS({
});
}
}
- var fs$writeFile = fs10.writeFile;
- fs10.writeFile = writeFile;
+ var fs$writeFile = fs9.writeFile;
+ fs9.writeFile = writeFile;
function writeFile(path10, data, options, cb) {
if (typeof options === "function")
cb = options, options = null;
@@ -20339,9 +20120,9 @@ var require_graceful_fs = __commonJS({
});
}
}
- var fs$appendFile = fs10.appendFile;
+ var fs$appendFile = fs9.appendFile;
if (fs$appendFile)
- fs10.appendFile = appendFile;
+ fs9.appendFile = appendFile;
function appendFile(path10, data, options, cb) {
if (typeof options === "function")
cb = options, options = null;
@@ -20357,9 +20138,9 @@ var require_graceful_fs = __commonJS({
});
}
}
- var fs$copyFile = fs10.copyFile;
+ var fs$copyFile = fs9.copyFile;
if (fs$copyFile)
- fs10.copyFile = copyFile;
+ fs9.copyFile = copyFile;
function copyFile(src, dest, flags, cb) {
if (typeof flags === "function") {
cb = flags;
@@ -20377,8 +20158,8 @@ var require_graceful_fs = __commonJS({
});
}
}
- var fs$readdir = fs10.readdir;
- fs10.readdir = readdir;
+ var fs$readdir = fs9.readdir;
+ fs9.readdir = readdir;
var noReaddirOptionVersions = /^v[0-5]\./;
function readdir(path10, options, cb) {
if (typeof options === "function")
@@ -20419,21 +20200,21 @@ var require_graceful_fs = __commonJS({
}
}
if (process.version.substr(0, 4) === "v0.8") {
- var legStreams = legacy(fs10);
+ var legStreams = legacy(fs9);
ReadStream = legStreams.ReadStream;
WriteStream = legStreams.WriteStream;
}
- var fs$ReadStream = fs10.ReadStream;
+ var fs$ReadStream = fs9.ReadStream;
if (fs$ReadStream) {
ReadStream.prototype = Object.create(fs$ReadStream.prototype);
ReadStream.prototype.open = ReadStream$open;
}
- var fs$WriteStream = fs10.WriteStream;
+ var fs$WriteStream = fs9.WriteStream;
if (fs$WriteStream) {
WriteStream.prototype = Object.create(fs$WriteStream.prototype);
WriteStream.prototype.open = WriteStream$open;
}
- Object.defineProperty(fs10, "ReadStream", {
+ Object.defineProperty(fs9, "ReadStream", {
get: function() {
return ReadStream;
},
@@ -20443,7 +20224,7 @@ var require_graceful_fs = __commonJS({
enumerable: true,
configurable: true
});
- Object.defineProperty(fs10, "WriteStream", {
+ Object.defineProperty(fs9, "WriteStream", {
get: function() {
return WriteStream;
},
@@ -20454,7 +20235,7 @@ var require_graceful_fs = __commonJS({
configurable: true
});
var FileReadStream = ReadStream;
- Object.defineProperty(fs10, "FileReadStream", {
+ Object.defineProperty(fs9, "FileReadStream", {
get: function() {
return FileReadStream;
},
@@ -20465,7 +20246,7 @@ var require_graceful_fs = __commonJS({
configurable: true
});
var FileWriteStream = WriteStream;
- Object.defineProperty(fs10, "FileWriteStream", {
+ Object.defineProperty(fs9, "FileWriteStream", {
get: function() {
return FileWriteStream;
},
@@ -20514,13 +20295,13 @@ var require_graceful_fs = __commonJS({
});
}
function createReadStream(path10, options) {
- return new fs10.ReadStream(path10, options);
+ return new fs9.ReadStream(path10, options);
}
function createWriteStream(path10, options) {
- return new fs10.WriteStream(path10, options);
+ return new fs9.WriteStream(path10, options);
}
- var fs$open = fs10.open;
- fs10.open = open;
+ var fs$open = fs9.open;
+ fs9.open = open;
function open(path10, flags, mode, cb) {
if (typeof mode === "function")
cb = mode, mode = null;
@@ -20536,20 +20317,20 @@ var require_graceful_fs = __commonJS({
});
}
}
- return fs10;
+ return fs9;
}
function enqueue(elem) {
debug2("ENQUEUE", elem[0].name, elem[1]);
- fs9[gracefulQueue].push(elem);
+ fs8[gracefulQueue].push(elem);
retry();
}
var retryTimer;
function resetQueue() {
var now = Date.now();
- for (var i = 0; i < fs9[gracefulQueue].length; ++i) {
- if (fs9[gracefulQueue][i].length > 2) {
- fs9[gracefulQueue][i][3] = now;
- fs9[gracefulQueue][i][4] = now;
+ for (var i = 0; i < fs8[gracefulQueue].length; ++i) {
+ if (fs8[gracefulQueue][i].length > 2) {
+ fs8[gracefulQueue][i][3] = now;
+ fs8[gracefulQueue][i][4] = now;
}
}
retry();
@@ -20557,9 +20338,9 @@ var require_graceful_fs = __commonJS({
function retry() {
clearTimeout(retryTimer);
retryTimer = void 0;
- if (fs9[gracefulQueue].length === 0)
+ if (fs8[gracefulQueue].length === 0)
return;
- var elem = fs9[gracefulQueue].shift();
+ var elem = fs8[gracefulQueue].shift();
var fn2 = elem[0];
var args = elem[1];
var err = elem[2];
@@ -20581,7 +20362,7 @@ var require_graceful_fs = __commonJS({
debug2("RETRY", fn2.name, args);
fn2.apply(null, args.concat([startTime]));
} else {
- fs9[gracefulQueue].push(elem);
+ fs8[gracefulQueue].push(elem);
}
}
if (retryTimer === void 0) {
@@ -20618,15 +20399,15 @@ var require_cmd_shim = __commonJS({
]);
function ingestOptions(opts) {
const opts_ = { ...DEFAULT_OPTIONS, ...opts };
- const fs9 = opts_.fs;
+ const fs8 = opts_.fs;
opts_.fs_ = {
- chmod: fs9.chmod ? (0, util_1.promisify)(fs9.chmod) : async () => {
+ chmod: fs8.chmod ? (0, util_1.promisify)(fs8.chmod) : async () => {
},
- mkdir: (0, util_1.promisify)(fs9.mkdir),
- readFile: (0, util_1.promisify)(fs9.readFile),
- stat: (0, util_1.promisify)(fs9.stat),
- unlink: (0, util_1.promisify)(fs9.unlink),
- writeFile: (0, util_1.promisify)(fs9.writeFile)
+ mkdir: (0, util_1.promisify)(fs8.mkdir),
+ readFile: (0, util_1.promisify)(fs8.readFile),
+ stat: (0, util_1.promisify)(fs8.stat),
+ unlink: (0, util_1.promisify)(fs8.unlink),
+ writeFile: (0, util_1.promisify)(fs8.writeFile)
};
return opts_;
}
@@ -20638,7 +20419,7 @@ var require_cmd_shim = __commonJS({
return cmdShim2(src, to, opts).catch(() => {
});
}
- function rm2(path11, opts) {
+ function rm(path11, opts) {
return opts.fs_.unlink(path11).catch(() => {
});
}
@@ -20662,7 +20443,7 @@ var require_cmd_shim = __commonJS({
return Promise.all(generatorAndExts.map((generatorAndExt) => writeShim(src, to + generatorAndExt.extension, srcRuntimeInfo, generatorAndExt.generator, opts_)));
}
function writeShimPre(target, opts) {
- return rm2(target, opts);
+ return rm(target, opts);
}
function writeShimPost(target, opts) {
return chmodShim(target, opts);
@@ -22636,19 +22417,19 @@ function String2(descriptor, ...args) {
}
// package.json
-var version = "0.25.2";
+var version = "0.28.0";
// sources/Engine.ts
-var import_fs3 = __toESM(require("fs"));
-var import_path3 = __toESM(require("path"));
+var import_fs4 = __toESM(require("fs"));
+var import_path4 = __toESM(require("path"));
var import_process3 = __toESM(require("process"));
-var import_semver3 = __toESM(require_semver2());
+var import_semver4 = __toESM(require_semver2());
// config.json
var config_default = {
definitions: {
npm: {
- default: "10.4.0+sha1.904025b4d932cfaed8799e644a1c5ae7f02729fc",
+ default: "10.5.2+sha1.0e9b72afaf5ecf8249b2abb4b7417db6739c1475",
fetchLatestFrom: {
type: "npm",
package: "npm"
@@ -22685,7 +22466,7 @@ var config_default = {
}
},
pnpm: {
- default: "8.15.3+sha1.64838798f519c18029c1e8a1310e16101fc2eda0",
+ default: "9.0.3+sha1.ff3ad37177cbd0843e533aab13d5e40a05803b47",
fetchLatestFrom: {
type: "npm",
package: "pnpm"
@@ -22743,14 +22524,18 @@ var config_default = {
}
},
yarn: {
- default: "1.22.21+sha1.1959a18351b811cdeedbd484a8f86c3cc3bbaf72",
+ default: "1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610",
fetchLatestFrom: {
type: "npm",
package: "yarn"
},
transparent: {
- default: "4.1.0+sha224.bc24d7f5afc738464f3d4e95f4e6e7829a35cee54a0fd527ea5baa83",
+ default: "4.1.1+sha224.00f08619463229f8ba40c4ee90e8c2e4ced1f11c3115c26f3b98432e",
commands: [
+ [
+ "yarn",
+ "init"
+ ],
[
"yarn",
"dlx"
@@ -22792,7 +22577,8 @@ var config_default = {
},
npmRegistry: {
type: "npm",
- package: "@yarnpkg/cli-dist"
+ package: "@yarnpkg/cli-dist",
+ bin: "bin/yarn.js"
},
commands: {
use: [
@@ -22803,16 +22589,28 @@ var config_default = {
}
}
}
+ },
+ keys: {
+ npm: [
+ {
+ expires: null,
+ keyid: "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA",
+ keytype: "ecdsa-sha2-nistp256",
+ scheme: "ecdsa-sha2-nistp256",
+ key: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1Olb3zMAFFxXKHiIkQO5cJ3Yhl5i6UPp+IhuteBJbuHcA5UogKo0EWtlWwW6KSaKoTNEYL7JlCQiVnkhBktUgg=="
+ }
+ ]
}
};
// sources/corepackUtils.ts
-var import_crypto = require("crypto");
+var import_crypto2 = require("crypto");
var import_events2 = require("events");
var import_fs2 = __toESM(require("fs"));
var import_module = __toESM(require("module"));
var import_path2 = __toESM(require("path"));
var import_semver = __toESM(require_semver2());
+var import_promises = require("timers/promises");
// sources/debugUtils.ts
var import_debug = __toESM(require_src());
@@ -22856,27 +22654,109 @@ function getTemporaryFolder(target = (0, import_os.tmpdir)()) {
}
}
}
-
-// sources/fsUtils.ts
-var import_promises = require("fs/promises");
-async function rimraf(path10) {
- return (0, import_promises.rm)(path10, { recursive: true, force: true });
+
+// sources/httpUtils.ts
+var import_assert = __toESM(require("assert"));
+var import_events = require("events");
+var import_process2 = require("process");
+var import_stream = require("stream");
+
+// sources/npmRegistryUtils.ts
+var import_crypto = require("crypto");
+var DEFAULT_HEADERS = {
+ [`Accept`]: `application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8`
+};
+var DEFAULT_NPM_REGISTRY_URL = `https://registry.npmjs.org`;
+async function fetchAsJson2(packageName, version2) {
+ const npmRegistryUrl = process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL;
+ if (process.env.COREPACK_ENABLE_NETWORK === `0`)
+ throw new UsageError(`Network access disabled by the environment; can't reach npm repository ${npmRegistryUrl}`);
+ const headers = { ...DEFAULT_HEADERS };
+ if (`COREPACK_NPM_TOKEN` in process.env) {
+ headers.authorization = `Bearer ${process.env.COREPACK_NPM_TOKEN}`;
+ } else if (`COREPACK_NPM_USERNAME` in process.env && `COREPACK_NPM_PASSWORD` in process.env) {
+ const encodedCreds = Buffer.from(`${process.env.COREPACK_NPM_USERNAME}:${process.env.COREPACK_NPM_PASSWORD}`, `utf8`).toString(`base64`);
+ headers.authorization = `Basic ${encodedCreds}`;
+ }
+ return fetchAsJson(`${npmRegistryUrl}/${packageName}${version2 ? `/${version2}` : ``}`, { headers });
+}
+function verifySignature({ signatures, integrity, packageName, version: version2 }) {
+ const { npm: keys } = process.env.COREPACK_INTEGRITY_KEYS ? JSON.parse(process.env.COREPACK_INTEGRITY_KEYS) : config_default.keys;
+ const key = keys.find(({ keyid }) => signatures.some((s) => s.keyid === keyid));
+ const signature = signatures.find(({ keyid }) => keyid === key?.keyid);
+ if (key == null || signature == null)
+ throw new Error(`Cannot find matching keyid: ${JSON.stringify({ signatures, keys })}`);
+ const verifier = (0, import_crypto.createVerify)(`SHA256`);
+ verifier.end(`${packageName}@${version2}:${integrity}`);
+ const valid = verifier.verify(
+ `-----BEGIN PUBLIC KEY-----
+${key.key}
+-----END PUBLIC KEY-----`,
+ signature.sig,
+ `base64`
+ );
+ if (!valid) {
+ throw new Error(`Signature does not match`);
+ }
+}
+async function fetchLatestStableVersion(packageName) {
+ const metadata = await fetchAsJson2(packageName, `latest`);
+ const { version: version2, dist: { integrity, signatures } } = metadata;
+ if (process.env.COREPACK_INTEGRITY_KEYS !== ``) {
+ verifySignature({
+ packageName,
+ version: version2,
+ integrity,
+ signatures
+ });
+ }
+ return `${version2}+sha512.${Buffer.from(integrity.slice(7), `base64`).toString(`hex`)}`;
+}
+async function fetchAvailableTags(packageName) {
+ const metadata = await fetchAsJson2(packageName);
+ return metadata[`dist-tags`];
+}
+async function fetchAvailableVersions(packageName) {
+ const metadata = await fetchAsJson2(packageName);
+ return Object.keys(metadata.versions);
+}
+async function fetchTarballURLAndSignature(packageName, version2) {
+ const versionMetadata = await fetchAsJson2(packageName, version2);
+ const { tarball, signatures, integrity } = versionMetadata.dist;
+ if (tarball === void 0 || !tarball.startsWith(`http`))
+ throw new Error(`${packageName}@${version2} does not have a valid tarball.`);
+ return { tarball, signatures, integrity };
}
// sources/httpUtils.ts
-var import_assert = __toESM(require("assert"));
-var import_events = require("events");
-var import_process2 = require("process");
-var import_stream = require("stream");
async function fetch(input, init) {
if (process.env.COREPACK_ENABLE_NETWORK === `0`)
throw new UsageError(`Network access disabled by the environment; can't reach ${input}`);
const agent = await getProxyAgent(input);
+ if (typeof input === `string`)
+ input = new URL(input);
+ let headers = init?.headers;
+ const username = input.username ?? process.env.COREPACK_NPM_USERNAME;
+ const password = input.password ?? process.env.COREPACK_NPM_PASSWORD;
+ if (username || password) {
+ headers = {
+ ...headers,
+ authorization: `Basic ${Buffer.from(`${username}:${password}`).toString(`base64`)}`
+ };
+ input.username = input.password = ``;
+ }
+ if (input.origin === (process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL) && process.env.COREPACK_NPM_TOKEN) {
+ headers = {
+ ...headers,
+ authorization: `Bearer ${process.env.COREPACK_NPM_TOKEN}`
+ };
+ }
let response;
try {
response = await globalThis.fetch(input, {
...init,
- dispatcher: agent
+ dispatcher: agent,
+ headers
});
} catch (error) {
throw new Error(
@@ -22898,17 +22778,15 @@ async function fetchAsJson(input, init) {
}
async function fetchUrlStream(input, init) {
if (process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT === `1`) {
- console.error(`Corepack is about to download ${input}.`);
+ console.error(`! Corepack is about to download ${input}`);
if (import_process2.stdin.isTTY && !process.env.CI) {
- import_process2.stderr.write(`
-Do you want to continue? [Y/n] `);
+ import_process2.stderr.write(`? Do you want to continue? [Y/n] `);
import_process2.stdin.resume();
const chars = await (0, import_events.once)(import_process2.stdin, `data`);
import_process2.stdin.pause();
- if (chars[0][0] === 110 || // n
- chars[0][0] === 78) {
+ if (chars[0][0] === 110 || chars[0][0] === 78)
throw new UsageError(`Aborted by the user`);
- }
+ console.error();
}
}
const response = await fetch(input, init);
@@ -22917,48 +22795,25 @@ Do you want to continue? [Y/n] `);
const stream = import_stream.Readable.fromWeb(webStream);
return stream;
}
+var ProxyAgent;
async function getProxyAgent(input) {
const { getProxyForUrl } = await Promise.resolve().then(() => __toESM(require_proxy_from_env()));
const proxy = getProxyForUrl(input);
if (!proxy)
return void 0;
- const { default: ProxyAgent } = await Promise.resolve().then(() => __toESM(require_proxy_agent()));
- return new ProxyAgent(proxy);
-}
-
-// sources/npmRegistryUtils.ts
-var DEFAULT_HEADERS = {
- [`Accept`]: `application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8`
-};
-var DEFAULT_NPM_REGISTRY_URL = `https://registry.npmjs.org`;
-async function fetchAsJson2(packageName) {
- const npmRegistryUrl = process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL;
- if (process.env.COREPACK_ENABLE_NETWORK === `0`)
- throw new UsageError(`Network access disabled by the environment; can't reach npm repository ${npmRegistryUrl}`);
- const headers = { ...DEFAULT_HEADERS };
- if (`COREPACK_NPM_TOKEN` in process.env) {
- headers.authorization = `Bearer ${process.env.COREPACK_NPM_TOKEN}`;
- } else if (`COREPACK_NPM_USERNAME` in process.env && `COREPACK_NPM_PASSWORD` in process.env) {
- const encodedCreds = Buffer.from(`${process.env.COREPACK_NPM_USERNAME}:${process.env.COREPACK_NPM_PASSWORD}`, `utf8`).toString(`base64`);
- headers.authorization = `Basic ${encodedCreds}`;
+ if (ProxyAgent == null) {
+ const [api, Dispatcher, _ProxyAgent] = await Promise.all([
+ // @ts-expect-error internal module is untyped
+ Promise.resolve().then(() => __toESM(require_api())),
+ // @ts-expect-error internal module is untyped
+ Promise.resolve().then(() => __toESM(require_dispatcher())),
+ // @ts-expect-error internal module is untyped
+ Promise.resolve().then(() => __toESM(require_proxy_agent()))
+ ]);
+ Object.assign(Dispatcher.default.prototype, api.default);
+ ProxyAgent = _ProxyAgent.default;
}
- return fetchAsJson(`${npmRegistryUrl}/${packageName}`, { headers });
-}
-async function fetchLatestStableVersion(packageName) {
- const metadata = await fetchAsJson2(packageName);
- const { latest } = metadata[`dist-tags`];
- if (latest === void 0)
- throw new Error(`${packageName} does not have a "latest" tag.`);
- const { shasum } = metadata.versions[latest].dist;
- return `${latest}+sha1.${shasum}`;
-}
-async function fetchAvailableTags(packageName) {
- const metadata = await fetchAsJson2(packageName);
- return metadata[`dist-tags`];
-}
-async function fetchAvailableVersions(packageName) {
- const metadata = await fetchAsJson2(packageName);
- return Object.keys(metadata.versions);
+ return new ProxyAgent(proxy);
}
// sources/corepackUtils.ts
@@ -23049,6 +22904,57 @@ function parseURLReference(locator) {
}
return { version: encodeURIComponent(href), build: [] };
}
+function isValidBinList(x) {
+ return Array.isArray(x) && x.length > 0;
+}
+function isValidBinSpec(x) {
+ return typeof x === `object` && x !== null && !Array.isArray(x) && Object.keys(x).length > 0;
+}
+async function download(installTarget, url, algo, binPath = null) {
+ const tmpFolder = getTemporaryFolder(installTarget);
+ log(`Downloading to ${tmpFolder}`);
+ const stream = await fetchUrlStream(url);
+ const parsedUrl = new URL(url);
+ const ext = import_path2.default.posix.extname(parsedUrl.pathname);
+ let outputFile = null;
+ let sendTo;
+ if (ext === `.tgz`) {
+ const { default: tar } = await Promise.resolve().then(() => __toESM(require_tar()));
+ sendTo = tar.x({
+ strip: 1,
+ cwd: tmpFolder,
+ filter: binPath ? (path10) => {
+ const pos = path10.indexOf(`/`);
+ return pos !== -1 && path10.slice(pos + 1) === binPath;
+ } : void 0
+ });
+ } else if (ext === `.js`) {
+ outputFile = import_path2.default.join(tmpFolder, import_path2.default.posix.basename(parsedUrl.pathname));
+ sendTo = import_fs2.default.createWriteStream(outputFile);
+ }
+ stream.pipe(sendTo);
+ let hash = !binPath ? stream.pipe((0, import_crypto2.createHash)(algo)) : null;
+ await (0, import_events2.once)(sendTo, `finish`);
+ if (binPath) {
+ const downloadedBin = import_path2.default.join(tmpFolder, binPath);
+ outputFile = import_path2.default.join(tmpFolder, import_path2.default.basename(downloadedBin));
+ try {
+ await renameSafe(downloadedBin, outputFile);
+ } catch (err) {
+ if (err?.code === `ENOENT`)
+ throw new Error(`Cannot locate '${binPath}' in downloaded tarball`, { cause: err });
+ throw err;
+ }
+ const fileStream = import_fs2.default.createReadStream(outputFile);
+ hash = fileStream.pipe((0, import_crypto2.createHash)(algo));
+ await (0, import_events2.once)(fileStream, `close`);
+ }
+ return {
+ tmpFolder,
+ outputFile,
+ hash: hash.digest(`hex`)
+ };
+}
async function installVersion(installTarget, locator, { spec }) {
const locatorIsASupportedPackageManager = isSupportedPackageManagerLocator(locator);
const locatorReference = locatorIsASupportedPackageManager ? import_semver.default.parse(locator.reference) : parseURLReference(locator);
@@ -23070,42 +22976,68 @@ async function installVersion(installTarget, locator, { spec }) {
}
}
let url;
+ let signatures;
+ let integrity;
+ let binPath = null;
if (locatorIsASupportedPackageManager) {
- const defaultNpmRegistryURL = spec.url.replace(`{}`, version2);
- url = process.env.COREPACK_NPM_REGISTRY ? defaultNpmRegistryURL.replace(
- DEFAULT_NPM_REGISTRY_URL,
- () => process.env.COREPACK_NPM_REGISTRY
- ) : defaultNpmRegistryURL;
+ url = spec.url.replace(`{}`, version2);
+ if (process.env.COREPACK_NPM_REGISTRY) {
+ const registry = getRegistryFromPackageManagerSpec(spec);
+ if (registry.type === `npm`) {
+ ({ tarball: url, signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version2));
+ if (registry.bin) {
+ binPath = registry.bin;
+ }
+ } else {
+ url = url.replace(
+ DEFAULT_NPM_REGISTRY_URL,
+ () => process.env.COREPACK_NPM_REGISTRY
+ );
+ }
+ }
} else {
url = decodeURIComponent(version2);
+ if (process.env.COREPACK_NPM_REGISTRY && url.startsWith(DEFAULT_NPM_REGISTRY_URL)) {
+ url = url.replace(
+ DEFAULT_NPM_REGISTRY_URL,
+ () => process.env.COREPACK_NPM_REGISTRY
+ );
+ }
}
- const tmpFolder = getTemporaryFolder(installTarget);
- log(`Installing ${locator.name}@${version2} from ${url} to ${tmpFolder}`);
- const stream = await fetchUrlStream(url);
- const parsedUrl = new URL(url);
- const ext = import_path2.default.posix.extname(parsedUrl.pathname);
- let outputFile = null;
- let sendTo;
- if (ext === `.tgz`) {
- const { default: tar } = await Promise.resolve().then(() => __toESM(require_tar()));
- sendTo = tar.x({ strip: 1, cwd: tmpFolder });
- } else if (ext === `.js`) {
- outputFile = import_path2.default.join(tmpFolder, import_path2.default.posix.basename(parsedUrl.pathname));
- sendTo = import_fs2.default.createWriteStream(outputFile);
- }
- stream.pipe(sendTo);
- const algo = build[0] ?? `sha256`;
- const hash = stream.pipe((0, import_crypto.createHash)(algo));
- await (0, import_events2.once)(sendTo, `finish`);
+ log(`Installing ${locator.name}@${version2} from ${url}`);
+ const algo = build[0] ?? `sha512`;
+ const { tmpFolder, outputFile, hash: actualHash } = await download(installTarget, url, algo, binPath);
let bin;
- if (!locatorIsASupportedPackageManager) {
- if (ext === `.tgz`) {
- bin = require(import_path2.default.join(tmpFolder, `package.json`)).bin;
- } else if (ext === `.js`) {
+ const isSingleFile = outputFile !== null;
+ if (isSingleFile) {
+ if (locatorIsASupportedPackageManager && isValidBinList(spec.bin)) {
+ bin = spec.bin;
+ } else {
bin = [locator.name];
}
+ } else {
+ if (locatorIsASupportedPackageManager && isValidBinSpec(spec.bin)) {
+ bin = spec.bin;
+ } else {
+ const { name: packageName, bin: packageBin } = require(import_path2.default.join(tmpFolder, `package.json`));
+ if (typeof packageBin === `string`) {
+ bin = { [packageName]: packageBin };
+ } else if (isValidBinSpec(packageBin)) {
+ bin = packageBin;
+ } else {
+ throw new Error(`Unable to locate bin in package.json`);
+ }
+ }
+ }
+ if (!build[1]) {
+ const registry = getRegistryFromPackageManagerSpec(spec);
+ if (registry.type === `npm` && !registry.bin && process.env.COREPACK_INTEGRITY_KEYS !== ``) {
+ if (signatures == null || integrity == null)
+ ({ signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version2));
+ verifySignature({ signatures, integrity, packageName: registry.package, version: version2 });
+ build[1] = Buffer.from(integrity.slice(`sha512-`.length), `base64`).toString(`hex`);
+ }
}
- const actualHash = hash.digest(`hex`);
if (build[1] && actualHash !== build[1])
throw new Error(`Mismatch hashes. Expected ${build[1]}, got ${actualHash}`);
const serializedHash = `${algo}.${actualHash}`;
@@ -23116,35 +23048,29 @@ async function installVersion(installTarget, locator, { spec }) {
}));
await import_fs2.default.promises.mkdir(import_path2.default.dirname(installFolder), { recursive: true });
try {
- await import_fs2.default.promises.rename(tmpFolder, installFolder);
+ if (process.platform === `win32`) {
+ await renameUnderWindows(tmpFolder, installFolder);
+ } else {
+ await import_fs2.default.promises.rename(tmpFolder, installFolder);
+ }
} catch (err) {
if (err.code === `ENOTEMPTY` || // On Windows the error code is EPERM so we check if it is a directory
err.code === `EPERM` && (await import_fs2.default.promises.stat(installFolder)).isDirectory()) {
log(`Another instance of corepack installed ${locator.name}@${locator.reference}`);
- await rimraf(tmpFolder);
+ await import_fs2.default.promises.rm(tmpFolder, { recursive: true, force: true });
} else {
throw err;
}
}
if (locatorIsASupportedPackageManager && process.env.COREPACK_DEFAULT_TO_LATEST !== `0`) {
- let lastKnownGoodFile;
- try {
- lastKnownGoodFile = await getLastKnownGoodFile(`r+`);
- const lastKnownGood = await getJSONFileContent(lastKnownGoodFile);
- const defaultVersion = getLastKnownGoodFromFileContent(lastKnownGood, locator.name);
- if (defaultVersion) {
- const currentDefault = import_semver.default.parse(defaultVersion);
- const downloadedVersion = locatorReference;
- if (currentDefault.major === downloadedVersion.major && import_semver.default.lt(currentDefault, downloadedVersion)) {
- await activatePackageManagerFromFileHandle(lastKnownGoodFile, lastKnownGood, locator);
- }
- }
- } catch (err) {
- if (err?.code !== `ENOENT`) {
- throw err;
+ const lastKnownGood = await getLastKnownGood();
+ const defaultVersion = getLastKnownGoodFromFileContent(lastKnownGood, locator.name);
+ if (defaultVersion) {
+ const currentDefault = import_semver.default.parse(defaultVersion);
+ const downloadedVersion = locatorReference;
+ if (currentDefault.major === downloadedVersion.major && import_semver.default.lt(currentDefault, downloadedVersion)) {
+ await activatePackageManager(lastKnownGood, locator);
}
- } finally {
- await lastKnownGoodFile?.close();
}
}
log(`Install finished`);
@@ -23154,10 +23080,34 @@ async function installVersion(installTarget, locator, { spec }) {
hash: serializedHash
};
}
+async function renameSafe(oldPath, newPath) {
+ if (process.platform === `win32`) {
+ await renameUnderWindows(oldPath, newPath);
+ } else {
+ await import_fs2.default.promises.rename(oldPath, newPath);
+ }
+}
+async function renameUnderWindows(oldPath, newPath) {
+ const retries = 5;
+ for (let i = 0; i < retries; i++) {
+ try {
+ await import_fs2.default.promises.rename(oldPath, newPath);
+ break;
+ } catch (err) {
+ if ((err.code === `ENOENT` || err.code === `EPERM`) && i < retries - 1) {
+ await (0, import_promises.setTimeout)(100 * 2 ** i);
+ continue;
+ } else {
+ throw err;
+ }
+ }
+ }
+}
async function runVersion(locator, installSpec, binName, args) {
let binPath = null;
- if (Array.isArray(installSpec.spec.bin)) {
- if (installSpec.spec.bin.some((bin) => bin === binName)) {
+ const bin = installSpec.bin ?? installSpec.spec.bin;
+ if (Array.isArray(bin)) {
+ if (bin.some((name) => name === binName)) {
const parsedUrl = new URL(installSpec.spec.url);
const ext = import_path2.default.posix.extname(parsedUrl.pathname);
if (ext === `.js`) {
@@ -23165,7 +23115,7 @@ async function runVersion(locator, installSpec, binName, args) {
}
}
} else {
- for (const [name, dest] of Object.entries(installSpec.spec.bin)) {
+ for (const [name, dest] of Object.entries(bin)) {
if (name === binName) {
binPath = import_path2.default.join(installSpec.location, dest);
break;
@@ -23204,74 +23154,214 @@ function satisfiesWithPrereleases(version2, range, loose = false) {
if (semverVersion.prerelease) {
semverVersion.prerelease = [];
}
- } catch (err) {
- return false;
+ } catch (err) {
+ return false;
+ }
+ return semverRange.set.some((comparatorSet) => {
+ for (const comparator of comparatorSet)
+ if (comparator.semver.prerelease)
+ comparator.semver.prerelease = [];
+ return comparatorSet.every((comparator) => {
+ return comparator.test(semverVersion);
+ });
+ });
+}
+
+// sources/specUtils.ts
+var import_fs3 = __toESM(require("fs"));
+var import_path3 = __toESM(require("path"));
+var import_semver3 = __toESM(require_semver2());
+
+// sources/nodeUtils.ts
+var import_os2 = __toESM(require("os"));
+function getEndOfLine(content) {
+ const matches = content.match(/\r?\n/g);
+ if (matches === null)
+ return import_os2.default.EOL;
+ const crlf = matches.filter((nl) => nl === `\r
+`).length;
+ const lf = matches.length - crlf;
+ return crlf > lf ? `\r
+` : `
+`;
+}
+function normalizeLineEndings(originalContent, newContent) {
+ return newContent.replace(/\r?\n/g, getEndOfLine(originalContent));
+}
+function getIndent(content) {
+ const indentMatch = content.match(/^[ \t]+/m);
+ if (indentMatch) {
+ return indentMatch[0];
+ } else {
+ return ` `;
+ }
+}
+function stripBOM(content) {
+ if (content.charCodeAt(0) === 65279) {
+ return content.slice(1);
+ } else {
+ return content;
+ }
+}
+function readPackageJson(content) {
+ return {
+ data: JSON.parse(stripBOM(content) || `{}`),
+ indent: getIndent(content)
+ };
+}
+
+// sources/types.ts
+var SupportedPackageManagers = /* @__PURE__ */ ((SupportedPackageManagers3) => {
+ SupportedPackageManagers3["Npm"] = `npm`;
+ SupportedPackageManagers3["Pnpm"] = `pnpm`;
+ SupportedPackageManagers3["Yarn"] = `yarn`;
+ return SupportedPackageManagers3;
+})(SupportedPackageManagers || {});
+var SupportedPackageManagerSet = new Set(
+ Object.values(SupportedPackageManagers)
+);
+var SupportedPackageManagerSetWithoutNpm = new Set(
+ Object.values(SupportedPackageManagers)
+);
+SupportedPackageManagerSetWithoutNpm.delete("npm" /* Npm */);
+function isSupportedPackageManager(value) {
+ return SupportedPackageManagerSet.has(value);
+}
+
+// sources/specUtils.ts
+var nodeModulesRegExp = /[\\/]node_modules[\\/](@[^\\/]*[\\/])?([^@\\/][^\\/]*)$/;
+function parseSpec(raw, source, { enforceExactVersion = true } = {}) {
+ if (typeof raw !== `string`)
+ throw new UsageError(`Invalid package manager specification in ${source}; expected a string`);
+ const atIndex = raw.indexOf(`@`);
+ if (atIndex === -1 || atIndex === raw.length - 1) {
+ if (enforceExactVersion)
+ throw new UsageError(`No version specified for ${raw} in "packageManager" of ${source}`);
+ const name2 = atIndex === -1 ? raw : raw.slice(0, -1);
+ if (!isSupportedPackageManager(name2))
+ throw new UsageError(`Unsupported package manager specification (${name2})`);
+ return {
+ name: name2,
+ range: `*`
+ };
+ }
+ const name = raw.slice(0, atIndex);
+ const range = raw.slice(atIndex + 1);
+ const isURL = URL.canParse(range);
+ if (!isURL) {
+ if (enforceExactVersion && !import_semver3.default.valid(range))
+ throw new UsageError(`Invalid package manager specification in ${source} (${raw}); expected a semver version${enforceExactVersion ? `` : `, range, or tag`}`);
+ if (!isSupportedPackageManager(name)) {
+ throw new UsageError(`Unsupported package manager specification (${raw})`);
+ }
+ } else if (isSupportedPackageManager(name) && process.env.COREPACK_ENABLE_UNSAFE_CUSTOM_URLS !== `1`) {
+ throw new UsageError(`Illegal use of URL for known package manager. Instead, select a specific version, or set COREPACK_ENABLE_UNSAFE_CUSTOM_URLS=1 in your environment (${raw})`);
+ }
+ return {
+ name,
+ range
+ };
+}
+async function setLocalPackageManager(cwd, info) {
+ const lookup = await loadSpec(cwd);
+ const content = lookup.type !== `NoProject` ? await import_fs3.default.promises.readFile(lookup.target, `utf8`) : ``;
+ const { data, indent } = readPackageJson(content);
+ const previousPackageManager = data.packageManager ?? `unknown`;
+ data.packageManager = `${info.locator.name}@${info.locator.reference}`;
+ const newContent = normalizeLineEndings(content, `${JSON.stringify(data, null, indent)}
+`);
+ await import_fs3.default.promises.writeFile(lookup.target, newContent, `utf8`);
+ return {
+ previousPackageManager
+ };
+}
+async function loadSpec(initialCwd) {
+ let nextCwd = initialCwd;
+ let currCwd = ``;
+ let selection = null;
+ while (nextCwd !== currCwd && (!selection || !selection.data.packageManager)) {
+ currCwd = nextCwd;
+ nextCwd = import_path3.default.dirname(currCwd);
+ if (nodeModulesRegExp.test(currCwd))
+ continue;
+ const manifestPath = import_path3.default.join(currCwd, `package.json`);
+ let content;
+ try {
+ content = await import_fs3.default.promises.readFile(manifestPath, `utf8`);
+ } catch (err) {
+ if (err?.code === `ENOENT`)
+ continue;
+ throw err;
+ }
+ let data;
+ try {
+ data = JSON.parse(content);
+ } catch {
+ }
+ if (typeof data !== `object` || data === null)
+ throw new UsageError(`Invalid package.json in ${import_path3.default.relative(initialCwd, manifestPath)}`);
+ selection = { data, manifestPath };
}
- return semverRange.set.some((comparatorSet) => {
- for (const comparator of comparatorSet)
- if (comparator.semver.prerelease)
- comparator.semver.prerelease = [];
- return comparatorSet.every((comparator) => {
- return comparator.test(semverVersion);
- });
- });
-}
-
-// sources/types.ts
-var SupportedPackageManagers = /* @__PURE__ */ ((SupportedPackageManagers3) => {
- SupportedPackageManagers3["Npm"] = `npm`;
- SupportedPackageManagers3["Pnpm"] = `pnpm`;
- SupportedPackageManagers3["Yarn"] = `yarn`;
- return SupportedPackageManagers3;
-})(SupportedPackageManagers || {});
-var SupportedPackageManagerSet = new Set(
- Object.values(SupportedPackageManagers)
-);
-var SupportedPackageManagerSetWithoutNpm = new Set(
- Object.values(SupportedPackageManagers)
-);
-SupportedPackageManagerSetWithoutNpm.delete("npm" /* Npm */);
-function isSupportedPackageManager(value) {
- return SupportedPackageManagerSet.has(value);
+ if (selection === null)
+ return { type: `NoProject`, target: import_path3.default.join(initialCwd, `package.json`) };
+ const rawPmSpec = selection.data.packageManager;
+ if (typeof rawPmSpec === `undefined`)
+ return { type: `NoSpec`, target: selection.manifestPath };
+ return {
+ type: `Found`,
+ target: selection.manifestPath,
+ spec: parseSpec(rawPmSpec, import_path3.default.relative(initialCwd, selection.manifestPath))
+ };
}
// sources/Engine.ts
-function getLastKnownGoodFile(flag = `r`) {
- return import_fs3.default.promises.open(import_path3.default.join(getCorepackHomeFolder(), `lastKnownGood.json`), flag);
+function getLastKnownGoodFilePath() {
+ return import_path4.default.join(getCorepackHomeFolder(), `lastKnownGood.json`);
}
-async function createLastKnownGoodFile() {
- await import_fs3.default.promises.mkdir(getCorepackHomeFolder(), { recursive: true });
- return getLastKnownGoodFile(`w`);
-}
-async function getJSONFileContent(fh) {
- let lastKnownGood;
+async function getLastKnownGood() {
+ let raw;
+ try {
+ raw = await import_fs4.default.promises.readFile(getLastKnownGoodFilePath(), `utf8`);
+ } catch (err) {
+ if (err?.code === `ENOENT`)
+ return {};
+ throw err;
+ }
try {
- lastKnownGood = JSON.parse(await fh.readFile(`utf8`));
+ const parsed = JSON.parse(raw);
+ if (!parsed)
+ return {};
+ if (typeof parsed !== `object`)
+ return {};
+ Object.entries(parsed).forEach(([key, value]) => {
+ if (typeof value !== `string`) {
+ delete parsed[key];
+ }
+ });
+ return parsed;
} catch {
- return void 0;
+ return {};
}
- return lastKnownGood;
}
-async function overwriteJSONFileContent(fh, content) {
- await fh.truncate(0);
- await fh.write(`${JSON.stringify(content, null, 2)}
-`, 0);
+async function createLastKnownGoodFile(lastKnownGood) {
+ const content = `${JSON.stringify(lastKnownGood, null, 2)}
+`;
+ await import_fs4.default.promises.mkdir(getCorepackHomeFolder(), { recursive: true });
+ await import_fs4.default.promises.writeFile(getLastKnownGoodFilePath(), content, `utf8`);
}
function getLastKnownGoodFromFileContent(lastKnownGood, packageManager) {
- if (typeof lastKnownGood === `object` && lastKnownGood !== null && Object.hasOwn(lastKnownGood, packageManager)) {
- const override = lastKnownGood[packageManager];
- if (typeof override === `string`) {
- return override;
- }
- }
+ if (Object.hasOwn(lastKnownGood, packageManager))
+ return lastKnownGood[packageManager];
return void 0;
}
-async function activatePackageManagerFromFileHandle(lastKnownGoodFile, lastKnownGood, locator) {
- if (typeof lastKnownGood !== `object` || lastKnownGood === null)
- lastKnownGood = {};
+async function activatePackageManager(lastKnownGood, locator) {
+ if (lastKnownGood[locator.name] === locator.reference) {
+ log(`${locator.name}@${locator.reference} is already Last Known Good version`);
+ return;
+ }
lastKnownGood[locator.name] = locator.reference;
log(`Setting ${locator.name}@${locator.reference} as Last Known Good version`);
- await overwriteJSONFileContent(lastKnownGoodFile, lastKnownGood);
+ await createLastKnownGoodFile(lastKnownGood);
}
var Engine = class {
constructor(config = config_default) {
@@ -23334,60 +23424,126 @@ var Engine = class {
const definition = this.config.definitions[packageManager];
if (typeof definition === `undefined`)
throw new UsageError(`This package manager (${packageManager}) isn't supported by this corepack build`);
- let lastKnownGoodFile = await getLastKnownGoodFile(`r+`).catch((err) => {
- if (err?.code !== `ENOENT`) {
- throw err;
- }
- });
+ const lastKnownGood = await getLastKnownGood();
+ const lastKnownGoodForThisPackageManager = getLastKnownGoodFromFileContent(lastKnownGood, packageManager);
+ if (lastKnownGoodForThisPackageManager)
+ return lastKnownGoodForThisPackageManager;
+ if (import_process3.default.env.COREPACK_DEFAULT_TO_LATEST === `0`)
+ return definition.default;
+ const reference = await fetchLatestStableVersion2(definition.fetchLatestFrom);
try {
- const lastKnownGood = lastKnownGoodFile == null || await getJSONFileContent(lastKnownGoodFile);
- const lastKnownGoodForThisPackageManager = getLastKnownGoodFromFileContent(lastKnownGood, packageManager);
- if (lastKnownGoodForThisPackageManager)
- return lastKnownGoodForThisPackageManager;
- if (import_process3.default.env.COREPACK_DEFAULT_TO_LATEST === `0`)
- return definition.default;
- const reference = await fetchLatestStableVersion2(definition.fetchLatestFrom);
- try {
- lastKnownGoodFile ??= await createLastKnownGoodFile();
- await activatePackageManagerFromFileHandle(lastKnownGoodFile, lastKnownGood, {
- name: packageManager,
- reference
- });
- } catch {
- }
- return reference;
- } finally {
- await lastKnownGoodFile?.close();
+ await activatePackageManager(lastKnownGood, {
+ name: packageManager,
+ reference
+ });
+ } catch {
}
+ return reference;
}
async activatePackageManager(locator) {
- let emptyFile = false;
- const lastKnownGoodFile = await getLastKnownGoodFile(`r+`).catch((err) => {
- if (err?.code === `ENOENT`) {
- emptyFile = true;
- return getLastKnownGoodFile(`w`);
- }
- throw err;
- });
- try {
- await activatePackageManagerFromFileHandle(lastKnownGoodFile, emptyFile || await getJSONFileContent(lastKnownGoodFile), locator);
- } finally {
- await lastKnownGoodFile.close();
- }
+ const lastKnownGood = await getLastKnownGood();
+ await activatePackageManager(lastKnownGood, locator);
}
async ensurePackageManager(locator) {
const spec = this.getPackageManagerSpecFor(locator);
const packageManagerInfo = await installVersion(getInstallFolder(), locator, {
spec
});
- spec.bin ??= packageManagerInfo.bin;
+ const noHashReference = locator.reference.replace(/\+.*/, ``);
+ const fixedHashReference = `${noHashReference}+${packageManagerInfo.hash}`;
+ const fixedHashLocator = {
+ name: locator.name,
+ reference: fixedHashReference
+ };
return {
...packageManagerInfo,
- locator,
+ locator: fixedHashLocator,
spec
};
}
- async fetchAvailableVersions() {
+ /**
+ * Locates the active project's package manager specification.
+ *
+ * If the specification exists but doesn't match the active package manager,
+ * an error is thrown to prevent users from using the wrong package manager,
+ * which would lead to inconsistent project layouts.
+ *
+ * If the project doesn't include a specification file, we just assume that
+ * whatever the user uses is exactly what they want to use. Since the version
+ * isn't explicited, we fallback on known good versions.
+ *
+ * Finally, if the project doesn't exist at all, we ask the user whether they
+ * want to create one in the current project. If they do, we initialize a new
+ * project using the default package managers, and configure it so that we
+ * don't need to ask again in the future.
+ */
+ async findProjectSpec(initialCwd, locator, { transparent = false } = {}) {
+ const fallbackDescriptor = { name: locator.name, range: `${locator.reference}` };
+ if (import_process3.default.env.COREPACK_ENABLE_PROJECT_SPEC === `0`)
+ return fallbackDescriptor;
+ if (import_process3.default.env.COREPACK_ENABLE_STRICT === `0`)
+ transparent = true;
+ while (true) {
+ const result = await loadSpec(initialCwd);
+ switch (result.type) {
+ case `NoProject`:
+ return fallbackDescriptor;
+ case `NoSpec`: {
+ if (import_process3.default.env.COREPACK_ENABLE_AUTO_PIN !== `0`) {
+ const resolved = await this.resolveDescriptor(fallbackDescriptor, { allowTags: true });
+ if (resolved === null)
+ throw new UsageError(`Failed to successfully resolve '${fallbackDescriptor.range}' to a valid ${fallbackDescriptor.name} release`);
+ const installSpec = await this.ensurePackageManager(resolved);
+ console.error(`! The local project doesn't define a 'packageManager' field. Corepack will now add one referencing ${installSpec.locator.name}@${installSpec.locator.reference}.`);
+ console.error(`! For more details about this field, consult the documentation at https://nodejs.org/api/packages.html#packagemanager`);
+ console.error();
+ await setLocalPackageManager(import_path4.default.dirname(result.target), installSpec);
+ }
+ return fallbackDescriptor;
+ }
+ case `Found`: {
+ if (result.spec.name !== locator.name) {
+ if (transparent) {
+ return fallbackDescriptor;
+ } else {
+ throw new UsageError(`This project is configured to use ${result.spec.name} because ${result.target} has a "packageManager" field`);
+ }
+ } else {
+ return result.spec;
+ }
+ }
+ }
+ }
+ }
+ async executePackageManagerRequest({ packageManager, binaryName, binaryVersion }, { cwd, args }) {
+ let fallbackLocator = {
+ name: binaryName,
+ reference: void 0
+ };
+ let isTransparentCommand = false;
+ if (packageManager != null) {
+ const defaultVersion = binaryVersion || await this.getDefaultVersion(packageManager);
+ const definition = this.config.definitions[packageManager];
+ for (const transparentPath of definition.transparent.commands) {
+ if (transparentPath[0] === binaryName && transparentPath.slice(1).every((segment, index) => segment === args[index])) {
+ isTransparentCommand = true;
+ break;
+ }
+ }
+ const fallbackReference = isTransparentCommand ? definition.transparent.default ?? defaultVersion : defaultVersion;
+ fallbackLocator = {
+ name: packageManager,
+ reference: fallbackReference
+ };
+ }
+ const descriptor = await this.findProjectSpec(cwd, fallbackLocator, { transparent: isTransparentCommand });
+ if (binaryVersion)
+ descriptor.range = binaryVersion;
+ const resolved = await this.resolveDescriptor(descriptor, { allowTags: true });
+ if (resolved === null)
+ throw new UsageError(`Failed to successfully resolve '${descriptor.range}' to a valid ${descriptor.name} release`);
+ const installSpec = await this.ensurePackageManager(resolved);
+ return await runVersion(resolved, installSpec, binaryName, args);
}
async resolveDescriptor(descriptor, { allowTags = false, useCache = true } = {}) {
if (!isSupportedPackageManagerDescriptor(descriptor)) {
@@ -23402,7 +23558,7 @@ var Engine = class {
if (typeof definition === `undefined`)
throw new UsageError(`This package manager (${descriptor.name}) isn't supported by this corepack build`);
let finalDescriptor = descriptor;
- if (!import_semver3.default.valid(descriptor.range) && !import_semver3.default.validRange(descriptor.range)) {
+ if (!import_semver4.default.valid(descriptor.range) && !import_semver4.default.validRange(descriptor.range)) {
if (!allowTags)
throw new UsageError(`Packages managers can't be referenced via tags in this context`);
const ranges = Object.keys(definition.ranges);
@@ -23420,7 +23576,7 @@ var Engine = class {
const cachedVersion = await findInstalledVersion(getInstallFolder(), finalDescriptor);
if (cachedVersion !== null && useCache)
return { name: finalDescriptor.name, reference: cachedVersion };
- if (import_semver3.default.valid(finalDescriptor.range))
+ if (import_semver4.default.valid(finalDescriptor.range))
return { name: finalDescriptor.name, reference: finalDescriptor.range };
const versions = await Promise.all(Object.keys(definition.ranges).map(async (range) => {
const packageManagerSpec = definition.ranges[range];
@@ -23428,7 +23584,7 @@ var Engine = class {
const versions2 = await fetchAvailableVersions2(registry);
return versions2.filter((version2) => satisfiesWithPrereleases(version2, finalDescriptor.range));
}));
- const highestVersion = [...new Set(versions.flat())].sort(import_semver3.default.rcompare);
+ const highestVersion = [...new Set(versions.flat())].sort(import_semver4.default.rcompare);
if (highestVersion.length === 0)
return null;
return { name: finalDescriptor.name, reference: highestVersion[0] };
@@ -23436,7 +23592,7 @@ var Engine = class {
};
// sources/commands/Cache.ts
-var import_fs4 = __toESM(require("fs"));
+var import_fs5 = __toESM(require("fs"));
var CacheCommand = class extends Command {
static paths = [
[`cache`, `clean`],
@@ -23449,13 +23605,13 @@ var CacheCommand = class extends Command {
`
});
async execute() {
- await import_fs4.default.promises.rm(getInstallFolder(), { recursive: true, force: true });
+ await import_fs5.default.promises.rm(getInstallFolder(), { recursive: true, force: true });
}
};
// sources/commands/Disable.ts
-var import_fs5 = __toESM(require("fs"));
-var import_path4 = __toESM(require("path"));
+var import_fs6 = __toESM(require("fs"));
+var import_path5 = __toESM(require("path"));
var import_which = __toESM(require_lib());
var DisableCommand = class extends Command {
static paths = [
@@ -23486,7 +23642,7 @@ var DisableCommand = class extends Command {
async execute() {
let installDirectory = this.installDirectory;
if (typeof installDirectory === `undefined`)
- installDirectory = import_path4.default.dirname(await (0, import_which.default)(`corepack`));
+ installDirectory = import_path5.default.dirname(await (0, import_which.default)(`corepack`));
const names = this.names.length === 0 ? SupportedPackageManagerSetWithoutNpm : this.names;
for (const name of new Set(names)) {
if (!isSupportedPackageManager(name))
@@ -23501,9 +23657,9 @@ var DisableCommand = class extends Command {
}
}
async removePosixLink(installDirectory, binName) {
- const file = import_path4.default.join(installDirectory, binName);
+ const file = import_path5.default.join(installDirectory, binName);
try {
- await import_fs5.default.promises.unlink(file);
+ await import_fs6.default.promises.unlink(file);
} catch (err) {
if (err.code !== `ENOENT`) {
throw err;
@@ -23512,9 +23668,9 @@ var DisableCommand = class extends Command {
}
async removeWin32Link(installDirectory, binName) {
for (const ext of [``, `.ps1`, `.cmd`]) {
- const file = import_path4.default.join(installDirectory, `${binName}${ext}`);
+ const file = import_path5.default.join(installDirectory, `${binName}${ext}`);
try {
- await import_fs5.default.promises.unlink(file);
+ await import_fs6.default.promises.unlink(file);
} catch (err) {
if (err.code !== `ENOENT`) {
throw err;
@@ -23526,8 +23682,8 @@ var DisableCommand = class extends Command {
// sources/commands/Enable.ts
var import_cmd_shim = __toESM(require_cmd_shim());
-var import_fs6 = __toESM(require("fs"));
-var import_path5 = __toESM(require("path"));
+var import_fs7 = __toESM(require("fs"));
+var import_path6 = __toESM(require("path"));
var import_which2 = __toESM(require_lib());
var EnableCommand = class extends Command {
static paths = [
@@ -23558,11 +23714,11 @@ var EnableCommand = class extends Command {
async execute() {
let installDirectory = this.installDirectory;
if (typeof installDirectory === `undefined`)
- installDirectory = import_path5.default.dirname(await (0, import_which2.default)(`corepack`));
- installDirectory = import_fs6.default.realpathSync(installDirectory);
+ installDirectory = import_path6.default.dirname(await (0, import_which2.default)(`corepack`));
+ installDirectory = import_fs7.default.realpathSync(installDirectory);
const manifestPath = require.resolve("corepack/package.json");
- const distFolder = import_path5.default.join(import_path5.default.dirname(manifestPath), `dist`);
- if (!import_fs6.default.existsSync(distFolder))
+ const distFolder = import_path6.default.join(import_path6.default.dirname(manifestPath), `dist`);
+ if (!import_fs7.default.existsSync(distFolder))
throw new Error(`Assertion failed: The stub folder doesn't exist`);
const names = this.names.length === 0 ? SupportedPackageManagerSetWithoutNpm : this.names;
for (const name of new Set(names)) {
@@ -23578,173 +23734,29 @@ var EnableCommand = class extends Command {
}
}
async generatePosixLink(installDirectory, distFolder, binName) {
- const file = import_path5.default.join(installDirectory, binName);
- const symlink = import_path5.default.relative(installDirectory, import_path5.default.join(distFolder, `${binName}.js`));
- if (import_fs6.default.existsSync(file)) {
- const currentSymlink = await import_fs6.default.promises.readlink(file);
+ const file = import_path6.default.join(installDirectory, binName);
+ const symlink = import_path6.default.relative(installDirectory, import_path6.default.join(distFolder, `${binName}.js`));
+ if (import_fs7.default.existsSync(file)) {
+ const currentSymlink = await import_fs7.default.promises.readlink(file);
if (currentSymlink !== symlink) {
- await import_fs6.default.promises.unlink(file);
+ await import_fs7.default.promises.unlink(file);
} else {
return;
}
}
- await import_fs6.default.promises.symlink(symlink, file);
+ await import_fs7.default.promises.symlink(symlink, file);
}
async generateWin32Link(installDirectory, distFolder, binName) {
- const file = import_path5.default.join(installDirectory, binName);
- await (0, import_cmd_shim.default)(import_path5.default.join(distFolder, `${binName}.js`), file, {
+ const file = import_path6.default.join(installDirectory, binName);
+ await (0, import_cmd_shim.default)(import_path6.default.join(distFolder, `${binName}.js`), file, {
createCmdFile: true
});
}
};
// sources/commands/InstallGlobal.ts
-var import_fs9 = __toESM(require("fs"));
-var import_path7 = __toESM(require("path"));
-
-// sources/specUtils.ts
-var import_fs7 = __toESM(require("fs"));
-var import_path6 = __toESM(require("path"));
-var import_semver4 = __toESM(require_semver2());
-var nodeModulesRegExp = /[\\/]node_modules[\\/](@[^\\/]*[\\/])?([^@\\/][^\\/]*)$/;
-function parseSpec(raw, source, { enforceExactVersion = true } = {}) {
- if (typeof raw !== `string`)
- throw new UsageError(`Invalid package manager specification in ${source}; expected a string`);
- const atIndex = raw.indexOf(`@`);
- if (atIndex === -1 || atIndex === raw.length - 1) {
- if (enforceExactVersion)
- throw new UsageError(`No version specified for ${raw} in "packageManager" of ${source}`);
- const name2 = atIndex === -1 ? raw : raw.slice(0, -1);
- if (!isSupportedPackageManager(name2))
- throw new UsageError(`Unsupported package manager specification (${name2})`);
- return {
- name: name2,
- range: `*`
- };
- }
- const name = raw.slice(0, atIndex);
- const range = raw.slice(atIndex + 1);
- const isURL = URL.canParse(range);
- if (!isURL) {
- if (enforceExactVersion && !import_semver4.default.valid(range))
- throw new UsageError(`Invalid package manager specification in ${source} (${raw}); expected a semver version${enforceExactVersion ? `` : `, range, or tag`}`);
- if (!isSupportedPackageManager(name)) {
- throw new UsageError(`Unsupported package manager specification (${raw})`);
- }
- } else if (isSupportedPackageManager(name) && process.env.COREPACK_ENABLE_UNSAFE_CUSTOM_URLS !== `1`) {
- throw new UsageError(`Illegal use of URL for known package manager. Instead, select a specific version, or set COREPACK_ENABLE_UNSAFE_CUSTOM_URLS=1 in your environment (${raw})`);
- }
- return {
- name,
- range
- };
-}
-async function findProjectSpec(initialCwd, locator, { transparent = false } = {}) {
- const fallbackLocator = { name: locator.name, range: `${locator.reference}` };
- if (process.env.COREPACK_ENABLE_PROJECT_SPEC === `0`)
- return fallbackLocator;
- if (process.env.COREPACK_ENABLE_STRICT === `0`)
- transparent = true;
- while (true) {
- const result = await loadSpec(initialCwd);
- switch (result.type) {
- case `NoProject`:
- case `NoSpec`: {
- return fallbackLocator;
- }
- case `Found`: {
- if (result.spec.name !== locator.name) {
- if (transparent) {
- return fallbackLocator;
- } else {
- throw new UsageError(`This project is configured to use ${result.spec.name}`);
- }
- } else {
- return result.spec;
- }
- }
- }
- }
-}
-async function loadSpec(initialCwd) {
- let nextCwd = initialCwd;
- let currCwd = ``;
- let selection = null;
- while (nextCwd !== currCwd && (!selection || !selection.data.packageManager)) {
- currCwd = nextCwd;
- nextCwd = import_path6.default.dirname(currCwd);
- if (nodeModulesRegExp.test(currCwd))
- continue;
- const manifestPath = import_path6.default.join(currCwd, `package.json`);
- let content;
- try {
- content = await import_fs7.default.promises.readFile(manifestPath, `utf8`);
- } catch (err) {
- if (err?.code === `ENOENT`)
- continue;
- throw err;
- }
- let data;
- try {
- data = JSON.parse(content);
- } catch {
- }
- if (typeof data !== `object` || data === null)
- throw new UsageError(`Invalid package.json in ${import_path6.default.relative(initialCwd, manifestPath)}`);
- selection = { data, manifestPath };
- }
- if (selection === null)
- return { type: `NoProject`, target: import_path6.default.join(initialCwd, `package.json`) };
- const rawPmSpec = selection.data.packageManager;
- if (typeof rawPmSpec === `undefined`)
- return { type: `NoSpec`, target: selection.manifestPath };
- return {
- type: `Found`,
- target: selection.manifestPath,
- spec: parseSpec(rawPmSpec, import_path6.default.relative(initialCwd, selection.manifestPath))
- };
-}
-
-// sources/commands/Base.ts
var import_fs8 = __toESM(require("fs"));
-
-// sources/nodeUtils.ts
-var import_os2 = __toESM(require("os"));
-function getEndOfLine(content) {
- const matches = content.match(/\r?\n/g);
- if (matches === null)
- return import_os2.default.EOL;
- const crlf = matches.filter((nl) => nl === `\r
-`).length;
- const lf = matches.length - crlf;
- return crlf > lf ? `\r
-` : `
-`;
-}
-function normalizeLineEndings(originalContent, newContent) {
- return newContent.replace(/\r?\n/g, getEndOfLine(originalContent));
-}
-function getIndent(content) {
- const indentMatch = content.match(/^[ \t]+/m);
- if (indentMatch) {
- return indentMatch[0];
- } else {
- return ` `;
- }
-}
-function stripBOM(content) {
- if (content.charCodeAt(0) === 65279) {
- return content.slice(1);
- } else {
- return content;
- }
-}
-function readPackageJson(content) {
- return {
- data: JSON.parse(stripBOM(content) || `{}`),
- indent: getIndent(content)
- };
-}
+var import_path7 = __toESM(require("path"));
// sources/commands/Base.ts
var BaseCommand = class extends Command {
@@ -23764,15 +23776,10 @@ var BaseCommand = class extends Command {
}
return resolvedSpecs;
}
- async setLocalPackageManager(info) {
- const lookup = await loadSpec(this.context.cwd);
- const content = lookup.type !== `NoProject` ? await import_fs8.default.promises.readFile(lookup.target, `utf8`) : ``;
- const { data, indent } = readPackageJson(content);
- const previousPackageManager = data.packageManager ?? `unknown`;
- data.packageManager = `${info.locator.name}@${info.locator.reference}+${info.hash}`;
- const newContent = normalizeLineEndings(content, `${JSON.stringify(data, null, indent)}
-`);
- await import_fs8.default.promises.writeFile(lookup.target, newContent, `utf8`);
+ async setAndInstallLocalPackageManager(info) {
+ const {
+ previousPackageManager
+ } = await setLocalPackageManager(this.context.cwd, info);
const command = this.context.engine.getPackageManagerSpecFor(info.locator).commands?.use ?? null;
if (command === null)
return 0;
@@ -23866,7 +23873,7 @@ var InstallGlobalCommand = class extends BaseCommand {
if (!isSupportedPackageManager(name))
throw new UsageError(`Unsupported package manager '${name}'`);
this.log({ name, reference });
- await import_fs9.default.promises.mkdir(installFolder, { recursive: true });
+ await import_fs8.default.promises.mkdir(installFolder, { recursive: true });
await tar.x({ file: p, cwd: installFolder }, [`${name}/${reference}`]);
if (!this.cacheOnly) {
await this.context.engine.activatePackageManager({ name, reference });
@@ -24009,7 +24016,7 @@ var UpCommand = class extends BaseCommand {
this.context.stdout.write(`Installing ${highestVersion.name}@${highestVersion.reference} in the project...
`);
const packageManagerInfo = await this.context.engine.ensurePackageManager(highestVersion);
- await this.setLocalPackageManager(packageManagerInfo);
+ await this.setAndInstallLocalPackageManager(packageManagerInfo);
}
};
@@ -24041,7 +24048,7 @@ var UseCommand = class extends BaseCommand {
this.context.stdout.write(`Installing ${resolved.name}@${resolved.reference} in the project...
`);
const packageManagerInfo = await this.context.engine.ensurePackageManager(resolved);
- await this.setLocalPackageManager(packageManagerInfo);
+ await this.setAndInstallLocalPackageManager(packageManagerInfo);
}
};
@@ -24173,22 +24180,15 @@ var PrepareCommand = class extends Command {
}
};
-// sources/miscUtils.ts
-var Cancellation = class extends Error {
- constructor() {
- super(`Cancelled operation`);
- }
-};
-
// sources/main.ts
-function getPackageManagerRequestFromCli(parameter, context) {
+function getPackageManagerRequestFromCli(parameter, engine) {
if (!parameter)
return null;
const match = parameter.match(/^([^@]*)(?:@(.*))?$/);
if (!match)
return null;
const [, binaryName, binaryVersion] = match;
- const packageManager = context.engine.getPackageManagerFor(binaryName);
+ const packageManager = engine.getPackageManagerFor(binaryName);
if (packageManager == null && binaryVersion == null)
return null;
return {
@@ -24197,54 +24197,10 @@ function getPackageManagerRequestFromCli(parameter, context) {
binaryVersion: binaryVersion || null
};
}
-async function executePackageManagerRequest({ packageManager, binaryName, binaryVersion }, args, context) {
- let fallbackLocator = {
- name: binaryName,
- reference: void 0
- };
- let isTransparentCommand = false;
- if (packageManager != null) {
- const defaultVersion = await context.engine.getDefaultVersion(packageManager);
- const definition = context.engine.config.definitions[packageManager];
- for (const transparentPath of definition.transparent.commands) {
- if (transparentPath[0] === binaryName && transparentPath.slice(1).every((segment, index) => segment === args[index])) {
- isTransparentCommand = true;
- break;
- }
- }
- const fallbackReference = isTransparentCommand ? definition.transparent.default ?? defaultVersion : defaultVersion;
- fallbackLocator = {
- name: packageManager,
- reference: fallbackReference
- };
- }
- let descriptor;
- try {
- descriptor = await findProjectSpec(context.cwd, fallbackLocator, { transparent: isTransparentCommand });
- } catch (err) {
- if (err instanceof Cancellation) {
- return 1;
- } else {
- throw err;
- }
- }
- if (binaryVersion)
- descriptor.range = binaryVersion;
- const resolved = await context.engine.resolveDescriptor(descriptor, { allowTags: true });
- if (resolved === null)
- throw new UsageError(`Failed to successfully resolve '${descriptor.range}' to a valid ${descriptor.name} release`);
- const installSpec = await context.engine.ensurePackageManager(resolved);
- return await runVersion(resolved, installSpec, binaryName, args);
-}
async function runMain(argv) {
- const context = {
- ...Cli.defaultContext,
- cwd: process.cwd(),
- engine: new Engine()
- };
+ const engine = new Engine();
const [firstArg, ...restArgs] = argv;
- const request = getPackageManagerRequestFromCli(firstArg, context);
- let code;
+ const request = getPackageManagerRequestFromCli(firstArg, engine);
if (!request) {
const cli = new Cli({
binaryLabel: `Corepack`,
@@ -24263,23 +24219,20 @@ async function runMain(argv) {
cli.register(UseCommand);
cli.register(HydrateCommand);
cli.register(PrepareCommand);
- code = await cli.run(argv, context);
+ const context = {
+ ...Cli.defaultContext,
+ cwd: process.cwd(),
+ engine
+ };
+ const code = await cli.run(argv, context);
+ if (code !== 0) {
+ process.exitCode ??= code;
+ }
} else {
- const cli = new Cli({
- binaryLabel: `'${request.binaryName}', via Corepack`,
- binaryName: request.binaryName,
- binaryVersion: `corepack/${version}`
- });
- cli.register(class BinaryCommand extends Command {
- proxy = options_exports.Proxy();
- async execute() {
- return executePackageManagerRequest(request, this.proxy, this.context);
- }
+ await engine.executePackageManagerRequest(request, {
+ cwd: process.cwd(),
+ args: restArgs
});
- code = await cli.run(restArgs, context);
- }
- if (code !== 0) {
- process.exitCode ??= code;
}
}
// Annotate the CommonJS export names for ESM import in node:
@@ -24288,7 +24241,7 @@ async function runMain(argv) {
});
/*! Bundled license information:
-undici/lib/fetch/body.js:
+undici/lib/web/fetch/body.js:
(*! formdata-polyfill. MIT License. Jimmy Wärting *)
is-windows/index.js:
diff --git a/deps/corepack/package.json b/deps/corepack/package.json
index 391eb749c82d65..5ca045e37041e0 100644
--- a/deps/corepack/package.json
+++ b/deps/corepack/package.json
@@ -1,6 +1,6 @@
{
"name": "corepack",
- "version": "0.25.2",
+ "version": "0.28.0",
"homepage": "https://github.com/nodejs/corepack#readme",
"bugs": {
"url": "https://github.com/nodejs/corepack/issues"
@@ -16,7 +16,7 @@
"./package.json": "./package.json"
},
"license": "MIT",
- "packageManager": "yarn@4.1.0+sha224.bc24d7f5afc738464f3d4e95f4e6e7829a35cee54a0fd527ea5baa83",
+ "packageManager": "yarn@4.1.1+sha224.00f08619463229f8ba40c4ee90e8c2e4ced1f11c3115c26f3b98432e",
"devDependencies": {
"@babel/core": "^7.14.3",
"@babel/plugin-transform-modules-commonjs": "^7.14.0",
@@ -35,6 +35,7 @@
"@yarnpkg/fslib": "^3.0.0-rc.48",
"@zkochan/cmd-shim": "^6.0.0",
"babel-plugin-dynamic-import-node": "^2.3.3",
+ "better-sqlite3": "^9.4.1",
"clipanion": "^3.0.1",
"debug": "^4.1.1",
"esbuild": "0.19.5",
@@ -44,13 +45,16 @@
"proxy-from-env": "^1.1.0",
"semver": "^7.5.2",
"supports-color": "^9.0.0",
- "tar": "^6.0.1",
+ "tar": "^6.2.1",
"ts-node": "^10.0.0",
- "typescript": "^5.0.4",
+ "typescript": "^5.3.3",
"undici": "^6.6.1",
"v8-compile-cache": "^2.3.0",
"which": "^4.0.0"
},
+ "resolutions": {
+ "undici-types": "6.x"
+ },
"scripts": {
"build": "rm -rf dist shims && run build:bundle && ts-node ./mkshims.ts",
"build:bundle": "esbuild ./sources/_lib.ts --bundle --platform=node --target=node18.17.0 --external:corepack --outfile='./dist/lib/corepack.cjs' --resolve-extensions='.ts,.mjs,.js'",
diff --git a/deps/nghttp2/lib/CMakeLists.txt b/deps/nghttp2/lib/CMakeLists.txt
index 7adba3a3ffa2da..fda8dcb7fc7f2a 100644
--- a/deps/nghttp2/lib/CMakeLists.txt
+++ b/deps/nghttp2/lib/CMakeLists.txt
@@ -14,7 +14,7 @@ set(NGHTTP2_SOURCES
nghttp2_stream.c nghttp2_outbound_item.c
nghttp2_session.c nghttp2_submit.c
nghttp2_helper.c
- nghttp2_npn.c
+ nghttp2_alpn.c
nghttp2_hd.c nghttp2_hd_huffman.c nghttp2_hd_huffman_data.c
nghttp2_version.c
nghttp2_priority_spec.c
@@ -31,6 +31,12 @@ set(NGHTTP2_SOURCES
)
set(NGHTTP2_RES "")
+set(STATIC_LIB "nghttp2_static")
+set(SHARED_LIB "nghttp2")
+
+if(BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS AND MSVC AND NOT STATIC_LIB_SUFFIX)
+ set(STATIC_LIB_SUFFIX "_static")
+endif()
if(WIN32)
configure_file(
@@ -41,40 +47,61 @@ if(WIN32)
set(NGHTTP2_RES ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
endif()
+set(EXPORT_SET "${PROJECT_NAME}-targets")
+
# Public shared library
-if(ENABLE_SHARED_LIB)
- add_library(nghttp2 SHARED ${NGHTTP2_SOURCES} ${NGHTTP2_RES})
- set_target_properties(nghttp2 PROPERTIES
+if(BUILD_SHARED_LIBS)
+ add_library(${SHARED_LIB} SHARED ${NGHTTP2_SOURCES} ${NGHTTP2_RES})
+
+ set_target_properties(${SHARED_LIB} PROPERTIES
COMPILE_FLAGS "${WARNCFLAGS}"
VERSION ${LT_VERSION} SOVERSION ${LT_SOVERSION}
C_VISIBILITY_PRESET hidden
)
- target_include_directories(nghttp2 INTERFACE
- "${CMAKE_CURRENT_BINARY_DIR}/includes"
- "${CMAKE_CURRENT_SOURCE_DIR}/includes"
+
+ target_include_directories(${SHARED_LIB} INTERFACE
+ $
+ $
+ $
)
- install(TARGETS nghttp2
- ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
- LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
- RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
+ install(TARGETS ${SHARED_LIB} EXPORT ${EXPORT_SET})
+ list(APPEND nghttp2_exports ${SHARED_LIB})
endif()
-if(HAVE_CUNIT OR ENABLE_STATIC_LIB)
- # Static library (for unittests because of symbol visibility)
- add_library(nghttp2_static STATIC ${NGHTTP2_SOURCES})
- set_target_properties(nghttp2_static PROPERTIES
+# Static library (for unittests because of symbol visibility)
+if(BUILD_STATIC_LIBS)
+ add_library(${STATIC_LIB} STATIC ${NGHTTP2_SOURCES})
+
+ set_target_properties(${STATIC_LIB} PROPERTIES
COMPILE_FLAGS "${WARNCFLAGS}"
VERSION ${LT_VERSION} SOVERSION ${LT_SOVERSION}
ARCHIVE_OUTPUT_NAME nghttp2${STATIC_LIB_SUFFIX}
)
- target_compile_definitions(nghttp2_static PUBLIC "-DNGHTTP2_STATICLIB")
- if(ENABLE_STATIC_LIB)
- install(TARGETS nghttp2_static
- DESTINATION "${CMAKE_INSTALL_LIBDIR}")
- endif()
+
+ target_include_directories(${STATIC_LIB} INTERFACE
+ $
+ $
+ $
+ )
+
+ target_compile_definitions(${STATIC_LIB} PUBLIC "-DNGHTTP2_STATICLIB")
+
+ install(TARGETS ${STATIC_LIB} EXPORT ${EXPORT_SET})
+ list(APPEND nghttp2_exports ${STATIC_LIB})
endif()
+if(BUILD_SHARED_LIBS)
+ set(LIB_SELECTED ${SHARED_LIB})
+else()
+ set(LIB_SELECTED ${STATIC_LIB})
+endif()
+
+add_library(${PROJECT_NAME}::nghttp2 ALIAS ${LIB_SELECTED})
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libnghttp2.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+
+install(EXPORT ${EXPORT_SET}
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
+ NAMESPACE ${PROJECT_NAME}::)
diff --git a/deps/nghttp2/lib/Makefile.am b/deps/nghttp2/lib/Makefile.am
index c3ace4029a69b8..1168c1e6135661 100644
--- a/deps/nghttp2/lib/Makefile.am
+++ b/deps/nghttp2/lib/Makefile.am
@@ -41,7 +41,7 @@ OBJECTS = nghttp2_pq.c nghttp2_map.c nghttp2_queue.c \
nghttp2_stream.c nghttp2_outbound_item.c \
nghttp2_session.c nghttp2_submit.c \
nghttp2_helper.c \
- nghttp2_npn.c \
+ nghttp2_alpn.c \
nghttp2_hd.c nghttp2_hd_huffman.c nghttp2_hd_huffman_data.c \
nghttp2_version.c \
nghttp2_priority_spec.c \
@@ -60,7 +60,7 @@ HFILES = nghttp2_pq.h nghttp2_int.h nghttp2_map.h nghttp2_queue.h \
nghttp2_frame.h \
nghttp2_buf.h \
nghttp2_session.h nghttp2_helper.h nghttp2_stream.h nghttp2_int.h \
- nghttp2_npn.h \
+ nghttp2_alpn.h \
nghttp2_submit.h nghttp2_outbound_item.h \
nghttp2_net.h \
nghttp2_hd.h nghttp2_hd_huffman.h \
diff --git a/deps/nghttp2/lib/Makefile.in b/deps/nghttp2/lib/Makefile.in
index 0b95613bc21808..a5653128884f26 100644
--- a/deps/nghttp2/lib/Makefile.in
+++ b/deps/nghttp2/lib/Makefile.in
@@ -153,7 +153,7 @@ am__objects_1 =
am__objects_2 = nghttp2_pq.lo nghttp2_map.lo nghttp2_queue.lo \
nghttp2_frame.lo nghttp2_buf.lo nghttp2_stream.lo \
nghttp2_outbound_item.lo nghttp2_session.lo nghttp2_submit.lo \
- nghttp2_helper.lo nghttp2_npn.lo nghttp2_hd.lo \
+ nghttp2_helper.lo nghttp2_alpn.lo nghttp2_hd.lo \
nghttp2_hd_huffman.lo nghttp2_hd_huffman_data.lo \
nghttp2_version.lo nghttp2_priority_spec.lo nghttp2_option.lo \
nghttp2_callbacks.lo nghttp2_mem.lo nghttp2_http.lo \
@@ -183,15 +183,15 @@ am__v_at_1 =
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = ./$(DEPDIR)/nghttp2_buf.Plo \
- ./$(DEPDIR)/nghttp2_callbacks.Plo \
+am__depfiles_remade = ./$(DEPDIR)/nghttp2_alpn.Plo \
+ ./$(DEPDIR)/nghttp2_buf.Plo ./$(DEPDIR)/nghttp2_callbacks.Plo \
./$(DEPDIR)/nghttp2_debug.Plo ./$(DEPDIR)/nghttp2_extpri.Plo \
./$(DEPDIR)/nghttp2_frame.Plo ./$(DEPDIR)/nghttp2_hd.Plo \
./$(DEPDIR)/nghttp2_hd_huffman.Plo \
./$(DEPDIR)/nghttp2_hd_huffman_data.Plo \
./$(DEPDIR)/nghttp2_helper.Plo ./$(DEPDIR)/nghttp2_http.Plo \
./$(DEPDIR)/nghttp2_map.Plo ./$(DEPDIR)/nghttp2_mem.Plo \
- ./$(DEPDIR)/nghttp2_npn.Plo ./$(DEPDIR)/nghttp2_option.Plo \
+ ./$(DEPDIR)/nghttp2_option.Plo \
./$(DEPDIR)/nghttp2_outbound_item.Plo \
./$(DEPDIR)/nghttp2_pq.Plo \
./$(DEPDIR)/nghttp2_priority_spec.Plo \
@@ -306,8 +306,6 @@ CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSCOPE = @CSCOPE@
CTAGS = @CTAGS@
-CUNIT_CFLAGS = @CUNIT_CFLAGS@
-CUNIT_LIBS = @CUNIT_LIBS@
CXX = @CXX@
CXX1XCXXFLAGS = @CXX1XCXXFLAGS@
CXXCPP = @CXXCPP@
@@ -329,7 +327,6 @@ EXTRABPFCFLAGS = @EXTRABPFCFLAGS@
EXTRACFLAG = @EXTRACFLAG@
EXTRA_DEFS = @EXTRA_DEFS@
FGREP = @FGREP@
-FILECMD = @FILECMD@
GREP = @GREP@
HAVE_CXX14 = @HAVE_CXX14@
INSTALL = @INSTALL@
@@ -345,6 +342,10 @@ LD = @LD@
LDFLAGS = @LDFLAGS@
LIBBPF_CFLAGS = @LIBBPF_CFLAGS@
LIBBPF_LIBS = @LIBBPF_LIBS@
+LIBBROTLIDEC_CFLAGS = @LIBBROTLIDEC_CFLAGS@
+LIBBROTLIDEC_LIBS = @LIBBROTLIDEC_LIBS@
+LIBBROTLIENC_CFLAGS = @LIBBROTLIENC_CFLAGS@
+LIBBROTLIENC_LIBS = @LIBBROTLIENC_LIBS@
LIBCARES_CFLAGS = @LIBCARES_CFLAGS@
LIBCARES_LIBS = @LIBCARES_LIBS@
LIBEVENT_OPENSSL_CFLAGS = @LIBEVENT_OPENSSL_CFLAGS@
@@ -502,7 +503,7 @@ OBJECTS = nghttp2_pq.c nghttp2_map.c nghttp2_queue.c \
nghttp2_stream.c nghttp2_outbound_item.c \
nghttp2_session.c nghttp2_submit.c \
nghttp2_helper.c \
- nghttp2_npn.c \
+ nghttp2_alpn.c \
nghttp2_hd.c nghttp2_hd_huffman.c nghttp2_hd_huffman_data.c \
nghttp2_version.c \
nghttp2_priority_spec.c \
@@ -521,7 +522,7 @@ HFILES = nghttp2_pq.h nghttp2_int.h nghttp2_map.h nghttp2_queue.h \
nghttp2_frame.h \
nghttp2_buf.h \
nghttp2_session.h nghttp2_helper.h nghttp2_stream.h nghttp2_int.h \
- nghttp2_npn.h \
+ nghttp2_alpn.h \
nghttp2_submit.h nghttp2_outbound_item.h \
nghttp2_net.h \
nghttp2_hd.h nghttp2_hd_huffman.h \
@@ -621,6 +622,7 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_alpn.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_buf.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_callbacks.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_debug.Plo@am__quote@ # am--include-marker
@@ -633,7 +635,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_http.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_map.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_mem.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_npn.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_option.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_outbound_item.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nghttp2_pq.Plo@am__quote@ # am--include-marker
@@ -906,7 +907,8 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
mostlyclean-am
distclean: distclean-recursive
- -rm -f ./$(DEPDIR)/nghttp2_buf.Plo
+ -rm -f ./$(DEPDIR)/nghttp2_alpn.Plo
+ -rm -f ./$(DEPDIR)/nghttp2_buf.Plo
-rm -f ./$(DEPDIR)/nghttp2_callbacks.Plo
-rm -f ./$(DEPDIR)/nghttp2_debug.Plo
-rm -f ./$(DEPDIR)/nghttp2_extpri.Plo
@@ -918,7 +920,6 @@ distclean: distclean-recursive
-rm -f ./$(DEPDIR)/nghttp2_http.Plo
-rm -f ./$(DEPDIR)/nghttp2_map.Plo
-rm -f ./$(DEPDIR)/nghttp2_mem.Plo
- -rm -f ./$(DEPDIR)/nghttp2_npn.Plo
-rm -f ./$(DEPDIR)/nghttp2_option.Plo
-rm -f ./$(DEPDIR)/nghttp2_outbound_item.Plo
-rm -f ./$(DEPDIR)/nghttp2_pq.Plo
@@ -977,7 +978,8 @@ install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-recursive
- -rm -f ./$(DEPDIR)/nghttp2_buf.Plo
+ -rm -f ./$(DEPDIR)/nghttp2_alpn.Plo
+ -rm -f ./$(DEPDIR)/nghttp2_buf.Plo
-rm -f ./$(DEPDIR)/nghttp2_callbacks.Plo
-rm -f ./$(DEPDIR)/nghttp2_debug.Plo
-rm -f ./$(DEPDIR)/nghttp2_extpri.Plo
@@ -989,7 +991,6 @@ maintainer-clean: maintainer-clean-recursive
-rm -f ./$(DEPDIR)/nghttp2_http.Plo
-rm -f ./$(DEPDIR)/nghttp2_map.Plo
-rm -f ./$(DEPDIR)/nghttp2_mem.Plo
- -rm -f ./$(DEPDIR)/nghttp2_npn.Plo
-rm -f ./$(DEPDIR)/nghttp2_option.Plo
-rm -f ./$(DEPDIR)/nghttp2_outbound_item.Plo
-rm -f ./$(DEPDIR)/nghttp2_pq.Plo
diff --git a/deps/nghttp2/lib/Makefile.msvc b/deps/nghttp2/lib/Makefile.msvc
index 611b39d0b1d95e..752389e0fc485a 100644
--- a/deps/nghttp2/lib/Makefile.msvc
+++ b/deps/nghttp2/lib/Makefile.msvc
@@ -74,7 +74,7 @@ NGHTTP2_SRC := nghttp2_pq.c \
nghttp2_session.c \
nghttp2_submit.c \
nghttp2_helper.c \
- nghttp2_npn.c \
+ nghttp2_alpn.c \
nghttp2_hd.c \
nghttp2_hd_huffman.c \
nghttp2_hd_huffman_data.c \
diff --git a/deps/nghttp2/lib/includes/Makefile.in b/deps/nghttp2/lib/includes/Makefile.in
index 3de90d7bef3e3a..47f46764652434 100644
--- a/deps/nghttp2/lib/includes/Makefile.in
+++ b/deps/nghttp2/lib/includes/Makefile.in
@@ -211,8 +211,6 @@ CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSCOPE = @CSCOPE@
CTAGS = @CTAGS@
-CUNIT_CFLAGS = @CUNIT_CFLAGS@
-CUNIT_LIBS = @CUNIT_LIBS@
CXX = @CXX@
CXX1XCXXFLAGS = @CXX1XCXXFLAGS@
CXXCPP = @CXXCPP@
@@ -234,7 +232,6 @@ EXTRABPFCFLAGS = @EXTRABPFCFLAGS@
EXTRACFLAG = @EXTRACFLAG@
EXTRA_DEFS = @EXTRA_DEFS@
FGREP = @FGREP@
-FILECMD = @FILECMD@
GREP = @GREP@
HAVE_CXX14 = @HAVE_CXX14@
INSTALL = @INSTALL@
@@ -250,6 +247,10 @@ LD = @LD@
LDFLAGS = @LDFLAGS@
LIBBPF_CFLAGS = @LIBBPF_CFLAGS@
LIBBPF_LIBS = @LIBBPF_LIBS@
+LIBBROTLIDEC_CFLAGS = @LIBBROTLIDEC_CFLAGS@
+LIBBROTLIDEC_LIBS = @LIBBROTLIDEC_LIBS@
+LIBBROTLIENC_CFLAGS = @LIBBROTLIENC_CFLAGS@
+LIBBROTLIENC_LIBS = @LIBBROTLIENC_LIBS@
LIBCARES_CFLAGS = @LIBCARES_CFLAGS@
LIBCARES_LIBS = @LIBCARES_LIBS@
LIBEVENT_OPENSSL_CFLAGS = @LIBEVENT_OPENSSL_CFLAGS@
diff --git a/deps/nghttp2/lib/includes/nghttp2/nghttp2.h b/deps/nghttp2/lib/includes/nghttp2/nghttp2.h
index fa22081c517497..92c3ccc6e4855a 100644
--- a/deps/nghttp2/lib/includes/nghttp2/nghttp2.h
+++ b/deps/nghttp2/lib/includes/nghttp2/nghttp2.h
@@ -51,6 +51,7 @@ extern "C" {
#endif /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */
#include
#include
+#include
#include
@@ -71,6 +72,13 @@ extern "C" {
# endif /* !BUILDING_NGHTTP2 */
#endif /* !defined(WIN32) */
+/**
+ * @typedef
+ *
+ * :type:`nghttp2_ssize` is a signed counterpart of size_t.
+ */
+typedef ptrdiff_t nghttp2_ssize;
+
/**
* @macro
*
@@ -168,6 +176,12 @@ typedef struct {
/**
* @macro
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme.
+ *
* The default weight of stream dependency.
*/
#define NGHTTP2_DEFAULT_WEIGHT 16
@@ -175,6 +189,12 @@ typedef struct {
/**
* @macro
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme.
+ *
* The maximum weight of stream dependency.
*/
#define NGHTTP2_MAX_WEIGHT 256
@@ -182,6 +202,12 @@ typedef struct {
/**
* @macro
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme.
+ *
* The minimum weight of stream dependency.
*/
#define NGHTTP2_MIN_WEIGHT 1
@@ -255,7 +281,7 @@ typedef enum {
*/
NGHTTP2_ERR_UNSUPPORTED_VERSION = -503,
/**
- * Used as a return value from :type:`nghttp2_send_callback`,
+ * Used as a return value from :type:`nghttp2_send_callback2`,
* :type:`nghttp2_recv_callback` and
* :type:`nghttp2_send_data_callback` to indicate that the operation
* would block.
@@ -275,9 +301,9 @@ typedef enum {
NGHTTP2_ERR_EOF = -507,
/**
* Used as a return value from
- * :func:`nghttp2_data_source_read_callback` to indicate that data
+ * :func:`nghttp2_data_source_read_callback2` to indicate that data
* transfer is postponed. See
- * :func:`nghttp2_data_source_read_callback` for details.
+ * :func:`nghttp2_data_source_read_callback2` for details.
*/
NGHTTP2_ERR_DEFERRED = -508,
/**
@@ -440,7 +466,12 @@ typedef enum {
* exhaustion on server side to send these frames forever and does
* not read network.
*/
- NGHTTP2_ERR_FLOODED = -904
+ NGHTTP2_ERR_FLOODED = -904,
+ /**
+ * When a local endpoint receives too many CONTINUATION frames
+ * following a HEADER frame.
+ */
+ NGHTTP2_ERR_TOO_MANY_CONTINUATIONS = -905,
} nghttp2_error;
/**
@@ -830,7 +861,7 @@ typedef struct {
* @union
*
* This union represents the some kind of data source passed to
- * :type:`nghttp2_data_source_read_callback`.
+ * :type:`nghttp2_data_source_read_callback2`.
*/
typedef union {
/**
@@ -847,7 +878,7 @@ typedef union {
* @enum
*
* The flags used to set in |data_flags| output parameter in
- * :type:`nghttp2_data_source_read_callback`.
+ * :type:`nghttp2_data_source_read_callback2`.
*/
typedef enum {
/**
@@ -861,8 +892,8 @@ typedef enum {
/**
* Indicates that END_STREAM flag must not be set even if
* NGHTTP2_DATA_FLAG_EOF is set. Usually this flag is used to send
- * trailer fields with `nghttp2_submit_request()` or
- * `nghttp2_submit_response()`.
+ * trailer fields with `nghttp2_submit_request2()` or
+ * `nghttp2_submit_response2()`.
*/
NGHTTP2_DATA_FLAG_NO_END_STREAM = 0x02,
/**
@@ -872,9 +903,15 @@ typedef enum {
NGHTTP2_DATA_FLAG_NO_COPY = 0x04
} nghttp2_data_flag;
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @functypedef
*
+ * .. warning::
+ *
+ * Deprecated. Use :type:`nghttp2_data_source_read_callback2`
+ * instead.
+ *
* Callback function invoked when the library wants to read data from
* the |source|. The read data is sent in the stream |stream_id|.
* The implementation of this function must read at most |length|
@@ -939,9 +976,83 @@ typedef ssize_t (*nghttp2_data_source_read_callback)(
nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length,
uint32_t *data_flags, nghttp2_data_source *source, void *user_data);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @functypedef
+ *
+ * Callback function invoked when the library wants to read data from
+ * the |source|. The read data is sent in the stream |stream_id|.
+ * The implementation of this function must read at most |length|
+ * bytes of data from |source| (or possibly other places) and store
+ * them in |buf| and return number of data stored in |buf|. If EOF is
+ * reached, set :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF` flag
+ * in |*data_flags|.
+ *
+ * Sometime it is desirable to avoid copying data into |buf| and let
+ * application to send data directly. To achieve this, set
+ * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_COPY` to
+ * |*data_flags| (and possibly other flags, just like when we do
+ * copy), and return the number of bytes to send without copying data
+ * into |buf|. The library, seeing
+ * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_COPY`, will invoke
+ * :type:`nghttp2_send_data_callback`. The application must send
+ * complete DATA frame in that callback.
+ *
+ * If this callback is set by `nghttp2_submit_request2()`,
+ * `nghttp2_submit_response2()` or `nghttp2_submit_headers()` and
+ * `nghttp2_submit_data2()` with flag parameter
+ * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM` set, and
+ * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF` flag is set to
+ * |*data_flags|, DATA frame will have END_STREAM flag set. Usually,
+ * this is expected behaviour and all are fine. One exception is send
+ * trailer fields. You cannot send trailer fields after sending frame
+ * with END_STREAM set. To avoid this problem, one can set
+ * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_END_STREAM` along
+ * with :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF` to signal the
+ * library not to set END_STREAM in DATA frame. Then application can
+ * use `nghttp2_submit_trailer()` to send trailer fields.
+ * `nghttp2_submit_trailer()` can be called inside this callback.
+ *
+ * If the application wants to postpone DATA frames (e.g.,
+ * asynchronous I/O, or reading data blocks for long time), it is
+ * achieved by returning :enum:`nghttp2_error.NGHTTP2_ERR_DEFERRED`
+ * without reading any data in this invocation. The library removes
+ * DATA frame from the outgoing queue temporarily. To move back
+ * deferred DATA frame to outgoing queue, call
+ * `nghttp2_session_resume_data()`.
+ *
+ * By default, |length| is limited to 16KiB at maximum. If peer
+ * allows larger frames, application can enlarge transmission buffer
+ * size. See :type:`nghttp2_data_source_read_length_callback` for
+ * more details.
+ *
+ * If the application just wants to return from
+ * `nghttp2_session_send()` or `nghttp2_session_mem_send2()` without
+ * sending anything, return :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE`.
+ *
+ * In case of error, there are 2 choices. Returning
+ * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE` will
+ * close the stream by issuing RST_STREAM with
+ * :enum:`nghttp2_error_code.NGHTTP2_INTERNAL_ERROR`. If a different
+ * error code is desirable, use `nghttp2_submit_rst_stream()` with a
+ * desired error code and then return
+ * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`.
+ * Returning :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` will
+ * signal the entire session failure.
+ */
+typedef nghttp2_ssize (*nghttp2_data_source_read_callback2)(
+ nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length,
+ uint32_t *data_flags, nghttp2_data_source *source, void *user_data);
+
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @struct
*
+ * .. warning::
+ *
+ * Deprecated. Use :type:`nghttp2_data_provider2` instead.
+ *
* This struct represents the data source and the way to read a chunk
* of data from it.
*/
@@ -956,6 +1067,25 @@ typedef struct {
nghttp2_data_source_read_callback read_callback;
} nghttp2_data_provider;
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @struct
+ *
+ * This struct represents the data source and the way to read a chunk
+ * of data from it.
+ */
+typedef struct {
+ /**
+ * The data source.
+ */
+ nghttp2_data_source source;
+ /**
+ * The callback function to read a chunk of data from the |source|.
+ */
+ nghttp2_data_source_read_callback2 read_callback;
+} nghttp2_data_provider2;
+
/**
* @struct
*
@@ -1008,6 +1138,12 @@ typedef enum {
/**
* @struct
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme.
+ *
* The structure to specify stream dependency.
*/
typedef struct {
@@ -1042,6 +1178,12 @@ typedef struct {
*/
size_t padlen;
/**
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme.
+ *
* The priority specification
*/
nghttp2_priority_spec pri_spec;
@@ -1062,6 +1204,12 @@ typedef struct {
/**
* @struct
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme.
+ *
* The PRIORITY frame. It has the following members:
*/
typedef struct {
@@ -1305,9 +1453,14 @@ typedef union {
nghttp2_extension ext;
} nghttp2_frame;
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @functypedef
*
+ * .. warning::
+ *
+ * Deprecated. Use :type:`nghttp2_send_callback2` instead.
+ *
* Callback function invoked when |session| wants to send data to the
* remote peer. The implementation of this function must send at most
* |length| bytes of data stored in |data|. The |flags| is currently
@@ -1340,6 +1493,44 @@ typedef ssize_t (*nghttp2_send_callback)(nghttp2_session *session,
const uint8_t *data, size_t length,
int flags, void *user_data);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @functypedef
+ *
+ * Callback function invoked when |session| wants to send data to the
+ * remote peer. The implementation of this function must send at most
+ * |length| bytes of data stored in |data|. The |flags| is currently
+ * not used and always 0. It must return the number of bytes sent if
+ * it succeeds. If it cannot send any single byte without blocking,
+ * it must return :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`. For
+ * other errors, it must return
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. The
+ * |user_data| pointer is the third argument passed in to the call to
+ * `nghttp2_session_client_new()` or `nghttp2_session_server_new()`.
+ *
+ * This callback is required if the application uses
+ * `nghttp2_session_send()` to send data to the remote endpoint. If
+ * the application uses solely `nghttp2_session_mem_send2()` instead,
+ * this callback function is unnecessary.
+ *
+ * To set this callback to :type:`nghttp2_session_callbacks`, use
+ * `nghttp2_session_callbacks_set_send_callback2()`.
+ *
+ * .. note::
+ *
+ * The |length| may be very small. If that is the case, and
+ * application disables Nagle algorithm (``TCP_NODELAY``), then just
+ * writing |data| to the network stack leads to very small packet,
+ * and it is very inefficient. An application should be responsible
+ * to buffer up small chunks of data as necessary to avoid this
+ * situation.
+ */
+typedef nghttp2_ssize (*nghttp2_send_callback2)(nghttp2_session *session,
+ const uint8_t *data,
+ size_t length, int flags,
+ void *user_data);
+
/**
* @functypedef
*
@@ -1370,7 +1561,7 @@ typedef ssize_t (*nghttp2_send_callback)(nghttp2_session *session,
* error; if partial frame data has already sent, it is impossible to
* send another data in that state, and all we can do is tear down
* connection). When data is fully processed, but application wants
- * to make `nghttp2_session_mem_send()` or `nghttp2_session_send()`
+ * to make `nghttp2_session_mem_send2()` or `nghttp2_session_send()`
* return immediately without processing next frames, return
* :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE`. If application decided to
* reset this stream, return
@@ -1387,9 +1578,14 @@ typedef int (*nghttp2_send_data_callback)(nghttp2_session *session,
nghttp2_data_source *source,
void *user_data);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @functypedef
*
+ * .. warning::
+ *
+ * Deprecated. Use :type:`nghttp2_recv_callback2` instead.
+ *
* Callback function invoked when |session| wants to receive data from
* the remote peer. The implementation of this function must read at
* most |length| bytes of data and store it in |buf|. The |flags| is
@@ -1417,11 +1613,43 @@ typedef ssize_t (*nghttp2_recv_callback)(nghttp2_session *session, uint8_t *buf,
size_t length, int flags,
void *user_data);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @functypedef
+ *
+ * Callback function invoked when |session| wants to receive data from
+ * the remote peer. The implementation of this function must read at
+ * most |length| bytes of data and store it in |buf|. The |flags| is
+ * currently not used and always 0. It must return the number of
+ * bytes written in |buf| if it succeeds. If it cannot read any
+ * single byte without blocking, it must return
+ * :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`. If it gets EOF
+ * before it reads any single byte, it must return
+ * :enum:`nghttp2_error.NGHTTP2_ERR_EOF`. For other errors, it must
+ * return :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
+ * Returning 0 is treated as
+ * :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`. The |user_data|
+ * pointer is the third argument passed in to the call to
+ * `nghttp2_session_client_new()` or `nghttp2_session_server_new()`.
+ *
+ * This callback is required if the application uses
+ * `nghttp2_session_recv()` to receive data from the remote endpoint.
+ * If the application uses solely `nghttp2_session_mem_recv2()`
+ * instead, this callback function is unnecessary.
+ *
+ * To set this callback to :type:`nghttp2_session_callbacks`, use
+ * `nghttp2_session_callbacks_set_recv_callback2()`.
+ */
+typedef nghttp2_ssize (*nghttp2_recv_callback2)(nghttp2_session *session,
+ uint8_t *buf, size_t length,
+ int flags, void *user_data);
+
/**
* @functypedef
*
* Callback function invoked by `nghttp2_session_recv()` and
- * `nghttp2_session_mem_recv()` when a frame is received. The
+ * `nghttp2_session_mem_recv2()` when a frame is received. The
* |user_data| pointer is the third argument passed in to the call to
* `nghttp2_session_client_new()` or `nghttp2_session_server_new()`.
*
@@ -1439,8 +1667,8 @@ typedef ssize_t (*nghttp2_recv_callback)(nghttp2_session *session, uint8_t *buf,
*
* The implementation of this function must return 0 if it succeeds.
* If nonzero value is returned, it is treated as fatal error and
- * `nghttp2_session_recv()` and `nghttp2_session_mem_recv()` functions
- * immediately return
+ * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()`
+ * functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
*
* To set this callback to :type:`nghttp2_session_callbacks`, use
@@ -1454,7 +1682,7 @@ typedef int (*nghttp2_on_frame_recv_callback)(nghttp2_session *session,
* @functypedef
*
* Callback function invoked by `nghttp2_session_recv()` and
- * `nghttp2_session_mem_recv()` when an invalid non-DATA frame is
+ * `nghttp2_session_mem_recv2()` when an invalid non-DATA frame is
* received. The error is indicated by the |lib_error_code|, which is
* one of the values defined in :type:`nghttp2_error`. When this
* callback function is invoked, the library automatically submits
@@ -1468,8 +1696,8 @@ typedef int (*nghttp2_on_frame_recv_callback)(nghttp2_session *session,
*
* The implementation of this function must return 0 if it succeeds.
* If nonzero is returned, it is treated as fatal error and
- * `nghttp2_session_recv()` and `nghttp2_session_mem_recv()` functions
- * immediately return
+ * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()`
+ * functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
*
* To set this callback to :type:`nghttp2_session_callbacks`, use
@@ -1492,19 +1720,19 @@ typedef int (*nghttp2_on_invalid_frame_recv_callback)(
* argument passed in to the call to `nghttp2_session_client_new()` or
* `nghttp2_session_server_new()`.
*
- * If the application uses `nghttp2_session_mem_recv()`, it can return
- * :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` to make
- * `nghttp2_session_mem_recv()` return without processing further
+ * If the application uses `nghttp2_session_mem_recv2()`, it can
+ * return :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` to make
+ * `nghttp2_session_mem_recv2()` return without processing further
* input bytes. The memory by pointed by the |data| is retained until
- * `nghttp2_session_mem_recv()` or `nghttp2_session_recv()` is called.
- * The application must retain the input bytes which was used to
- * produce the |data| parameter, because it may refer to the memory
+ * `nghttp2_session_mem_recv2()` or `nghttp2_session_recv()` is
+ * called. The application must retain the input bytes which was used
+ * to produce the |data| parameter, because it may refer to the memory
* region included in the input bytes.
*
* The implementation of this function must return 0 if it succeeds.
* If nonzero is returned, it is treated as fatal error, and
- * `nghttp2_session_recv()` and `nghttp2_session_mem_recv()` functions
- * immediately return
+ * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()`
+ * functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
*
* To set this callback to :type:`nghttp2_session_callbacks`, use
@@ -1531,8 +1759,8 @@ typedef int (*nghttp2_on_data_chunk_recv_callback)(nghttp2_session *session,
* If there is a fatal error while executing this callback, the
* implementation should return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`, which makes
- * `nghttp2_session_send()` and `nghttp2_session_mem_send()` functions
- * immediately return
+ * `nghttp2_session_send()` and `nghttp2_session_mem_send2()`
+ * functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
*
* If the other value is returned, it is treated as if
@@ -1556,8 +1784,8 @@ typedef int (*nghttp2_before_frame_send_callback)(nghttp2_session *session,
*
* The implementation of this function must return 0 if it succeeds.
* If nonzero is returned, it is treated as fatal error and
- * `nghttp2_session_send()` and `nghttp2_session_mem_send()` functions
- * immediately return
+ * `nghttp2_session_send()` and `nghttp2_session_mem_send2()`
+ * functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
*
* To set this callback to :type:`nghttp2_session_callbacks`, use
@@ -1579,8 +1807,8 @@ typedef int (*nghttp2_on_frame_send_callback)(nghttp2_session *session,
*
* The implementation of this function must return 0 if it succeeds.
* If nonzero is returned, it is treated as fatal error and
- * `nghttp2_session_send()` and `nghttp2_session_mem_send()` functions
- * immediately return
+ * `nghttp2_session_send()` and `nghttp2_session_mem_send2()`
+ * functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
*
* `nghttp2_session_get_stream_user_data()` can be used to get
@@ -1601,7 +1829,7 @@ typedef int (*nghttp2_on_frame_not_send_callback)(nghttp2_session *session,
* The reason of closure is indicated by the |error_code|. The
* |error_code| is usually one of :enum:`nghttp2_error_code`, but that
* is not guaranteed. The stream_user_data, which was specified in
- * `nghttp2_submit_request()` or `nghttp2_submit_headers()`, is still
+ * `nghttp2_submit_request2()` or `nghttp2_submit_headers()`, is still
* available in this function. The |user_data| pointer is the third
* argument passed in to the call to `nghttp2_session_client_new()` or
* `nghttp2_session_server_new()`.
@@ -1610,8 +1838,8 @@ typedef int (*nghttp2_on_frame_not_send_callback)(nghttp2_session *session,
*
* The implementation of this function must return 0 if it succeeds.
* If nonzero is returned, it is treated as fatal error and
- * `nghttp2_session_recv()`, `nghttp2_session_mem_recv()`,
- * `nghttp2_session_send()`, and `nghttp2_session_mem_send()`
+ * `nghttp2_session_recv()`, `nghttp2_session_mem_recv2()`,
+ * `nghttp2_session_send()`, and `nghttp2_session_mem_send2()`
* functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
*
@@ -1681,7 +1909,7 @@ typedef int (*nghttp2_on_stream_close_callback)(nghttp2_session *session,
* value is returned, it is treated as if
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` is returned. If
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` is returned,
- * `nghttp2_session_mem_recv()` function will immediately return
+ * `nghttp2_session_mem_recv2()` function will immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
*
* To set this callback to :type:`nghttp2_session_callbacks`, use
@@ -1726,11 +1954,11 @@ typedef int (*nghttp2_on_begin_headers_callback)(nghttp2_session *session,
* performs validation based on HTTP Messaging rule, which is briefly
* explained in :ref:`http-messaging` section.
*
- * If the application uses `nghttp2_session_mem_recv()`, it can return
- * :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` to make
- * `nghttp2_session_mem_recv()` return without processing further
+ * If the application uses `nghttp2_session_mem_recv2()`, it can
+ * return :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` to make
+ * `nghttp2_session_mem_recv2()` return without processing further
* input bytes. The memory pointed by |frame|, |name| and |value|
- * parameters are retained until `nghttp2_session_mem_recv()` or
+ * parameters are retained until `nghttp2_session_mem_recv2()` or
* `nghttp2_session_recv()` is called. The application must retain
* the input bytes which was used to produce these parameters, because
* it may refer to the memory region included in the input bytes.
@@ -1757,8 +1985,8 @@ typedef int (*nghttp2_on_begin_headers_callback)(nghttp2_session *session,
* nonzero value is returned, it is treated as
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` is returned,
- * `nghttp2_session_recv()` and `nghttp2_session_mem_recv()` functions
- * immediately return
+ * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()`
+ * functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
*
* To set this callback to :type:`nghttp2_session_callbacks`, use
@@ -1873,9 +2101,15 @@ typedef int (*nghttp2_on_invalid_header_callback2)(
nghttp2_session *session, const nghttp2_frame *frame, nghttp2_rcbuf *name,
nghttp2_rcbuf *value, uint8_t flags, void *user_data);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @functypedef
*
+ * .. warning::
+ *
+ * Deprecated. Use :type:`nghttp2_select_padding_callback2`
+ * instead.
+ *
* Callback function invoked when the library asks application how
* many padding bytes are required for the transmission of the
* |frame|. The application must choose the total length of payload
@@ -1896,9 +2130,39 @@ typedef ssize_t (*nghttp2_select_padding_callback)(nghttp2_session *session,
size_t max_payloadlen,
void *user_data);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @functypedef
+ *
+ * Callback function invoked when the library asks application how
+ * many padding bytes are required for the transmission of the
+ * |frame|. The application must choose the total length of payload
+ * including padded bytes in range [frame->hd.length, max_payloadlen],
+ * inclusive. Choosing number not in this range will be treated as
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. Returning
+ * ``frame->hd.length`` means no padding is added. Returning
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` will make
+ * `nghttp2_session_send()` and `nghttp2_session_mem_send2()`
+ * functions immediately return
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
+ *
+ * To set this callback to :type:`nghttp2_session_callbacks`, use
+ * `nghttp2_session_callbacks_set_select_padding_callback2()`.
+ */
+typedef nghttp2_ssize (*nghttp2_select_padding_callback2)(
+ nghttp2_session *session, const nghttp2_frame *frame, size_t max_payloadlen,
+ void *user_data);
+
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @functypedef
*
+ * .. warning::
+ *
+ * Deprecated. Use
+ * :type:`nghttp2_data_source_read_length_callback2` instead.
+ *
* Callback function invoked when library wants to get max length of
* data to send data to the remote peer. The implementation of this
* function should return a value in the following range. [1,
@@ -1926,6 +2190,38 @@ typedef ssize_t (*nghttp2_data_source_read_length_callback)(
int32_t session_remote_window_size, int32_t stream_remote_window_size,
uint32_t remote_max_frame_size, void *user_data);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @functypedef
+ *
+ * Callback function invoked when library wants to get max length of
+ * data to send data to the remote peer. The implementation of this
+ * function should return a value in the following range. [1,
+ * min(|session_remote_window_size|, |stream_remote_window_size|,
+ * |remote_max_frame_size|)]. If a value greater than this range is
+ * returned than the max allow value will be used. Returning a value
+ * smaller than this range is treated as
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. The
+ * |frame_type| is provided for future extensibility and identifies
+ * the type of frame (see :type:`nghttp2_frame_type`) for which to get
+ * the length for. Currently supported frame types are:
+ * :enum:`nghttp2_frame_type.NGHTTP2_DATA`.
+ *
+ * This callback can be used to control the length in bytes for which
+ * :type:`nghttp2_data_source_read_callback` is allowed to send to the
+ * remote endpoint. This callback is optional. Returning
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` will signal the
+ * entire session failure.
+ *
+ * To set this callback to :type:`nghttp2_session_callbacks`, use
+ * `nghttp2_session_callbacks_set_data_source_read_length_callback2()`.
+ */
+typedef nghttp2_ssize (*nghttp2_data_source_read_length_callback2)(
+ nghttp2_session *session, uint8_t frame_type, int32_t stream_id,
+ int32_t session_remote_window_size, int32_t stream_remote_window_size,
+ uint32_t remote_max_frame_size, void *user_data);
+
/**
* @functypedef
*
@@ -1942,8 +2238,8 @@ typedef ssize_t (*nghttp2_data_source_read_length_callback)(
*
* The implementation of this function must return 0 if it succeeds.
* If nonzero value is returned, it is treated as fatal error and
- * `nghttp2_session_recv()` and `nghttp2_session_mem_recv()` functions
- * immediately return
+ * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()`
+ * functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
*
* To set this callback to :type:`nghttp2_session_callbacks`, use
@@ -1967,8 +2263,8 @@ typedef int (*nghttp2_on_begin_frame_callback)(nghttp2_session *session,
*
* If fatal error occurred, application should return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. In this case,
- * `nghttp2_session_recv()` and `nghttp2_session_mem_recv()` functions
- * immediately return
+ * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()`
+ * functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the other
* values are returned, currently they are treated as
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
@@ -1997,7 +2293,7 @@ typedef int (*nghttp2_on_extension_chunk_recv_callback)(
* ``NULL``. The |*payload| is available as ``frame->ext.payload`` in
* :type:`nghttp2_on_frame_recv_callback`. Therefore if application
* can free that memory inside :type:`nghttp2_on_frame_recv_callback`
- * callback. Of course, application has a liberty not ot use
+ * callback. Of course, application has a liberty not to use
* |*payload|, and do its own mechanism to process extension frames.
*
* To abort processing this extension frame, return
@@ -2005,8 +2301,8 @@ typedef int (*nghttp2_on_extension_chunk_recv_callback)(
*
* If fatal error occurred, application should return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. In this case,
- * `nghttp2_session_recv()` and `nghttp2_session_mem_recv()` functions
- * immediately return
+ * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()`
+ * functions immediately return
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the other
* values are returned, currently they are treated as
* :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
@@ -2016,9 +2312,15 @@ typedef int (*nghttp2_unpack_extension_callback)(nghttp2_session *session,
const nghttp2_frame_hd *hd,
void *user_data);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @functypedef
*
+ * .. warning::
+ *
+ * Deprecated. Use :type:`nghttp2_pack_extension_callback2`
+ * instead.
+ *
* Callback function invoked when library asks the application to pack
* extension payload in its wire format. The frame header will be
* packed by library. Application must pack payload only.
@@ -2049,18 +2351,53 @@ typedef ssize_t (*nghttp2_pack_extension_callback)(nghttp2_session *session,
const nghttp2_frame *frame,
void *user_data);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
/**
* @functypedef
*
- * Callback function invoked when library provides the error message
+ * Callback function invoked when library asks the application to pack
+ * extension payload in its wire format. The frame header will be
+ * packed by library. Application must pack payload only.
+ * ``frame->ext.payload`` is the object passed to
+ * `nghttp2_submit_extension()` as payload parameter. Application
+ * must pack extension payload to the |buf| of its capacity |len|
+ * bytes. The |len| is at least 16KiB.
+ *
+ * The implementation of this function should return the number of
+ * bytes written into |buf| when it succeeds.
+ *
+ * To abort processing this extension frame, return
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CANCEL`, and
+ * :type:`nghttp2_on_frame_not_send_callback` will be invoked.
+ *
+ * If fatal error occurred, application should return
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. In this case,
+ * `nghttp2_session_send()` and `nghttp2_session_mem_send2()`
+ * functions immediately return
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the other
+ * values are returned, currently they are treated as
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the return
+ * value is strictly larger than |len|, it is treated as
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`.
+ */
+typedef nghttp2_ssize (*nghttp2_pack_extension_callback2)(
+ nghttp2_session *session, uint8_t *buf, size_t len,
+ const nghttp2_frame *frame, void *user_data);
+
+/**
+ * @functypedef
+ *
+ * .. warning::
+ *
+ * Deprecated. Use :type:`nghttp2_error_callback2` instead.
+ *
+ * Callback function invoked when library provides the error message
* intended for human consumption. This callback is solely for
* debugging purpose. The |msg| is typically NULL-terminated string
* of length |len|. |len| does not include the sentinel NULL
* character.
*
- * This function is deprecated. The new application should use
- * :type:`nghttp2_error_callback2`.
- *
* The format of error message may change between nghttp2 library
* versions. The application should not depend on the particular
* format.
@@ -2143,9 +2480,15 @@ nghttp2_session_callbacks_new(nghttp2_session_callbacks **callbacks_ptr);
NGHTTP2_EXTERN void
nghttp2_session_callbacks_del(nghttp2_session_callbacks *callbacks);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_session_callbacks_set_send_callback2()`
+ * with :type:`nghttp2_send_callback2` instead.
+ *
* Sets callback function invoked when a session wants to send data to
* the remote peer. This callback is not necessary if the application
* uses solely `nghttp2_session_mem_send()` to serialize data to
@@ -2154,9 +2497,28 @@ nghttp2_session_callbacks_del(nghttp2_session_callbacks *callbacks);
NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_callback(
nghttp2_session_callbacks *cbs, nghttp2_send_callback send_callback);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Sets callback function invoked when a session wants to send data to
+ * the remote peer. This callback is not necessary if the application
+ * uses solely `nghttp2_session_mem_send2()` to serialize data to
+ * transmit.
+ */
+NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_callback2(
+ nghttp2_session_callbacks *cbs, nghttp2_send_callback2 send_callback);
+
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_session_callbacks_set_recv_callback2()`
+ * with :type:`nghttp2_recv_callback2` instead.
+ *
* Sets callback function invoked when the a session wants to receive
* data from the remote peer. This callback is not necessary if the
* application uses solely `nghttp2_session_mem_recv()` to process
@@ -2165,11 +2527,24 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_callback(
NGHTTP2_EXTERN void nghttp2_session_callbacks_set_recv_callback(
nghttp2_session_callbacks *cbs, nghttp2_recv_callback recv_callback);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Sets callback function invoked when the a session wants to receive
+ * data from the remote peer. This callback is not necessary if the
+ * application uses solely `nghttp2_session_mem_recv2()` to process
+ * received data.
+ */
+NGHTTP2_EXTERN void nghttp2_session_callbacks_set_recv_callback2(
+ nghttp2_session_callbacks *cbs, nghttp2_recv_callback2 recv_callback);
+
/**
* @function
*
* Sets callback function invoked by `nghttp2_session_recv()` and
- * `nghttp2_session_mem_recv()` when a frame is received.
+ * `nghttp2_session_mem_recv2()` when a frame is received.
*/
NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_recv_callback(
nghttp2_session_callbacks *cbs,
@@ -2179,7 +2554,7 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_recv_callback(
* @function
*
* Sets callback function invoked by `nghttp2_session_recv()` and
- * `nghttp2_session_mem_recv()` when an invalid non-DATA frame is
+ * `nghttp2_session_mem_recv2()` when an invalid non-DATA frame is
* received.
*/
NGHTTP2_EXTERN void
@@ -2290,9 +2665,16 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_header_callback2(
nghttp2_session_callbacks *cbs,
nghttp2_on_invalid_header_callback2 on_invalid_header_callback2);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use
+ * `nghttp2_session_callbacks_set_select_padding_callback2()` with
+ * :type:`nghttp2_select_padding_callback2` instead.
+ *
* Sets callback function invoked when the library asks application
* how many padding bytes are required for the transmission of the
* given frame.
@@ -2301,9 +2683,29 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_select_padding_callback(
nghttp2_session_callbacks *cbs,
nghttp2_select_padding_callback select_padding_callback);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Sets callback function invoked when the library asks application
+ * how many padding bytes are required for the transmission of the
+ * given frame.
+ */
+NGHTTP2_EXTERN void nghttp2_session_callbacks_set_select_padding_callback2(
+ nghttp2_session_callbacks *cbs,
+ nghttp2_select_padding_callback2 select_padding_callback);
+
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use
+ * `nghttp2_session_callbacks_set_data_source_read_length_callback2()`
+ * with :type:`nghttp2_data_source_read_length_callback2` instead.
+ *
* Sets callback function determine the length allowed in
* :type:`nghttp2_data_source_read_callback`.
*/
@@ -2312,6 +2714,19 @@ nghttp2_session_callbacks_set_data_source_read_length_callback(
nghttp2_session_callbacks *cbs,
nghttp2_data_source_read_length_callback data_source_read_length_callback);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Sets callback function determine the length allowed in
+ * :type:`nghttp2_data_source_read_callback2`.
+ */
+NGHTTP2_EXTERN void
+nghttp2_session_callbacks_set_data_source_read_length_callback2(
+ nghttp2_session_callbacks *cbs,
+ nghttp2_data_source_read_length_callback2 data_source_read_length_callback);
+
/**
* @function
*
@@ -2326,15 +2741,22 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_begin_frame_callback(
*
* Sets callback function invoked when
* :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_COPY` is used in
- * :type:`nghttp2_data_source_read_callback` to avoid data copy.
+ * :type:`nghttp2_data_source_read_callback2` to avoid data copy.
*/
NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_data_callback(
nghttp2_session_callbacks *cbs,
nghttp2_send_data_callback send_data_callback);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use
+ * `nghttp2_session_callbacks_set_pack_extension_callback2()` with
+ * :type:`nghttp2_pack_extension_callback2` instead.
+ *
* Sets callback function invoked when the library asks the
* application to pack extension frame payload in wire format.
*/
@@ -2342,6 +2764,18 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_pack_extension_callback(
nghttp2_session_callbacks *cbs,
nghttp2_pack_extension_callback pack_extension_callback);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Sets callback function invoked when the library asks the
+ * application to pack extension frame payload in wire format.
+ */
+NGHTTP2_EXTERN void nghttp2_session_callbacks_set_pack_extension_callback2(
+ nghttp2_session_callbacks *cbs,
+ nghttp2_pack_extension_callback2 pack_extension_callback);
+
/**
* @function
*
@@ -2366,12 +2800,15 @@ nghttp2_session_callbacks_set_on_extension_chunk_recv_callback(
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use
+ * `nghttp2_session_callbacks_set_error_callback2()` with
+ * :type:`nghttp2_error_callback2` instead.
+ *
* Sets callback function invoked when library tells error message to
* the application.
*
- * This function is deprecated. The new application should use
- * `nghttp2_session_callbacks_set_error_callback2()`.
- *
* If both :type:`nghttp2_error_callback` and
* :type:`nghttp2_error_callback2` are set, the latter takes
* precedence.
@@ -2568,7 +3005,7 @@ nghttp2_option_set_peer_max_concurrent_streams(nghttp2_option *option,
*
* If this option is not used or used with zero value, if MAGIC does
* not match :macro:`NGHTTP2_CLIENT_MAGIC`, `nghttp2_session_recv()`
- * and `nghttp2_session_mem_recv()` will return error
+ * and `nghttp2_session_mem_recv2()` will return error
* :enum:`nghttp2_error.NGHTTP2_ERR_BAD_CLIENT_MAGIC`, which is fatal
* error.
*/
@@ -2773,6 +3210,17 @@ NGHTTP2_EXTERN void
nghttp2_option_set_stream_reset_rate_limit(nghttp2_option *option,
uint64_t burst, uint64_t rate);
+/**
+ * @function
+ *
+ * This function sets the maximum number of CONTINUATION frames
+ * following an incoming HEADER frame. If more than those frames are
+ * received, the remote endpoint is considered to be misbehaving and
+ * session will be closed. The default value is 8.
+ */
+NGHTTP2_EXTERN void nghttp2_option_set_max_continuations(nghttp2_option *option,
+ size_t val);
+
/**
* @function
*
@@ -2781,7 +3229,7 @@ nghttp2_option_set_stream_reset_rate_limit(nghttp2_option *option,
* does not store |callbacks|. The |user_data| is an arbitrary user
* supplied data, which will be passed to the callback functions.
*
- * The :type:`nghttp2_send_callback` must be specified. If the
+ * The :type:`nghttp2_send_callback2` must be specified. If the
* application code uses `nghttp2_session_recv()`, the
* :type:`nghttp2_recv_callback` must be specified. The other members
* of |callbacks| can be ``NULL``.
@@ -2807,7 +3255,7 @@ nghttp2_session_client_new(nghttp2_session **session_ptr,
* does not store |callbacks|. The |user_data| is an arbitrary user
* supplied data, which will be passed to the callback functions.
*
- * The :type:`nghttp2_send_callback` must be specified. If the
+ * The :type:`nghttp2_send_callback2` must be specified. If the
* application code uses `nghttp2_session_recv()`, the
* :type:`nghttp2_recv_callback` must be specified. The other members
* of |callbacks| can be ``NULL``.
@@ -2943,7 +3391,7 @@ NGHTTP2_EXTERN void nghttp2_session_del(nghttp2_session *session);
* This function retrieves the highest prioritized frame from the
* outbound queue and sends it to the remote peer. It does this as
* many times as possible until the user callback
- * :type:`nghttp2_send_callback` returns
+ * :type:`nghttp2_send_callback2` returns
* :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`, the outbound queue
* becomes empty or flow control is triggered (remote window size
* becomes depleted or maximum number of concurrent streams is
@@ -2973,7 +3421,7 @@ NGHTTP2_EXTERN void nghttp2_session_del(nghttp2_session *session);
* :type:`nghttp2_on_frame_not_send_callback` is invoked. Abort
* the following steps.
*
- * 8. :type:`nghttp2_send_callback` is invoked one or more times to
+ * 8. :type:`nghttp2_send_callback2` is invoked one or more times to
* send the frame.
*
* 9. :type:`nghttp2_on_frame_send_callback` is invoked.
@@ -2992,9 +3440,14 @@ NGHTTP2_EXTERN void nghttp2_session_del(nghttp2_session *session);
*/
NGHTTP2_EXTERN int nghttp2_session_send(nghttp2_session *session);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_session_mem_send2()` instead.
+ *
* Returns the serialized data to send.
*
* This function behaves like `nghttp2_session_send()` except that it
@@ -3034,6 +3487,50 @@ NGHTTP2_EXTERN int nghttp2_session_send(nghttp2_session *session);
NGHTTP2_EXTERN ssize_t nghttp2_session_mem_send(nghttp2_session *session,
const uint8_t **data_ptr);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Returns the serialized data to send.
+ *
+ * This function behaves like `nghttp2_session_send()` except that it
+ * does not use :type:`nghttp2_send_callback2` to transmit data.
+ * Instead, it assigns the pointer to the serialized data to the
+ * |*data_ptr| and returns its length. The other callbacks are called
+ * in the same way as they are in `nghttp2_session_send()`.
+ *
+ * If no data is available to send, this function returns 0.
+ *
+ * This function may not return all serialized data in one invocation.
+ * To get all data, call this function repeatedly until it returns 0
+ * or one of negative error codes.
+ *
+ * The assigned |*data_ptr| is valid until the next call of
+ * `nghttp2_session_mem_send2()` or `nghttp2_session_send()`.
+ *
+ * The caller must send all data before sending the next chunk of
+ * data.
+ *
+ * This function returns the length of the data pointed by the
+ * |*data_ptr| if it succeeds, or one of the following negative error
+ * codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM`
+ * Out of memory.
+ *
+ * .. note::
+ *
+ * This function may produce very small byte string. If that is the
+ * case, and application disables Nagle algorithm (``TCP_NODELAY``),
+ * then writing this small chunk leads to very small packet, and it
+ * is very inefficient. An application should be responsible to
+ * buffer up small chunks of data as necessary to avoid this
+ * situation.
+ */
+NGHTTP2_EXTERN nghttp2_ssize
+nghttp2_session_mem_send2(nghttp2_session *session, const uint8_t **data_ptr);
+
/**
* @function
*
@@ -3104,9 +3601,14 @@ NGHTTP2_EXTERN ssize_t nghttp2_session_mem_send(nghttp2_session *session,
*/
NGHTTP2_EXTERN int nghttp2_session_recv(nghttp2_session *session);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_session_mem_recv2()` instead.
+ *
* Processes data |in| as an input from the remote endpoint. The
* |inlen| indicates the number of bytes to receive in the |in|.
*
@@ -3145,6 +3647,49 @@ NGHTTP2_EXTERN ssize_t nghttp2_session_mem_recv(nghttp2_session *session,
const uint8_t *in,
size_t inlen);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Processes data |in| as an input from the remote endpoint. The
+ * |inlen| indicates the number of bytes to receive in the |in|.
+ *
+ * This function behaves like `nghttp2_session_recv()` except that it
+ * does not use :type:`nghttp2_recv_callback` to receive data; the
+ * |in| is the only data for the invocation of this function. If all
+ * bytes are processed, this function returns. The other callbacks
+ * are called in the same way as they are in `nghttp2_session_recv()`.
+ *
+ * In the current implementation, this function always tries to
+ * processes |inlen| bytes of input data unless either an error occurs or
+ * :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` is returned from
+ * :type:`nghttp2_on_header_callback` or
+ * :type:`nghttp2_on_data_chunk_recv_callback`. If
+ * :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` is used, the return value
+ * includes the number of bytes which was used to produce the data or
+ * frame for the callback.
+ *
+ * This function returns the number of processed bytes, or one of the
+ * following negative error codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM`
+ * Out of memory.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`
+ * The callback function failed.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_BAD_CLIENT_MAGIC`
+ * Invalid client magic was detected. This error only returns
+ * when |session| was configured as server and
+ * `nghttp2_option_set_no_recv_client_magic()` is not used with
+ * nonzero value.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_FLOODED`
+ * Flooding was detected in this HTTP/2 session, and it must be
+ * closed. This is most likely caused by misbehaviour of peer.
+ */
+NGHTTP2_EXTERN nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session,
+ const uint8_t *in,
+ size_t inlen);
+
/**
* @function
*
@@ -3190,7 +3735,7 @@ NGHTTP2_EXTERN int nghttp2_session_want_write(nghttp2_session *session);
* @function
*
* Returns stream_user_data for the stream |stream_id|. The
- * stream_user_data is provided by `nghttp2_submit_request()`,
+ * stream_user_data is provided by `nghttp2_submit_request2()`,
* `nghttp2_submit_headers()` or
* `nghttp2_session_set_stream_user_data()`. Unless it is set using
* `nghttp2_session_set_stream_user_data()`, if the stream is
@@ -3626,6 +4171,13 @@ NGHTTP2_EXTERN int nghttp2_session_consume_stream(nghttp2_session *session,
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme. In the future release after the end of
+ * 2024, this function will always return 0 without doing anything.
+ *
* Changes priority of existing stream denoted by |stream_id|. The
* new priority specification is |pri_spec|.
*
@@ -3665,6 +4217,13 @@ nghttp2_session_change_stream_priority(nghttp2_session *session,
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme. In the future release after the end of
+ * 2024, this function will always return 0 without doing anything.
+ *
* Creates idle stream with the given |stream_id|, and priority
* |pri_spec|.
*
@@ -3715,10 +4274,6 @@ nghttp2_session_create_idle_stream(nghttp2_session *session, int32_t stream_id,
/**
* @function
*
- * Performs post-process of HTTP Upgrade request. This function can
- * be called from both client and server, but the behavior is very
- * different in each other.
- *
* .. warning::
*
* This function is deprecated in favor of
@@ -3730,6 +4285,10 @@ nghttp2_session_create_idle_stream(nghttp2_session *session, int32_t stream_id,
* HEAD is used in request, the length of response body must be 0
* regardless of value included in content-length header field.
*
+ * Performs post-process of HTTP Upgrade request. This function can
+ * be called from both client and server, but the behavior is very
+ * different in each other.
+ *
* If called from client side, the |settings_payload| must be the
* value sent in ``HTTP2-Settings`` header field and must be decoded
* by base64url decoder. The |settings_payloadlen| is the length of
@@ -3809,9 +4368,14 @@ NGHTTP2_EXTERN int nghttp2_session_upgrade2(nghttp2_session *session,
int head_request,
void *stream_user_data);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_pack_settings_payload2()` instead.
+ *
* Serializes the SETTINGS values |iv| in the |buf|. The size of the
* |buf| is specified by |buflen|. The number of entries in the |iv|
* array is given by |niv|. The required space in |buf| for the |niv|
@@ -3833,6 +4397,32 @@ NGHTTP2_EXTERN int nghttp2_session_upgrade2(nghttp2_session *session,
NGHTTP2_EXTERN ssize_t nghttp2_pack_settings_payload(
uint8_t *buf, size_t buflen, const nghttp2_settings_entry *iv, size_t niv);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Serializes the SETTINGS values |iv| in the |buf|. The size of the
+ * |buf| is specified by |buflen|. The number of entries in the |iv|
+ * array is given by |niv|. The required space in |buf| for the |niv|
+ * entries is ``6*niv`` bytes and if the given buffer is too small, an
+ * error is returned. This function is used mainly for creating a
+ * SETTINGS payload to be sent with the ``HTTP2-Settings`` header
+ * field in an HTTP Upgrade request. The data written in |buf| is NOT
+ * base64url encoded and the application is responsible for encoding.
+ *
+ * This function returns the number of bytes written in |buf|, or one
+ * of the following negative error codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT`
+ * The |iv| contains duplicate settings ID or invalid value.
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE`
+ * The provided |buflen| size is too small to hold the output.
+ */
+NGHTTP2_EXTERN nghttp2_ssize nghttp2_pack_settings_payload2(
+ uint8_t *buf, size_t buflen, const nghttp2_settings_entry *iv, size_t niv);
+
/**
* @function
*
@@ -3854,6 +4444,12 @@ NGHTTP2_EXTERN const char *nghttp2_http2_strerror(uint32_t error_code);
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme.
+ *
* Initializes |pri_spec| with the |stream_id| of the stream to depend
* on with |weight| and its exclusive flag. If |exclusive| is
* nonzero, exclusive flag is set.
@@ -3868,6 +4464,12 @@ NGHTTP2_EXTERN void nghttp2_priority_spec_init(nghttp2_priority_spec *pri_spec,
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme.
+ *
* Initializes |pri_spec| with the default values. The default values
* are: stream_id = 0, weight = :macro:`NGHTTP2_DEFAULT_WEIGHT` and
* exclusive = 0.
@@ -3878,18 +4480,29 @@ nghttp2_priority_spec_default_init(nghttp2_priority_spec *pri_spec);
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme.
+ *
* Returns nonzero if the |pri_spec| is filled with default values.
*/
NGHTTP2_EXTERN int
nghttp2_priority_spec_check_default(const nghttp2_priority_spec *pri_spec);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_submit_request2()` instead.
+ *
* Submits HEADERS frame and optionally one or more DATA frames.
*
- * The |pri_spec| is priority specification of this request. ``NULL``
- * means the default priority (see
+ * The |pri_spec| is a deprecated priority specification of this
+ * request. ``NULL`` means the default priority (see
* `nghttp2_priority_spec_default_init()`). To specify the priority,
* use `nghttp2_priority_spec_init()`. If |pri_spec| is not ``NULL``,
* this function will copy its data members.
@@ -3970,23 +4583,119 @@ NGHTTP2_EXTERN int32_t nghttp2_submit_request(
const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider *data_prd,
void *stream_user_data);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
/**
* @function
*
- * Submits response HEADERS frame and optionally one or more DATA
- * frames against the stream |stream_id|.
+ * Submits HEADERS frame and optionally one or more DATA frames.
*
- * The |nva| is an array of name/value pair :type:`nghttp2_nv` with
- * |nvlen| elements. The application is responsible to include
- * required pseudo-header fields (header field whose name starts with
- * ":") in |nva| and must place pseudo-headers before regular header
- * fields.
+ * The |pri_spec| is a deprecated priority specification of this
+ * request. ``NULL`` means the default priority (see
+ * `nghttp2_priority_spec_default_init()`). To specify the priority,
+ * use `nghttp2_priority_spec_init()`. If |pri_spec| is not ``NULL``,
+ * this function will copy its data members. In the future release
+ * after the end of 2024, this function will ignore |pri_spec| and
+ * behave as if ``NULL`` is given.
*
- * This function creates copies of all name/value pairs in |nva|. It
- * also lower-cases all names in |nva|. The order of elements in
- * |nva| is preserved. For header fields with
- * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and
- * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set,
+ * The ``pri_spec->weight`` must be in [:macro:`NGHTTP2_MIN_WEIGHT`,
+ * :macro:`NGHTTP2_MAX_WEIGHT`], inclusive. If ``pri_spec->weight``
+ * is strictly less than :macro:`NGHTTP2_MIN_WEIGHT`, it becomes
+ * :macro:`NGHTTP2_MIN_WEIGHT`. If it is strictly greater than
+ * :macro:`NGHTTP2_MAX_WEIGHT`, it becomes
+ * :macro:`NGHTTP2_MAX_WEIGHT`.
+ *
+ * If
+ * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES`
+ * of value of 1 is received by a remote endpoint, |pri_spec| is
+ * ignored, and treated as if ``NULL`` is specified.
+ *
+ * The |nva| is an array of name/value pair :type:`nghttp2_nv` with
+ * |nvlen| elements. The application is responsible to include
+ * required pseudo-header fields (header field whose name starts with
+ * ":") in |nva| and must place pseudo-headers before regular header
+ * fields.
+ *
+ * This function creates copies of all name/value pairs in |nva|. It
+ * also lower-cases all names in |nva|. The order of elements in
+ * |nva| is preserved. For header fields with
+ * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and
+ * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set,
+ * header field name and value are not copied respectively. With
+ * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`, application
+ * is responsible to pass header field name in lowercase. The
+ * application should maintain the references to them until
+ * :type:`nghttp2_on_frame_send_callback` or
+ * :type:`nghttp2_on_frame_not_send_callback` is called.
+ *
+ * HTTP/2 specification has requirement about header fields in the
+ * request HEADERS. See the specification for more details.
+ *
+ * If |data_prd| is not ``NULL``, it provides data which will be sent
+ * in subsequent DATA frames. In this case, a method that allows
+ * request message bodies
+ * (https://tools.ietf.org/html/rfc7231#section-4) must be specified
+ * with ``:method`` key in |nva| (e.g. ``POST``). This function does
+ * not take ownership of the |data_prd|. The function copies the
+ * members of the |data_prd|. If |data_prd| is ``NULL``, HEADERS have
+ * END_STREAM set. The |stream_user_data| is data associated to the
+ * stream opened by this request and can be an arbitrary pointer,
+ * which can be retrieved later by
+ * `nghttp2_session_get_stream_user_data()`.
+ *
+ * This function returns assigned stream ID if it succeeds, or one of
+ * the following negative error codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM`
+ * Out of memory.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE`
+ * No stream ID is available because maximum stream ID was
+ * reached.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT`
+ * Trying to depend on itself (new stream ID equals
+ * ``pri_spec->stream_id``).
+ * :enum:`nghttp2_error.NGHTTP2_ERR_PROTO`
+ * The |session| is server session.
+ *
+ * .. warning::
+ *
+ * This function returns assigned stream ID if it succeeds. But
+ * that stream is not created yet. The application must not submit
+ * frame to that stream ID before
+ * :type:`nghttp2_before_frame_send_callback` is called for this
+ * frame. This means `nghttp2_session_get_stream_user_data()` does
+ * not work before the callback. But
+ * `nghttp2_session_set_stream_user_data()` handles this situation
+ * specially, and it can set data to a stream during this period.
+ *
+ */
+NGHTTP2_EXTERN int32_t nghttp2_submit_request2(
+ nghttp2_session *session, const nghttp2_priority_spec *pri_spec,
+ const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider2 *data_prd,
+ void *stream_user_data);
+
+#ifndef NGHTTP2_NO_SSIZE_T
+/**
+ * @function
+ *
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_submit_response2()` instead.
+ *
+ * Submits response HEADERS frame and optionally one or more DATA
+ * frames against the stream |stream_id|.
+ *
+ * The |nva| is an array of name/value pair :type:`nghttp2_nv` with
+ * |nvlen| elements. The application is responsible to include
+ * required pseudo-header fields (header field whose name starts with
+ * ":") in |nva| and must place pseudo-headers before regular header
+ * fields.
+ *
+ * This function creates copies of all name/value pairs in |nva|. It
+ * also lower-cases all names in |nva|. The order of elements in
+ * |nva| is preserved. For header fields with
+ * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and
+ * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set,
* header field name and value are not copied respectively. With
* :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`, application
* is responsible to pass header field name in lowercase. The
@@ -4039,6 +4748,77 @@ nghttp2_submit_response(nghttp2_session *session, int32_t stream_id,
const nghttp2_nv *nva, size_t nvlen,
const nghttp2_data_provider *data_prd);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Submits response HEADERS frame and optionally one or more DATA
+ * frames against the stream |stream_id|.
+ *
+ * The |nva| is an array of name/value pair :type:`nghttp2_nv` with
+ * |nvlen| elements. The application is responsible to include
+ * required pseudo-header fields (header field whose name starts with
+ * ":") in |nva| and must place pseudo-headers before regular header
+ * fields.
+ *
+ * This function creates copies of all name/value pairs in |nva|. It
+ * also lower-cases all names in |nva|. The order of elements in
+ * |nva| is preserved. For header fields with
+ * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and
+ * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set,
+ * header field name and value are not copied respectively. With
+ * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`, application
+ * is responsible to pass header field name in lowercase. The
+ * application should maintain the references to them until
+ * :type:`nghttp2_on_frame_send_callback` or
+ * :type:`nghttp2_on_frame_not_send_callback` is called.
+ *
+ * HTTP/2 specification has requirement about header fields in the
+ * response HEADERS. See the specification for more details.
+ *
+ * If |data_prd| is not ``NULL``, it provides data which will be sent
+ * in subsequent DATA frames. This function does not take ownership
+ * of the |data_prd|. The function copies the members of the
+ * |data_prd|. If |data_prd| is ``NULL``, HEADERS will have
+ * END_STREAM flag set.
+ *
+ * This method can be used as normal HTTP response and push response.
+ * When pushing a resource using this function, the |session| must be
+ * configured using `nghttp2_session_server_new()` or its variants and
+ * the target stream denoted by the |stream_id| must be reserved using
+ * `nghttp2_submit_push_promise()`.
+ *
+ * To send non-final response headers (e.g., HTTP status 101), don't
+ * use this function because this function half-closes the outbound
+ * stream. Instead, use `nghttp2_submit_headers()` for this purpose.
+ *
+ * This function returns 0 if it succeeds, or one of the following
+ * negative error codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM`
+ * Out of memory.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT`
+ * The |stream_id| is 0.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_DATA_EXIST`
+ * DATA or HEADERS has been already submitted and not fully
+ * processed yet. Normally, this does not happen, but when
+ * application wrongly calls `nghttp2_submit_response2()` twice,
+ * this may happen.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_PROTO`
+ * The |session| is client session.
+ *
+ * .. warning::
+ *
+ * Calling this function twice for the same stream ID may lead to
+ * program crash. It is generally considered to a programming error
+ * to commit response twice.
+ */
+NGHTTP2_EXTERN int
+nghttp2_submit_response2(nghttp2_session *session, int32_t stream_id,
+ const nghttp2_nv *nva, size_t nvlen,
+ const nghttp2_data_provider2 *data_prd);
+
/**
* @function
*
@@ -4064,22 +4844,23 @@ nghttp2_submit_response(nghttp2_session *session, int32_t stream_id,
* DATA without END_STREAM flat set. The library does not enforce
* this requirement, and applications should do this for themselves.
* If `nghttp2_submit_trailer()` is called before any response HEADERS
- * submission (usually by `nghttp2_submit_response()`), the content of
- * |nva| will be sent as response headers, which will result in error.
+ * submission (usually by `nghttp2_submit_response2()`), the content
+ * of |nva| will be sent as response headers, which will result in
+ * error.
*
* This function has the same effect with `nghttp2_submit_headers()`,
* with flags = :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM` and both
* pri_spec and stream_user_data to NULL.
*
- * To submit trailer fields after `nghttp2_submit_response()` is
+ * To submit trailer fields after `nghttp2_submit_response2()` is
* called, the application has to specify
- * :type:`nghttp2_data_provider` to `nghttp2_submit_response()`.
- * Inside of :type:`nghttp2_data_source_read_callback`, when setting
+ * :type:`nghttp2_data_provider2` to `nghttp2_submit_response2()`.
+ * Inside of :type:`nghttp2_data_source_read_callback2`, when setting
* :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF`, also set
* :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_END_STREAM`. After
* that, the application can send trailer fields using
* `nghttp2_submit_trailer()`. `nghttp2_submit_trailer()` can be used
- * inside :type:`nghttp2_data_source_read_callback`.
+ * inside :type:`nghttp2_data_source_read_callback2`.
*
* This function returns 0 if it succeeds and |stream_id| is -1.
* Otherwise, this function returns 0 if it succeeds, or one of the
@@ -4114,11 +4895,13 @@ NGHTTP2_EXTERN int nghttp2_submit_trailer(nghttp2_session *session,
* assigned stream ID will be returned. Otherwise, specify stream ID
* in |stream_id|.
*
- * The |pri_spec| is priority specification of this request. ``NULL``
- * means the default priority (see
+ * The |pri_spec| is a deprecated priority specification of this
+ * request. ``NULL`` means the default priority (see
* `nghttp2_priority_spec_default_init()`). To specify the priority,
* use `nghttp2_priority_spec_init()`. If |pri_spec| is not ``NULL``,
- * this function will copy its data members.
+ * this function will copy its data members. In the future release
+ * after the end of 2024, this function will ignore |pri_spec| and
+ * behave as if ``NULL`` is given.
*
* The ``pri_spec->weight`` must be in [:macro:`NGHTTP2_MIN_WEIGHT`,
* :macro:`NGHTTP2_MAX_WEIGHT`], inclusive. If ``pri_spec->weight``
@@ -4156,8 +4939,8 @@ NGHTTP2_EXTERN int nghttp2_submit_trailer(nghttp2_session *session,
*
* This function is low-level in a sense that the application code can
* specify flags directly. For usual HTTP request,
- * `nghttp2_submit_request()` is useful. Likewise, for HTTP response,
- * prefer `nghttp2_submit_response()`.
+ * `nghttp2_submit_request2()` is useful. Likewise, for HTTP
+ * response, prefer `nghttp2_submit_response2()`.
*
* This function returns newly assigned stream ID if it succeeds and
* |stream_id| is -1. Otherwise, this function returns 0 if it
@@ -4192,9 +4975,14 @@ NGHTTP2_EXTERN int32_t nghttp2_submit_headers(
const nghttp2_priority_spec *pri_spec, const nghttp2_nv *nva, size_t nvlen,
void *stream_user_data);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_submit_data2()` instead.
+ *
* Submits one or more DATA frames to the stream |stream_id|. The
* data to be sent are provided by |data_prd|. If |flags| contains
* :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM`, the last DATA frame
@@ -4237,19 +5025,73 @@ NGHTTP2_EXTERN int nghttp2_submit_data(nghttp2_session *session, uint8_t flags,
int32_t stream_id,
const nghttp2_data_provider *data_prd);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Submits one or more DATA frames to the stream |stream_id|. The
+ * data to be sent are provided by |data_prd|. If |flags| contains
+ * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM`, the last DATA frame
+ * has END_STREAM flag set.
+ *
+ * This function does not take ownership of the |data_prd|. The
+ * function copies the members of the |data_prd|.
+ *
+ * This function returns 0 if it succeeds, or one of the following
+ * negative error codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM`
+ * Out of memory.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_DATA_EXIST`
+ * DATA or HEADERS has been already submitted and not fully
+ * processed yet.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT`
+ * The |stream_id| is 0.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_STREAM_CLOSED`
+ * The stream was already closed; or the |stream_id| is invalid.
+ *
+ * .. note::
+ *
+ * Currently, only one DATA or HEADERS is allowed for a stream at a
+ * time. Submitting these frames more than once before first DATA
+ * or HEADERS is finished results in
+ * :enum:`nghttp2_error.NGHTTP2_ERR_DATA_EXIST` error code. The
+ * earliest callback which tells that previous frame is done is
+ * :type:`nghttp2_on_frame_send_callback`. In side that callback,
+ * new data can be submitted using `nghttp2_submit_data2()`. Of
+ * course, all data except for last one must not have
+ * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM` flag set in |flags|.
+ * This sounds a bit complicated, and we recommend to use
+ * `nghttp2_submit_request2()` and `nghttp2_submit_response2()` to
+ * avoid this cascading issue. The experience shows that for HTTP
+ * use, these two functions are enough to implement both client and
+ * server.
+ */
+NGHTTP2_EXTERN int nghttp2_submit_data2(nghttp2_session *session, uint8_t flags,
+ int32_t stream_id,
+ const nghttp2_data_provider2 *data_prd);
+
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme. In the future release after the end of
+ * 2024, this function will always return 0 without doing anything.
+ *
* Submits PRIORITY frame to change the priority of stream |stream_id|
* to the priority specification |pri_spec|.
*
* The |flags| is currently ignored and should be
* :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`.
*
- * The |pri_spec| is priority specification of this request. ``NULL``
- * is not allowed for this function. To specify the priority, use
- * `nghttp2_priority_spec_init()`. This function will copy its data
- * members.
+ * The |pri_spec| is a deprecated priority specification of this
+ * request. ``NULL`` is not allowed for this function. To specify the
+ * priority, use `nghttp2_priority_spec_init()`. This function will
+ * copy its data members.
*
* The ``pri_spec->weight`` must be in [:macro:`NGHTTP2_MIN_WEIGHT`,
* :macro:`NGHTTP2_MAX_WEIGHT`], inclusive. If ``pri_spec->weight``
@@ -4429,7 +5271,7 @@ NGHTTP2_EXTERN int nghttp2_submit_settings(nghttp2_session *session,
* The client side is not allowed to use this function.
*
* To submit response headers and data, use
- * `nghttp2_submit_response()`.
+ * `nghttp2_submit_response2()`.
*
* This function returns assigned promised stream ID if it succeeds,
* or one of the following negative error codes:
@@ -4568,10 +5410,11 @@ nghttp2_session_get_last_proc_stream_id(nghttp2_session *session);
* reasons are: session is server; stream ID has been spent; GOAWAY
* has been sent or received.
*
- * The application can call `nghttp2_submit_request()` without
- * consulting this function. In that case, `nghttp2_submit_request()`
- * may return error. Or, request is failed to sent, and
- * :type:`nghttp2_on_stream_close_callback` is called.
+ * The application can call `nghttp2_submit_request2()` without
+ * consulting this function. In that case,
+ * `nghttp2_submit_request2()` may return error. Or, request is
+ * failed to sent, and :type:`nghttp2_on_stream_close_callback` is
+ * called.
*/
NGHTTP2_EXTERN int
nghttp2_session_check_request_allowed(nghttp2_session *session);
@@ -4673,11 +5516,11 @@ nghttp2_session_set_local_window_size(nghttp2_session *session, uint8_t flags,
* Application can pass arbitrary frame flags and stream ID in |flags|
* and |stream_id| respectively. The |payload| is opaque pointer, and
* it can be accessible though ``frame->ext.payload`` in
- * :type:`nghttp2_pack_extension_callback`. The library will not own
+ * :type:`nghttp2_pack_extension_callback2`. The library will not own
* passed |payload| pointer.
*
- * The application must set :type:`nghttp2_pack_extension_callback`
- * using `nghttp2_session_callbacks_set_pack_extension_callback()`.
+ * The application must set :type:`nghttp2_pack_extension_callback2`
+ * using `nghttp2_session_callbacks_set_pack_extension_callback2()`.
*
* The application should retain the memory pointed by |payload| until
* the transmission of extension frame is done (which is indicated by
@@ -4685,7 +5528,7 @@ nghttp2_session_set_local_window_size(nghttp2_session *session, uint8_t flags,
* (which is indicated by :type:`nghttp2_on_frame_not_send_callback`).
* If application does not touch this memory region after packing it
* into a wire format, application can free it inside
- * :type:`nghttp2_pack_extension_callback`.
+ * :type:`nghttp2_pack_extension_callback2`.
*
* The standard HTTP/2 frame cannot be sent with this function, so
* |type| must be strictly grater than 0x9. Otherwise, this function
@@ -4696,7 +5539,7 @@ nghttp2_session_set_local_window_size(nghttp2_session *session, uint8_t flags,
* negative error codes:
*
* :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE`
- * If :type:`nghttp2_pack_extension_callback` is not set.
+ * If :type:`nghttp2_pack_extension_callback2` is not set.
* :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT`
* If |type| specifies standard HTTP/2 frame type. The frame
* types in the rage [0x0, 0x9], both inclusive, are standard
@@ -4958,6 +5801,55 @@ NGHTTP2_EXTERN int nghttp2_session_change_extpri_stream_priority(
nghttp2_session *session, int32_t stream_id, const nghttp2_extpri *extpri,
int ignore_client_signal);
+/**
+ * @function
+ *
+ * Stores the stream priority of the existing stream denoted by
+ * |stream_id| in the object pointed by |extpri|. This function is
+ * meant to be used by server for :rfc:`9218` extensible
+ * prioritization scheme.
+ *
+ * If |session| is initialized as client, this function returns
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE`.
+ *
+ * If
+ * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES`
+ * of value of 1 is not submitted via `nghttp2_submit_settings()`,
+ * this function does nothing and returns 0.
+ *
+ * This function returns 0 if it succeeds, or one of the following
+ * negative error codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE`
+ * The |session| is initialized as client.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT`
+ * |stream_id| is zero; or a stream denoted by |stream_id| is not
+ * found.
+ */
+NGHTTP2_EXTERN int nghttp2_session_get_extpri_stream_priority(
+ nghttp2_session *session, nghttp2_extpri *extpri, int32_t stream_id);
+
+/**
+ * @function
+ *
+ * Parses Priority header field value pointed by |value| of length
+ * |len|, and stores the result in the object pointed by |extpri|.
+ * Priority header field is defined in :rfc:`9218`.
+ *
+ * This function does not initialize the object pointed by |extpri|
+ * before storing the result. It only assigns the values that the
+ * parser correctly extracted to fields.
+ *
+ * This function returns 0 if it succeeds, or one of the following
+ * negative error codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT`
+ * Failed to parse the header field value.
+ */
+NGHTTP2_EXTERN int nghttp2_extpri_parse_priority(nghttp2_extpri *extpri,
+ const uint8_t *value,
+ size_t len);
+
/**
* @function
*
@@ -4973,11 +5865,14 @@ NGHTTP2_EXTERN int nghttp2_nv_compare_name(const nghttp2_nv *lhs,
/**
* @function
*
- * A helper function for dealing with NPN in client side or ALPN in
- * server side. The |in| contains peer's protocol list in preferable
- * order. The format of |in| is length-prefixed and not
- * null-terminated. For example, ``h2`` and
- * ``http/1.1`` stored in |in| like this::
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_select_alpn` instead.
+ *
+ * A helper function for dealing with ALPN in server side. The |in|
+ * contains peer's protocol list in preferable order. The format of
+ * |in| is length-prefixed and not null-terminated. For example,
+ * ``h2`` and ``http/1.1`` stored in |in| like this::
*
* in[0] = 2
* in[1..2] = "h2"
@@ -5002,20 +5897,18 @@ NGHTTP2_EXTERN int nghttp2_nv_compare_name(const nghttp2_nv *lhs,
*
* For ALPN, refer to https://tools.ietf.org/html/rfc7301
*
- * See http://technotes.googlecode.com/git/nextprotoneg.html for more
- * details about NPN.
- *
- * For NPN, to use this method you should do something like::
+ * To use this method you should do something like::
*
- * static int select_next_proto_cb(SSL* ssl,
- * unsigned char **out,
+ * static int alpn_select_proto_cb(SSL* ssl,
+ * const unsigned char **out,
* unsigned char *outlen,
* const unsigned char *in,
* unsigned int inlen,
* void *arg)
* {
* int rv;
- * rv = nghttp2_select_next_protocol(out, outlen, in, inlen);
+ * rv = nghttp2_select_next_protocol((unsigned char**)out, outlen,
+ * in, inlen);
* if (rv == -1) {
* return SSL_TLSEXT_ERR_NOACK;
* }
@@ -5025,7 +5918,7 @@ NGHTTP2_EXTERN int nghttp2_nv_compare_name(const nghttp2_nv *lhs,
* return SSL_TLSEXT_ERR_OK;
* }
* ...
- * SSL_CTX_set_next_proto_select_cb(ssl_ctx, select_next_proto_cb, my_obj);
+ * SSL_CTX_set_alpn_select_cb(ssl_ctx, alpn_select_proto_cb, my_obj);
*
*/
NGHTTP2_EXTERN int nghttp2_select_next_protocol(unsigned char **out,
@@ -5033,6 +5926,65 @@ NGHTTP2_EXTERN int nghttp2_select_next_protocol(unsigned char **out,
const unsigned char *in,
unsigned int inlen);
+/**
+ * @function
+ *
+ * A helper function for dealing with ALPN in server side. The |in|
+ * contains peer's protocol list in preferable order. The format of
+ * |in| is length-prefixed and not null-terminated. For example,
+ * ``h2`` and ``http/1.1`` stored in |in| like this::
+ *
+ * in[0] = 2
+ * in[1..2] = "h2"
+ * in[3] = 8
+ * in[4..11] = "http/1.1"
+ * inlen = 12
+ *
+ * The selection algorithm is as follows:
+ *
+ * 1. If peer's list contains HTTP/2 protocol the library supports,
+ * it is selected and returns 1. The following step is not taken.
+ *
+ * 2. If peer's list contains ``http/1.1``, this function selects
+ * ``http/1.1`` and returns 0. The following step is not taken.
+ *
+ * 3. This function selects nothing and returns -1 (So called
+ * non-overlap case). In this case, |out| and |outlen| are left
+ * untouched.
+ *
+ * Selecting ``h2`` means that ``h2`` is written into |*out| and its
+ * length (which is 2) is assigned to |*outlen|.
+ *
+ * For ALPN, refer to https://tools.ietf.org/html/rfc7301
+ *
+ * To use this method you should do something like::
+ *
+ * static int alpn_select_proto_cb(SSL* ssl,
+ * const unsigned char **out,
+ * unsigned char *outlen,
+ * const unsigned char *in,
+ * unsigned int inlen,
+ * void *arg)
+ * {
+ * int rv;
+ * rv = nghttp2_select_alpn(out, outlen, in, inlen);
+ * if (rv == -1) {
+ * return SSL_TLSEXT_ERR_NOACK;
+ * }
+ * if (rv == 1) {
+ * ((MyType*)arg)->http2_selected = 1;
+ * }
+ * return SSL_TLSEXT_ERR_OK;
+ * }
+ * ...
+ * SSL_CTX_set_alpn_select_cb(ssl_ctx, alpn_select_proto_cb, my_obj);
+ *
+ */
+NGHTTP2_EXTERN int nghttp2_select_alpn(const unsigned char **out,
+ unsigned char *outlen,
+ const unsigned char *in,
+ unsigned int inlen);
+
/**
* @function
*
@@ -5208,9 +6160,14 @@ NGHTTP2_EXTERN int
nghttp2_hd_deflate_change_table_size(nghttp2_hd_deflater *deflater,
size_t settings_max_dynamic_table_size);
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_hd_deflate_hd2()` instead.
+ *
* Deflates the |nva|, which has the |nvlen| name/value pairs, into
* the |buf| of length |buflen|.
*
@@ -5240,9 +6197,47 @@ NGHTTP2_EXTERN ssize_t nghttp2_hd_deflate_hd(nghttp2_hd_deflater *deflater,
const nghttp2_nv *nva,
size_t nvlen);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Deflates the |nva|, which has the |nvlen| name/value pairs, into
+ * the |buf| of length |buflen|.
+ *
+ * If |buf| is not large enough to store the deflated header block,
+ * this function fails with
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE`. The caller
+ * should use `nghttp2_hd_deflate_bound()` to know the upper bound of
+ * buffer size required to deflate given header name/value pairs.
+ *
+ * Once this function fails, subsequent call of this function always
+ * returns :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP`.
+ *
+ * After this function returns, it is safe to delete the |nva|.
+ *
+ * This function returns the number of bytes written to |buf| if it
+ * succeeds, or one of the following negative error codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM`
+ * Out of memory.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP`
+ * Deflation process has failed.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE`
+ * The provided |buflen| size is too small to hold the output.
+ */
+NGHTTP2_EXTERN nghttp2_ssize
+nghttp2_hd_deflate_hd2(nghttp2_hd_deflater *deflater, uint8_t *buf,
+ size_t buflen, const nghttp2_nv *nva, size_t nvlen);
+
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_hd_deflate_hd_vec2()` instead.
+ *
* Deflates the |nva|, which has the |nvlen| name/value pairs, into
* the |veclen| size of buf vector |vec|. The each size of buffer
* must be set in len field of :type:`nghttp2_vec`. If and only if
@@ -5274,6 +6269,40 @@ NGHTTP2_EXTERN ssize_t nghttp2_hd_deflate_hd_vec(nghttp2_hd_deflater *deflater,
const nghttp2_nv *nva,
size_t nvlen);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Deflates the |nva|, which has the |nvlen| name/value pairs, into
+ * the |veclen| size of buf vector |vec|. The each size of buffer
+ * must be set in len field of :type:`nghttp2_vec`. If and only if
+ * one chunk is filled up completely, next chunk will be used. If
+ * |vec| is not large enough to store the deflated header block, this
+ * function fails with
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE`. The caller
+ * should use `nghttp2_hd_deflate_bound()` to know the upper bound of
+ * buffer size required to deflate given header name/value pairs.
+ *
+ * Once this function fails, subsequent call of this function always
+ * returns :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP`.
+ *
+ * After this function returns, it is safe to delete the |nva|.
+ *
+ * This function returns the number of bytes written to |vec| if it
+ * succeeds, or one of the following negative error codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM`
+ * Out of memory.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP`
+ * Deflation process has failed.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE`
+ * The provided |buflen| size is too small to hold the output.
+ */
+NGHTTP2_EXTERN nghttp2_ssize nghttp2_hd_deflate_hd_vec2(
+ nghttp2_hd_deflater *deflater, const nghttp2_vec *vec, size_t veclen,
+ const nghttp2_nv *nva, size_t nvlen);
+
/**
* @function
*
@@ -5387,7 +6416,7 @@ NGHTTP2_EXTERN void nghttp2_hd_inflate_del(nghttp2_hd_inflater *inflater);
* This function must not be called while header block is being
* inflated. In other words, this function must be called after
* initialization of |inflater|, but before calling
- * `nghttp2_hd_inflate_hd2()`, or after
+ * `nghttp2_hd_inflate_hd3()`, or after
* `nghttp2_hd_inflate_end_headers()`. Otherwise,
* `NGHTTP2_ERR_INVALID_STATE` was returned.
*
@@ -5425,6 +6454,7 @@ typedef enum {
NGHTTP2_HD_INFLATE_EMIT = 0x02
} nghttp2_hd_inflate_flag;
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
@@ -5512,9 +6542,16 @@ NGHTTP2_EXTERN ssize_t nghttp2_hd_inflate_hd(nghttp2_hd_inflater *inflater,
int *inflate_flags, uint8_t *in,
size_t inlen, int in_final);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+#ifndef NGHTTP2_NO_SSIZE_T
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. Use `nghttp2_hd_inflate_hd3()` instead.
+ *
* Inflates name/value block stored in |in| with length |inlen|. This
* function performs decompression. For each successful emission of
* header name/value pair,
@@ -5601,6 +6638,95 @@ NGHTTP2_EXTERN ssize_t nghttp2_hd_inflate_hd2(nghttp2_hd_inflater *inflater,
const uint8_t *in, size_t inlen,
int in_final);
+#endif /* NGHTTP2_NO_SSIZE_T */
+
+/**
+ * @function
+ *
+ * Inflates name/value block stored in |in| with length |inlen|. This
+ * function performs decompression. For each successful emission of
+ * header name/value pair,
+ * :enum:`nghttp2_hd_inflate_flag.NGHTTP2_HD_INFLATE_EMIT` is set in
+ * |*inflate_flags| and name/value pair is assigned to the |nv_out|
+ * and the function returns. The caller must not free the members of
+ * |nv_out|.
+ *
+ * The |nv_out| may include pointers to the memory region in the |in|.
+ * The caller must retain the |in| while the |nv_out| is used.
+ *
+ * The application should call this function repeatedly until the
+ * ``(*inflate_flags) & NGHTTP2_HD_INFLATE_FINAL`` is nonzero and
+ * return value is non-negative. If that happens, all given input
+ * data (|inlen| bytes) are processed successfully. Then the
+ * application must call `nghttp2_hd_inflate_end_headers()` to prepare
+ * for the next header block input.
+ *
+ * In other words, if |in_final| is nonzero, and this function returns
+ * |inlen|, you can assert that
+ * :enum:`nghttp2_hd_inflate_final.NGHTTP2_HD_INFLATE_FINAL` is set in
+ * |*inflate_flags|.
+ *
+ * The caller can feed complete compressed header block. It also can
+ * feed it in several chunks. The caller must set |in_final| to
+ * nonzero if the given input is the last block of the compressed
+ * header.
+ *
+ * This function returns the number of bytes processed if it succeeds,
+ * or one of the following negative error codes:
+ *
+ * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM`
+ * Out of memory.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP`
+ * Inflation process has failed.
+ * :enum:`nghttp2_error.NGHTTP2_ERR_BUFFER_ERROR`
+ * The header field name or value is too large.
+ *
+ * Example follows::
+ *
+ * int inflate_header_block(nghttp2_hd_inflater *hd_inflater,
+ * uint8_t *in, size_t inlen, int final)
+ * {
+ * nghttp2_ssize rv;
+ *
+ * for(;;) {
+ * nghttp2_nv nv;
+ * int inflate_flags = 0;
+ *
+ * rv = nghttp2_hd_inflate_hd3(hd_inflater, &nv, &inflate_flags,
+ * in, inlen, final);
+ *
+ * if(rv < 0) {
+ * fprintf(stderr, "inflate failed with error code %td", rv);
+ * return -1;
+ * }
+ *
+ * in += rv;
+ * inlen -= rv;
+ *
+ * if(inflate_flags & NGHTTP2_HD_INFLATE_EMIT) {
+ * fwrite(nv.name, nv.namelen, 1, stderr);
+ * fprintf(stderr, ": ");
+ * fwrite(nv.value, nv.valuelen, 1, stderr);
+ * fprintf(stderr, "\n");
+ * }
+ * if(inflate_flags & NGHTTP2_HD_INFLATE_FINAL) {
+ * nghttp2_hd_inflate_end_headers(hd_inflater);
+ * break;
+ * }
+ * if((inflate_flags & NGHTTP2_HD_INFLATE_EMIT) == 0 &&
+ * inlen == 0) {
+ * break;
+ * }
+ * }
+ *
+ * return 0;
+ * }
+ *
+ */
+NGHTTP2_EXTERN nghttp2_ssize nghttp2_hd_inflate_hd3(
+ nghttp2_hd_inflater *inflater, nghttp2_nv *nv_out, int *inflate_flags,
+ const uint8_t *in, size_t inlen, int in_final);
+
/**
* @function
*
@@ -5674,8 +6800,8 @@ typedef struct nghttp2_stream nghttp2_stream;
* `nghttp2_session_get_root_stream()`) if 0 is given in |stream_id|.
*
* Unless |stream_id| == 0, the returned pointer is valid until next
- * call of `nghttp2_session_send()`, `nghttp2_session_mem_send()`,
- * `nghttp2_session_recv()`, and `nghttp2_session_mem_recv()`.
+ * call of `nghttp2_session_send()`, `nghttp2_session_mem_send2()`,
+ * `nghttp2_session_recv()`, and `nghttp2_session_mem_recv2()`.
*/
NGHTTP2_EXTERN nghttp2_stream *
nghttp2_session_find_stream(nghttp2_session *session, int32_t stream_id);
@@ -5729,6 +6855,12 @@ nghttp2_stream_get_state(nghttp2_stream *stream);
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme.
+ *
* Returns root of dependency tree, which is imaginary stream with
* stream ID 0. The returned pointer is valid until |session| is
* freed by `nghttp2_session_del()`.
@@ -5739,6 +6871,13 @@ nghttp2_session_get_root_stream(nghttp2_session *session);
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme. In the future release after the end of
+ * 2024, this function will always return NULL.
+ *
* Returns the parent stream of |stream| in dependency tree. Returns
* NULL if there is no such stream.
*/
@@ -5750,6 +6889,13 @@ NGHTTP2_EXTERN int32_t nghttp2_stream_get_stream_id(nghttp2_stream *stream);
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme. In the future release after the end of
+ * 2024, this function will always return NULL.
+ *
* Returns the next sibling stream of |stream| in dependency tree.
* Returns NULL if there is no such stream.
*/
@@ -5759,6 +6905,13 @@ nghttp2_stream_get_next_sibling(nghttp2_stream *stream);
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme. In the future release after the end of
+ * 2024, this function will always return NULL.
+ *
* Returns the previous sibling stream of |stream| in dependency tree.
* Returns NULL if there is no such stream.
*/
@@ -5768,6 +6921,13 @@ nghttp2_stream_get_previous_sibling(nghttp2_stream *stream);
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme. In the future release after the end of
+ * 2024, this function will always return NULL.
+ *
* Returns the first child stream of |stream| in dependency tree.
* Returns NULL if there is no such stream.
*/
@@ -5777,6 +6937,14 @@ nghttp2_stream_get_first_child(nghttp2_stream *stream);
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme. In the future release after the end of
+ * 2024, this function will always return
+ * :macro:`NGHTTP2_DEFAULT_WEIGHT`.
+ *
* Returns dependency weight to the parent stream of |stream|.
*/
NGHTTP2_EXTERN int32_t nghttp2_stream_get_weight(nghttp2_stream *stream);
@@ -5784,6 +6952,13 @@ NGHTTP2_EXTERN int32_t nghttp2_stream_get_weight(nghttp2_stream *stream);
/**
* @function
*
+ * .. warning::
+ *
+ * Deprecated. :rfc:`7540` priorities are deprecated by
+ * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible
+ * prioritization scheme. In the future release after the end of
+ * 2024, this function will always return 0.
+ *
* Returns the sum of the weight for |stream|'s children.
*/
NGHTTP2_EXTERN int32_t
diff --git a/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h b/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h
index f56954e7fded45..a21d6a1605e010 100644
--- a/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h
+++ b/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h
@@ -29,7 +29,7 @@
* @macro
* Version number of the nghttp2 library release
*/
-#define NGHTTP2_VERSION "1.57.0"
+#define NGHTTP2_VERSION "1.61.0"
/**
* @macro
@@ -37,6 +37,6 @@
* release. This is a 24 bit number with 8 bits for major number, 8 bits
* for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203.
*/
-#define NGHTTP2_VERSION_NUM 0x013900
+#define NGHTTP2_VERSION_NUM 0x013d00
#endif /* NGHTTP2VER_H */
diff --git a/deps/nghttp2/lib/nghttp2_npn.c b/deps/nghttp2/lib/nghttp2_alpn.c
similarity index 65%
rename from deps/nghttp2/lib/nghttp2_npn.c
rename to deps/nghttp2/lib/nghttp2_alpn.c
index d1384c80758d9b..33c5885f8d889f 100644
--- a/deps/nghttp2/lib/nghttp2_npn.c
+++ b/deps/nghttp2/lib/nghttp2_alpn.c
@@ -22,13 +22,13 @@
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#include "nghttp2_npn.h"
+#include "nghttp2_alpn.h"
#include
-static int select_next_protocol(unsigned char **out, unsigned char *outlen,
- const unsigned char *in, unsigned int inlen,
- const char *key, unsigned int keylen) {
+static int select_alpn(const unsigned char **out, unsigned char *outlen,
+ const unsigned char *in, unsigned int inlen,
+ const char *key, unsigned int keylen) {
unsigned int i;
for (i = 0; i + keylen <= inlen; i += (unsigned int)(in[i] + 1)) {
if (memcmp(&in[i], key, keylen) == 0) {
@@ -45,12 +45,25 @@ static int select_next_protocol(unsigned char **out, unsigned char *outlen,
int nghttp2_select_next_protocol(unsigned char **out, unsigned char *outlen,
const unsigned char *in, unsigned int inlen) {
- if (select_next_protocol(out, outlen, in, inlen, NGHTTP2_PROTO_ALPN,
- NGHTTP2_PROTO_ALPN_LEN) == 0) {
+ if (select_alpn((const unsigned char **)out, outlen, in, inlen,
+ NGHTTP2_PROTO_ALPN, NGHTTP2_PROTO_ALPN_LEN) == 0) {
return 1;
}
- if (select_next_protocol(out, outlen, in, inlen, NGHTTP2_HTTP_1_1_ALPN,
- NGHTTP2_HTTP_1_1_ALPN_LEN) == 0) {
+ if (select_alpn((const unsigned char **)out, outlen, in, inlen,
+ NGHTTP2_HTTP_1_1_ALPN, NGHTTP2_HTTP_1_1_ALPN_LEN) == 0) {
+ return 0;
+ }
+ return -1;
+}
+
+int nghttp2_select_alpn(const unsigned char **out, unsigned char *outlen,
+ const unsigned char *in, unsigned int inlen) {
+ if (select_alpn(out, outlen, in, inlen, NGHTTP2_PROTO_ALPN,
+ NGHTTP2_PROTO_ALPN_LEN) == 0) {
+ return 1;
+ }
+ if (select_alpn(out, outlen, in, inlen, NGHTTP2_HTTP_1_1_ALPN,
+ NGHTTP2_HTTP_1_1_ALPN_LEN) == 0) {
return 0;
}
return -1;
diff --git a/deps/nghttp2/lib/nghttp2_npn.h b/deps/nghttp2/lib/nghttp2_alpn.h
similarity index 94%
rename from deps/nghttp2/lib/nghttp2_npn.h
rename to deps/nghttp2/lib/nghttp2_alpn.h
index c6f1c04b683594..09810fd821490a 100644
--- a/deps/nghttp2/lib/nghttp2_npn.h
+++ b/deps/nghttp2/lib/nghttp2_alpn.h
@@ -22,8 +22,8 @@
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#ifndef NGHTTP2_NPN_H
-#define NGHTTP2_NPN_H
+#ifndef NGHTTP2_ALPN_H
+#define NGHTTP2_ALPN_H
#ifdef HAVE_CONFIG_H
# include |