@kerebron/extension-basic-editor 0.1.1 → 0.1.3
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/esm/editor/src/CoreEditor.d.ts.map +1 -1
- package/esm/editor/src/CoreEditor.js +5 -5
- package/esm/editor/src/nodeToTreeString.d.ts.map +1 -1
- package/esm/editor/src/nodeToTreeString.js +5 -2
- package/esm/editor/src/utilities/createNodeFromContent.d.ts.map +1 -1
- package/esm/editor/src/utilities/createNodeFromContent.js +1 -1
- package/esm/extension-basic-editor/src/ExtensionHtml.d.ts.map +1 -1
- package/esm/extension-basic-editor/src/ExtensionHtml.js +3 -2
- package/esm/extension-basic-editor/src/MarkChange.d.ts.map +1 -1
- package/esm/extension-basic-editor/src/NodeImage.d.ts +1 -19
- package/esm/extension-basic-editor/src/NodeImage.d.ts.map +1 -1
- package/esm/extension-basic-editor/src/NodeImage.js +0 -22
- package/package.json +1 -4
- package/esm/extension-automerge/src/CursorPlugin.d.ts +0 -16
- package/esm/extension-automerge/src/CursorPlugin.d.ts.map +0 -1
- package/esm/extension-automerge/src/CursorPlugin.js +0 -114
- package/esm/extension-automerge/src/ExtensionAutomerge.d.ts +0 -26
- package/esm/extension-automerge/src/ExtensionAutomerge.d.ts.map +0 -1
- package/esm/extension-automerge/src/ExtensionAutomerge.js +0 -136
- package/esm/extension-automerge/src/MarkUnknown.d.ts +0 -8
- package/esm/extension-automerge/src/MarkUnknown.d.ts.map +0 -1
- package/esm/extension-automerge/src/MarkUnknown.js +0 -26
- package/esm/extension-automerge/src/NodeUnknown.d.ts +0 -8
- package/esm/extension-automerge/src/NodeUnknown.d.ts.map +0 -1
- package/esm/extension-automerge/src/NodeUnknown.js +0 -28
- package/esm/extension-automerge/src/NodeUnknownBlock.d.ts +0 -11
- package/esm/extension-automerge/src/NodeUnknownBlock.d.ts.map +0 -1
- package/esm/extension-automerge/src/NodeUnknownBlock.js +0 -36
- package/esm/extension-automerge/src/SchemaAdapter.d.ts +0 -70
- package/esm/extension-automerge/src/SchemaAdapter.d.ts.map +0 -1
- package/esm/extension-automerge/src/SchemaAdapter.js +0 -188
- package/esm/extension-automerge/src/SyncPlugin.d.ts +0 -16
- package/esm/extension-automerge/src/SyncPlugin.d.ts.map +0 -1
- package/esm/extension-automerge/src/SyncPlugin.js +0 -147
- package/esm/extension-automerge/src/amToPm.d.ts +0 -9
- package/esm/extension-automerge/src/amToPm.d.ts.map +0 -1
- package/esm/extension-automerge/src/amToPm.js +0 -245
- package/esm/extension-automerge/src/amTraversal.d.ts +0 -62
- package/esm/extension-automerge/src/amTraversal.d.ts.map +0 -1
- package/esm/extension-automerge/src/amTraversal.js +0 -688
- package/esm/extension-automerge/src/loader.d.ts +0 -8
- package/esm/extension-automerge/src/loader.d.ts.map +0 -1
- package/esm/extension-automerge/src/loader.js +0 -54
- package/esm/extension-automerge/src/maintainSpans.d.ts +0 -9
- package/esm/extension-automerge/src/maintainSpans.d.ts.map +0 -1
- package/esm/extension-automerge/src/maintainSpans.js +0 -464
- package/esm/extension-automerge/src/pmToAm.d.ts +0 -6
- package/esm/extension-automerge/src/pmToAm.d.ts.map +0 -1
- package/esm/extension-automerge/src/pmToAm.js +0 -183
- package/esm/extension-automerge/src/pmTraversal.d.ts +0 -26
- package/esm/extension-automerge/src/pmTraversal.d.ts.map +0 -1
- package/esm/extension-automerge/src/pmTraversal.js +0 -102
- package/esm/extension-automerge/src/types.d.ts +0 -42
- package/esm/extension-automerge/src/types.d.ts.map +0 -1
- package/esm/extension-automerge/src/types.js +0 -94
- package/esm/extension-automerge/src/utils.d.ts +0 -3
- package/esm/extension-automerge/src/utils.d.ts.map +0 -1
- package/esm/extension-automerge/src/utils.js +0 -18
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import { Fragment, Slice } from 'prosemirror-model';
|
|
2
|
-
import { ReplaceStep } from 'prosemirror-transform';
|
|
3
|
-
import { amSpansToDoc, amSpliceIdxToPmIdx } from './amTraversal.js';
|
|
4
|
-
import { findBlockAtCharIdx, patchSpans } from './maintainSpans.js';
|
|
5
|
-
import { isArrayEqual, isPrefixOfArray } from './utils.js';
|
|
6
|
-
import { pmMarksFromAmMarks } from './SchemaAdapter.js';
|
|
7
|
-
export function amToPm(adapter, spansAtStart, patches, path, tx) {
|
|
8
|
-
const gathered = gatherPatches(path, patches);
|
|
9
|
-
for (const patchGroup of gathered) {
|
|
10
|
-
if (patchGroup.type === 'text') {
|
|
11
|
-
for (const patch of patchGroup.patches) {
|
|
12
|
-
if (patch.action === 'splice') {
|
|
13
|
-
tx = handleSplice(adapter, spansAtStart, patch, path, tx);
|
|
14
|
-
patchSpans(path, spansAtStart, patch);
|
|
15
|
-
}
|
|
16
|
-
else if (patch.action === 'del') {
|
|
17
|
-
const patchIndex = patch.path[patch.path.length - 1];
|
|
18
|
-
const block = findBlockAtCharIdx(spansAtStart, patchIndex);
|
|
19
|
-
if (block != null) {
|
|
20
|
-
tx = handleBlockChange(adapter, path, spansAtStart, patchIndex, [patch], tx);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
tx = handleDelete(adapter, spansAtStart, patch, path, tx);
|
|
24
|
-
}
|
|
25
|
-
patchSpans(path, spansAtStart, patch);
|
|
26
|
-
}
|
|
27
|
-
else if (patch.action === 'mark') {
|
|
28
|
-
tx = handleMark(adapter, spansAtStart, patch, path, tx);
|
|
29
|
-
patchSpans(path, spansAtStart, patch);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
tx = handleBlockChange(adapter, path, spansAtStart, patchGroup.index, patchGroup.patches, tx);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return tx;
|
|
38
|
-
}
|
|
39
|
-
export function handleSplice(adapter, spans, patch, path, tx) {
|
|
40
|
-
const index = charPath(path, patch.path);
|
|
41
|
-
if (index === null)
|
|
42
|
-
return tx;
|
|
43
|
-
const pmIdx = amSpliceIdxToPmIdx(adapter, spans, index);
|
|
44
|
-
if (pmIdx == null)
|
|
45
|
-
throw new Error('Invalid index');
|
|
46
|
-
const content = patchContentToFragment(adapter, patch.value, patch.marks);
|
|
47
|
-
tx = tx.step(new ReplaceStep(pmIdx, pmIdx, new Slice(content, 0, 0)));
|
|
48
|
-
return tx;
|
|
49
|
-
}
|
|
50
|
-
function handleDelete(adapter, spans, patch, path, tx) {
|
|
51
|
-
const index = charPath(path, patch.path);
|
|
52
|
-
if (index === null)
|
|
53
|
-
return tx;
|
|
54
|
-
const start = amSpliceIdxToPmIdx(adapter, spans, index);
|
|
55
|
-
if (start == null)
|
|
56
|
-
throw new Error('Invalid index');
|
|
57
|
-
const end = start + (patch.length || 1);
|
|
58
|
-
return tx.delete(start, end);
|
|
59
|
-
}
|
|
60
|
-
function handleMark(adapter, spans, patch, path, tx) {
|
|
61
|
-
if (isArrayEqual(patch.path, path)) {
|
|
62
|
-
for (const mark of patch.marks) {
|
|
63
|
-
const pmStart = amSpliceIdxToPmIdx(adapter, spans, mark.start);
|
|
64
|
-
const pmEnd = amSpliceIdxToPmIdx(adapter, spans, mark.end);
|
|
65
|
-
if (pmStart == null || pmEnd == null)
|
|
66
|
-
throw new Error('Invalid index');
|
|
67
|
-
if (mark.value == null) {
|
|
68
|
-
const markMapping = adapter.markMappings.find((m) => m.automergeMarkName === mark.name);
|
|
69
|
-
const markType = markMapping
|
|
70
|
-
? markMapping.prosemirrorMark
|
|
71
|
-
: adapter.unknownMark;
|
|
72
|
-
tx = tx.removeMark(pmStart, pmEnd, markType);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
const pmMarks = pmMarksFromAmMarks(adapter, {
|
|
76
|
-
[mark.name]: mark.value,
|
|
77
|
-
});
|
|
78
|
-
for (const pmMark of pmMarks) {
|
|
79
|
-
tx = tx.addMark(pmStart, pmEnd, pmMark);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return tx;
|
|
85
|
-
}
|
|
86
|
-
export function handleBlockChange(adapter, atPath, spans, _blockIdx, patches, tx) {
|
|
87
|
-
for (const patch of patches) {
|
|
88
|
-
patchSpans(atPath, spans, patch);
|
|
89
|
-
}
|
|
90
|
-
const docAfter = amSpansToDoc(adapter, spans);
|
|
91
|
-
const change = findDiff(tx.doc.content, docAfter.content);
|
|
92
|
-
if (change == null)
|
|
93
|
-
return tx;
|
|
94
|
-
const $from = docAfter.resolve(change.start);
|
|
95
|
-
const $to = docAfter.resolve(change.endB);
|
|
96
|
-
const $fromA = tx.doc.resolve(change.start);
|
|
97
|
-
const inlineChange = $from.sameParent($to) &&
|
|
98
|
-
$from.parent.inlineContent &&
|
|
99
|
-
$fromA.end() >= change.endA;
|
|
100
|
-
const chFrom = change.start;
|
|
101
|
-
const chTo = change.endA;
|
|
102
|
-
let handledByInline = false;
|
|
103
|
-
if (inlineChange) {
|
|
104
|
-
if ($from.pos == $to.pos) {
|
|
105
|
-
// Deletion
|
|
106
|
-
handledByInline = true;
|
|
107
|
-
tx = tx.delete(chFrom, chTo);
|
|
108
|
-
}
|
|
109
|
-
else if ($from.parent.child($from.index()).isText &&
|
|
110
|
-
$from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {
|
|
111
|
-
handledByInline = true;
|
|
112
|
-
// Both positions in the same text node -- simply insert text
|
|
113
|
-
const text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);
|
|
114
|
-
tx = tx.insertText(text, chFrom, chTo);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (!handledByInline) {
|
|
118
|
-
tx = tx.replace(chFrom, chTo, docAfter.slice(change.start, change.endB));
|
|
119
|
-
}
|
|
120
|
-
return tx;
|
|
121
|
-
}
|
|
122
|
-
function findDiff(a, b) {
|
|
123
|
-
let start = a.findDiffStart(b);
|
|
124
|
-
if (start == null)
|
|
125
|
-
return null;
|
|
126
|
-
//eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
127
|
-
let { a: endA, b: endB } = a.findDiffEnd(b);
|
|
128
|
-
if (endA < start && a.size < b.size) {
|
|
129
|
-
if (start &&
|
|
130
|
-
start < b.size &&
|
|
131
|
-
isSurrogatePair(b.textBetween(start - 1, start + 1))) {
|
|
132
|
-
start -= 1;
|
|
133
|
-
}
|
|
134
|
-
endB = start + (endB - endA);
|
|
135
|
-
endA = start;
|
|
136
|
-
}
|
|
137
|
-
else if (endB < start) {
|
|
138
|
-
if (start &&
|
|
139
|
-
start < a.size &&
|
|
140
|
-
isSurrogatePair(a.textBetween(start - 1, start + 1))) {
|
|
141
|
-
start -= 1;
|
|
142
|
-
}
|
|
143
|
-
endA = start + (endA - endB);
|
|
144
|
-
endB = start;
|
|
145
|
-
}
|
|
146
|
-
return { start, endA, endB };
|
|
147
|
-
}
|
|
148
|
-
function isSurrogatePair(str) {
|
|
149
|
-
if (str.length != 2)
|
|
150
|
-
return false;
|
|
151
|
-
const a = str.charCodeAt(0), b = str.charCodeAt(1);
|
|
152
|
-
return a >= 0xdc00 && a <= 0xdfff && b >= 0xd800 && b <= 0xdbff;
|
|
153
|
-
}
|
|
154
|
-
// If the path of the patch is of the form [path, <index>] then we know this is
|
|
155
|
-
// a path to a character within the sequence given by path
|
|
156
|
-
function charPath(textPath, candidatePath) {
|
|
157
|
-
if (candidatePath.length !== textPath.length + 1)
|
|
158
|
-
return null;
|
|
159
|
-
for (let i = 0; i < textPath.length; i++) {
|
|
160
|
-
if (textPath[i] !== candidatePath[i])
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
const index = candidatePath[candidatePath.length - 1];
|
|
164
|
-
if (typeof index === 'number')
|
|
165
|
-
return index;
|
|
166
|
-
return null;
|
|
167
|
-
}
|
|
168
|
-
function patchContentToFragment(adapter, patchContent, marks) {
|
|
169
|
-
let pmMarks = undefined;
|
|
170
|
-
if (marks != null) {
|
|
171
|
-
pmMarks = pmMarksFromAmMarks(adapter, marks);
|
|
172
|
-
}
|
|
173
|
-
// Splice is only ever called once a block has already been created so we're
|
|
174
|
-
// only inserting text. This means we don't have to think about openStart
|
|
175
|
-
// and openEnd
|
|
176
|
-
return Fragment.from(adapter.schema.text(patchContent, pmMarks));
|
|
177
|
-
}
|
|
178
|
-
function gatherPatches(textPath, diff) {
|
|
179
|
-
const result = [];
|
|
180
|
-
let state = { type: 'gatheringText', gathered: [] };
|
|
181
|
-
function flush() {
|
|
182
|
-
if (state.type === 'gatheringBlock') {
|
|
183
|
-
result.push({
|
|
184
|
-
type: 'block',
|
|
185
|
-
index: state.index,
|
|
186
|
-
patches: state.gathered,
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
else if (state.type === 'gatheringText') {
|
|
190
|
-
result.push({ type: 'text', patches: state.gathered });
|
|
191
|
-
}
|
|
192
|
-
state = { type: 'transitioning' };
|
|
193
|
-
}
|
|
194
|
-
for (const patch of diff) {
|
|
195
|
-
if (!isPrefixOfArray(textPath, patch.path)) {
|
|
196
|
-
continue;
|
|
197
|
-
}
|
|
198
|
-
if (isArrayEqual(textPath, patch.path) && patch.action === 'mark') {
|
|
199
|
-
if (state.type === 'gatheringText') {
|
|
200
|
-
state.gathered.push(patch);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
flush();
|
|
204
|
-
state = { type: 'gatheringText', gathered: [patch] };
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
else if (patch.path.length === textPath.length + 1) {
|
|
208
|
-
const lastElem = patch.path[patch.path.length - 1];
|
|
209
|
-
if (typeof lastElem === 'number') {
|
|
210
|
-
if (patch.action === 'splice' || patch.action === 'del') {
|
|
211
|
-
if (state.type === 'gatheringText') {
|
|
212
|
-
state.gathered.push(patch);
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
flush();
|
|
216
|
-
state = { type: 'gatheringText', gathered: [patch] };
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else if (patch.action === 'insert') {
|
|
220
|
-
flush();
|
|
221
|
-
state = {
|
|
222
|
-
type: 'gatheringBlock',
|
|
223
|
-
index: lastElem,
|
|
224
|
-
gathered: [patch],
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
const index = patch.path[textPath.length];
|
|
231
|
-
if (typeof index !== 'number') {
|
|
232
|
-
continue;
|
|
233
|
-
}
|
|
234
|
-
if (state.type === 'gatheringBlock' && state.index === index) {
|
|
235
|
-
state.gathered.push(patch);
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
flush();
|
|
239
|
-
state = { type: 'gatheringBlock', index: index, gathered: [patch] };
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
flush();
|
|
244
|
-
return result;
|
|
245
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { next as automerge } from '@automerge/automerge/slim';
|
|
2
|
-
import { Node } from 'prosemirror-model';
|
|
3
|
-
import { BlockMarker } from './types.js';
|
|
4
|
-
import { SchemaAdapter } from './SchemaAdapter.js';
|
|
5
|
-
type RenderRole = 'explicit' | 'render-only';
|
|
6
|
-
export type TraversalEvent = {
|
|
7
|
-
type: 'openTag';
|
|
8
|
-
tag: string;
|
|
9
|
-
role: RenderRole;
|
|
10
|
-
attrs?: {
|
|
11
|
-
[key: string]: any;
|
|
12
|
-
};
|
|
13
|
-
} | {
|
|
14
|
-
type: 'closeTag';
|
|
15
|
-
tag: string;
|
|
16
|
-
role: RenderRole;
|
|
17
|
-
} | {
|
|
18
|
-
type: 'leafNode';
|
|
19
|
-
tag: string;
|
|
20
|
-
role: RenderRole;
|
|
21
|
-
} | {
|
|
22
|
-
type: 'text';
|
|
23
|
-
text: string;
|
|
24
|
-
marks: automerge.MarkSet;
|
|
25
|
-
} | {
|
|
26
|
-
type: 'block';
|
|
27
|
-
isUnknown?: boolean;
|
|
28
|
-
block: {
|
|
29
|
-
type: string;
|
|
30
|
-
parents: string[];
|
|
31
|
-
attrs: {
|
|
32
|
-
[key: string]: automerge.MaterializeValue;
|
|
33
|
-
};
|
|
34
|
-
isEmbed: boolean;
|
|
35
|
-
};
|
|
36
|
-
};
|
|
37
|
-
/**
|
|
38
|
-
* Convert an array of AutoMerge spans into a ProseMirror doc.
|
|
39
|
-
* @param adapter
|
|
40
|
-
* @param spans
|
|
41
|
-
* @returns
|
|
42
|
-
*/
|
|
43
|
-
export declare function amSpansToDoc(adapter: SchemaAdapter, spans: automerge.Span[]): Node;
|
|
44
|
-
export declare function amSpliceIdxToPmIdx(adapter: SchemaAdapter, spans: automerge.Span[], target: number): number | null;
|
|
45
|
-
export declare function amIdxToPmBlockIdx(adapter: SchemaAdapter, spans: automerge.Span[], target: number): number | null;
|
|
46
|
-
type Indexes = {
|
|
47
|
-
amIdx: number;
|
|
48
|
-
pmIdx: number;
|
|
49
|
-
};
|
|
50
|
-
export declare function eventsWithIndexChanges(events: IterableIterator<TraversalEvent>): IterableIterator<{
|
|
51
|
-
event: TraversalEvent;
|
|
52
|
-
before: Indexes;
|
|
53
|
-
after: Indexes;
|
|
54
|
-
}>;
|
|
55
|
-
export declare function traverseNode(adapter: SchemaAdapter, node: Node): IterableIterator<TraversalEvent>;
|
|
56
|
-
export declare function traverseSpans(adapter: SchemaAdapter, amSpans: automerge.Span[]): IterableIterator<TraversalEvent>;
|
|
57
|
-
export declare function blockAtIdx(spans: automerge.Span[], target: number): {
|
|
58
|
-
index: number;
|
|
59
|
-
block: BlockMarker;
|
|
60
|
-
} | null;
|
|
61
|
-
export {};
|
|
62
|
-
//# sourceMappingURL=amTraversal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"amTraversal.d.ts","sourceRoot":"","sources":["../../../src/extension-automerge/src/amTraversal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAGL,IAAI,EAGL,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAgB,WAAW,EAAiB,MAAM,YAAY,CAAC;AACtE,OAAO,EAIL,aAAa,EACd,MAAM,oBAAoB,CAAC;AAE5B,KAAK,UAAU,GAAG,UAAU,GAAG,aAAa,CAAC;AAO7C,MAAM,MAAM,cAAc,GACtB;IACA,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IAEjB,KAAK,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAChC,GACC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAA;CAAE,GACxD;IACA,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAA;SAAE,CAAC;QACrD,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH,CAAC;AAEJ;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,GACtB,IAAI,CAyDN;AAqCD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,EACvB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAyBf;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,EACvB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CA4Bf;AAED,KAAK,OAAO,GAAG;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAiB,sBAAsB,CACrC,MAAM,EAAE,gBAAgB,CAAC,cAAc,CAAC,GACvC,gBAAgB,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC,CA2BD;AAED,wBAAiB,YAAY,CAC3B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,IAAI,GACT,gBAAgB,CAAC,cAAc,CAAC,CA4ElC;AAwPD,wBAAiB,aAAa,CAC5B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,GACxB,gBAAgB,CAAC,cAAc,CAAC,CAkBlC;AAmOD,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,EACvB,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,IAAI,CAoB9C"}
|