@mridang/webhint-hint-plumbline 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -4
- package/dist/node/child-process.d.ts +1 -1
- package/dist/node/child-process.js +1 -1
- package/dist/node/crypto.d.ts +1 -1
- package/dist/node/crypto.js +1 -1
- package/dist/node/fs-promises.d.ts +1 -1
- package/dist/node/fs-promises.js +1 -1
- package/dist/node/http.d.ts +1 -1
- package/dist/node/http.js +1 -1
- package/dist/node/https.d.ts +1 -1
- package/dist/node/https.js +1 -1
- package/dist/node/net.d.ts +1 -1
- package/dist/node/net.js +1 -1
- package/dist/node/os.d.ts +1 -1
- package/dist/node/os.js +1 -1
- package/dist/node/path.d.ts +1 -1
- package/dist/node/path.js +1 -1
- package/dist/node/tls.d.ts +1 -1
- package/dist/node/tls.js +1 -1
- package/dist/node/url.d.ts +1 -1
- package/dist/node/url.js +1 -1
- package/package.json +1 -12
- package/types/child_process.d.ts +1 -2
- package/types/crypto.d.ts +1 -2
- package/types/fs-promises.d.ts +1 -2
- package/types/http.d.ts +1 -2
- package/types/https.d.ts +1 -2
- package/types/net.d.ts +1 -2
- package/types/os.d.ts +1 -2
- package/types/path.d.ts +1 -2
- package/types/tls.d.ts +1 -2
- package/types/url.d.ts +1 -2
- package/dist/browser/child-process.d.ts +0 -8
- package/dist/browser/child-process.js +0 -12
- package/dist/browser/child-process.js.map +0 -1
- package/dist/browser/crypto.d.ts +0 -16
- package/dist/browser/crypto.js +0 -24
- package/dist/browser/crypto.js.map +0 -1
- package/dist/browser/fs.d.ts +0 -17
- package/dist/browser/fs.js +0 -33
- package/dist/browser/fs.js.map +0 -1
- package/dist/browser/hint.d.ts +0 -13
- package/dist/browser/hint.js +0 -15
- package/dist/browser/hint.js.map +0 -1
- package/dist/browser/http.d.ts +0 -9
- package/dist/browser/http.js +0 -13
- package/dist/browser/http.js.map +0 -1
- package/dist/browser/net.d.ts +0 -14
- package/dist/browser/net.js +0 -36
- package/dist/browser/net.js.map +0 -1
- package/dist/browser/refusals.d.ts +0 -25
- package/dist/browser/refusals.js +0 -36
- package/dist/browser/refusals.js.map +0 -1
- package/dist/browser/tls.d.ts +0 -18
- package/dist/browser/tls.js +0 -19
- package/dist/browser/tls.js.map +0 -1
- package/dist/browser/url.d.ts +0 -8
- package/dist/browser/url.js +0 -16
- package/dist/browser/url.js.map +0 -1
- package/dist/lib/tls/remote.d.ts +0 -58
- package/dist/lib/tls/remote.js +0 -64
- package/dist/lib/tls/remote.js.map +0 -1
package/README.md
CHANGED
|
@@ -68,10 +68,6 @@ devbox run -- npm pack ./packages/hints --pack-destination "$(mktemp -d)"
|
|
|
68
68
|
|
|
69
69
|
`npm pack` prints the path of the tarball; install it with `npm install hint @hint/connector-puppeteer @hint/parser-html /path/to/mridang-webhint-hint-plumbline-0.0.0.tgz`.
|
|
70
70
|
|
|
71
|
-
## In the browser
|
|
72
|
-
|
|
73
|
-
The package also loads in a browser, which is how the [plumbline site](../web/README.md) runs it. It imports Node's socket, TLS, process, crypto and file modules through the conditional imports in `package.json` (`#net`, `#tls`, `#child_process`, …): Node gets `src/node/`, browsers get `src/browser/`, whose stand-ins refuse, so a hint that needs a raw connection is reported as skipped there.
|
|
74
|
-
|
|
75
71
|
## Development
|
|
76
72
|
|
|
77
73
|
Commands run from the repository root through devbox. [`AGENTS.md`](../../AGENTS.md) explains how a hint is written, registered and tested.
|
package/dist/node/crypto.d.ts
CHANGED
package/dist/node/crypto.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
*
|
|
4
|
-
* `#fs/promises` under Node: Node's own module
|
|
4
|
+
* `#fs/promises` under Node: Node's own module (see
|
|
5
5
|
* `imports` in package.json).
|
|
6
6
|
*/
|
|
7
7
|
export { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
package/dist/node/fs-promises.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
*
|
|
4
|
-
* `#fs/promises` under Node: Node's own module
|
|
4
|
+
* `#fs/promises` under Node: Node's own module (see
|
|
5
5
|
* `imports` in package.json).
|
|
6
6
|
*/
|
|
7
7
|
export { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
package/dist/node/http.d.ts
CHANGED
package/dist/node/http.js
CHANGED
package/dist/node/https.d.ts
CHANGED
package/dist/node/https.js
CHANGED
package/dist/node/net.d.ts
CHANGED
package/dist/node/net.js
CHANGED
package/dist/node/os.d.ts
CHANGED
package/dist/node/os.js
CHANGED
package/dist/node/path.d.ts
CHANGED
package/dist/node/path.js
CHANGED
package/dist/node/tls.d.ts
CHANGED
package/dist/node/tls.js
CHANGED
package/dist/node/url.d.ts
CHANGED
package/dist/node/url.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mridang/webhint-hint-plumbline",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"prepack": "tsc --build",
|
|
@@ -17,57 +17,46 @@
|
|
|
17
17
|
},
|
|
18
18
|
"imports": {
|
|
19
19
|
"#hint": {
|
|
20
|
-
"browser": "./dist/browser/hint.js",
|
|
21
20
|
"default": "hint"
|
|
22
21
|
},
|
|
23
22
|
"#net": {
|
|
24
23
|
"types": "./types/net.d.ts",
|
|
25
|
-
"browser": "./dist/browser/net.js",
|
|
26
24
|
"default": "./dist/node/net.js"
|
|
27
25
|
},
|
|
28
26
|
"#tls": {
|
|
29
27
|
"types": "./types/tls.d.ts",
|
|
30
|
-
"browser": "./dist/browser/tls.js",
|
|
31
28
|
"default": "./dist/node/tls.js"
|
|
32
29
|
},
|
|
33
30
|
"#child_process": {
|
|
34
31
|
"types": "./types/child_process.d.ts",
|
|
35
|
-
"browser": "./dist/browser/child-process.js",
|
|
36
32
|
"default": "./dist/node/child-process.js"
|
|
37
33
|
},
|
|
38
34
|
"#crypto": {
|
|
39
35
|
"types": "./types/crypto.d.ts",
|
|
40
|
-
"browser": "./dist/browser/crypto.js",
|
|
41
36
|
"default": "./dist/node/crypto.js"
|
|
42
37
|
},
|
|
43
38
|
"#http": {
|
|
44
39
|
"types": "./types/http.d.ts",
|
|
45
|
-
"browser": "./dist/browser/http.js",
|
|
46
40
|
"default": "./dist/node/http.js"
|
|
47
41
|
},
|
|
48
42
|
"#https": {
|
|
49
43
|
"types": "./types/https.d.ts",
|
|
50
|
-
"browser": "./dist/browser/http.js",
|
|
51
44
|
"default": "./dist/node/https.js"
|
|
52
45
|
},
|
|
53
46
|
"#fs/promises": {
|
|
54
47
|
"types": "./types/fs-promises.d.ts",
|
|
55
|
-
"browser": "./dist/browser/fs.js",
|
|
56
48
|
"default": "./dist/node/fs-promises.js"
|
|
57
49
|
},
|
|
58
50
|
"#os": {
|
|
59
51
|
"types": "./types/os.d.ts",
|
|
60
|
-
"browser": "./dist/browser/fs.js",
|
|
61
52
|
"default": "./dist/node/os.js"
|
|
62
53
|
},
|
|
63
54
|
"#path": {
|
|
64
55
|
"types": "./types/path.d.ts",
|
|
65
|
-
"browser": "./dist/browser/fs.js",
|
|
66
56
|
"default": "./dist/node/path.js"
|
|
67
57
|
},
|
|
68
58
|
"#url": {
|
|
69
59
|
"types": "./types/url.d.ts",
|
|
70
|
-
"browser": "./dist/browser/url.js",
|
|
71
60
|
"default": "./dist/node/url.js"
|
|
72
61
|
}
|
|
73
62
|
},
|
package/types/child_process.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
// The Node module `#child_process` stands for (see `imports` in package.json)
|
|
2
|
-
// get the stand-in in `src/browser/` instead, which has the same shape.
|
|
1
|
+
// The Node module `#child_process` stands for (see `imports` in package.json).
|
|
3
2
|
export * from 'node:child_process';
|
package/types/crypto.d.ts
CHANGED
package/types/fs-promises.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
// The Node module `#fs/promises` stands for (see `imports` in package.json)
|
|
2
|
-
// get the stand-in in `src/browser/` instead, which has the same shape.
|
|
1
|
+
// The Node module `#fs/promises` stands for (see `imports` in package.json).
|
|
3
2
|
export * from 'node:fs/promises';
|
package/types/http.d.ts
CHANGED
package/types/https.d.ts
CHANGED
package/types/net.d.ts
CHANGED
package/types/os.d.ts
CHANGED
package/types/path.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
// The Node module `#path` stands for (see `imports` in package.json)
|
|
2
|
-
// get the stand-in in `src/browser/` instead, which has the same shape.
|
|
1
|
+
// The Node module `#path` stands for (see `imports` in package.json).
|
|
3
2
|
import path from 'node:path';
|
|
4
3
|
|
|
5
4
|
export declare const join: typeof path.join;
|
package/types/tls.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
// The Node module `#tls` stands for (see `imports` in package.json)
|
|
2
|
-
// get the stand-in in `src/browser/` instead, which has the same shape.
|
|
1
|
+
// The Node module `#tls` stands for (see `imports` in package.json).
|
|
3
2
|
export * from 'node:tls';
|
|
4
3
|
|
|
5
4
|
export { default } from 'node:tls';
|
package/types/url.d.ts
CHANGED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:child_process` for a browser: starting a program refuses (see
|
|
5
|
-
* `refusals.ts`).
|
|
6
|
-
*/
|
|
7
|
-
import { refuse } from './refusals.js';
|
|
8
|
-
/** Refuses: a browser cannot start a program such as openssl. */
|
|
9
|
-
export function spawn() {
|
|
10
|
-
return refuse('process', 'start a program such as openssl');
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=child-process.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"child-process.js","sourceRoot":"","sources":["../../src/browser/child-process.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,iEAAiE;AACjE,MAAM,UAAU,KAAK;IACnB,OAAO,MAAM,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/browser/crypto.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:crypto` for a browser. The hints use it to read certificates and keys,
|
|
5
|
-
* which only come from the raw connections a browser cannot open, or in a form
|
|
6
|
-
* the browser's own Web Crypto does not read synchronously; so it refuses (see
|
|
7
|
-
* `refusals.ts`).
|
|
8
|
-
*/
|
|
9
|
-
/** Refuses: there is no certificate parser in a browser. */
|
|
10
|
-
export declare class X509Certificate {
|
|
11
|
-
constructor();
|
|
12
|
-
}
|
|
13
|
-
/** Refuses: a browser has no synchronous hash. */
|
|
14
|
-
export declare function createHash(): never;
|
|
15
|
-
/** Refuses: a browser has no synchronous key parser. */
|
|
16
|
-
export declare function createPublicKey(): never;
|
package/dist/browser/crypto.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:crypto` for a browser. The hints use it to read certificates and keys,
|
|
5
|
-
* which only come from the raw connections a browser cannot open, or in a form
|
|
6
|
-
* the browser's own Web Crypto does not read synchronously; so it refuses (see
|
|
7
|
-
* `refusals.ts`).
|
|
8
|
-
*/
|
|
9
|
-
import { refuse } from './refusals.js';
|
|
10
|
-
/** Refuses: there is no certificate parser in a browser. */
|
|
11
|
-
export class X509Certificate {
|
|
12
|
-
constructor() {
|
|
13
|
-
refuse('crypto', 'parse an X.509 certificate');
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
/** Refuses: a browser has no synchronous hash. */
|
|
17
|
-
export function createHash() {
|
|
18
|
-
return refuse('crypto', 'hash synchronously');
|
|
19
|
-
}
|
|
20
|
-
/** Refuses: a browser has no synchronous key parser. */
|
|
21
|
-
export function createPublicKey() {
|
|
22
|
-
return refuse('crypto', 'parse a public key synchronously');
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=crypto.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/browser/crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,4DAA4D;AAC5D,MAAM,OAAO,eAAe;IAC1B;QACE,MAAM,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAC;IACjD,CAAC;CACF;AAED,kDAAkD;AAClD,MAAM,UAAU,UAAU;IACxB,OAAO,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AAChD,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,eAAe;IAC7B,OAAO,MAAM,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/browser/fs.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:fs/promises`, `node:os` and `node:path` for a browser, as far as the
|
|
5
|
-
* hints use them (to hand openssl a file): writing refuses (see
|
|
6
|
-
* `refusals.ts`).
|
|
7
|
-
*/
|
|
8
|
-
/** Refuses: a browser has no file system. */
|
|
9
|
-
export declare function mkdtemp(): Promise<never>;
|
|
10
|
-
/** Refuses: a browser has no file system. */
|
|
11
|
-
export declare function writeFile(): Promise<never>;
|
|
12
|
-
/** Refuses: a browser has no file system. */
|
|
13
|
-
export declare function rm(): Promise<never>;
|
|
14
|
-
/** No temporary folder in a browser. */
|
|
15
|
-
export declare function tmpdir(): string;
|
|
16
|
-
/** Joins path pieces with `/`. */
|
|
17
|
-
export declare function join(...parts: readonly string[]): string;
|
package/dist/browser/fs.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:fs/promises`, `node:os` and `node:path` for a browser, as far as the
|
|
5
|
-
* hints use them (to hand openssl a file): writing refuses (see
|
|
6
|
-
* `refusals.ts`).
|
|
7
|
-
*/
|
|
8
|
-
import { refuse } from './refusals.js';
|
|
9
|
-
/** A refusal to touch the file system, as a rejected promise. */
|
|
10
|
-
function refused() {
|
|
11
|
-
return new Promise(() => refuse('file', 'write a file'));
|
|
12
|
-
}
|
|
13
|
-
/** Refuses: a browser has no file system. */
|
|
14
|
-
export function mkdtemp() {
|
|
15
|
-
return refused();
|
|
16
|
-
}
|
|
17
|
-
/** Refuses: a browser has no file system. */
|
|
18
|
-
export function writeFile() {
|
|
19
|
-
return refused();
|
|
20
|
-
}
|
|
21
|
-
/** Refuses: a browser has no file system. */
|
|
22
|
-
export function rm() {
|
|
23
|
-
return refused();
|
|
24
|
-
}
|
|
25
|
-
/** No temporary folder in a browser. */
|
|
26
|
-
export function tmpdir() {
|
|
27
|
-
return '';
|
|
28
|
-
}
|
|
29
|
-
/** Joins path pieces with `/`. */
|
|
30
|
-
export function join(...parts) {
|
|
31
|
-
return parts.join('/');
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=fs.js.map
|
package/dist/browser/fs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/browser/fs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,iEAAiE;AACjE,SAAS,OAAO;IACd,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,OAAO;IACrB,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,EAAE;IAChB,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,MAAM;IACpB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,IAAI,CAAC,GAAG,KAAwB;IAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
package/dist/browser/hint.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* The one runtime value the hints take from `hint`: the scope enum. Webhint's
|
|
5
|
-
* engine needs Node and a Chromium, so a browser gets this instead; the rest of
|
|
6
|
-
* what the hints import from `hint` is types, which vanish when compiled.
|
|
7
|
-
*/
|
|
8
|
-
/** Where a hint applies, as webhint's `HintScope`. */
|
|
9
|
-
export declare enum HintScope {
|
|
10
|
-
local = "local",
|
|
11
|
-
site = "site",
|
|
12
|
-
any = "any"
|
|
13
|
-
}
|
package/dist/browser/hint.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* The one runtime value the hints take from `hint`: the scope enum. Webhint's
|
|
5
|
-
* engine needs Node and a Chromium, so a browser gets this instead; the rest of
|
|
6
|
-
* what the hints import from `hint` is types, which vanish when compiled.
|
|
7
|
-
*/
|
|
8
|
-
/** Where a hint applies, as webhint's `HintScope`. */
|
|
9
|
-
export var HintScope;
|
|
10
|
-
(function (HintScope) {
|
|
11
|
-
HintScope["local"] = "local";
|
|
12
|
-
HintScope["site"] = "site";
|
|
13
|
-
HintScope["any"] = "any";
|
|
14
|
-
})(HintScope || (HintScope = {}));
|
|
15
|
-
//# sourceMappingURL=hint.js.map
|
package/dist/browser/hint.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hint.js","sourceRoot":"","sources":["../../src/browser/hint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sDAAsD;AACtD,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,4BAAe,CAAA;IACf,0BAAa,CAAA;IACb,wBAAW,CAAA;AACb,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB"}
|
package/dist/browser/http.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:http` and `node:https` for a browser: the hints use them for requests
|
|
5
|
-
* `fetch` cannot make (any method, any `Host`), so they refuse (see
|
|
6
|
-
* `refusals.ts`).
|
|
7
|
-
*/
|
|
8
|
-
/** Refuses: a browser can only make the requests `fetch` allows. */
|
|
9
|
-
export declare function request(): never;
|
package/dist/browser/http.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:http` and `node:https` for a browser: the hints use them for requests
|
|
5
|
-
* `fetch` cannot make (any method, any `Host`), so they refuse (see
|
|
6
|
-
* `refusals.ts`).
|
|
7
|
-
*/
|
|
8
|
-
import { refuse } from './refusals.js';
|
|
9
|
-
/** Refuses: a browser can only make the requests `fetch` allows. */
|
|
10
|
-
export function request() {
|
|
11
|
-
return refuse('socket', 'make a raw HTTP request');
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=http.js.map
|
package/dist/browser/http.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/browser/http.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,oEAAoE;AACpE,MAAM,UAAU,OAAO;IACrB,OAAO,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/browser/net.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:net` for a browser: telling addresses apart works, connecting refuses
|
|
5
|
-
* (see `refusals.ts`).
|
|
6
|
-
*/
|
|
7
|
-
/** Whether `value` is an IPv4 address, as Node's `isIPv4`. */
|
|
8
|
-
export declare function isIPv4(value: string): boolean;
|
|
9
|
-
/** Whether `value` is an IPv6 address, as Node's `isIPv6`. */
|
|
10
|
-
export declare function isIPv6(value: string): boolean;
|
|
11
|
-
/** 4, 6 or 0 for an IPv4 address, an IPv6 address or neither, as Node's `isIP`. */
|
|
12
|
-
export declare function isIP(value: string): 0 | 4 | 6;
|
|
13
|
-
/** Refuses: a browser cannot open a raw TCP connection. */
|
|
14
|
-
export declare function connect(): never;
|
package/dist/browser/net.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:net` for a browser: telling addresses apart works, connecting refuses
|
|
5
|
-
* (see `refusals.ts`).
|
|
6
|
-
*/
|
|
7
|
-
import { refuse } from './refusals.js';
|
|
8
|
-
const IPV4 = /^(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}$/;
|
|
9
|
-
/** Whether `value` is an IPv4 address, as Node's `isIPv4`. */
|
|
10
|
-
export function isIPv4(value) {
|
|
11
|
-
return IPV4.test(value);
|
|
12
|
-
}
|
|
13
|
-
/** Whether `value` is an IPv6 address, as Node's `isIPv6`. */
|
|
14
|
-
export function isIPv6(value) {
|
|
15
|
-
if (!value.includes(':') || /[^0-9a-f:.%]/i.test(value.split('%')[0] ?? '')) {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
try {
|
|
19
|
-
return new URL(`http://[${value.split('%')[0]}]/`).hostname !== '';
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/** 4, 6 or 0 for an IPv4 address, an IPv6 address or neither, as Node's `isIP`. */
|
|
26
|
-
export function isIP(value) {
|
|
27
|
-
if (isIPv4(value)) {
|
|
28
|
-
return 4;
|
|
29
|
-
}
|
|
30
|
-
return isIPv6(value) ? 6 : 0;
|
|
31
|
-
}
|
|
32
|
-
/** Refuses: a browser cannot open a raw TCP connection. */
|
|
33
|
-
export function connect() {
|
|
34
|
-
return refuse('socket', 'open a raw TCP connection');
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=net.js.map
|
package/dist/browser/net.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"net.js","sourceRoot":"","sources":["../../src/browser/net.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,IAAI,GACR,6EAA6E,CAAC;AAEhF,8DAA8D;AAC9D,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,IAAI,CAAC,KAAa;IAChC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,OAAO;IACrB,OAAO,MAAM,CAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* What the browser stand-ins refused. A browser cannot open raw TCP or TLS
|
|
5
|
-
* connections, start a program or read files, so the stand-ins in this folder
|
|
6
|
-
* (swapped in for Node's modules by the `browser` field of `package.json`)
|
|
7
|
-
* throw instead. Many hints catch connection errors and report them as the
|
|
8
|
-
* site's fault ("no HTTPS", "mail server unreachable"), which would be wrong
|
|
9
|
-
* here; so each refusal is also noted, and whoever runs the hints in a browser
|
|
10
|
-
* reads the note after each hint and shows that hint as not run.
|
|
11
|
-
*
|
|
12
|
-
* The note is one set for the whole module, so it is only accurate when one
|
|
13
|
-
* hint runs at a time in this JavaScript realm (one per Web Worker, say).
|
|
14
|
-
*/
|
|
15
|
-
/** What a hint asked for that a browser cannot give. */
|
|
16
|
-
export type Refusal = 'socket' | 'process' | 'file' | 'crypto';
|
|
17
|
-
/** Thrown in place of the connection, process or file a hint asked for. */
|
|
18
|
-
export declare class BrowserRefusalError extends Error {
|
|
19
|
-
readonly refusal: Refusal;
|
|
20
|
-
constructor(refusal: Refusal, what: string);
|
|
21
|
-
}
|
|
22
|
-
/** Note the refusal and throw it. */
|
|
23
|
-
export declare function refuse(refusal: Refusal, what: string): never;
|
|
24
|
-
/** What was refused since the last call, and start a fresh note. */
|
|
25
|
-
export declare function takeRefusals(): ReadonlySet<Refusal>;
|
package/dist/browser/refusals.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* What the browser stand-ins refused. A browser cannot open raw TCP or TLS
|
|
5
|
-
* connections, start a program or read files, so the stand-ins in this folder
|
|
6
|
-
* (swapped in for Node's modules by the `browser` field of `package.json`)
|
|
7
|
-
* throw instead. Many hints catch connection errors and report them as the
|
|
8
|
-
* site's fault ("no HTTPS", "mail server unreachable"), which would be wrong
|
|
9
|
-
* here; so each refusal is also noted, and whoever runs the hints in a browser
|
|
10
|
-
* reads the note after each hint and shows that hint as not run.
|
|
11
|
-
*
|
|
12
|
-
* The note is one set for the whole module, so it is only accurate when one
|
|
13
|
-
* hint runs at a time in this JavaScript realm (one per Web Worker, say).
|
|
14
|
-
*/
|
|
15
|
-
/** Thrown in place of the connection, process or file a hint asked for. */
|
|
16
|
-
export class BrowserRefusalError extends Error {
|
|
17
|
-
refusal;
|
|
18
|
-
constructor(refusal, what) {
|
|
19
|
-
super(`A browser cannot ${what}.`);
|
|
20
|
-
this.name = 'BrowserRefusalError';
|
|
21
|
-
this.refusal = refusal;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
const noted = new Set();
|
|
25
|
-
/** Note the refusal and throw it. */
|
|
26
|
-
export function refuse(refusal, what) {
|
|
27
|
-
noted.add(refusal);
|
|
28
|
-
throw new BrowserRefusalError(refusal, what);
|
|
29
|
-
}
|
|
30
|
-
/** What was refused since the last call, and start a fresh note. */
|
|
31
|
-
export function takeRefusals() {
|
|
32
|
-
const taken = new Set(noted);
|
|
33
|
-
noted.clear();
|
|
34
|
-
return taken;
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=refusals.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"refusals.js","sourceRoot":"","sources":["../../src/browser/refusals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,2EAA2E;AAC3E,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5B,OAAO,CAAU;IAEjC,YAAmB,OAAgB,EAAE,IAAY;QAC/C,KAAK,CAAC,oBAAoB,IAAI,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAW,CAAC;AAEjC,qCAAqC;AACrC,MAAM,UAAU,MAAM,CAAC,OAAgB,EAAE,IAAY;IACnD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,IAAI,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,YAAY;IAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/browser/tls.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:tls` for a browser: connecting refuses (see `refusals.ts`), and there
|
|
5
|
-
* is no root store to read.
|
|
6
|
-
*/
|
|
7
|
-
/** No roots: a browser does not expose its trust store. */
|
|
8
|
-
export declare const rootCertificates: readonly string[];
|
|
9
|
-
/** Refuses: a browser cannot open a TLS connection it can inspect. */
|
|
10
|
-
export declare function connect(): never;
|
|
11
|
-
/** Refuses: there is no certificate to check without a connection. */
|
|
12
|
-
export declare function checkServerIdentity(): never;
|
|
13
|
-
declare const _default: {
|
|
14
|
-
connect: typeof connect;
|
|
15
|
-
checkServerIdentity: typeof checkServerIdentity;
|
|
16
|
-
rootCertificates: readonly string[];
|
|
17
|
-
};
|
|
18
|
-
export default _default;
|
package/dist/browser/tls.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:tls` for a browser: connecting refuses (see `refusals.ts`), and there
|
|
5
|
-
* is no root store to read.
|
|
6
|
-
*/
|
|
7
|
-
import { refuse } from './refusals.js';
|
|
8
|
-
/** No roots: a browser does not expose its trust store. */
|
|
9
|
-
export const rootCertificates = [];
|
|
10
|
-
/** Refuses: a browser cannot open a TLS connection it can inspect. */
|
|
11
|
-
export function connect() {
|
|
12
|
-
return refuse('socket', 'open a TLS connection it can inspect');
|
|
13
|
-
}
|
|
14
|
-
/** Refuses: there is no certificate to check without a connection. */
|
|
15
|
-
export function checkServerIdentity() {
|
|
16
|
-
return refuse('socket', 'check a certificate it never received');
|
|
17
|
-
}
|
|
18
|
-
export default { connect, checkServerIdentity, rootCertificates };
|
|
19
|
-
//# sourceMappingURL=tls.js.map
|
package/dist/browser/tls.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tls.js","sourceRoot":"","sources":["../../src/browser/tls.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAsB,EAAE,CAAC;AAEtD,sEAAsE;AACtE,MAAM,UAAU,OAAO;IACrB,OAAO,MAAM,CAAC,QAAQ,EAAE,sCAAsC,CAAC,CAAC;AAClE,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,mBAAmB;IACjC,OAAO,MAAM,CAAC,QAAQ,EAAE,uCAAuC,CAAC,CAAC;AACnE,CAAC;AAED,eAAe,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,CAAC"}
|
package/dist/browser/url.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:url` for a browser, as far as the hints use it: the ASCII form of a
|
|
5
|
-
* domain name, which the URL parser works out.
|
|
6
|
-
*/
|
|
7
|
-
/** The punycode form of `domain`, or `''` when it is not a valid name, as Node's. */
|
|
8
|
-
export declare function domainToASCII(domain: string): string;
|
package/dist/browser/url.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* `node:url` for a browser, as far as the hints use it: the ASCII form of a
|
|
5
|
-
* domain name, which the URL parser works out.
|
|
6
|
-
*/
|
|
7
|
-
/** The punycode form of `domain`, or `''` when it is not a valid name, as Node's. */
|
|
8
|
-
export function domainToASCII(domain) {
|
|
9
|
-
try {
|
|
10
|
-
return new URL(`http://${domain}/`).hostname;
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return '';
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=url.js.map
|
package/dist/browser/url.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/browser/url.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,UAAU,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/lib/tls/remote.d.ts
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import type { EphemeralKey } from './evaluate.js';
|
|
2
|
-
import type { TlsConnect } from './client.js';
|
|
3
|
-
/** A certificate name, as the prober writes it. */
|
|
4
|
-
export interface RemoteName {
|
|
5
|
-
common_name?: string;
|
|
6
|
-
organization?: string;
|
|
7
|
-
country?: string;
|
|
8
|
-
}
|
|
9
|
-
/** The certificate facts the prober reads. */
|
|
10
|
-
export interface RemoteCertificate {
|
|
11
|
-
subject: RemoteName;
|
|
12
|
-
issuer: RemoteName;
|
|
13
|
-
subject_alt_names: string;
|
|
14
|
-
valid_from: string;
|
|
15
|
-
valid_to: string;
|
|
16
|
-
serial_number: string;
|
|
17
|
-
fingerprint256: string;
|
|
18
|
-
key_type: string;
|
|
19
|
-
bits?: number;
|
|
20
|
-
asn1_curve?: string;
|
|
21
|
-
signature_algorithm: string;
|
|
22
|
-
}
|
|
23
|
-
/** What the prober answers. */
|
|
24
|
-
export interface RemoteHandshake {
|
|
25
|
-
protocol: string;
|
|
26
|
-
cipher: {
|
|
27
|
-
name: string;
|
|
28
|
-
standard_name: string;
|
|
29
|
-
};
|
|
30
|
-
authorized: boolean;
|
|
31
|
-
authorization_error: string | null;
|
|
32
|
-
ephemeral: EphemeralKey | null;
|
|
33
|
-
/** DER, base64, leaf first. */
|
|
34
|
-
chain: string[] | null;
|
|
35
|
-
certificates: RemoteCertificate[] | null;
|
|
36
|
-
/** DER, base64. */
|
|
37
|
-
ocsp: string | null;
|
|
38
|
-
compression?: boolean;
|
|
39
|
-
}
|
|
40
|
-
/** What is asked of the prober. */
|
|
41
|
-
export interface RemoteRequest {
|
|
42
|
-
host: string;
|
|
43
|
-
port: number;
|
|
44
|
-
starttls?: 'smtp';
|
|
45
|
-
min_version?: string;
|
|
46
|
-
max_version?: string;
|
|
47
|
-
/** An OpenSSL cipher list. */
|
|
48
|
-
ciphers?: string;
|
|
49
|
-
/** An OpenSSL signature algorithm list. */
|
|
50
|
-
sigalgs?: string;
|
|
51
|
-
/** Colon separated key exchange groups. */
|
|
52
|
-
ecdh_curve?: string;
|
|
53
|
-
request_ocsp?: boolean;
|
|
54
|
-
}
|
|
55
|
-
/** Makes one request to the prober; rejects when the handshake failed. */
|
|
56
|
-
export type RemoteCall = (request: RemoteRequest) => Promise<RemoteHandshake>;
|
|
57
|
-
/** A `TlsConnect` that asks the prober. */
|
|
58
|
-
export declare function remoteConnect(call: RemoteCall): TlsConnect;
|
package/dist/lib/tls/remote.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { TLS_VERSIONS } from './constants.js';
|
|
2
|
-
/** The base64 text as bytes. */
|
|
3
|
-
function bytesOf(base64) {
|
|
4
|
-
return Buffer.from(base64, 'base64');
|
|
5
|
-
}
|
|
6
|
-
/** A name as Node shows it: `CN`, `O` and `C`. */
|
|
7
|
-
function nodeName(name) {
|
|
8
|
-
return {
|
|
9
|
-
...(name?.common_name ? { CN: name.common_name } : {}),
|
|
10
|
-
...(name?.organization ? { O: name.organization } : {}),
|
|
11
|
-
...(name?.country ? { C: name.country } : {}),
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
/** The leaf certificate as Node shows it, from what the prober read. */
|
|
15
|
-
function peerOf(certs, chain) {
|
|
16
|
-
const leaf = certs[0];
|
|
17
|
-
return {
|
|
18
|
-
subject: nodeName(leaf?.subject),
|
|
19
|
-
issuer: nodeName(leaf?.issuer),
|
|
20
|
-
subjectaltname: leaf?.subject_alt_names,
|
|
21
|
-
valid_from: leaf?.valid_from,
|
|
22
|
-
valid_to: leaf?.valid_to,
|
|
23
|
-
serialNumber: leaf?.serial_number,
|
|
24
|
-
fingerprint256: leaf?.fingerprint256,
|
|
25
|
-
bits: leaf?.bits,
|
|
26
|
-
asn1Curve: leaf?.asn1_curve,
|
|
27
|
-
raw: chain[0],
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
/** A `TlsConnect` that asks the prober. */
|
|
31
|
-
export function remoteConnect(call) {
|
|
32
|
-
return async (target, options) => {
|
|
33
|
-
const answer = await call({
|
|
34
|
-
host: target.host,
|
|
35
|
-
port: target.port,
|
|
36
|
-
...(target.starttls ? { starttls: target.starttls } : {}),
|
|
37
|
-
...(options.minVersion ? { min_version: options.minVersion } : {}),
|
|
38
|
-
...(options.maxVersion ? { max_version: options.maxVersion } : {}),
|
|
39
|
-
...(options.ciphers ? { ciphers: options.ciphers } : {}),
|
|
40
|
-
...(options.sigalgs ? { sigalgs: options.sigalgs } : {}),
|
|
41
|
-
...(options.ecdhCurve ? { ecdh_curve: options.ecdhCurve } : {}),
|
|
42
|
-
...(options.requestOCSP ? { request_ocsp: true } : {}),
|
|
43
|
-
});
|
|
44
|
-
const chain = (answer.chain ?? []).map(bytesOf);
|
|
45
|
-
const protocol = TLS_VERSIONS.includes(answer.protocol)
|
|
46
|
-
? answer.protocol
|
|
47
|
-
: null;
|
|
48
|
-
const result = {
|
|
49
|
-
protocol,
|
|
50
|
-
cipher: {
|
|
51
|
-
name: answer.cipher.name,
|
|
52
|
-
standardName: answer.cipher.standard_name,
|
|
53
|
-
},
|
|
54
|
-
ephemeral: answer.ephemeral,
|
|
55
|
-
authorized: answer.authorized,
|
|
56
|
-
authorizationError: answer.authorization_error,
|
|
57
|
-
chain,
|
|
58
|
-
peerCertificate: peerOf(answer.certificates ?? [], chain),
|
|
59
|
-
ocspResponse: answer.ocsp ? bytesOf(answer.ocsp) : null,
|
|
60
|
-
};
|
|
61
|
-
return result;
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=remote.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../src/lib/tls/remote.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAmB,MAAM,gBAAgB,CAAC;AA4D/D,gCAAgC;AAChC,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,kDAAkD;AAClD,SAAS,QAAQ,CAAC,IAA4B;IAC5C,OAAO;QACL,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,SAAS,MAAM,CACb,KAAmC,EACnC,KAAwB;IAExB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;QAChC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAC9B,cAAc,EAAE,IAAI,EAAE,iBAAiB;QACvC,UAAU,EAAE,IAAI,EAAE,UAAU;QAC5B,QAAQ,EAAE,IAAI,EAAE,QAAQ;QACxB,YAAY,EAAE,IAAI,EAAE,aAAa;QACjC,cAAc,EAAE,IAAI,EAAE,cAAc;QACpC,IAAI,EAAE,IAAI,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI,EAAE,UAAU;QAC3B,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;KACgB,CAAC;AAClC,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;YACxB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvD,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAI,YAAkC,CAAC,QAAQ,CAC3D,MAAM,CAAC,QAAQ,CAChB;YACC,CAAC,CAAE,MAAM,CAAC,QAAuB;YACjC,CAAC,CAAC,IAAI,CAAC;QACT,MAAM,MAAM,GAAgB;YAC1B,QAAQ;YACR,MAAM,EAAE;gBACN,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;gBACxB,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa;aAC1C;YACD,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,kBAAkB,EAAE,MAAM,CAAC,mBAAmB;YAC9C,KAAK;YACL,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE,KAAK,CAAC;YACzD,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SACxD,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|