@fluidframework/merge-tree 1.2.1 → 2.0.0-internal.1.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.
Files changed (231) hide show
  1. package/DEV.md +2 -2
  2. package/README.md +1 -1
  3. package/REFERENCEPOSITIONS.md +2 -2
  4. package/dist/MergeTreeTextHelper.d.ts +23 -0
  5. package/dist/MergeTreeTextHelper.d.ts.map +1 -0
  6. package/dist/MergeTreeTextHelper.js +136 -0
  7. package/dist/MergeTreeTextHelper.js.map +1 -0
  8. package/dist/base.d.ts +2 -26
  9. package/dist/base.d.ts.map +1 -1
  10. package/dist/base.js.map +1 -1
  11. package/dist/client.d.ts +21 -12
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +87 -27
  14. package/dist/client.js.map +1 -1
  15. package/dist/collections/heap.d.ts +28 -0
  16. package/dist/collections/heap.d.ts.map +1 -0
  17. package/dist/collections/heap.js +65 -0
  18. package/dist/collections/heap.js.map +1 -0
  19. package/dist/collections/index.d.ts +11 -0
  20. package/dist/collections/index.d.ts.map +1 -0
  21. package/dist/collections/index.js +23 -0
  22. package/dist/collections/index.js.map +1 -0
  23. package/dist/collections/intervalTree.d.ts +60 -0
  24. package/dist/collections/intervalTree.d.ts.map +1 -0
  25. package/dist/collections/intervalTree.js +99 -0
  26. package/dist/collections/intervalTree.js.map +1 -0
  27. package/dist/collections/list.d.ts +39 -0
  28. package/dist/collections/list.d.ts.map +1 -0
  29. package/dist/collections/list.js +155 -0
  30. package/dist/collections/list.js.map +1 -0
  31. package/dist/collections/rbTree.d.ts +154 -0
  32. package/dist/collections/rbTree.d.ts.map +1 -0
  33. package/dist/{collections.js → collections/rbTree.js} +10 -448
  34. package/dist/collections/rbTree.js.map +1 -0
  35. package/dist/collections/stack.d.ts +16 -0
  36. package/dist/collections/stack.d.ts.map +1 -0
  37. package/dist/collections/stack.js +30 -0
  38. package/dist/collections/stack.js.map +1 -0
  39. package/dist/collections/tst.d.ts +55 -0
  40. package/dist/collections/tst.d.ts.map +1 -0
  41. package/dist/collections/tst.js +171 -0
  42. package/dist/collections/tst.js.map +1 -0
  43. package/dist/index.d.ts +3 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +4 -2
  46. package/dist/index.js.map +1 -1
  47. package/dist/localReference.d.ts +48 -99
  48. package/dist/localReference.d.ts.map +1 -1
  49. package/dist/localReference.js +132 -169
  50. package/dist/localReference.js.map +1 -1
  51. package/dist/mergeTree.d.ts +38 -299
  52. package/dist/mergeTree.d.ts.map +1 -1
  53. package/dist/mergeTree.js +214 -598
  54. package/dist/mergeTree.js.map +1 -1
  55. package/dist/mergeTreeDeltaCallback.d.ts +1 -1
  56. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  57. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  58. package/dist/mergeTreeNodes.d.ts +269 -0
  59. package/dist/mergeTreeNodes.d.ts.map +1 -0
  60. package/dist/mergeTreeNodes.js +383 -0
  61. package/dist/mergeTreeNodes.js.map +1 -0
  62. package/dist/mergeTreeTracking.d.ts +1 -1
  63. package/dist/mergeTreeTracking.d.ts.map +1 -1
  64. package/dist/mergeTreeTracking.js.map +1 -1
  65. package/dist/opBuilder.d.ts +1 -1
  66. package/dist/opBuilder.d.ts.map +1 -1
  67. package/dist/opBuilder.js.map +1 -1
  68. package/dist/partialLengths.d.ts +130 -15
  69. package/dist/partialLengths.d.ts.map +1 -1
  70. package/dist/partialLengths.js +230 -138
  71. package/dist/partialLengths.js.map +1 -1
  72. package/dist/properties.d.ts.map +1 -1
  73. package/dist/properties.js.map +1 -1
  74. package/dist/referencePositions.d.ts +6 -26
  75. package/dist/referencePositions.d.ts.map +1 -1
  76. package/dist/referencePositions.js.map +1 -1
  77. package/dist/segmentGroupCollection.d.ts +2 -1
  78. package/dist/segmentGroupCollection.d.ts.map +1 -1
  79. package/dist/segmentGroupCollection.js +3 -0
  80. package/dist/segmentGroupCollection.js.map +1 -1
  81. package/dist/segmentPropertiesManager.d.ts +10 -1
  82. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  83. package/dist/segmentPropertiesManager.js +41 -6
  84. package/dist/segmentPropertiesManager.js.map +1 -1
  85. package/dist/snapshotLoader.d.ts.map +1 -1
  86. package/dist/snapshotLoader.js.map +1 -1
  87. package/dist/snapshotV1.d.ts +1 -1
  88. package/dist/snapshotV1.d.ts.map +1 -1
  89. package/dist/snapshotV1.js.map +1 -1
  90. package/dist/snapshotlegacy.d.ts +5 -1
  91. package/dist/snapshotlegacy.d.ts.map +1 -1
  92. package/dist/snapshotlegacy.js +4 -0
  93. package/dist/snapshotlegacy.js.map +1 -1
  94. package/dist/sortedSegmentSet.d.ts +1 -1
  95. package/dist/sortedSegmentSet.d.ts.map +1 -1
  96. package/dist/sortedSegmentSet.js.map +1 -1
  97. package/dist/textSegment.d.ts +7 -7
  98. package/dist/textSegment.d.ts.map +1 -1
  99. package/dist/textSegment.js +3 -125
  100. package/dist/textSegment.js.map +1 -1
  101. package/lib/MergeTreeTextHelper.d.ts +23 -0
  102. package/lib/MergeTreeTextHelper.d.ts.map +1 -0
  103. package/lib/MergeTreeTextHelper.js +132 -0
  104. package/lib/MergeTreeTextHelper.js.map +1 -0
  105. package/lib/base.d.ts +2 -26
  106. package/lib/base.d.ts.map +1 -1
  107. package/lib/base.js.map +1 -1
  108. package/lib/client.d.ts +21 -12
  109. package/lib/client.d.ts.map +1 -1
  110. package/lib/client.js +85 -25
  111. package/lib/client.js.map +1 -1
  112. package/lib/collections/heap.d.ts +28 -0
  113. package/lib/collections/heap.d.ts.map +1 -0
  114. package/lib/collections/heap.js +61 -0
  115. package/lib/collections/heap.js.map +1 -0
  116. package/lib/collections/index.d.ts +11 -0
  117. package/lib/collections/index.d.ts.map +1 -0
  118. package/lib/collections/index.js +11 -0
  119. package/lib/collections/index.js.map +1 -0
  120. package/lib/collections/intervalTree.d.ts +60 -0
  121. package/lib/collections/intervalTree.d.ts.map +1 -0
  122. package/lib/collections/intervalTree.js +94 -0
  123. package/lib/collections/intervalTree.js.map +1 -0
  124. package/lib/collections/list.d.ts +39 -0
  125. package/lib/collections/list.d.ts.map +1 -0
  126. package/lib/collections/list.js +149 -0
  127. package/lib/collections/list.js.map +1 -0
  128. package/lib/collections/rbTree.d.ts +154 -0
  129. package/lib/collections/rbTree.d.ts.map +1 -0
  130. package/lib/{collections.js → collections/rbTree.js} +9 -439
  131. package/lib/collections/rbTree.js.map +1 -0
  132. package/lib/collections/stack.d.ts +16 -0
  133. package/lib/collections/stack.d.ts.map +1 -0
  134. package/lib/collections/stack.js +26 -0
  135. package/lib/collections/stack.js.map +1 -0
  136. package/lib/collections/tst.d.ts +55 -0
  137. package/lib/collections/tst.d.ts.map +1 -0
  138. package/lib/collections/tst.js +167 -0
  139. package/lib/collections/tst.js.map +1 -0
  140. package/lib/index.d.ts +3 -1
  141. package/lib/index.d.ts.map +1 -1
  142. package/lib/index.js +3 -1
  143. package/lib/index.js.map +1 -1
  144. package/lib/localReference.d.ts +48 -99
  145. package/lib/localReference.d.ts.map +1 -1
  146. package/lib/localReference.js +132 -170
  147. package/lib/localReference.js.map +1 -1
  148. package/lib/mergeTree.d.ts +38 -299
  149. package/lib/mergeTree.d.ts.map +1 -1
  150. package/lib/mergeTree.js +190 -563
  151. package/lib/mergeTree.js.map +1 -1
  152. package/lib/mergeTreeDeltaCallback.d.ts +1 -1
  153. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  154. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  155. package/lib/mergeTreeNodes.d.ts +269 -0
  156. package/lib/mergeTreeNodes.d.ts.map +1 -0
  157. package/lib/mergeTreeNodes.js +369 -0
  158. package/lib/mergeTreeNodes.js.map +1 -0
  159. package/lib/mergeTreeTracking.d.ts +1 -1
  160. package/lib/mergeTreeTracking.d.ts.map +1 -1
  161. package/lib/mergeTreeTracking.js.map +1 -1
  162. package/lib/opBuilder.d.ts +1 -1
  163. package/lib/opBuilder.d.ts.map +1 -1
  164. package/lib/opBuilder.js.map +1 -1
  165. package/lib/partialLengths.d.ts +130 -15
  166. package/lib/partialLengths.d.ts.map +1 -1
  167. package/lib/partialLengths.js +227 -135
  168. package/lib/partialLengths.js.map +1 -1
  169. package/lib/properties.d.ts.map +1 -1
  170. package/lib/properties.js.map +1 -1
  171. package/lib/referencePositions.d.ts +6 -26
  172. package/lib/referencePositions.d.ts.map +1 -1
  173. package/lib/referencePositions.js.map +1 -1
  174. package/lib/segmentGroupCollection.d.ts +2 -1
  175. package/lib/segmentGroupCollection.d.ts.map +1 -1
  176. package/lib/segmentGroupCollection.js +3 -0
  177. package/lib/segmentGroupCollection.js.map +1 -1
  178. package/lib/segmentPropertiesManager.d.ts +10 -1
  179. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  180. package/lib/segmentPropertiesManager.js +41 -6
  181. package/lib/segmentPropertiesManager.js.map +1 -1
  182. package/lib/snapshotLoader.d.ts.map +1 -1
  183. package/lib/snapshotLoader.js.map +1 -1
  184. package/lib/snapshotV1.d.ts +1 -1
  185. package/lib/snapshotV1.d.ts.map +1 -1
  186. package/lib/snapshotV1.js.map +1 -1
  187. package/lib/snapshotlegacy.d.ts +5 -1
  188. package/lib/snapshotlegacy.d.ts.map +1 -1
  189. package/lib/snapshotlegacy.js +4 -0
  190. package/lib/snapshotlegacy.js.map +1 -1
  191. package/lib/sortedSegmentSet.d.ts +1 -1
  192. package/lib/sortedSegmentSet.d.ts.map +1 -1
  193. package/lib/sortedSegmentSet.js.map +1 -1
  194. package/lib/textSegment.d.ts +7 -7
  195. package/lib/textSegment.d.ts.map +1 -1
  196. package/lib/textSegment.js +1 -122
  197. package/lib/textSegment.js.map +1 -1
  198. package/package.json +93 -17
  199. package/src/MergeTreeTextHelper.ts +172 -0
  200. package/src/base.ts +2 -35
  201. package/src/client.ts +114 -30
  202. package/src/collections/heap.ts +75 -0
  203. package/src/collections/index.ts +11 -0
  204. package/src/collections/intervalTree.ts +140 -0
  205. package/src/collections/list.ts +165 -0
  206. package/src/{collections.ts → collections/rbTree.ts} +79 -538
  207. package/src/collections/stack.ts +27 -0
  208. package/src/collections/tst.ts +212 -0
  209. package/src/index.ts +8 -2
  210. package/src/localReference.ts +152 -203
  211. package/src/mergeTree.ts +265 -868
  212. package/src/mergeTreeDeltaCallback.ts +1 -1
  213. package/src/mergeTreeNodes.ts +676 -0
  214. package/src/mergeTreeTracking.ts +1 -1
  215. package/src/opBuilder.ts +1 -1
  216. package/src/partialLengths.ts +295 -150
  217. package/src/properties.ts +1 -0
  218. package/src/referencePositions.ts +7 -27
  219. package/src/segmentGroupCollection.ts +5 -1
  220. package/src/segmentPropertiesManager.ts +45 -6
  221. package/src/snapshotLoader.ts +2 -1
  222. package/src/snapshotV1.ts +2 -2
  223. package/src/snapshotlegacy.ts +6 -2
  224. package/src/sortedSegmentSet.ts +1 -1
  225. package/src/textSegment.ts +10 -157
  226. package/dist/collections.d.ts +0 -197
  227. package/dist/collections.d.ts.map +0 -1
  228. package/dist/collections.js.map +0 -1
  229. package/lib/collections.d.ts +0 -197
  230. package/lib/collections.d.ts.map +0 -1
  231. package/lib/collections.js.map +0 -1
@@ -6,7 +6,7 @@
6
6
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
7
7
 
8
8
  import { assert } from "@fluidframework/common-utils";
9
- import { UnassignedSequenceNumber } from "./constants";
9
+ import { UnassignedSequenceNumber, UniversalSequenceNumber } from "./constants";
10
10
  import { ICombiningOp, IMergeTreeAnnotateMsg } from "./ops";
11
11
  import {
12
12
  combine,
@@ -15,6 +15,17 @@ import {
15
15
  PropertySet,
16
16
  } from "./properties";
17
17
 
18
+ export enum PropertiesRollback {
19
+ /** Not in a rollback */
20
+ None,
21
+
22
+ /** Rollback */
23
+ Rollback,
24
+
25
+ /** Rollback of a rewrite */
26
+ Rewrite,
27
+ }
28
+
18
29
  export class PropertiesManager {
19
30
  private pendingKeyUpdateCount: MapLike<number> | undefined;
20
31
  private pendingRewriteCount: number;
@@ -24,11 +35,20 @@ export class PropertiesManager {
24
35
  }
25
36
 
26
37
  public ackPendingProperties(annotateOp: IMergeTreeAnnotateMsg) {
27
- if (annotateOp.combiningOp && annotateOp.combiningOp.name === "rewrite") {
38
+ const rewrite = !!annotateOp.combiningOp && annotateOp.combiningOp.name === "rewrite";
39
+ this.decrementPendingCounts(rewrite, annotateOp.props);
40
+ }
41
+
42
+ private decrementPendingCounts(rewrite: boolean, props: PropertySet) {
43
+ if (rewrite) {
28
44
  this.pendingRewriteCount--;
29
45
  }
30
- for (const key of Object.keys(annotateOp.props)) {
46
+ for (const key of Object.keys(props)) {
31
47
  if (this.pendingKeyUpdateCount?.[key] !== undefined) {
48
+ if (rewrite && props[key] === null) {
49
+ // We don't track the pending count for this redundant case
50
+ continue;
51
+ }
32
52
  assert(this.pendingKeyUpdateCount[key] > 0,
33
53
  0x05c /* "Trying to update more annotate props than do exist!" */);
34
54
  this.pendingKeyUpdateCount[key]--;
@@ -45,21 +65,35 @@ export class PropertiesManager {
45
65
  newProps: PropertySet,
46
66
  op?: ICombiningOp,
47
67
  seq?: number,
48
- collaborating: boolean = false): PropertySet | undefined {
68
+ collaborating: boolean = false,
69
+ rollback: PropertiesRollback = PropertiesRollback.None): PropertySet | undefined {
49
70
  if (!this.pendingKeyUpdateCount) {
50
71
  this.pendingKeyUpdateCount = createMap<number>();
51
72
  }
52
73
 
53
74
  // There are outstanding local rewrites, so block all non-local changes
54
- if (this.pendingRewriteCount > 0 && seq !== UnassignedSequenceNumber && collaborating) {
75
+ if (this.pendingRewriteCount > 0 && seq !== UnassignedSequenceNumber && seq !== UniversalSequenceNumber
76
+ && collaborating) {
55
77
  return undefined;
56
78
  }
57
79
 
80
+ // Clean up counts for rolled back edits before modifying oldProps
81
+ if (collaborating) {
82
+ if (rollback === PropertiesRollback.Rollback) {
83
+ this.decrementPendingCounts(false, newProps);
84
+ } else if (rollback === PropertiesRollback.Rewrite) {
85
+ // oldProps is the correct props for tracking counts on rewrite because the ones in newProps include
86
+ // those that were implicitly cleared by the rewrite for which we don't track pending counts.
87
+ this.decrementPendingCounts(true, oldProps);
88
+ }
89
+ }
90
+
58
91
  const rewrite = (op && op.name === "rewrite");
59
92
  const combiningOp = !rewrite ? op ? op : undefined : undefined;
60
93
 
61
94
  const shouldModifyKey = (key: string): boolean => {
62
95
  if (seq === UnassignedSequenceNumber
96
+ || seq === UniversalSequenceNumber
63
97
  || this.pendingKeyUpdateCount?.[key] === undefined
64
98
  || combiningOp) {
65
99
  return true;
@@ -87,6 +121,11 @@ export class PropertiesManager {
87
121
  for (const key of Object.keys(newProps)) {
88
122
  if (collaborating) {
89
123
  if (seq === UnassignedSequenceNumber) {
124
+ if (rewrite && newProps[key] === null) {
125
+ // This case has already been handled above and
126
+ // we don't want to track the pending count for it in case of rollback
127
+ continue;
128
+ }
90
129
  if (this.pendingKeyUpdateCount?.[key] === undefined) {
91
130
  this.pendingKeyUpdateCount[key] = 0;
92
131
  }
@@ -97,7 +136,7 @@ export class PropertiesManager {
97
136
  }
98
137
 
99
138
  const previousValue: any = oldProps[key];
100
- // The delta should be null if undefined, as thats how we encode delete
139
+ // The delta should be null if undefined, as that's how we encode delete
101
140
  deltas[key] = (previousValue === undefined) ? null : previousValue;
102
141
  let newValue: any;
103
142
  if (combiningOp) {
@@ -14,7 +14,7 @@ import { ITelemetryLogger } from "@fluidframework/common-definitions";
14
14
  import { AttachState } from "@fluidframework/container-definitions";
15
15
  import { Client } from "./client";
16
16
  import { NonCollabClient, UniversalSequenceNumber } from "./constants";
17
- import { ISegment, MergeTree } from "./mergeTree";
17
+ import { ISegment } from "./mergeTreeNodes";
18
18
  import { IJSONSegment } from "./ops";
19
19
  import {
20
20
  IJSONSegmentWithMergeInfo,
@@ -23,6 +23,7 @@ import {
23
23
  } from "./snapshotChunks";
24
24
  import { SnapshotV1 } from "./snapshotV1";
25
25
  import { SnapshotLegacy } from "./snapshotlegacy";
26
+ import { MergeTree } from "./mergeTree";
26
27
 
27
28
  export class SnapshotLoader {
28
29
  private readonly logger: ITelemetryLogger;
package/src/snapshotV1.ts CHANGED
@@ -14,8 +14,7 @@ import { SummaryTreeBuilder } from "@fluidframework/runtime-utils";
14
14
  import { UnassignedSequenceNumber } from "./constants";
15
15
  import {
16
16
  ISegment,
17
- MergeTree,
18
- } from "./mergeTree";
17
+ } from "./mergeTreeNodes";
19
18
  import {
20
19
  matchProperties,
21
20
  PropertySet,
@@ -29,6 +28,7 @@ import {
29
28
  serializeAsMaxSupportedVersion,
30
29
  } from "./snapshotChunks";
31
30
  import { SnapshotLegacy } from "./snapshotlegacy";
31
+ import { MergeTree } from "./mergeTree";
32
32
 
33
33
  export class SnapshotV1 {
34
34
  // Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content
@@ -16,14 +16,14 @@ import { SummaryTreeBuilder } from "@fluidframework/runtime-utils";
16
16
  import { NonCollabClient, UnassignedSequenceNumber } from "./constants";
17
17
  import {
18
18
  ISegment,
19
- MergeTree,
20
- } from "./mergeTree";
19
+ } from "./mergeTreeNodes";
21
20
  import { IJSONSegment } from "./ops";
22
21
  import { matchProperties } from "./properties";
23
22
  import {
24
23
  MergeTreeChunkLegacy,
25
24
  serializeAsMinSupportedVersion,
26
25
  } from "./snapshotChunks";
26
+ import { MergeTree } from "./mergeTree";
27
27
 
28
28
  interface SnapshotHeader {
29
29
  chunkCount?: number;
@@ -36,6 +36,10 @@ interface SnapshotHeader {
36
36
  minSeq?: number;
37
37
  }
38
38
 
39
+ /**
40
+ * @deprecated for internal use only. public export will be removed.
41
+ * @internal
42
+ */
39
43
  export class SnapshotLegacy {
40
44
  public static readonly header = "header";
41
45
  public static readonly body = "body";
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ISegment } from "./mergeTree";
6
+ import { ISegment } from "./mergeTreeNodes";
7
7
 
8
8
  /**
9
9
  * Stores a unique and sorted set of segments, or objects with segments
@@ -3,8 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { IIntegerRange } from "./base";
7
- import { BaseSegment, ISegment, Marker, MergeTree } from "./mergeTree";
6
+ import { BaseSegment, ISegment, Marker } from "./mergeTreeNodes";
8
7
  import { IJSONSegment } from "./ops";
9
8
  import { PropertySet } from "./properties";
10
9
  import { LocalReferenceCollection } from "./localReference";
@@ -121,159 +120,13 @@ export class TextSegment extends BaseSegment {
121
120
  }
122
121
  }
123
122
 
124
- interface ITextAccumulator {
125
- textSegment: TextSegment;
126
- placeholder?: string;
127
- parallelArrays?: boolean;
128
- }
129
-
130
- interface ITextAndMarkerAccumulator extends ITextAccumulator {
131
- parallelArrays: true;
132
- parallelText: string[];
133
- parallelMarkers: Marker[];
134
- parallelMarkerLabel: string;
135
- tagsInProgress: string[];
136
- }
137
-
138
- function isTextAndMarkerAccumulator(accum: ITextAccumulator): accum is ITextAndMarkerAccumulator {
139
- return accum.parallelArrays === true;
140
- }
141
-
142
- type ITextAccumulatorType = ITextAccumulator | ITextAndMarkerAccumulator;
143
- export class MergeTreeTextHelper {
144
- constructor(private readonly mergeTree: MergeTree) { }
145
-
146
- public getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number) {
147
- const range = this.getValidRange(start, end, refSeq, clientId);
148
- const accum: ITextAndMarkerAccumulator = {
149
- parallelArrays: true,
150
- parallelMarkerLabel: label,
151
- parallelMarkers: [],
152
- parallelText: [],
153
- tagsInProgress: [],
154
- textSegment: new TextSegment(""),
155
- };
156
-
157
- this.mergeTree.mapRange<ITextAndMarkerAccumulator>(
158
- { leaf: this.gatherText },
159
- refSeq,
160
- clientId,
161
- accum,
162
- range.start,
163
- range.end);
164
-
165
- return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };
166
- }
167
-
168
- public getText(refSeq: number, clientId: number, placeholder = "", start?: number, end?: number) {
169
- const range = this.getValidRange(start, end, refSeq, clientId);
170
-
171
- const accum: ITextAccumulator = { textSegment: new TextSegment(""), placeholder };
172
-
173
- this.mergeTree.mapRange<ITextAccumulator>(
174
- { leaf: this.gatherText },
175
- refSeq,
176
- clientId,
177
- accum,
178
- range.start,
179
- range.end);
180
- return accum.textSegment.text;
181
- }
182
-
183
- private getValidRange(
184
- start: number | undefined,
185
- end: number | undefined,
186
- refSeq: number,
187
- clientId: number,
188
- ): IIntegerRange {
189
- const range: IIntegerRange = {
190
- end: end ?? this.mergeTree.getLength(refSeq, clientId),
191
- start: start ?? 0,
192
- };
193
- return range;
194
- }
195
-
196
- private readonly gatherText = (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,
197
- end: number, accumText: ITextAccumulatorType) => {
198
- let _start = start;
199
- if (TextSegment.is(segment)) {
200
- let beginTags = "";
201
- let endTags = "";
202
- if (isTextAndMarkerAccumulator(accumText)) {
203
- // TODO: let clients pass in function to get tag
204
- const tags = [] as string[];
205
- const initTags = [] as string[];
206
-
207
- if (segment.properties?.["font-weight"]) {
208
- tags.push("b");
209
- }
210
- if (segment.properties?.["text-decoration"]) {
211
- tags.push("u");
212
- }
213
- const remTags = [] as string[];
214
- if (tags.length > 0) {
215
- for (const tag of tags) {
216
- if (!accumText.tagsInProgress.includes(tag)) {
217
- beginTags += `<${tag}>`;
218
- initTags.push(tag);
219
- }
220
- }
221
- for (const accumTag of accumText.tagsInProgress) {
222
- if (!tags.includes(accumTag)) {
223
- endTags += `</${accumTag}>`;
224
- remTags.push(accumTag);
225
- }
226
- }
227
- for (const initTag of initTags.reverse()) {
228
- accumText.tagsInProgress.push(initTag);
229
- }
230
- } else {
231
- for (const accumTag of accumText.tagsInProgress) {
232
- endTags += `</${accumTag}>`;
233
- remTags.push(accumTag);
234
- }
235
- }
236
- for (const remTag of remTags) {
237
- const remdex = accumText.tagsInProgress.indexOf(remTag);
238
- if (remdex >= 0) {
239
- accumText.tagsInProgress.splice(remdex, 1);
240
- }
241
- }
242
- }
243
- accumText.textSegment.text += endTags;
244
- accumText.textSegment.text += beginTags;
245
- if ((_start <= 0) && (end >= segment.text.length)) {
246
- accumText.textSegment.text += segment.text;
247
- } else {
248
- if (_start < 0) {
249
- _start = 0;
250
- }
251
- if (end >= segment.text.length) {
252
- accumText.textSegment.text += segment.text.substring(_start);
253
- } else {
254
- accumText.textSegment.text += segment.text.substring(_start, end);
255
- }
256
- }
257
- } else {
258
- if (accumText.placeholder && (accumText.placeholder.length > 0)) {
259
- if (accumText.placeholder === "*") {
260
- const marker = segment as Marker;
261
- accumText.textSegment.text += `\n${marker.toString()}`;
262
- } else {
263
- for (let i = 0; i < segment.cachedLength; i++) {
264
- accumText.textSegment.text += accumText.placeholder;
265
- }
266
- }
267
- } else if (isTextAndMarkerAccumulator(accumText)) {
268
- const marker = segment as Marker;
269
- if (marker.hasTileLabel(accumText.parallelMarkerLabel)) {
270
- accumText.parallelMarkers.push(marker);
271
- accumText.parallelText.push(accumText.textSegment.text);
272
- accumText.textSegment.text = "";
273
- }
274
- }
275
- }
276
-
277
- return true;
278
- };
123
+ export interface IMergeTreeTextHelper{
124
+ /**
125
+ * @deprecated - If consuming via sequence, use `getTextAndMarkers` exported from \@fluidframework/sequence.
126
+ * Otherwise, define your own accumulation model and use `Client.walkSegments`.
127
+ */
128
+ getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number): {
129
+ parallelText: string[];
130
+ parallelMarkers: Marker[]; };
131
+ getText(refSeq: number, clientId: number, placeholder: string, start?: number, end?: number): string;
279
132
  }
@@ -1,197 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
6
- import { ConflictAction, IIntegerRange, KeyComparer, PropertyAction, SortedDictionary } from "./base";
7
- export declare class Stack<T> {
8
- items: T[];
9
- push(val: T): void;
10
- empty(): boolean;
11
- top(): T | undefined;
12
- pop(): T | undefined;
13
- }
14
- export declare function ListRemoveEntry<U>(entry: List<U>): List<U> | undefined;
15
- export declare function ListMakeHead<U>(): List<U>;
16
- export declare class List<T> {
17
- isHead: boolean;
18
- data: T | undefined;
19
- next: List<T>;
20
- prev: List<T>;
21
- constructor(isHead: boolean, data: T | undefined);
22
- clear(): void;
23
- private add;
24
- dequeue(): T | undefined;
25
- enqueue(data: T): List<T>;
26
- walk(fn: (data: T, l: List<T>) => void): void;
27
- some(fn: (data: T, l: List<T>) => boolean, rev?: boolean): T[];
28
- count(): number;
29
- first(): T | undefined;
30
- last(): T | undefined;
31
- empty(): boolean;
32
- /**
33
- * @deprecated - use unshift
34
- */
35
- push(data: T): void;
36
- unshift(data: T): void;
37
- [Symbol.iterator](): IterableIterator<T>;
38
- }
39
- export interface Comparer<T> {
40
- compare(a: T, b: T): number;
41
- min: T;
42
- }
43
- export declare class Heap<T> {
44
- comp: Comparer<T>;
45
- private L;
46
- count(): number;
47
- constructor(a: T[], comp: Comparer<T>);
48
- peek(): T;
49
- get(): T;
50
- add(x: T): void;
51
- private fixup;
52
- private fixDown;
53
- }
54
- export declare const RBColor: {
55
- readonly RED: 0;
56
- readonly BLACK: 1;
57
- };
58
- export declare type RBColor = typeof RBColor[keyof typeof RBColor];
59
- export interface RBNode<TKey, TData> {
60
- key: TKey;
61
- data: TData;
62
- left: RBNode<TKey, TData> | undefined;
63
- right: RBNode<TKey, TData> | undefined;
64
- color: RBColor;
65
- size: number;
66
- }
67
- export interface IRBAugmentation<TKey, TData> {
68
- update(node: RBNode<TKey, TData>): void;
69
- }
70
- export interface IRBMatcher<TKey, TData> {
71
- continueSubtree(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;
72
- matchNode(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;
73
- }
74
- export interface RBNodeActions<TKey, TData> {
75
- infix?(node: RBNode<TKey, TData>): boolean;
76
- pre?(node: RBNode<TKey, TData>): boolean;
77
- post?(node: RBNode<TKey, TData>): boolean;
78
- showStructure?: boolean;
79
- }
80
- export declare class RedBlackTree<TKey, TData> implements SortedDictionary<TKey, TData> {
81
- private readonly compareKeys;
82
- private readonly aug?;
83
- private root;
84
- constructor(compareKeys: KeyComparer<TKey>, aug?: IRBAugmentation<TKey, TData> | undefined);
85
- private makeNode;
86
- private isRed;
87
- private nodeSize;
88
- size(): number;
89
- isEmpty(): boolean;
90
- get(key: TKey): RBNode<TKey, TData> | undefined;
91
- private nodeGet;
92
- private contains;
93
- gather(key: TKey, matcher: IRBMatcher<TKey, TData>): RBNode<TKey, TData>[];
94
- private nodeGather;
95
- walkExactMatchesForward(compareFn: (node: RBNode<TKey, TData>) => number, actionFn: (node: RBNode<TKey, TData>) => void, continueLeftFn: (number: number) => boolean, continueRightFn: (number: number) => boolean): void;
96
- private nodeWalkExactMatchesForward;
97
- walkExactMatchesBackward(compareFn: (node: RBNode<TKey, TData>) => number, actionFn: (node: RBNode<TKey, TData>) => void, continueLeftFn: (number: number) => boolean, continueRightFn: (number: number) => boolean): void;
98
- private nodeWalkExactMatchesBackward;
99
- put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void;
100
- private nodePut;
101
- private updateLocal;
102
- private nodeRemoveMin;
103
- remove(key: TKey): void;
104
- removeExisting(key: TKey): void;
105
- private nodeRemove;
106
- floor(key: TKey): RBNode<TKey, TData> | undefined;
107
- private nodeFloor;
108
- ceil(key: TKey): RBNode<TKey, TData> | undefined;
109
- private nodeCeil;
110
- min(): RBNode<TKey, TData> | undefined;
111
- private nodeMin;
112
- max(): RBNode<TKey, TData> | undefined;
113
- private nodeMax;
114
- private rotateRight;
115
- private rotateLeft;
116
- private oppositeColor;
117
- private flipColors;
118
- private moveRedLeft;
119
- private moveRedRight;
120
- private balance;
121
- mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey): void;
122
- map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void;
123
- keys(): TKey[];
124
- /**
125
- * Depth-first traversal with custom action; if action returns
126
- * false, traversal is halted.
127
- * @param action - action to apply to each node
128
- */
129
- walk(actions: RBNodeActions<TKey, TData>): void;
130
- walkBackward(actions: RBNodeActions<TKey, TData>): void;
131
- private nodeWalk;
132
- private nodeWalkBackward;
133
- private nodeMap;
134
- }
135
- export interface AugmentedIntervalNode {
136
- minmax: IInterval;
137
- }
138
- export declare const integerRangeToString: (range: IIntegerRange) => string;
139
- export interface IInterval {
140
- clone(): IInterval;
141
- compare(b: IInterval): number;
142
- compareStart(b: IInterval): number;
143
- compareEnd(b: IInterval): number;
144
- modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage): IInterval | undefined;
145
- overlaps(b: IInterval): boolean;
146
- union(b: IInterval): IInterval;
147
- }
148
- export declare type IntervalNode<T extends IInterval> = RBNode<T, AugmentedIntervalNode>;
149
- export declare type IntervalConflictResolver<TInterval> = (a: TInterval, b: TInterval) => TInterval;
150
- export declare class IntervalTree<T extends IInterval> implements IRBAugmentation<T, AugmentedIntervalNode>, IRBMatcher<T, AugmentedIntervalNode> {
151
- intervals: RedBlackTree<T, AugmentedIntervalNode>;
152
- remove(x: T): void;
153
- removeExisting(x: T): void;
154
- put(x: T, conflict?: IntervalConflictResolver<T>): void;
155
- map(fn: (x: T) => void): void;
156
- mapUntil(fn: (X: T) => boolean): void;
157
- mapBackward(fn: (x: T) => void): void;
158
- match(x: T): RBNode<T, AugmentedIntervalNode>[];
159
- matchNode(node: IntervalNode<T> | undefined, key: T): boolean;
160
- continueSubtree(node: IntervalNode<T> | undefined, key: T): boolean;
161
- update(node: IntervalNode<T>): void;
162
- }
163
- export interface TSTResult<T> {
164
- key: string;
165
- val: T;
166
- }
167
- export interface TSTNode<T> {
168
- c: string;
169
- left?: TSTNode<T>;
170
- mid?: TSTNode<T>;
171
- right?: TSTNode<T>;
172
- val?: T;
173
- }
174
- export interface ProxString<T> {
175
- text: string;
176
- invDistance: number;
177
- val: T;
178
- }
179
- export declare class TST<T> {
180
- private n;
181
- private root;
182
- size(): number;
183
- private contains;
184
- get(key: string): T | undefined;
185
- private nodeGet;
186
- put(key: string, val: T): void;
187
- private nodePut;
188
- neighbors(text: string, distance?: number): ProxString<T>[];
189
- keysWithPrefix(text: string): string[];
190
- private collect;
191
- private mapNode;
192
- map(fn: (key: string, val: T) => void): void;
193
- pairsWithPrefix(text: string): TSTResult<T>[];
194
- private collectPairs;
195
- private nodeProximity;
196
- }
197
- //# sourceMappingURL=collections.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EACH,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACd,gBAAgB,EACnB,MAAM,QAAQ,CAAC;AAEhB,qBAAa,KAAK,CAAC,CAAC;IACT,KAAK,EAAE,CAAC,EAAE,CAAM;IAChB,IAAI,CAAC,GAAG,EAAE,CAAC;IAIX,KAAK;IAIL,GAAG,IAAI,CAAC,GAAG,SAAS;IAIpB,GAAG,IAAI,CAAC,GAAG,SAAS;CAG9B;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAUtE;AAMD,wBAAgB,YAAY,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAEzC;AAED,qBAAa,IAAI,CAAC,CAAC;IAII,MAAM,EAAE,OAAO;IAAS,IAAI,EAAE,CAAC,GAAG,SAAS;IAHvD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;gBAEF,MAAM,EAAE,OAAO,EAAS,IAAI,EAAE,CAAC,GAAG,SAAS;IAKvD,KAAK,IAAI,IAAI;IAOpB,OAAO,CAAC,GAAG;IASJ,OAAO,IAAI,CAAC,GAAG,SAAS;IAQxB,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAIzB,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAO7C,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE;IAkB9D,KAAK,IAAI,MAAM;IAWf,KAAK,IAAI,CAAC,GAAG,SAAS;IAMtB,IAAI,IAAI,CAAC,GAAG,SAAS;IAMrB,KAAK,IAAI,OAAO;IAIvB;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAInB,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAUtB,CAAC,MAAM,CAAC,QAAQ,CAAC;CAmB3B;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACvB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC;CACV;AAED,qBAAa,IAAI,CAAC,CAAC;IAKY,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAJ5C,OAAO,CAAC,CAAC,CAAM;IACR,KAAK;gBAGA,CAAC,EAAE,CAAC,EAAE,EAAS,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAMrC,IAAI;IAIJ,GAAG;IAQH,GAAG,CAAC,CAAC,EAAE,CAAC;IAMf,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,OAAO;CAiBlB;AAED,eAAO,MAAM,OAAO;;;CAGV,CAAC;AACX,oBAAY,OAAO,GAAG,OAAO,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAE3D,MAAM,WAAW,MAAM,CAAC,IAAI,EAAE,KAAK;IAC/B,GAAG,EAAE,IAAI,CAAC;IACV,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe,CAAC,IAAI,EAAE,KAAK;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU,CAAC,IAAI,EAAE,KAAK;IACnC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC;IAC3E,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC;CACxE;AAED,MAAM,WAAW,aAAa,CAAC,IAAI,EAAE,KAAK;IACtC,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;IAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;IACzC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,YAAY,CAAC,IAAI,EAAE,KAAK,CAAE,YAAW,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;IAIvE,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;IAJzB,OAAO,CAAC,IAAI,CAAkC;gBAGzB,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,0CAA8B;IAGvD,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,QAAQ;IAGT,IAAI;IAGJ,OAAO;IAGP,GAAG,CAAC,GAAG,EAAE,IAAI;IAKpB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,QAAQ;IAIT,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;IAQzD,OAAO,CAAC,UAAU;IAkBX,uBAAuB,CAC1B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,MAAM,EAChD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,EAC7C,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,EAC3C,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO;IAIhD,OAAO,CAAC,2BAA2B;IAqB5B,wBAAwB,CAC3B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,MAAM,EAChD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,EAC7C,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,EAC3C,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO;IAIhD,OAAO,CAAC,4BAA4B;IAqB7B,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;IAWzE,OAAO,CAAC,OAAO;IA+Cf,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,aAAa;IAad,MAAM,CAAC,GAAG,EAAE,IAAI;IAWhB,cAAc,CAAC,GAAG,EAAE,IAAI;IAW/B,OAAO,CAAC,UAAU;IAmCX,KAAK,CAAC,GAAG,EAAE,IAAI;IAMtB,OAAO,CAAC,SAAS;IAkBV,IAAI,CAAC,GAAG,EAAE,IAAI;IAMrB,OAAO,CAAC,QAAQ;IAkBT,GAAG;IAMV,OAAO,CAAC,OAAO;IAQR,GAAG;IAMV,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,OAAO;IAmBR,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI;IAI9F,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM;IAK/D,IAAI;IAaX;;;;OAIG;IACI,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC;IAIxC,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC;IAIvD,OAAO,CAAC,QAAQ;IA4BhB,OAAO,CAAC,gBAAgB;IA4BxB,OAAO,CAAC,OAAO;CAiClB;AAED,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,SAAS,CAAC;CACrB;AAED,eAAO,MAAM,oBAAoB,UAAW,aAAa,WAAoC,CAAC;AAE9F,MAAM,WAAW,SAAS;IACtB,KAAK,IAAI,SAAS,CAAC;IACnB,OAAO,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC9B,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACnC,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,yBAAyB,GAAG,SAAS,GAAG,SAAS,CAAC;IACzG,QAAQ,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAChC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAClC;AAGD,oBAAY,YAAY,CAAC,CAAC,SAAS,SAAS,IAAI,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;AACjF,oBAAY,wBAAwB,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,KAAK,SAAS,CAAC;AAE5F,qBAAa,YAAY,CAAC,CAAC,SAAS,SAAS,CAAE,YAAW,eAAe,CAAC,CAAC,EAAE,qBAAqB,CAAC,EAC/F,UAAU,CAAC,CAAC,EAAE,qBAAqB,CAAC;IAC7B,SAAS,yCAAsE;IAE/E,MAAM,CAAC,CAAC,EAAE,CAAC;IAIX,cAAc,CAAC,CAAC,EAAE,CAAC;IAInB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAahD,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI;IAWtB,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO;IAU9B,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI;IAY9B,KAAK,CAAC,CAAC,EAAE,CAAC;IAIV,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC;IAInD,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC;IAIzD,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;CActC;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC;CACV;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,CAAC;CACX;AAMD,MAAM,WAAW,UAAU,CAAC,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,CAAC,CAAC;CACV;AAED,qBAAa,GAAG,CAAC,CAAC;IACd,OAAO,CAAC,CAAC,CAAK;IACd,OAAO,CAAC,IAAI,CAAyB;IAE9B,IAAI;IAIX,OAAO,CAAC,QAAQ;IAIT,GAAG,CAAC,GAAG,EAAE,MAAM;IAQtB,OAAO,CAAC,OAAO;IAcR,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAO9B,OAAO,CAAC,OAAO;IAkBR,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAI;IAOpC,cAAc,CAAC,IAAI,EAAE,MAAM;IAalC,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,OAAO;IAaR,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI;IAIrC,eAAe,CAAC,IAAI,EAAE,MAAM;IAanC,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,aAAa;CAkCxB"}