@browsercore/profiles 0.1.9 → 0.2.1
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 +1 -1
- package/dist/codes.d.ts +44 -4
- package/dist/codes.d.ts.map +1 -1
- package/dist/codes.js +44 -4
- package/dist/codes.js.map +1 -1
- package/dist/diff.d.ts +25 -1
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +16 -0
- package/dist/diff.js.map +1 -1
- package/dist/errors.d.ts +50 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +50 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/profiles/chrome.d.ts.map +1 -1
- package/dist/profiles/chrome.js +7 -0
- package/dist/profiles/chrome.js.map +1 -1
- package/dist/profiles/edge.d.ts.map +1 -1
- package/dist/profiles/edge.js +7 -0
- package/dist/profiles/edge.js.map +1 -1
- package/dist/profiles/firefox.d.ts.map +1 -1
- package/dist/profiles/firefox.js +20 -0
- package/dist/profiles/firefox.js.map +1 -1
- package/dist/profiles/safari.d.ts.map +1 -1
- package/dist/profiles/safari.js +6 -0
- package/dist/profiles/safari.js.map +1 -1
- package/dist/registry.d.ts +57 -4
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +57 -4
- package/dist/registry.js.map +1 -1
- package/dist/types.d.ts +55 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +36 -4
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +36 -4
- package/dist/utils.js.map +1 -1
- package/dist/validate.d.ts +62 -7
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +67 -6
- package/dist/validate.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firefox.js","sourceRoot":"","sources":["../../src/profiles/firefox.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"firefox.js","sourceRoot":"","sources":["../../src/profiles/firefox.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safari.d.ts","sourceRoot":"","sources":["../../src/profiles/safari.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"safari.d.ts","sourceRoot":"","sources":["../../src/profiles/safari.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,aAAa,CAAC;AA+F7D,eAAO,MAAM,QAAQ,EAAE,cA2BtB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,cA2BtB,CAAC;AAEF,eAAO,MAAM,cAAc;;;CAGjB,CAAC"}
|
package/dist/profiles/safari.js
CHANGED
|
@@ -43,12 +43,18 @@ const safariTlsBase = {
|
|
|
43
43
|
"rsa_pkcs1_sha1",
|
|
44
44
|
],
|
|
45
45
|
grease: true,
|
|
46
|
+
ecPointFormats: [0x00],
|
|
47
|
+
compressCertificateAlgorithms: [0x02],
|
|
46
48
|
};
|
|
47
49
|
const safariHttp2Base = {
|
|
48
50
|
initialWindowSize: 1048576,
|
|
49
51
|
maxFrameSize: 16384,
|
|
50
52
|
headerTableSize: 65536,
|
|
51
53
|
weight: 256,
|
|
54
|
+
settingsOrder: [1, 2, 4, 6],
|
|
55
|
+
grease: false,
|
|
56
|
+
connectionWindowUpdate: 0,
|
|
57
|
+
pseudoHeaderOrder: ["method", "authority", "scheme", "path"],
|
|
52
58
|
};
|
|
53
59
|
const safariHttp1Base = {
|
|
54
60
|
connection: "keep-alive",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safari.js","sourceRoot":"","sources":["../../src/profiles/safari.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,wFAAwF;AACxF,MAAM,MAAM,GAAG,uBAAuB,CAAC;AAEvC;;;;GAIG;AACH,MAAM,sBAAsB,GAAsB;IAC9C,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;CAC1D,CAAC;AAEF,MAAM,aAAa,GAAG;IAClB,cAAc,EAAE,sBAAsB;IACtC,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IAC/D,cAAc,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;IACjE;;;;;OAKG;IACH,mBAAmB,EAAE;QACjB,wBAAwB;QACxB,qBAAqB;QACrB,kBAAkB;QAClB,wBAAwB;QACxB,YAAY;QACZ,qBAAqB;QACrB,qBAAqB;QACrB,kBAAkB;QAClB,qBAAqB;QACrB,kBAAkB;QAClB,gBAAgB;KACnB;IACD,MAAM,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"safari.js","sourceRoot":"","sources":["../../src/profiles/safari.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -7,13 +7,66 @@
|
|
|
7
7
|
* evaluation; later {@link registerProfile} calls append or overwrite by id.
|
|
8
8
|
*/
|
|
9
9
|
import type { BrowserProfile, ProfileId } from "./types.js";
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* Look up a profile by its branded id.
|
|
12
|
+
*
|
|
13
|
+
* Built-in profiles (chrome, firefox, safari, edge) are always available.
|
|
14
|
+
* Custom profiles registered via {@link registerProfile} are returned here too.
|
|
15
|
+
*
|
|
16
|
+
* @param id - The {@link ProfileId} to look up.
|
|
17
|
+
* @returns The matching {@link BrowserProfile}.
|
|
18
|
+
* @throws {UnknownProfileError} If no profile with the given id is registered.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const chrome = getProfile("chrome-140" as ProfileId);
|
|
23
|
+
* console.log(chrome.tls.cipherSuites);
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @since 0.1.0
|
|
27
|
+
*/
|
|
11
28
|
export declare function getProfile(id: ProfileId): BrowserProfile;
|
|
12
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* List every registered profile id, in insertion order.
|
|
31
|
+
*
|
|
32
|
+
* Built-in profiles come first (chrome, firefox, safari, edge in that order),
|
|
33
|
+
* followed by any custom profiles registered via {@link registerProfile}.
|
|
34
|
+
* The order is stable because the registry is backed by a `Map`.
|
|
35
|
+
*
|
|
36
|
+
* @returns A readonly array of {@link ProfileId} values.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* for (const id of listProfiles()) {
|
|
41
|
+
* console.log(id); // "chrome-140", "firefox-128", ...
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @since 0.1.0
|
|
46
|
+
*/
|
|
13
47
|
export declare function listProfiles(): ReadonlyArray<ProfileId>;
|
|
14
48
|
/**
|
|
15
|
-
* Register a custom profile (e.g. a private build or a future version).
|
|
16
|
-
*
|
|
49
|
+
* Register a custom profile (e.g. a private build or a future browser version).
|
|
50
|
+
*
|
|
51
|
+
* Adds the profile to the registry, or overwrites any existing profile with the
|
|
52
|
+
* same id. After registration the profile is returned from {@link getProfile}
|
|
53
|
+
* and listed by {@link listProfiles}.
|
|
54
|
+
*
|
|
55
|
+
* @param profile - The {@link BrowserProfile} to register.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* registerProfile({
|
|
60
|
+
* id: "chrome-141" as ProfileId,
|
|
61
|
+
* name: "chrome",
|
|
62
|
+
* version: "141.0.0.0",
|
|
63
|
+
* tls: { ... },
|
|
64
|
+
* http2: { ... },
|
|
65
|
+
* http1: { ... },
|
|
66
|
+
* });
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* @since 0.1.0
|
|
17
70
|
*/
|
|
18
71
|
export declare function registerProfile(profile: BrowserProfile): void;
|
|
19
72
|
//# sourceMappingURL=registry.d.ts.map
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA2B5D
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA2B5D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,SAAS,GAAG,cAAc,CAMxD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,IAAI,aAAa,CAAC,SAAS,CAAC,CAEvD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAE7D"}
|
package/dist/registry.js
CHANGED
|
@@ -28,7 +28,24 @@ for (const profile of Object.values(SafariProfiles)) {
|
|
|
28
28
|
for (const profile of Object.values(EdgeProfiles)) {
|
|
29
29
|
index(profile);
|
|
30
30
|
}
|
|
31
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* Look up a profile by its branded id.
|
|
33
|
+
*
|
|
34
|
+
* Built-in profiles (chrome, firefox, safari, edge) are always available.
|
|
35
|
+
* Custom profiles registered via {@link registerProfile} are returned here too.
|
|
36
|
+
*
|
|
37
|
+
* @param id - The {@link ProfileId} to look up.
|
|
38
|
+
* @returns The matching {@link BrowserProfile}.
|
|
39
|
+
* @throws {UnknownProfileError} If no profile with the given id is registered.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* const chrome = getProfile("chrome-140" as ProfileId);
|
|
44
|
+
* console.log(chrome.tls.cipherSuites);
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @since 0.1.0
|
|
48
|
+
*/
|
|
32
49
|
export function getProfile(id) {
|
|
33
50
|
const profile = registry.get(id);
|
|
34
51
|
if (profile === undefined) {
|
|
@@ -36,13 +53,49 @@ export function getProfile(id) {
|
|
|
36
53
|
}
|
|
37
54
|
return profile;
|
|
38
55
|
}
|
|
39
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* List every registered profile id, in insertion order.
|
|
58
|
+
*
|
|
59
|
+
* Built-in profiles come first (chrome, firefox, safari, edge in that order),
|
|
60
|
+
* followed by any custom profiles registered via {@link registerProfile}.
|
|
61
|
+
* The order is stable because the registry is backed by a `Map`.
|
|
62
|
+
*
|
|
63
|
+
* @returns A readonly array of {@link ProfileId} values.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* for (const id of listProfiles()) {
|
|
68
|
+
* console.log(id); // "chrome-140", "firefox-128", ...
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @since 0.1.0
|
|
73
|
+
*/
|
|
40
74
|
export function listProfiles() {
|
|
41
75
|
return Array.from(registry.keys());
|
|
42
76
|
}
|
|
43
77
|
/**
|
|
44
|
-
* Register a custom profile (e.g. a private build or a future version).
|
|
45
|
-
*
|
|
78
|
+
* Register a custom profile (e.g. a private build or a future browser version).
|
|
79
|
+
*
|
|
80
|
+
* Adds the profile to the registry, or overwrites any existing profile with the
|
|
81
|
+
* same id. After registration the profile is returned from {@link getProfile}
|
|
82
|
+
* and listed by {@link listProfiles}.
|
|
83
|
+
*
|
|
84
|
+
* @param profile - The {@link BrowserProfile} to register.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* registerProfile({
|
|
89
|
+
* id: "chrome-141" as ProfileId,
|
|
90
|
+
* name: "chrome",
|
|
91
|
+
* version: "141.0.0.0",
|
|
92
|
+
* tls: { ... },
|
|
93
|
+
* http2: { ... },
|
|
94
|
+
* http1: { ... },
|
|
95
|
+
* });
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* @since 0.1.0
|
|
46
99
|
*/
|
|
47
100
|
export function registerProfile(profile) {
|
|
48
101
|
index(profile);
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEtD,SAAS,KAAK,CAAC,OAAuB;IAClC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,oDAAoD;AACpD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;IAClD,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;IACnD,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;IAClD,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEtD,SAAS,KAAK,CAAC,OAAuB;IAClC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,oDAAoD;AACpD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;IAClD,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;IACnD,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;IAClD,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,UAAU,CAAC,EAAa;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY;IACxB,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,eAAe,CAAC,OAAuB;IACnD,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -5,13 +5,26 @@
|
|
|
5
5
|
* HOW to emit it on the wire. Protocol implementations (tls, http1, http2) read
|
|
6
6
|
* these definitions and translate them into bytes / header order / settings frames.
|
|
7
7
|
*/
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Branded browser-profile identifier.
|
|
10
|
+
*
|
|
11
|
+
* Format: `"${name}-${version}"`, e.g. `"chrome-140"`, `"firefox-128"`.
|
|
12
|
+
* Branding prevents passing an arbitrary string where a validated id is expected.
|
|
13
|
+
*
|
|
14
|
+
* @see createId for building a branded id from a name + version.
|
|
15
|
+
*/
|
|
9
16
|
export type ProfileId = string & {
|
|
10
17
|
__brand: "ProfileId";
|
|
11
18
|
};
|
|
12
19
|
/** Known browser families. Discriminated-union literal set. */
|
|
13
20
|
export type ProfileName = "chrome" | "firefox" | "safari" | "edge";
|
|
14
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* TLS-layer fingerprint: everything a ClientHello reveals about the client.
|
|
23
|
+
*
|
|
24
|
+
* Stored as human-readable strings (cipher names, group names) and integer
|
|
25
|
+
* arrays (extension order). Translation to wire bytes happens in the protocol
|
|
26
|
+
* layers via {@link cipherSuiteToWire} and the IANA code tables in {@link codes.ts}.
|
|
27
|
+
*/
|
|
15
28
|
export interface TlsProfile {
|
|
16
29
|
/** Ordered list of offered cipher suites (IANA names). Order matters for fingerprinting. */
|
|
17
30
|
readonly cipherSuites: readonly string[];
|
|
@@ -25,10 +38,21 @@ export interface TlsProfile {
|
|
|
25
38
|
readonly signatureAlgorithms: readonly string[];
|
|
26
39
|
/** record_size_limit extension value, if advertised. Absent when not sent. */
|
|
27
40
|
readonly recordSizeLimit?: number;
|
|
41
|
+
/** EC point formats offered. Chrome: [0x00 (uncompressed)]. */
|
|
42
|
+
readonly ecPointFormats?: readonly number[];
|
|
43
|
+
/** compress_certificate algorithms. Chrome: [0x02 (brotli)]. */
|
|
44
|
+
readonly compressCertificateAlgorithms?: readonly number[];
|
|
45
|
+
/** Record padding target in bytes. Chrome: 512. */
|
|
46
|
+
readonly recordPadding?: number;
|
|
28
47
|
/** Whether this browser randomizes with GREASE values (RFC 8701). */
|
|
29
48
|
readonly grease: boolean;
|
|
30
49
|
}
|
|
31
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* HTTP/2 SETTINGS + tuning parameters.
|
|
52
|
+
*
|
|
53
|
+
* Captures the values a client advertises in its initial SETTINGS frame and
|
|
54
|
+
* the defaults it applies to stream priority / window sizing.
|
|
55
|
+
*/
|
|
32
56
|
export interface Http2Profile {
|
|
33
57
|
/** HTTP/2 settings the client sends in its first SETTINGS frame. */
|
|
34
58
|
readonly settings: Partial<Http2Settings>;
|
|
@@ -42,8 +66,22 @@ export interface Http2Profile {
|
|
|
42
66
|
readonly weight: number;
|
|
43
67
|
/** Default priority dependency / exclusive flag, if any. */
|
|
44
68
|
readonly priority?: Http2Priority;
|
|
69
|
+
/** Wire order of SETTINGS ids (fingerprint signal). Chrome: [1, 2, 4, 6]. */
|
|
70
|
+
readonly settingsOrder?: readonly number[];
|
|
71
|
+
/** Whether to inject GREASE settings. Chrome: true. */
|
|
72
|
+
readonly grease?: boolean;
|
|
73
|
+
/** Connection-level WINDOW_UPDATE value in preface. Chrome: 15663105. */
|
|
74
|
+
readonly connectionWindowUpdate?: number;
|
|
75
|
+
/** Pseudo-header order. Chrome: ["method", "authority", "scheme", "path"]. */
|
|
76
|
+
readonly pseudoHeaderOrder?: readonly string[];
|
|
45
77
|
}
|
|
46
|
-
/**
|
|
78
|
+
/**
|
|
79
|
+
* HTTP/2 numeric settings (RFC 9113 §6.5.1).
|
|
80
|
+
*
|
|
81
|
+
* These are the settings a client advertises in its SETTINGS frame; not every
|
|
82
|
+
* browser sends all of them, so the type is used as `Partial<Http2Settings>`
|
|
83
|
+
* in {@link Http2Profile}.
|
|
84
|
+
*/
|
|
47
85
|
export interface Http2Settings {
|
|
48
86
|
readonly headerTableSize: number;
|
|
49
87
|
readonly enablePush: boolean;
|
|
@@ -58,7 +96,12 @@ export interface Http2Priority {
|
|
|
58
96
|
readonly exclusive: boolean;
|
|
59
97
|
readonly weight: number;
|
|
60
98
|
}
|
|
61
|
-
/**
|
|
99
|
+
/**
|
|
100
|
+
* HTTP/1.1-layer fingerprint: header defaults and ordering.
|
|
101
|
+
*
|
|
102
|
+
* Models the headers a browser sends on every request and the order in which
|
|
103
|
+
* it serializes them — both are fingerprint signals.
|
|
104
|
+
*/
|
|
62
105
|
export interface Http1Profile {
|
|
63
106
|
/** Default headers sent on every request, in order. */
|
|
64
107
|
readonly defaultHeaders: Readonly<Record<string, string>>;
|
|
@@ -69,7 +112,13 @@ export interface Http1Profile {
|
|
|
69
112
|
/** Accept-Encoding value sent by default. */
|
|
70
113
|
readonly acceptEncoding: string;
|
|
71
114
|
}
|
|
72
|
-
/**
|
|
115
|
+
/**
|
|
116
|
+
* A complete browser fingerprint across all layers.
|
|
117
|
+
*
|
|
118
|
+
* Pure data — no protocol logic, no Node imports. The `id` uniquely identifies
|
|
119
|
+
* this profile in the registry. Higher layers read these definitions and
|
|
120
|
+
* translate them into wire bytes / header order / settings frames.
|
|
121
|
+
*/
|
|
73
122
|
export interface BrowserProfile {
|
|
74
123
|
readonly id: ProfileId;
|
|
75
124
|
/** Human-readable browser name. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -5,15 +5,47 @@
|
|
|
5
5
|
* cross-package imports.
|
|
6
6
|
*/
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* Compile-time exhaustiveness check for `switch`/`if-else` over discriminated unions.
|
|
9
|
+
*
|
|
10
|
+
* Call in the `default` branch with the narrowed variable: `default: assertNever(x)`.
|
|
11
|
+
* The argument is typed `never`, so adding a new union member forces every handler
|
|
12
|
+
* to compile-error until it handles the new case. At runtime (if the check is ever
|
|
13
|
+
* bypassed by an untyped value) it throws with the offending value.
|
|
14
|
+
*
|
|
15
|
+
* @param x - A value that must be `never` at compile time.
|
|
16
|
+
* @throws {Error} If reached at runtime with a non-`never` value.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* switch (state.state) {
|
|
21
|
+
* case "open": return doOpen();
|
|
22
|
+
* case "closed": return doClosed();
|
|
23
|
+
* default: return assertNever(state.state);
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @since 0.1.0
|
|
11
28
|
*/
|
|
12
29
|
export declare function assertNever(x: never): never;
|
|
13
30
|
import type { ProfileId } from "./types.js";
|
|
14
31
|
/**
|
|
15
32
|
* Build a branded {@link ProfileId} from a browser name + version.
|
|
16
|
-
*
|
|
33
|
+
*
|
|
34
|
+
* The canonical id format is `"${name}-${version}"`, e.g. `"chrome-140"`.
|
|
35
|
+
* The version is the major version only — patch-level differences within a
|
|
36
|
+
* major release do not change the fingerprint.
|
|
37
|
+
*
|
|
38
|
+
* @param name - Browser family name, e.g. `"chrome"`.
|
|
39
|
+
* @param version - Major version string, e.g. `"140"`.
|
|
40
|
+
* @returns A branded {@link ProfileId}.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* createId("chrome", "140"); // ProfileId<"chrome-140">
|
|
45
|
+
* createId("firefox", "128"); // ProfileId<"firefox-128">
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @since 0.1.0
|
|
17
49
|
*/
|
|
18
50
|
export declare function createId(name: string, version: string): ProfileId;
|
|
19
51
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAE3C;AAED,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAEjE"}
|
package/dist/utils.js
CHANGED
|
@@ -5,9 +5,26 @@
|
|
|
5
5
|
* cross-package imports.
|
|
6
6
|
*/
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* Compile-time exhaustiveness check for `switch`/`if-else` over discriminated unions.
|
|
9
|
+
*
|
|
10
|
+
* Call in the `default` branch with the narrowed variable: `default: assertNever(x)`.
|
|
11
|
+
* The argument is typed `never`, so adding a new union member forces every handler
|
|
12
|
+
* to compile-error until it handles the new case. At runtime (if the check is ever
|
|
13
|
+
* bypassed by an untyped value) it throws with the offending value.
|
|
14
|
+
*
|
|
15
|
+
* @param x - A value that must be `never` at compile time.
|
|
16
|
+
* @throws {Error} If reached at runtime with a non-`never` value.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* switch (state.state) {
|
|
21
|
+
* case "open": return doOpen();
|
|
22
|
+
* case "closed": return doClosed();
|
|
23
|
+
* default: return assertNever(state.state);
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @since 0.1.0
|
|
11
28
|
*/
|
|
12
29
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
13
30
|
export function assertNever(x) {
|
|
@@ -15,7 +32,22 @@ export function assertNever(x) {
|
|
|
15
32
|
}
|
|
16
33
|
/**
|
|
17
34
|
* Build a branded {@link ProfileId} from a browser name + version.
|
|
18
|
-
*
|
|
35
|
+
*
|
|
36
|
+
* The canonical id format is `"${name}-${version}"`, e.g. `"chrome-140"`.
|
|
37
|
+
* The version is the major version only — patch-level differences within a
|
|
38
|
+
* major release do not change the fingerprint.
|
|
39
|
+
*
|
|
40
|
+
* @param name - Browser family name, e.g. `"chrome"`.
|
|
41
|
+
* @param version - Major version string, e.g. `"140"`.
|
|
42
|
+
* @returns A branded {@link ProfileId}.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* createId("chrome", "140"); // ProfileId<"chrome-140">
|
|
47
|
+
* createId("firefox", "128"); // ProfileId<"firefox-128">
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @since 0.1.0
|
|
19
51
|
*/
|
|
20
52
|
export function createId(name, version) {
|
|
21
53
|
return `${name}-${version}`;
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,6DAA6D;AAC7D,MAAM,UAAU,WAAW,CAAC,CAAQ;IAChC,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9D,CAAC;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAe;IAClD,OAAO,GAAG,IAAI,IAAI,OAAO,EAAe,CAAC;AAC7C,CAAC"}
|
package/dist/validate.d.ts
CHANGED
|
@@ -29,6 +29,10 @@ export interface TlsCapture {
|
|
|
29
29
|
readonly keyShareGroups: readonly number[];
|
|
30
30
|
/** Signature algorithm codes offered. */
|
|
31
31
|
readonly signatureAlgorithms: readonly number[];
|
|
32
|
+
/** EC point formats observed (wire codes). Absent when the capture tool doesn't record them. */
|
|
33
|
+
readonly ecPointFormats?: readonly number[];
|
|
34
|
+
/** compress_certificate algorithms observed (wire codes). Absent when not recorded. */
|
|
35
|
+
readonly compressCertificateAlgorithms?: readonly number[];
|
|
32
36
|
/** Whether the ClientHello used GREASE randomization. */
|
|
33
37
|
readonly grease: boolean;
|
|
34
38
|
/** Optional JA3 / JA4 strings, when the capture tool computed them. */
|
|
@@ -47,6 +51,10 @@ export interface ClientHelloExpected {
|
|
|
47
51
|
readonly keyShareGroups: readonly number[];
|
|
48
52
|
/** Signature algorithm codes. */
|
|
49
53
|
readonly signatureAlgorithms: readonly number[];
|
|
54
|
+
/** EC point formats offered (wire codes). Undefined when the profile doesn't specify them. */
|
|
55
|
+
readonly ecPointFormats?: readonly number[];
|
|
56
|
+
/** compress_certificate algorithms offered (wire codes). Undefined when unspecified. */
|
|
57
|
+
readonly compressCertificateAlgorithms?: readonly number[];
|
|
50
58
|
/** Whether GREASE randomization is expected. */
|
|
51
59
|
readonly grease: boolean;
|
|
52
60
|
/** SNI hostname the client would send, derived from the connection target. */
|
|
@@ -55,11 +63,19 @@ export interface ClientHelloExpected {
|
|
|
55
63
|
/** Validation / projection failure (unknown profile value, bad capture, etc.). */
|
|
56
64
|
export declare class ValidationError extends ProfileError {
|
|
57
65
|
readonly kind: "ValidationError";
|
|
66
|
+
/**
|
|
67
|
+
* @param message - Description of what failed to validate or project.
|
|
68
|
+
* @param options - `cause` wraps the underlying error.
|
|
69
|
+
*/
|
|
58
70
|
constructor(message: string, options?: {
|
|
59
71
|
cause?: Error;
|
|
60
72
|
});
|
|
61
73
|
}
|
|
62
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Outcome of validating a profile against a captured ClientHello.
|
|
76
|
+
*
|
|
77
|
+
* Produced by {@link validateProfileAgainstCapture}.
|
|
78
|
+
*/
|
|
63
79
|
export interface ValidationResult {
|
|
64
80
|
/** True when every field matches (respecting GREASE randomization for cipher suites). */
|
|
65
81
|
readonly ok: boolean;
|
|
@@ -68,17 +84,56 @@ export interface ValidationResult {
|
|
|
68
84
|
}
|
|
69
85
|
/**
|
|
70
86
|
* Project a profile's TLS fields onto the wire values its ClientHello should
|
|
71
|
-
* carry for a connection to `serverName`.
|
|
72
|
-
*
|
|
73
|
-
*
|
|
87
|
+
* carry for a connection to `serverName`.
|
|
88
|
+
*
|
|
89
|
+
* Extension order is taken verbatim from the profile (already stored as wire
|
|
90
|
+
* codes), since extension order is a fingerprint signal. Cipher suites, named
|
|
91
|
+
* groups, signature schemes, and TLS versions are projected through the IANA
|
|
92
|
+
* code tables in {@link codes.ts}.
|
|
93
|
+
*
|
|
94
|
+
* @param profile - The {@link BrowserProfile} to project.
|
|
95
|
+
* @param serverName - The SNI server name the connection targets.
|
|
96
|
+
* @returns The {@link ClientHelloExpected} wire values.
|
|
97
|
+
* @throws {ValidationError} If the profile references an unknown cipher suite,
|
|
98
|
+
* named group, signature scheme, or TLS version.
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* const expected = buildExpectedClientHello(chrome140, "example.com");
|
|
103
|
+
* // expected.cipherSuites = [0x1301, 0x1302, ...]
|
|
104
|
+
* ```
|
|
105
|
+
*
|
|
106
|
+
* @since 0.1.0
|
|
74
107
|
*/
|
|
75
108
|
export declare function buildExpectedClientHello(profile: BrowserProfile, serverName: string): ClientHelloExpected;
|
|
76
109
|
/**
|
|
77
110
|
* Validate a profile against a captured ClientHello.
|
|
78
111
|
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
112
|
+
* Projects the profile to expected wire values (via {@link buildExpectedClientHello})
|
|
113
|
+
* and compares them field-by-field against the capture. Returns `ok: true` when
|
|
114
|
+
* every field matches (respecting GREASE randomization for cipher suites), and
|
|
115
|
+
* the list of diffs otherwise.
|
|
116
|
+
*
|
|
117
|
+
* SNI is not compared because captures do not record the destination hostname.
|
|
118
|
+
*
|
|
119
|
+
* @param profile - The {@link BrowserProfile} to validate.
|
|
120
|
+
* @param capture - A {@link TlsCapture} parsed from a packet capture.
|
|
121
|
+
* @returns A {@link ValidationResult} indicating match/mismatch.
|
|
122
|
+
* @throws {ValidationError} If the profile references an unknown cipher suite,
|
|
123
|
+
* named group, signature scheme, or TLS version.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```ts
|
|
127
|
+
* const result = validateProfileAgainstCapture(chrome140, capture);
|
|
128
|
+
* if (!result.ok) {
|
|
129
|
+
* for (const d of result.diffs) {
|
|
130
|
+
* console.log(`${d.path}: expected ${d.a}, got ${d.b}`);
|
|
131
|
+
* }
|
|
132
|
+
* }
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* @see buildExpectedClientHello for the projection step.
|
|
136
|
+
* @since 0.1.0
|
|
82
137
|
*/
|
|
83
138
|
export declare function validateProfileAgainstCapture(profile: BrowserProfile, capture: TlsCapture): ValidationResult;
|
|
84
139
|
//# sourceMappingURL=validate.d.ts.map
|
package/dist/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,wFAAwF;AACxF,MAAM,WAAW,UAAU;IACvB,iEAAiE;IACjE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,mDAAmD;IACnD,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,qEAAqE;IACrE,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,yCAAyC;IACzC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,yCAAyC;IACzC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,uEAAuE;IACvE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAChC,yDAAyD;IACzD,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,2CAA2C;IAC3C,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,yDAAyD;IACzD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,iCAAiC;IACjC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,iCAAiC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACxB;AAED,kFAAkF;AAClF,qBAAa,eAAgB,SAAQ,YAAY;IAC7C,SAAyB,IAAI,EAAG,iBAAiB,CAAU;IAE3D,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,EAGvD;CACJ;AAED
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,wFAAwF;AACxF,MAAM,WAAW,UAAU;IACvB,iEAAiE;IACjE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,mDAAmD;IACnD,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,qEAAqE;IACrE,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,yCAAyC;IACzC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,yCAAyC;IACzC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,gGAAgG;IAChG,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,uFAAuF;IACvF,QAAQ,CAAC,6BAA6B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3D,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,uEAAuE;IACvE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAChC,yDAAyD;IACzD,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,2CAA2C;IAC3C,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,yDAAyD;IACzD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,iCAAiC;IACjC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,iCAAiC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,8FAA8F;IAC9F,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,wFAAwF;IACxF,QAAQ,CAAC,6BAA6B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3D,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACxB;AAED,kFAAkF;AAClF,qBAAa,eAAgB,SAAQ,YAAY;IAC7C,SAAyB,IAAI,EAAG,iBAAiB,CAAU;IAE3D;;;OAGG;IACH,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,EAGvD;CACJ;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,uFAAuF;IACvF,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;CACjC;AAkCD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,wBAAwB,CACpC,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,GACnB,mBAAmB,CAkBrB;AA2DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,6BAA6B,CACzC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,UAAU,GACpB,gBAAgB,CAsClB"}
|