@jerp/xml-stream-ts 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jerome
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,116 @@
1
+ # @jerp/xml-stream-ts
2
+
3
+ A small TypeScript XML stream parser for extracting selected elements, text, attributes, and comments from arbitrarily chunked input.
4
+
5
+ It is designed for event-style parsing: define the tags you care about, stream bytes in, and receive parsed results as the matching root elements close. Unmatched branches are skipped.
6
+
7
+ ## Install
8
+
9
+ ```sh
10
+ npm install @jerp/xml-stream-ts
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```ts
16
+ import {
17
+ createParser,
18
+ decimal,
19
+ leafParser,
20
+ NamespaceMap,
21
+ rootResolver,
22
+ stringTextContent,
23
+ } from '@jerp/xml-stream-ts'
24
+
25
+ interface Book {
26
+ lang?: string | null
27
+ title?: string | null
28
+ price?: number | null
29
+ }
30
+
31
+ const nsMap = NamespaceMap.create({
32
+ '': 'urn:book',
33
+ xml: 'http://www.w3.org/XML/1998/namespace',
34
+ })
35
+
36
+ const book = rootResolver<Book>()('book', nsMap, {
37
+ attributes: ['xml:lang'] as const,
38
+ onStart(attributes) {
39
+ this.lang = stringTextContent(attributes.lang)
40
+ },
41
+ onEnd() {
42
+ return {
43
+ lang: this.lang,
44
+ title: this.title,
45
+ price: this.price,
46
+ }
47
+ },
48
+ })
49
+
50
+ book.onLeaf('title', leafParser<Book>()({
51
+ onTextContent(textContent) {
52
+ this.title = stringTextContent(textContent)
53
+ },
54
+ }))
55
+
56
+ book.onLeaf('price', leafParser<Book>()({
57
+ onTextContent(textContent) {
58
+ this.price = decimal(textContent)
59
+ },
60
+ }))
61
+
62
+ const parser = createParser<Book>(book, {})
63
+ const writer = parser.writable.getWriter()
64
+
65
+ await writer.write(new TextEncoder().encode('<book xmlns="urn:book" xml:lang="en">'))
66
+ await writer.write(new TextEncoder().encode('<title>XML Guide</title><price>19.95</price></book>'))
67
+ await writer.close()
68
+
69
+ for await (const book of parser.readable) {
70
+ console.log(book)
71
+ // { lang: 'en', title: 'XML Guide', price: 19.95 }
72
+ }
73
+ ```
74
+
75
+ ## Typed Resolvers
76
+
77
+ `rootResolver`, `tagParser`, and `leafParser` are convenience helpers around `TagResolver`. They keep resolver declarations readable while preserving TypeScript validation for callback `this` values and attribute names.
78
+
79
+ Use `as const` on `attributes` when you want precise keys in `onStart`:
80
+
81
+ ```ts
82
+ const root = rootResolver<Book>()('book', nsMap, {
83
+ attributes: ['xml:lang', 'id'] as const,
84
+ onStart(attributes) {
85
+ attributes.lang // Uint8Array | undefined
86
+ attributes.id // Uint8Array | undefined
87
+ },
88
+ })
89
+ ```
90
+
91
+ Namespaced attribute keys use the local name at runtime, so `xml:lang` is read as `attributes.lang`.
92
+
93
+ The parser callbacks receive `Uint8Array` text. Use the exported value resolvers to decode only when needed:
94
+
95
+ ```ts
96
+ stringTextContent(bytes) // string | null
97
+ decimal(bytes) // number | null
98
+ ```
99
+
100
+ ## Scope
101
+
102
+ This library parses XML elements, text, comments, attributes, namespaces, and CDATA. Processing instructions and declarations are skipped. Unmatched element branches are skipped without building a DOM.
103
+
104
+ Input is accepted as `Uint8Array` chunks through a `WritableStream`, and chunks may split anywhere in the document, including inside tag names, attributes, comments, and text.
105
+
106
+ ## Development
107
+
108
+ ```sh
109
+ npm install
110
+ npm run build
111
+ npm test
112
+ ```
113
+
114
+ ## Publishing
115
+
116
+ This package is intended to be published as `@jerp/xml-stream-ts` using npm Trusted Publishing from GitHub Actions.
@@ -0,0 +1,7 @@
1
+ export { createParser } from './parser.ts';
2
+ export { NamespaceMap } from './names.ts';
3
+ export type { FQName, Namespace } from './names.ts';
4
+ export { leafParser, rootResolver, TagResolver, tagParser } from './tagParser.ts';
5
+ export type { LeafTagParser, LeafTagParserConfig, TagAttribute, TagAttributes, TagParser, TagParserConfig } from './tagParser.ts';
6
+ export * from './valueResolver.ts';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACjF,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACjI,cAAc,oBAAoB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { createParser } from "./parser.js";
2
+ export { NamespaceMap } from "./names.js";
3
+ export { leafParser, rootResolver, TagResolver, tagParser } from "./tagParser.js";
4
+ export * from "./valueResolver.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEjF,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,39 @@
1
+ import type { TagResolver } from "./tagParser.ts";
2
+ export declare const NO_XML_PREFIX: Uint8Array<ArrayBuffer>;
3
+ export declare const PREDEFINED_XML_NAMESPACE: Namespace;
4
+ export declare const XMLNS_NAMESPACE: Namespace;
5
+ export interface Namespace {
6
+ readonly prefix: string;
7
+ readonly uri: string;
8
+ }
9
+ export interface FQName {
10
+ readonly namespace: Namespace;
11
+ readonly name: string;
12
+ }
13
+ export declare class TagNameMatcher<T> {
14
+ private nameMap;
15
+ setName(resolver: TagResolver<T>, tagName: string, namespace?: Namespace): void;
16
+ find(bytes: Uint8Array<ArrayBuffer>, begin: number, length: number, namespace?: Namespace): {
17
+ fqName: FQName;
18
+ resolver: TagResolver<T>;
19
+ } | undefined;
20
+ }
21
+ export declare class AttributeNameMatcher {
22
+ private nameMap;
23
+ setName(attributeName: string, namespace?: Namespace): void;
24
+ find(bytes: Uint8Array<ArrayBuffer>, begin: number, length: number, namespace?: Namespace): FQName | undefined;
25
+ }
26
+ export declare class NamespaceMap {
27
+ prefixes: Readonly<Uint8Array<ArrayBuffer>>[];
28
+ uris: Readonly<Uint8Array<ArrayBuffer>>[];
29
+ namespaces: Namespace[];
30
+ private constructor();
31
+ static create(nsMap: Record<string, string>): NamespaceMap;
32
+ registerNS(prefixBuffer: Uint8Array<ArrayBuffer> | null, nsUriBuffer: Uint8Array<ArrayBuffer>): NamespaceMap;
33
+ resolveNamespace(bytes: ArrayLike<number>, begin: number, prefixLength: number): Namespace;
34
+ get(prefix?: string): Namespace | undefined;
35
+ private indexOfPrefix;
36
+ private indexOfUri;
37
+ private print;
38
+ }
39
+ //# sourceMappingURL=names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,eAAO,MAAM,aAAa,yBAAoB,CAAA;AAM9C,eAAO,MAAM,wBAAwB,EAAE,SAAsE,CAAA;AAC7G,eAAO,MAAM,eAAe,EAAE,SAAoD,CAAA;AAElF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAKD,qBAAa,cAAc,CAAC,CAAC;IAC3B,OAAO,CAAC,OAAO,CAAwH;IACvI,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,SAAoC;IAYlG,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,SAAoC,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG,SAAS;CAS/K;AACD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAA6F;IAC5G,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,GAAE,SAAoC;IAY9E,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,SAAoC,GAAG,MAAM,GAAG,SAAS;CASzI;AAED,qBAAa,YAAY;IACvB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAA;IAC7C,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAA;IACzC,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,OAAO;IAKP,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAS3C,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,YAAY;IAmB5G,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS;IAiB1F,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI3C,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,KAAK;CAKd"}
package/dist/names.js ADDED
@@ -0,0 +1,141 @@
1
+ export const NO_XML_PREFIX = new Uint8Array(0);
2
+ const PREDEFINED_XML_PREFIX = "xml";
3
+ const PREDEFINED_XML_URI = 'http://www.w3.org/XML/1998/namespace';
4
+ const XMLNS_PREFIX = "xmlns";
5
+ const XMLNS_URI = 'http://www.w3.org/2000/xmlns/';
6
+ export const PREDEFINED_XML_NAMESPACE = { prefix: PREDEFINED_XML_PREFIX, uri: PREDEFINED_XML_URI };
7
+ export const XMLNS_NAMESPACE = { prefix: XMLNS_PREFIX, uri: XMLNS_URI };
8
+ const textDecoder = new TextDecoder();
9
+ const textEncoder = new TextEncoder();
10
+ export class TagNameMatcher {
11
+ nameMap = new Map();
12
+ setName(resolver, tagName, namespace = PREDEFINED_XML_NAMESPACE) {
13
+ for (const [ns, localNames] of this.nameMap.entries()) {
14
+ if (ns === namespace && localNames.some(({ fqName }) => fqName.name === tagName)) {
15
+ return;
16
+ }
17
+ }
18
+ if (!this.nameMap.has(namespace)) {
19
+ this.nameMap.set(namespace, []);
20
+ }
21
+ const name = textEncoder.encode(tagName);
22
+ this.nameMap.get(namespace).push({ name, fqName: { name: tagName, namespace }, resolver });
23
+ }
24
+ find(bytes, begin, length, namespace = PREDEFINED_XML_NAMESPACE) {
25
+ const fqNameMatches = this.nameMap.get(namespace);
26
+ if (fqNameMatches) {
27
+ const matched = fqNameMatches.find(({ name }) => name.length === length && name.every((value, index) => value === bytes[begin + index]));
28
+ if (matched) {
29
+ return { fqName: matched.fqName, resolver: matched.resolver };
30
+ }
31
+ }
32
+ }
33
+ }
34
+ export class AttributeNameMatcher {
35
+ nameMap = new Map();
36
+ setName(attributeName, namespace = PREDEFINED_XML_NAMESPACE) {
37
+ for (const [ns, localNames] of this.nameMap.entries()) {
38
+ if (ns === namespace && localNames.some(({ fqName }) => fqName.name === attributeName)) {
39
+ return;
40
+ }
41
+ }
42
+ if (!this.nameMap.has(namespace)) {
43
+ this.nameMap.set(namespace, []);
44
+ }
45
+ const name = textEncoder.encode(attributeName);
46
+ this.nameMap.get(namespace).push({ name, fqName: { name: attributeName, namespace } });
47
+ }
48
+ find(bytes, begin, length, namespace = PREDEFINED_XML_NAMESPACE) {
49
+ const fqNameMatches = this.nameMap.get(namespace);
50
+ if (fqNameMatches) {
51
+ const matched = fqNameMatches.find(({ name }) => name.length === length && name.every((value, index) => value === bytes[begin + index]));
52
+ if (matched) {
53
+ return matched.fqName;
54
+ }
55
+ }
56
+ }
57
+ }
58
+ export class NamespaceMap {
59
+ prefixes;
60
+ uris;
61
+ namespaces;
62
+ constructor(prefixes, uris, namespaces) {
63
+ this.prefixes = prefixes;
64
+ this.uris = uris;
65
+ this.namespaces = namespaces;
66
+ }
67
+ static create(nsMap) {
68
+ const nsList = Object.entries(nsMap).filter(([prefix, uri]) => {
69
+ return prefix !== 'xml' && uri !== PREDEFINED_XML_URI && prefix !== 'xmlns' && uri !== XMLNS_URI;
70
+ }).map(([prefix, uri]) => ({ prefix, uri }));
71
+ const prefixes = [PREDEFINED_XML_PREFIX, XMLNS_PREFIX].concat(nsList.map(ns => ns.prefix)).map(prefix => textEncoder.encode(prefix));
72
+ const uris = [PREDEFINED_XML_URI, XMLNS_URI].concat(nsList.map(ns => ns.uri)).map(uri => textEncoder.encode(uri));
73
+ const namespaces = [PREDEFINED_XML_NAMESPACE, XMLNS_NAMESPACE].concat(nsList);
74
+ return new NamespaceMap(prefixes, uris, namespaces);
75
+ }
76
+ registerNS(prefixBuffer, nsUriBuffer) {
77
+ const prefixIndex = this.indexOfUri(nsUriBuffer);
78
+ if (prefixIndex === -1) {
79
+ const prefix = prefixBuffer ? prefixBuffer.slice() : NO_XML_PREFIX;
80
+ this.prefixes.push(prefix);
81
+ this.uris.push(nsUriBuffer.slice());
82
+ this.namespaces.push({ prefix: textDecoder.decode(prefix), uri: textDecoder.decode(nsUriBuffer) });
83
+ return this;
84
+ }
85
+ else {
86
+ const existingPrefixIndex = this.indexOfPrefix(prefixBuffer ?? NO_XML_PREFIX);
87
+ if (existingPrefixIndex === prefixIndex) {
88
+ return this;
89
+ }
90
+ const clonedPrefixes = this.prefixes.slice();
91
+ clonedPrefixes[prefixIndex] = prefixBuffer ? prefixBuffer.slice() : NO_XML_PREFIX;
92
+ const clonedMap = new NamespaceMap(clonedPrefixes, this.uris, this.namespaces);
93
+ return clonedMap;
94
+ }
95
+ }
96
+ resolveNamespace(bytes, begin, prefixLength) {
97
+ for (let i = this.prefixes.length - 1; i >= 0; i--) {
98
+ const prefix = this.prefixes[i];
99
+ if (prefix.length !== prefixLength)
100
+ continue;
101
+ let matches = true;
102
+ for (let o = 0; o < prefixLength; o++) {
103
+ if (prefix[o] !== bytes[begin + o]) {
104
+ matches = false;
105
+ break;
106
+ }
107
+ }
108
+ if (matches) {
109
+ return this.namespaces[i];
110
+ }
111
+ }
112
+ return PREDEFINED_XML_NAMESPACE;
113
+ }
114
+ get(prefix) {
115
+ return this.namespaces.find(ns => ns.prefix === prefix);
116
+ }
117
+ indexOfPrefix(prefixBuffer) {
118
+ for (let i = this.prefixes.length - 1; i >= 0; i--) {
119
+ const prefix = this.prefixes[i];
120
+ if (prefixBuffer.length === prefix.length && prefixBuffer.every((value, index) => value === prefix[index])) {
121
+ return i;
122
+ }
123
+ }
124
+ return -1;
125
+ }
126
+ indexOfUri(uriBuffer) {
127
+ for (let i = this.uris.length - 1; i >= 0; i--) {
128
+ const uri = this.uris[i];
129
+ if (uriBuffer.length === uri.length && uriBuffer.every((value, index) => value === uri[index]))
130
+ return i;
131
+ }
132
+ return -1;
133
+ }
134
+ // @ts-ignore
135
+ print() {
136
+ const textDecoder = new TextDecoder();
137
+ const lines = this.namespaces.slice(2).map((ns, i) => `${textDecoder.decode(this.prefixes[i])} => ${ns.prefix}:${ns.uri}`);
138
+ return `NamespaceMap {\n${lines.join('\n ')}\n}`;
139
+ }
140
+ }
141
+ //# sourceMappingURL=names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { TagResolver } from "./tagParser.ts";
2
+ declare class XMLTransformStream<T extends any = any> implements TransformStream<Uint8Array<ArrayBuffer>, T> {
3
+ readonly readable: ReadableStream<T>;
4
+ readonly writable: WritableStream<Uint8Array<ArrayBuffer>>;
5
+ constructor(readable: ReadableStream<T>, writable: WritableStream<Uint8Array<ArrayBuffer>>);
6
+ }
7
+ export declare function createParser<C extends object = any>(rootResolver: TagResolver<any, any>, context?: any): XMLTransformStream<C>;
8
+ export declare class TailBuffer {
9
+ private bytes;
10
+ private end;
11
+ private tailByte;
12
+ private extendCapacityBy;
13
+ constructor(extendCapacityBy?: number);
14
+ addChunk(bytes: Uint8Array<ArrayBuffer>): {
15
+ front: null;
16
+ tail: Uint8Array<ArrayBuffer>;
17
+ } | {
18
+ front: Uint8Array<ArrayBuffer>;
19
+ tail: Uint8Array<ArrayBuffer>;
20
+ } | {
21
+ front: null;
22
+ tail: null;
23
+ };
24
+ saveTail(source: Uint8Array<ArrayBuffer>, begin: number, end: number, tailByte?: number): void;
25
+ reset(): void;
26
+ private appendBytes;
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAwC5C,cAAM,kBAAkB,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,CAAE,YAAW,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAClG,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC/C,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;CAI3F;AAgBD,wBAAgB,YAAY,CAC1B,CAAC,SAAS,MAAM,GAAG,GAAG,EACtB,YAAY,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,GAAE,GAAQ,yBA0evD;AAGD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,gBAAgB,CAAQ;gBACpB,gBAAgB,CAAC,EAAE,MAAM;IAMrC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC;;;;;;;;;;IAyBvC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAgB;IAU9F,KAAK;IAIL,OAAO,CAAC,WAAW;CAapB"}