entities 6.0.1 → 8.0.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/dist/decode-codepoint.d.ts +8 -0
- package/dist/decode-codepoint.d.ts.map +1 -0
- package/dist/decode-codepoint.js +46 -0
- package/dist/decode-codepoint.js.map +1 -0
- package/dist/{esm/decode.d.ts → decode.d.ts} +11 -26
- package/dist/decode.d.ts.map +1 -0
- package/dist/{esm/decode.js → decode.js} +130 -83
- package/dist/decode.js.map +1 -0
- package/dist/{commonjs/encode.d.ts → encode.d.ts} +2 -0
- package/dist/encode.d.ts.map +1 -0
- package/dist/encode.js +90 -0
- package/dist/encode.js.map +1 -0
- package/dist/{esm/escape.d.ts → escape.d.ts} +13 -8
- package/dist/escape.d.ts.map +1 -0
- package/dist/{esm/escape.js → escape.js} +49 -34
- package/dist/escape.js.map +1 -0
- package/dist/generated/decode-data-html.d.ts +3 -0
- package/dist/generated/decode-data-html.d.ts.map +1 -0
- package/dist/generated/decode-data-html.js +5 -0
- package/dist/generated/decode-data-html.js.map +1 -0
- package/dist/generated/decode-data-xml.d.ts +3 -0
- package/dist/generated/decode-data-xml.d.ts.map +1 -0
- package/dist/generated/decode-data-xml.js +5 -0
- package/dist/generated/decode-data-xml.js.map +1 -0
- package/dist/generated/encode-html.d.ts +5 -0
- package/dist/generated/encode-html.d.ts.map +1 -0
- package/dist/generated/encode-html.js +12 -0
- package/dist/generated/encode-html.js.map +1 -0
- package/dist/{commonjs/index.d.ts → index.d.ts} +10 -17
- package/dist/index.d.ts.map +1 -0
- package/dist/{esm/index.js → index.js} +9 -25
- package/dist/index.js.map +1 -0
- package/dist/internal/bin-trie-flags.d.ts +17 -0
- package/dist/internal/bin-trie-flags.d.ts.map +1 -0
- package/dist/internal/bin-trie-flags.js +18 -0
- package/dist/internal/bin-trie-flags.js.map +1 -0
- package/dist/internal/decode-shared.d.ts +7 -0
- package/dist/internal/decode-shared.d.ts.map +1 -0
- package/dist/internal/decode-shared.js +17 -0
- package/dist/internal/decode-shared.js.map +1 -0
- package/dist/internal/encode-shared.d.ts +33 -0
- package/dist/internal/encode-shared.d.ts.map +1 -0
- package/dist/internal/encode-shared.js +93 -0
- package/dist/internal/encode-shared.js.map +1 -0
- package/package.json +38 -73
- package/readme.md +36 -27
- package/src/decode-codepoint.ts +1 -32
- package/src/decode.ts +127 -76
- package/src/encode.ts +49 -31
- package/src/escape.ts +50 -38
- package/src/generated/decode-data-html.ts +4 -5
- package/src/generated/decode-data-xml.ts +4 -5
- package/src/generated/encode-html.ts +15 -14
- package/src/index.ts +23 -49
- package/src/internal/bin-trie-flags.ts +16 -0
- package/src/internal/decode-shared.ts +18 -0
- package/src/internal/encode-shared.ts +123 -0
- package/decode.d.ts +0 -1
- package/decode.js +0 -3
- package/dist/commonjs/decode-codepoint.d.ts +0 -19
- package/dist/commonjs/decode-codepoint.d.ts.map +0 -1
- package/dist/commonjs/decode-codepoint.js +0 -77
- package/dist/commonjs/decode-codepoint.js.map +0 -1
- package/dist/commonjs/decode.d.ts +0 -209
- package/dist/commonjs/decode.d.ts.map +0 -1
- package/dist/commonjs/decode.js +0 -511
- package/dist/commonjs/decode.js.map +0 -1
- package/dist/commonjs/encode.d.ts.map +0 -1
- package/dist/commonjs/encode.js +0 -73
- package/dist/commonjs/encode.js.map +0 -1
- package/dist/commonjs/escape.d.ts +0 -43
- package/dist/commonjs/escape.d.ts.map +0 -1
- package/dist/commonjs/escape.js +0 -121
- package/dist/commonjs/escape.js.map +0 -1
- package/dist/commonjs/generated/decode-data-html.d.ts +0 -2
- package/dist/commonjs/generated/decode-data-html.d.ts.map +0 -1
- package/dist/commonjs/generated/decode-data-html.js +0 -10
- package/dist/commonjs/generated/decode-data-html.js.map +0 -1
- package/dist/commonjs/generated/decode-data-xml.d.ts +0 -2
- package/dist/commonjs/generated/decode-data-xml.d.ts.map +0 -1
- package/dist/commonjs/generated/decode-data-xml.js +0 -10
- package/dist/commonjs/generated/decode-data-xml.js.map +0 -1
- package/dist/commonjs/generated/encode-html.d.ts +0 -8
- package/dist/commonjs/generated/encode-html.d.ts.map +0 -1
- package/dist/commonjs/generated/encode-html.js +0 -13
- package/dist/commonjs/generated/encode-html.js.map +0 -1
- package/dist/commonjs/index.d.ts.map +0 -1
- package/dist/commonjs/index.js +0 -131
- package/dist/commonjs/index.js.map +0 -1
- package/dist/commonjs/package.json +0 -3
- package/dist/esm/decode-codepoint.d.ts +0 -19
- package/dist/esm/decode-codepoint.d.ts.map +0 -1
- package/dist/esm/decode-codepoint.js +0 -72
- package/dist/esm/decode-codepoint.js.map +0 -1
- package/dist/esm/decode.d.ts.map +0 -1
- package/dist/esm/decode.js.map +0 -1
- package/dist/esm/encode.d.ts +0 -22
- package/dist/esm/encode.d.ts.map +0 -1
- package/dist/esm/encode.js +0 -69
- package/dist/esm/encode.js.map +0 -1
- package/dist/esm/escape.d.ts.map +0 -1
- package/dist/esm/escape.js.map +0 -1
- package/dist/esm/generated/decode-data-html.d.ts +0 -2
- package/dist/esm/generated/decode-data-html.d.ts.map +0 -1
- package/dist/esm/generated/decode-data-html.js +0 -7
- package/dist/esm/generated/decode-data-html.js.map +0 -1
- package/dist/esm/generated/decode-data-xml.d.ts +0 -2
- package/dist/esm/generated/decode-data-xml.d.ts.map +0 -1
- package/dist/esm/generated/decode-data-xml.js +0 -7
- package/dist/esm/generated/decode-data-xml.js.map +0 -1
- package/dist/esm/generated/encode-html.d.ts +0 -8
- package/dist/esm/generated/encode-html.d.ts.map +0 -1
- package/dist/esm/generated/encode-html.js +0 -10
- package/dist/esm/generated/encode-html.js.map +0 -1
- package/dist/esm/index.d.ts +0 -96
- package/dist/esm/index.d.ts.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/package.json +0 -3
- package/escape.d.ts +0 -1
- package/escape.js +0 -3
- package/src/decode.spec.ts +0 -320
- package/src/encode.spec.ts +0 -78
- package/src/escape.spec.ts +0 -14
- package/src/generated/.eslintrc.json +0 -10
- package/src/index.spec.ts +0 -125
package/src/index.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type DecodingMode, decodeHTML, decodeXML } from "./decode.js";
|
|
2
2
|
import { encodeHTML, encodeNonAsciiHTML } from "./encode.js";
|
|
3
3
|
import {
|
|
4
4
|
encodeXML,
|
|
5
|
-
escapeUTF8,
|
|
6
5
|
escapeAttribute,
|
|
7
6
|
escapeText,
|
|
7
|
+
escapeUTF8,
|
|
8
8
|
} from "./escape.js";
|
|
9
9
|
|
|
10
10
|
/** The level of entities to support. */
|
|
@@ -15,6 +15,9 @@ export enum EntityLevel {
|
|
|
15
15
|
HTML = 1,
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Encoding strategy used by `encode`.
|
|
20
|
+
*/
|
|
18
21
|
export enum EncodingMode {
|
|
19
22
|
/**
|
|
20
23
|
* The output is UTF-8 encoded. Only characters that need escaping within
|
|
@@ -44,6 +47,9 @@ export enum EncodingMode {
|
|
|
44
47
|
Text,
|
|
45
48
|
}
|
|
46
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Options for `decode`.
|
|
52
|
+
*/
|
|
47
53
|
export interface DecodingOptions {
|
|
48
54
|
/**
|
|
49
55
|
* The level of entities to support.
|
|
@@ -56,9 +62,6 @@ export interface DecodingOptions {
|
|
|
56
62
|
*
|
|
57
63
|
* Always `Strict` for XML. For HTML, set this to `true` if you are parsing
|
|
58
64
|
* an attribute value.
|
|
59
|
-
*
|
|
60
|
-
* The deprecated `decodeStrict` function defaults this to `Strict`.
|
|
61
|
-
*
|
|
62
65
|
* @default {@link DecodingMode.Legacy}
|
|
63
66
|
*/
|
|
64
67
|
mode?: DecodingMode | undefined;
|
|
@@ -66,7 +69,6 @@ export interface DecodingOptions {
|
|
|
66
69
|
|
|
67
70
|
/**
|
|
68
71
|
* Decodes a string with entities.
|
|
69
|
-
*
|
|
70
72
|
* @param input String to decode.
|
|
71
73
|
* @param options Decoding options.
|
|
72
74
|
*/
|
|
@@ -84,24 +86,6 @@ export function decode(
|
|
|
84
86
|
return decodeXML(input);
|
|
85
87
|
}
|
|
86
88
|
|
|
87
|
-
/**
|
|
88
|
-
* Decodes a string with entities. Does not allow missing trailing semicolons for entities.
|
|
89
|
-
*
|
|
90
|
-
* @param input String to decode.
|
|
91
|
-
* @param options Decoding options.
|
|
92
|
-
* @deprecated Use `decode` with the `mode` set to `Strict`.
|
|
93
|
-
*/
|
|
94
|
-
export function decodeStrict(
|
|
95
|
-
input: string,
|
|
96
|
-
options: DecodingOptions | EntityLevel = EntityLevel.XML,
|
|
97
|
-
): string {
|
|
98
|
-
const normalizedOptions =
|
|
99
|
-
typeof options === "number" ? { level: options } : options;
|
|
100
|
-
normalizedOptions.mode ??= DecodingMode.Strict;
|
|
101
|
-
|
|
102
|
-
return decode(input, normalizedOptions);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
89
|
/**
|
|
106
90
|
* Options for `encode`.
|
|
107
91
|
*/
|
|
@@ -120,7 +104,6 @@ export interface EncodingOptions {
|
|
|
120
104
|
|
|
121
105
|
/**
|
|
122
106
|
* Encodes a string with entities.
|
|
123
|
-
*
|
|
124
107
|
* @param input String to encode.
|
|
125
108
|
* @param options Encoding options.
|
|
126
109
|
*/
|
|
@@ -146,7 +129,7 @@ export function encode(
|
|
|
146
129
|
? encodeNonAsciiHTML(input)
|
|
147
130
|
: encodeXML(input);
|
|
148
131
|
}
|
|
149
|
-
//
|
|
132
|
+
// biome-ignore lint/complexity/noUselessSwitchCase: we get an error for the switch not being exhaustive
|
|
150
133
|
case EncodingMode.Extensive:
|
|
151
134
|
default: {
|
|
152
135
|
return level === EntityLevel.HTML
|
|
@@ -157,32 +140,23 @@ export function encode(
|
|
|
157
140
|
}
|
|
158
141
|
|
|
159
142
|
export {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
143
|
+
DecodingMode,
|
|
144
|
+
decodeHTML,
|
|
145
|
+
decodeHTMLAttribute,
|
|
146
|
+
decodeHTMLStrict,
|
|
147
|
+
decodeXML,
|
|
148
|
+
decodeXML as decodeXMLStrict,
|
|
149
|
+
EntityDecoder,
|
|
150
|
+
} from "./decode.js";
|
|
166
151
|
|
|
167
152
|
export {
|
|
168
153
|
encodeHTML,
|
|
169
154
|
encodeNonAsciiHTML,
|
|
170
|
-
// Legacy aliases (deprecated)
|
|
171
|
-
encodeHTML as encodeHTML4,
|
|
172
|
-
encodeHTML as encodeHTML5,
|
|
173
155
|
} from "./encode.js";
|
|
174
|
-
|
|
175
156
|
export {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
// Legacy aliases (deprecated)
|
|
183
|
-
decodeHTML as decodeHTML4,
|
|
184
|
-
decodeHTML as decodeHTML5,
|
|
185
|
-
decodeHTMLStrict as decodeHTML4Strict,
|
|
186
|
-
decodeHTMLStrict as decodeHTML5Strict,
|
|
187
|
-
decodeXML as decodeXMLStrict,
|
|
188
|
-
} from "./decode.js";
|
|
157
|
+
encodeXML,
|
|
158
|
+
escape,
|
|
159
|
+
escapeAttribute,
|
|
160
|
+
escapeText,
|
|
161
|
+
escapeUTF8,
|
|
162
|
+
} from "./escape.js";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bit flags & masks for the binary trie encoding used for entity decoding.
|
|
3
|
+
*
|
|
4
|
+
* Bit layout (16 bits total):
|
|
5
|
+
* 15..14 VALUE_LENGTH (+1 encoding; 0 => no value)
|
|
6
|
+
* 13 FLAG13. If valueLength>0: semicolon required flag (implicit ';').
|
|
7
|
+
* If valueLength==0: compact run flag.
|
|
8
|
+
* 12..7 BRANCH_LENGTH Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)
|
|
9
|
+
* 6..0 JUMP_TABLE Jump offset (jump table) OR single-branch char code OR first run char
|
|
10
|
+
*/
|
|
11
|
+
export enum BinTrieFlags {
|
|
12
|
+
VALUE_LENGTH = 0b1100_0000_0000_0000,
|
|
13
|
+
FLAG13 = 0b0010_0000_0000_0000,
|
|
14
|
+
BRANCH_LENGTH = 0b0001_1111_1000_0000,
|
|
15
|
+
JUMP_TABLE = 0b0000_0000_0111_1111,
|
|
16
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared base64 decode helper for generated decode data.
|
|
3
|
+
* Assumes global atob is available.
|
|
4
|
+
* @param input Input string to encode or decode.
|
|
5
|
+
*/
|
|
6
|
+
export function decodeBase64(input: string): Uint16Array {
|
|
7
|
+
const binary: string = atob(input);
|
|
8
|
+
const evenLength = binary.length & ~1; // Round down to even length
|
|
9
|
+
const out = new Uint16Array(evenLength / 2);
|
|
10
|
+
|
|
11
|
+
for (let index = 0, outIndex = 0; index < evenLength; index += 2) {
|
|
12
|
+
const lo = binary.charCodeAt(index);
|
|
13
|
+
const hi = binary.charCodeAt(index + 1);
|
|
14
|
+
out[outIndex++] = lo | (hi << 8);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A node inside the encoding trie used by `encode.ts`.
|
|
3
|
+
*
|
|
4
|
+
* There are two physical shapes to minimize allocations and lookup cost:
|
|
5
|
+
*
|
|
6
|
+
* 1. Leaf node (string)
|
|
7
|
+
* - A plain string (already in the form `"&name;"`).
|
|
8
|
+
* - Represents a terminal match with no children.
|
|
9
|
+
*
|
|
10
|
+
* 2. Branch / value node (object)
|
|
11
|
+
*/
|
|
12
|
+
export type EncodeTrieNode =
|
|
13
|
+
| string
|
|
14
|
+
| {
|
|
15
|
+
/**
|
|
16
|
+
* Entity value for the current code point sequence (wrapped: `&...;`).
|
|
17
|
+
* Present when the path to this node itself is a valid named entity.
|
|
18
|
+
*/
|
|
19
|
+
value: string | undefined;
|
|
20
|
+
/** If a number, the next code unit of the only next character. */
|
|
21
|
+
next: number | Map<number, EncodeTrieNode>;
|
|
22
|
+
/** If next is a number, `nextValue` contains the entity value. */
|
|
23
|
+
nextValue?: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Parse a compact encode trie string into a Map structure used for encoding.
|
|
28
|
+
*
|
|
29
|
+
* Format per entry (ascending code points using delta encoding):
|
|
30
|
+
* <diffBase36>[&name;][{<children>}] -- diff omitted when 0
|
|
31
|
+
* Where diff = currentKey - previousKey - 1 (first entry stores absolute key).
|
|
32
|
+
* `&name;` is the entity value (already wrapped); a following `{` denotes children.
|
|
33
|
+
* @param serialized Serialized text fragment to encode.
|
|
34
|
+
*/
|
|
35
|
+
export function parseEncodeTrie(
|
|
36
|
+
serialized: string,
|
|
37
|
+
): Map<number, EncodeTrieNode> {
|
|
38
|
+
const top = new Map<number, EncodeTrieNode>();
|
|
39
|
+
const totalLength = serialized.length;
|
|
40
|
+
let cursor = 0;
|
|
41
|
+
let lastTopKey = -1;
|
|
42
|
+
|
|
43
|
+
function readDiff(): number {
|
|
44
|
+
const start = cursor;
|
|
45
|
+
while (cursor < totalLength) {
|
|
46
|
+
const char = serialized.charAt(cursor);
|
|
47
|
+
|
|
48
|
+
if ((char < "0" || char > "9") && (char < "a" || char > "z")) {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
cursor++;
|
|
52
|
+
}
|
|
53
|
+
if (cursor === start) return 0;
|
|
54
|
+
return Number.parseInt(serialized.slice(start, cursor), 36);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function readEntity(): string {
|
|
58
|
+
if (serialized[cursor] !== "&") {
|
|
59
|
+
throw new Error(`Child entry missing value near index ${cursor}`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Cursor currently points at '&'
|
|
63
|
+
const start = cursor;
|
|
64
|
+
const end = serialized.indexOf(";", cursor + 1);
|
|
65
|
+
if (end === -1) {
|
|
66
|
+
throw new Error(`Unterminated entity starting at index ${start}`);
|
|
67
|
+
}
|
|
68
|
+
cursor = end + 1; // Move past ';'
|
|
69
|
+
return serialized.slice(start, cursor); // Includes & ... ;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
while (cursor < totalLength) {
|
|
73
|
+
const keyDiff = readDiff();
|
|
74
|
+
const key = lastTopKey === -1 ? keyDiff : lastTopKey + keyDiff + 1;
|
|
75
|
+
|
|
76
|
+
let value: string | undefined;
|
|
77
|
+
if (serialized[cursor] === "&") value = readEntity();
|
|
78
|
+
|
|
79
|
+
if (serialized[cursor] === "{") {
|
|
80
|
+
cursor++; // Skip '{'
|
|
81
|
+
// Parse first child
|
|
82
|
+
let diff = readDiff();
|
|
83
|
+
let childKey = diff; // First key (lastChildKey = -1)
|
|
84
|
+
const firstValue = readEntity();
|
|
85
|
+
if (serialized[cursor] === "{") {
|
|
86
|
+
throw new Error("Unexpected nested '{' beyond depth 2");
|
|
87
|
+
}
|
|
88
|
+
// If end of block -> single child optimization
|
|
89
|
+
if (serialized[cursor] === "}") {
|
|
90
|
+
top.set(key, { value, next: childKey, nextValue: firstValue });
|
|
91
|
+
cursor++; // Skip '}'
|
|
92
|
+
} else {
|
|
93
|
+
const childMap = new Map<number, EncodeTrieNode>([
|
|
94
|
+
[childKey, firstValue],
|
|
95
|
+
]);
|
|
96
|
+
let lastChildKey = childKey;
|
|
97
|
+
while (cursor < totalLength && serialized[cursor] !== "}") {
|
|
98
|
+
diff = readDiff();
|
|
99
|
+
childKey = lastChildKey + diff + 1;
|
|
100
|
+
const childValue = readEntity();
|
|
101
|
+
if (serialized[cursor] === "{") {
|
|
102
|
+
throw new Error("Unexpected nested '{' beyond depth 2");
|
|
103
|
+
}
|
|
104
|
+
childMap.set(childKey, childValue);
|
|
105
|
+
lastChildKey = childKey;
|
|
106
|
+
}
|
|
107
|
+
if (serialized[cursor] !== "}") {
|
|
108
|
+
throw new Error("Unterminated child block");
|
|
109
|
+
}
|
|
110
|
+
cursor++; // Skip '}'
|
|
111
|
+
top.set(key, { value, next: childMap });
|
|
112
|
+
}
|
|
113
|
+
} else if (value === undefined) {
|
|
114
|
+
throw new Error(
|
|
115
|
+
`Malformed encode trie: missing value at index ${cursor}`,
|
|
116
|
+
);
|
|
117
|
+
} else {
|
|
118
|
+
top.set(key, value);
|
|
119
|
+
}
|
|
120
|
+
lastTopKey = key;
|
|
121
|
+
}
|
|
122
|
+
return top;
|
|
123
|
+
}
|
package/decode.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "./dist/commonjs/decode.js";
|
package/decode.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point.
|
|
3
|
-
*/
|
|
4
|
-
export declare const fromCodePoint: (...codePoints: number[]) => string;
|
|
5
|
-
/**
|
|
6
|
-
* Replace the given code point with a replacement character if it is a
|
|
7
|
-
* surrogate or is outside the valid range. Otherwise return the code
|
|
8
|
-
* point unchanged.
|
|
9
|
-
*/
|
|
10
|
-
export declare function replaceCodePoint(codePoint: number): number;
|
|
11
|
-
/**
|
|
12
|
-
* Replace the code point if relevant, then convert it to a string.
|
|
13
|
-
*
|
|
14
|
-
* @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead.
|
|
15
|
-
* @param codePoint The code point to decode.
|
|
16
|
-
* @returns The decoded code point.
|
|
17
|
-
*/
|
|
18
|
-
export declare function decodeCodePoint(codePoint: number): string;
|
|
19
|
-
//# sourceMappingURL=decode-codepoint.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decode-codepoint.d.ts","sourceRoot":"","sources":["../../src/decode-codepoint.ts"],"names":[],"mappings":"AAkCA;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,KAAK,MAgBpD,CAAC;AAEN;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134
|
|
3
|
-
var _a;
|
|
4
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.fromCodePoint = void 0;
|
|
6
|
-
exports.replaceCodePoint = replaceCodePoint;
|
|
7
|
-
exports.decodeCodePoint = decodeCodePoint;
|
|
8
|
-
const decodeMap = new Map([
|
|
9
|
-
[0, 65533],
|
|
10
|
-
// C1 Unicode control character reference replacements
|
|
11
|
-
[128, 8364],
|
|
12
|
-
[130, 8218],
|
|
13
|
-
[131, 402],
|
|
14
|
-
[132, 8222],
|
|
15
|
-
[133, 8230],
|
|
16
|
-
[134, 8224],
|
|
17
|
-
[135, 8225],
|
|
18
|
-
[136, 710],
|
|
19
|
-
[137, 8240],
|
|
20
|
-
[138, 352],
|
|
21
|
-
[139, 8249],
|
|
22
|
-
[140, 338],
|
|
23
|
-
[142, 381],
|
|
24
|
-
[145, 8216],
|
|
25
|
-
[146, 8217],
|
|
26
|
-
[147, 8220],
|
|
27
|
-
[148, 8221],
|
|
28
|
-
[149, 8226],
|
|
29
|
-
[150, 8211],
|
|
30
|
-
[151, 8212],
|
|
31
|
-
[152, 732],
|
|
32
|
-
[153, 8482],
|
|
33
|
-
[154, 353],
|
|
34
|
-
[155, 8250],
|
|
35
|
-
[156, 339],
|
|
36
|
-
[158, 382],
|
|
37
|
-
[159, 376],
|
|
38
|
-
]);
|
|
39
|
-
/**
|
|
40
|
-
* Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point.
|
|
41
|
-
*/
|
|
42
|
-
exports.fromCodePoint =
|
|
43
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, n/no-unsupported-features/es-builtins
|
|
44
|
-
(_a = String.fromCodePoint) !== null && _a !== void 0 ? _a : function (codePoint) {
|
|
45
|
-
let output = "";
|
|
46
|
-
if (codePoint > 65535) {
|
|
47
|
-
codePoint -= 65536;
|
|
48
|
-
output += String.fromCharCode(((codePoint >>> 10) & 1023) | 55296);
|
|
49
|
-
codePoint = 56320 | (codePoint & 1023);
|
|
50
|
-
}
|
|
51
|
-
output += String.fromCharCode(codePoint);
|
|
52
|
-
return output;
|
|
53
|
-
};
|
|
54
|
-
/**
|
|
55
|
-
* Replace the given code point with a replacement character if it is a
|
|
56
|
-
* surrogate or is outside the valid range. Otherwise return the code
|
|
57
|
-
* point unchanged.
|
|
58
|
-
*/
|
|
59
|
-
function replaceCodePoint(codePoint) {
|
|
60
|
-
var _a;
|
|
61
|
-
if ((codePoint >= 55296 && codePoint <= 57343) ||
|
|
62
|
-
codePoint > 1114111) {
|
|
63
|
-
return 65533;
|
|
64
|
-
}
|
|
65
|
-
return (_a = decodeMap.get(codePoint)) !== null && _a !== void 0 ? _a : codePoint;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Replace the code point if relevant, then convert it to a string.
|
|
69
|
-
*
|
|
70
|
-
* @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead.
|
|
71
|
-
* @param codePoint The code point to decode.
|
|
72
|
-
* @returns The decoded code point.
|
|
73
|
-
*/
|
|
74
|
-
function decodeCodePoint(codePoint) {
|
|
75
|
-
return (0, exports.fromCodePoint)(replaceCodePoint(codePoint));
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=decode-codepoint.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decode-codepoint.js","sourceRoot":"","sources":["../../src/decode-codepoint.ts"],"names":[],"mappings":";AAAA,qHAAqH;;;;AA4DrH,4CASC;AASD,0CAEC;AA9ED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACtB,CAAC,CAAC,EAAE,KAAM,CAAC;IACX,sDAAsD;IACtD,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;CACb,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,aAAa;AACtB,8GAA8G;AAC9G,MAAA,MAAM,CAAC,aAAa,mCACpB,UAAU,SAAiB;IACvB,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,SAAS,GAAG,KAAO,EAAE,CAAC;QACtB,SAAS,IAAI,KAAS,CAAC;QACvB,MAAM,IAAI,MAAM,CAAC,YAAY,CACzB,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,GAAG,IAAM,CAAC,GAAG,KAAO,CAC1C,CAAC;QACF,SAAS,GAAG,KAAO,GAAG,CAAC,SAAS,GAAG,IAAM,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEN;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,SAAiB;;IAC9C,IACI,CAAC,SAAS,IAAI,KAAO,IAAI,SAAS,IAAI,KAAO,CAAC;QAC9C,SAAS,GAAG,OAAU,EACxB,CAAC;QACC,OAAO,KAAO,CAAC;IACnB,CAAC;IAED,OAAO,MAAA,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAI,SAAS,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,SAAiB;IAC7C,OAAO,IAAA,qBAAa,EAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
export declare enum BinTrieFlags {
|
|
2
|
-
VALUE_LENGTH = 49152,
|
|
3
|
-
BRANCH_LENGTH = 16256,
|
|
4
|
-
JUMP_TABLE = 127
|
|
5
|
-
}
|
|
6
|
-
export declare enum DecodingMode {
|
|
7
|
-
/** Entities in text nodes that can end with any character. */
|
|
8
|
-
Legacy = 0,
|
|
9
|
-
/** Only allow entities terminated with a semicolon. */
|
|
10
|
-
Strict = 1,
|
|
11
|
-
/** Entities in attributes have limitations on ending characters. */
|
|
12
|
-
Attribute = 2
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Producers for character reference errors as defined in the HTML spec.
|
|
16
|
-
*/
|
|
17
|
-
export interface EntityErrorProducer {
|
|
18
|
-
missingSemicolonAfterCharacterReference(): void;
|
|
19
|
-
absenceOfDigitsInNumericCharacterReference(consumedCharacters: number): void;
|
|
20
|
-
validateNumericCharacterReference(code: number): void;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Token decoder with support of writing partial entities.
|
|
24
|
-
*/
|
|
25
|
-
export declare class EntityDecoder {
|
|
26
|
-
/** The tree used to decode entities. */
|
|
27
|
-
private readonly decodeTree;
|
|
28
|
-
/**
|
|
29
|
-
* The function that is called when a codepoint is decoded.
|
|
30
|
-
*
|
|
31
|
-
* For multi-byte named entities, this will be called multiple times,
|
|
32
|
-
* with the second codepoint, and the same `consumed` value.
|
|
33
|
-
*
|
|
34
|
-
* @param codepoint The decoded codepoint.
|
|
35
|
-
* @param consumed The number of bytes consumed by the decoder.
|
|
36
|
-
*/
|
|
37
|
-
private readonly emitCodePoint;
|
|
38
|
-
/** An object that is used to produce errors. */
|
|
39
|
-
private readonly errors?;
|
|
40
|
-
constructor(
|
|
41
|
-
/** The tree used to decode entities. */
|
|
42
|
-
decodeTree: Uint16Array,
|
|
43
|
-
/**
|
|
44
|
-
* The function that is called when a codepoint is decoded.
|
|
45
|
-
*
|
|
46
|
-
* For multi-byte named entities, this will be called multiple times,
|
|
47
|
-
* with the second codepoint, and the same `consumed` value.
|
|
48
|
-
*
|
|
49
|
-
* @param codepoint The decoded codepoint.
|
|
50
|
-
* @param consumed The number of bytes consumed by the decoder.
|
|
51
|
-
*/
|
|
52
|
-
emitCodePoint: (cp: number, consumed: number) => void,
|
|
53
|
-
/** An object that is used to produce errors. */
|
|
54
|
-
errors?: EntityErrorProducer | undefined);
|
|
55
|
-
/** The current state of the decoder. */
|
|
56
|
-
private state;
|
|
57
|
-
/** Characters that were consumed while parsing an entity. */
|
|
58
|
-
private consumed;
|
|
59
|
-
/**
|
|
60
|
-
* The result of the entity.
|
|
61
|
-
*
|
|
62
|
-
* Either the result index of a numeric entity, or the codepoint of a
|
|
63
|
-
* numeric entity.
|
|
64
|
-
*/
|
|
65
|
-
private result;
|
|
66
|
-
/** The current index in the decode tree. */
|
|
67
|
-
private treeIndex;
|
|
68
|
-
/** The number of characters that were consumed in excess. */
|
|
69
|
-
private excess;
|
|
70
|
-
/** The mode in which the decoder is operating. */
|
|
71
|
-
private decodeMode;
|
|
72
|
-
/** Resets the instance to make it reusable. */
|
|
73
|
-
startEntity(decodeMode: DecodingMode): void;
|
|
74
|
-
/**
|
|
75
|
-
* Write an entity to the decoder. This can be called multiple times with partial entities.
|
|
76
|
-
* If the entity is incomplete, the decoder will return -1.
|
|
77
|
-
*
|
|
78
|
-
* Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the
|
|
79
|
-
* entity is incomplete, and resume when the next string is written.
|
|
80
|
-
*
|
|
81
|
-
* @param input The string containing the entity (or a continuation of the entity).
|
|
82
|
-
* @param offset The offset at which the entity begins. Should be 0 if this is not the first call.
|
|
83
|
-
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
|
|
84
|
-
*/
|
|
85
|
-
write(input: string, offset: number): number;
|
|
86
|
-
/**
|
|
87
|
-
* Switches between the numeric decimal and hexadecimal states.
|
|
88
|
-
*
|
|
89
|
-
* Equivalent to the `Numeric character reference state` in the HTML spec.
|
|
90
|
-
*
|
|
91
|
-
* @param input The string containing the entity (or a continuation of the entity).
|
|
92
|
-
* @param offset The current offset.
|
|
93
|
-
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
|
|
94
|
-
*/
|
|
95
|
-
private stateNumericStart;
|
|
96
|
-
private addToNumericResult;
|
|
97
|
-
/**
|
|
98
|
-
* Parses a hexadecimal numeric entity.
|
|
99
|
-
*
|
|
100
|
-
* Equivalent to the `Hexademical character reference state` in the HTML spec.
|
|
101
|
-
*
|
|
102
|
-
* @param input The string containing the entity (or a continuation of the entity).
|
|
103
|
-
* @param offset The current offset.
|
|
104
|
-
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
|
|
105
|
-
*/
|
|
106
|
-
private stateNumericHex;
|
|
107
|
-
/**
|
|
108
|
-
* Parses a decimal numeric entity.
|
|
109
|
-
*
|
|
110
|
-
* Equivalent to the `Decimal character reference state` in the HTML spec.
|
|
111
|
-
*
|
|
112
|
-
* @param input The string containing the entity (or a continuation of the entity).
|
|
113
|
-
* @param offset The current offset.
|
|
114
|
-
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
|
|
115
|
-
*/
|
|
116
|
-
private stateNumericDecimal;
|
|
117
|
-
/**
|
|
118
|
-
* Validate and emit a numeric entity.
|
|
119
|
-
*
|
|
120
|
-
* Implements the logic from the `Hexademical character reference start
|
|
121
|
-
* state` and `Numeric character reference end state` in the HTML spec.
|
|
122
|
-
*
|
|
123
|
-
* @param lastCp The last code point of the entity. Used to see if the
|
|
124
|
-
* entity was terminated with a semicolon.
|
|
125
|
-
* @param expectedLength The minimum number of characters that should be
|
|
126
|
-
* consumed. Used to validate that at least one digit
|
|
127
|
-
* was consumed.
|
|
128
|
-
* @returns The number of characters that were consumed.
|
|
129
|
-
*/
|
|
130
|
-
private emitNumericEntity;
|
|
131
|
-
/**
|
|
132
|
-
* Parses a named entity.
|
|
133
|
-
*
|
|
134
|
-
* Equivalent to the `Named character reference state` in the HTML spec.
|
|
135
|
-
*
|
|
136
|
-
* @param input The string containing the entity (or a continuation of the entity).
|
|
137
|
-
* @param offset The current offset.
|
|
138
|
-
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
|
|
139
|
-
*/
|
|
140
|
-
private stateNamedEntity;
|
|
141
|
-
/**
|
|
142
|
-
* Emit a named entity that was not terminated with a semicolon.
|
|
143
|
-
*
|
|
144
|
-
* @returns The number of characters consumed.
|
|
145
|
-
*/
|
|
146
|
-
private emitNotTerminatedNamedEntity;
|
|
147
|
-
/**
|
|
148
|
-
* Emit a named entity.
|
|
149
|
-
*
|
|
150
|
-
* @param result The index of the entity in the decode tree.
|
|
151
|
-
* @param valueLength The number of bytes in the entity.
|
|
152
|
-
* @param consumed The number of characters consumed.
|
|
153
|
-
*
|
|
154
|
-
* @returns The number of characters consumed.
|
|
155
|
-
*/
|
|
156
|
-
private emitNamedEntityData;
|
|
157
|
-
/**
|
|
158
|
-
* Signal to the parser that the end of the input was reached.
|
|
159
|
-
*
|
|
160
|
-
* Remaining data will be emitted and relevant errors will be produced.
|
|
161
|
-
*
|
|
162
|
-
* @returns The number of characters consumed.
|
|
163
|
-
*/
|
|
164
|
-
end(): number;
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Determines the branch of the current node that is taken given the current
|
|
168
|
-
* character. This function is used to traverse the trie.
|
|
169
|
-
*
|
|
170
|
-
* @param decodeTree The trie.
|
|
171
|
-
* @param current The current node.
|
|
172
|
-
* @param nodeIdx The index right after the current node and its value.
|
|
173
|
-
* @param char The current character.
|
|
174
|
-
* @returns The index of the next node, or -1 if no branch is taken.
|
|
175
|
-
*/
|
|
176
|
-
export declare function determineBranch(decodeTree: Uint16Array, current: number, nodeIndex: number, char: number): number;
|
|
177
|
-
/**
|
|
178
|
-
* Decodes an HTML string.
|
|
179
|
-
*
|
|
180
|
-
* @param htmlString The string to decode.
|
|
181
|
-
* @param mode The decoding mode.
|
|
182
|
-
* @returns The decoded string.
|
|
183
|
-
*/
|
|
184
|
-
export declare function decodeHTML(htmlString: string, mode?: DecodingMode): string;
|
|
185
|
-
/**
|
|
186
|
-
* Decodes an HTML string in an attribute.
|
|
187
|
-
*
|
|
188
|
-
* @param htmlAttribute The string to decode.
|
|
189
|
-
* @returns The decoded string.
|
|
190
|
-
*/
|
|
191
|
-
export declare function decodeHTMLAttribute(htmlAttribute: string): string;
|
|
192
|
-
/**
|
|
193
|
-
* Decodes an HTML string, requiring all entities to be terminated by a semicolon.
|
|
194
|
-
*
|
|
195
|
-
* @param htmlString The string to decode.
|
|
196
|
-
* @returns The decoded string.
|
|
197
|
-
*/
|
|
198
|
-
export declare function decodeHTMLStrict(htmlString: string): string;
|
|
199
|
-
/**
|
|
200
|
-
* Decodes an XML string, requiring all entities to be terminated by a semicolon.
|
|
201
|
-
*
|
|
202
|
-
* @param xmlString The string to decode.
|
|
203
|
-
* @returns The decoded string.
|
|
204
|
-
*/
|
|
205
|
-
export declare function decodeXML(xmlString: string): string;
|
|
206
|
-
export { htmlDecodeTree } from "./generated/decode-data-html.js";
|
|
207
|
-
export { xmlDecodeTree } from "./generated/decode-data-xml.js";
|
|
208
|
-
export { decodeCodePoint, replaceCodePoint, fromCodePoint, } from "./decode-codepoint.js";
|
|
209
|
-
//# sourceMappingURL=decode.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../../src/decode.ts"],"names":[],"mappings":"AAsBA,oBAAY,YAAY;IACpB,YAAY,QAAwB;IACpC,aAAa,QAAwB;IACrC,UAAU,MAAwB;CACrC;AAuCD,oBAAY,YAAY;IACpB,8DAA8D;IAC9D,MAAM,IAAI;IACV,uDAAuD;IACvD,MAAM,IAAI;IACV,oEAAoE;IACpE,SAAS,IAAI;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,uCAAuC,IAAI,IAAI,CAAC;IAChD,0CAA0C,CACtC,kBAAkB,EAAE,MAAM,GAC3B,IAAI,CAAC;IACR,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzD;AAED;;GAEG;AACH,qBAAa,aAAa;IAElB,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;;IAbxB,wCAAwC;IACvB,UAAU,EAAE,WAAW;IACxC;;;;;;;;OAQG;IACc,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI;IACtE,gDAAgD;IAC/B,MAAM,CAAC,EAAE,mBAAmB,GAAG,SAAS;IAG7D,wCAAwC;IACxC,OAAO,CAAC,KAAK,CAAkC;IAC/C,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAK;IACrB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAK;IAEnB,4CAA4C;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAK;IACnB,kDAAkD;IAClD,OAAO,CAAC,UAAU,CAAuB;IAEzC,+CAA+C;IAC/C,WAAW,CAAC,UAAU,EAAE,YAAY,GAAG,IAAI;IAS3C;;;;;;;;;;OAUG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IA8B5C;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;IAe1B;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAkBvB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAsDxB;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAYpC;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;;;;;OAMG;IACH,GAAG,IAAI,MAAM;CA6BhB;AAoDD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC3B,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACb,MAAM,CAsCR;AAKD;;;;;;GAMG;AACH,wBAAgB,UAAU,CACtB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,YAAkC,GACzC,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnD;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EACH,eAAe,EACf,gBAAgB,EAChB,aAAa,GAChB,MAAM,uBAAuB,CAAC"}
|