@rgby/collab-core 1.0.1 → 1.0.2
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/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/README.md +0 -60
- package/dist/useCollab.d.ts +0 -216
- package/dist/useCollab.d.ts.map +0 -1
- package/dist/useCollab.js +0 -583
- package/dist/useCollab.js.map +0 -1
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AAEpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AAEpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rgby/collab-core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -83,11 +83,11 @@
|
|
|
83
83
|
},
|
|
84
84
|
"devDependencies": {
|
|
85
85
|
"@ava/typescript": "^5.0.0",
|
|
86
|
-
"@rgby/collab-sdk": "
|
|
86
|
+
"@rgby/collab-sdk": "^1.0.2",
|
|
87
87
|
"ava": "^6.4.1",
|
|
88
88
|
"esbuild": "^0.27.2",
|
|
89
89
|
"happy-dom": "^20.4.0",
|
|
90
90
|
"tsx": "^4.21.0",
|
|
91
91
|
"typescript": "^5.9.3"
|
|
92
92
|
}
|
|
93
|
-
}
|
|
93
|
+
}
|
package/README.md
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# @collab/client
|
|
2
|
-
|
|
3
|
-
A powerful real-time collaboration SDK for building modern web applications. Built on top of [Yjs](https://github.com/yjs/yjs) and [Hocuspocus](https://github.com/ueberdosis/hocuspocus), providing a seamless experience for shared editing, comments, presence, and file uploads.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- 🔄 **Real-time Sync**: Effortless data synchronization across clients using Yjs.
|
|
8
|
-
- 🔌 **Offline Support**: Built-in IndexedDB persistence for offline editing.
|
|
9
|
-
- 💬 **Comments**: Integrated commenting system with threads and resolving.
|
|
10
|
-
- 👥 **Presence**: Real-time user awareness (cursors, selections).
|
|
11
|
-
- 📂 **File Uploads**: Resumable file uploads with offline queue support.
|
|
12
|
-
- 🌳 **Document Management**: Hierarchical document structure (spaces, folders).
|
|
13
|
-
- ⚡ **Framework Agnostic**: Core logic works with any framework.
|
|
14
|
-
- 💚 **Vue Composables**: First-class support for Vue 3.
|
|
15
|
-
|
|
16
|
-
## Installation
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npm install @collab/client
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Quick Start
|
|
23
|
-
|
|
24
|
-
### 1. Initialize the Client
|
|
25
|
-
|
|
26
|
-
```typescript
|
|
27
|
-
import { CollabClient } from '@collab/client';
|
|
28
|
-
|
|
29
|
-
const client = new CollabClient({
|
|
30
|
-
baseUrl: 'https://api.your-collab-server.com',
|
|
31
|
-
authClient: {
|
|
32
|
-
// Implement your auth logic here if using custom auth
|
|
33
|
-
},
|
|
34
|
-
managedAuth: {
|
|
35
|
-
// Or use the built-in managed auth
|
|
36
|
-
autoRefresh: true
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### 2. Connect to a Document
|
|
42
|
-
|
|
43
|
-
```typescript
|
|
44
|
-
// Connect to a specific document within a space
|
|
45
|
-
const provider = await client.getProvider('space-id', 'document-id');
|
|
46
|
-
|
|
47
|
-
// Access the Yjs document
|
|
48
|
-
const yDoc = provider.document;
|
|
49
|
-
const yText = yDoc.getText('content');
|
|
50
|
-
|
|
51
|
-
// Observe changes
|
|
52
|
-
yText.observe(() => {
|
|
53
|
-
console.log('Content updated:', yText.toString());
|
|
54
|
-
});
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## Documentation
|
|
58
|
-
|
|
59
|
-
- [**Vanilla JS Guide**](./VANILLA.md): Detailed guide for using the SDK in any JavaScript environment.
|
|
60
|
-
- [**Vue.js Guide**](./VUE.md): Learn how to use the provided Vue composables for reactive collaborative state.
|
package/dist/useCollab.d.ts
DELETED
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import { type InjectionKey, type Ref, type ShallowRef, type ComputedRef } from 'vue';
|
|
2
|
-
import * as Y from 'yjs';
|
|
3
|
-
import { CollabClient, CollabProvider, type CollabClientOptions, type SessionData } from './collab-provider.ts';
|
|
4
|
-
import type { Editor, EditorOptions } from '@tiptap/core';
|
|
5
|
-
export declare const CollabClientKey: InjectionKey<CollabClient>;
|
|
6
|
-
export declare function provideCollabClient(optionsOrInstance: CollabClientOptions | CollabClient): CollabClient;
|
|
7
|
-
export declare function useCollabClient(): CollabClient;
|
|
8
|
-
export interface UseDocumentReturn {
|
|
9
|
-
doc: ShallowRef<Y.Doc>;
|
|
10
|
-
provider: ShallowRef<CollabProvider | null>;
|
|
11
|
-
status: Ref<'disconnected' | 'connecting' | 'connected'>;
|
|
12
|
-
synced: Ref<boolean>;
|
|
13
|
-
persistenceReady: Ref<boolean>;
|
|
14
|
-
undoManager: ShallowRef<Y.UndoManager | null>;
|
|
15
|
-
connect: () => void;
|
|
16
|
-
disconnect: () => void;
|
|
17
|
-
transact: (callback: (txn: Y.Transaction) => void) => void;
|
|
18
|
-
undo: () => void;
|
|
19
|
-
redo: () => void;
|
|
20
|
-
clearLocalData: () => Promise<void>;
|
|
21
|
-
}
|
|
22
|
-
export declare function useDocument(spaceId: string, documentId: string): UseDocumentReturn;
|
|
23
|
-
export declare function useSyncedMap<T = any>(doc: ShallowRef<Y.Doc>, mapName: string): {
|
|
24
|
-
data: Record<string, T>;
|
|
25
|
-
set: (key: string, value: T) => T | undefined;
|
|
26
|
-
remove: (key: string) => void | undefined;
|
|
27
|
-
clear: () => void | undefined;
|
|
28
|
-
get: (key: string) => T | undefined;
|
|
29
|
-
yMap: ComputedRef<Y.Map<T> | null>;
|
|
30
|
-
};
|
|
31
|
-
export declare function useSyncedArray<T = any>(doc: ShallowRef<Y.Doc>, arrayName: string): {
|
|
32
|
-
list: Ref<T[], T[]>;
|
|
33
|
-
push: (item: T) => void | undefined;
|
|
34
|
-
unshift: (item: T) => void | undefined;
|
|
35
|
-
insert: (index: number, items: T[]) => void | undefined;
|
|
36
|
-
deleteAt: (index: number, length?: number) => void | undefined;
|
|
37
|
-
replace: (index: number, item: T) => void;
|
|
38
|
-
yArray: ComputedRef<Y.Array<T> | null>;
|
|
39
|
-
};
|
|
40
|
-
export declare function useSyncedText(doc: ShallowRef<Y.Doc>, textName: string): {
|
|
41
|
-
text: Ref<string, string>;
|
|
42
|
-
insert: (index: number, content: string, attributes?: Record<string, any>) => void | undefined;
|
|
43
|
-
delete: (index: number, length: number) => void | undefined;
|
|
44
|
-
format: (index: number, length: number, attributes: Record<string, any>) => void | undefined;
|
|
45
|
-
yText: ComputedRef<Y.Text | null>;
|
|
46
|
-
};
|
|
47
|
-
export declare function useSyncedXml(doc: ShallowRef<Y.Doc>, xmlName: string): {
|
|
48
|
-
yXml: ShallowRef<Y.XmlFragment | null, Y.XmlFragment | null>;
|
|
49
|
-
};
|
|
50
|
-
export interface AwarenessUser {
|
|
51
|
-
clientId: number;
|
|
52
|
-
user: {
|
|
53
|
-
name: string;
|
|
54
|
-
color: string;
|
|
55
|
-
avatar?: string;
|
|
56
|
-
};
|
|
57
|
-
[key: string]: any;
|
|
58
|
-
}
|
|
59
|
-
export declare function useAwareness(provider: ShallowRef<CollabProvider | null>): {
|
|
60
|
-
states: Ref<{
|
|
61
|
-
[x: string]: any;
|
|
62
|
-
clientId: number;
|
|
63
|
-
user: {
|
|
64
|
-
name: string;
|
|
65
|
-
color: string;
|
|
66
|
-
avatar?: string | undefined;
|
|
67
|
-
};
|
|
68
|
-
}[], AwarenessUser[] | {
|
|
69
|
-
[x: string]: any;
|
|
70
|
-
clientId: number;
|
|
71
|
-
user: {
|
|
72
|
-
name: string;
|
|
73
|
-
color: string;
|
|
74
|
-
avatar?: string | undefined;
|
|
75
|
-
};
|
|
76
|
-
}[]>;
|
|
77
|
-
currentUser: Ref<{
|
|
78
|
-
[x: string]: any;
|
|
79
|
-
clientId: number;
|
|
80
|
-
user: {
|
|
81
|
-
name: string;
|
|
82
|
-
color: string;
|
|
83
|
-
avatar?: string | undefined;
|
|
84
|
-
};
|
|
85
|
-
} | null, AwarenessUser | {
|
|
86
|
-
[x: string]: any;
|
|
87
|
-
clientId: number;
|
|
88
|
-
user: {
|
|
89
|
-
name: string;
|
|
90
|
-
color: string;
|
|
91
|
-
avatar?: string | undefined;
|
|
92
|
-
};
|
|
93
|
-
} | null>;
|
|
94
|
-
setLocalState: (state: Partial<AwarenessUser["user"] | any>) => void;
|
|
95
|
-
};
|
|
96
|
-
export declare function useLiveComments(provider: ShallowRef<CollabProvider | null>, spaceId: string, documentId: string): {
|
|
97
|
-
threads: Ref<any[], any[]>;
|
|
98
|
-
loading: Ref<boolean, boolean>;
|
|
99
|
-
createComment: (content: string, anchor?: any, parentId?: string) => Promise<void>;
|
|
100
|
-
refresh: () => Promise<void>;
|
|
101
|
-
};
|
|
102
|
-
export interface UseAuthReturn {
|
|
103
|
-
session: ComputedRef<SessionData | null>;
|
|
104
|
-
user: ComputedRef<SessionData['user'] | null>;
|
|
105
|
-
isAuthenticated: ComputedRef<boolean>;
|
|
106
|
-
login: (email: string, password: string) => Promise<SessionData>;
|
|
107
|
-
signup: (email: string, password: string, name: string) => Promise<SessionData>;
|
|
108
|
-
logout: () => Promise<void>;
|
|
109
|
-
}
|
|
110
|
-
export declare function useAuth(providedClient?: CollabClient): UseAuthReturn;
|
|
111
|
-
export interface UseTiptapEditorOptions {
|
|
112
|
-
spaceId: ComputedRef<string> | Ref<string> | string;
|
|
113
|
-
documentId: ComputedRef<string> | Ref<string> | string;
|
|
114
|
-
extensions?: any[];
|
|
115
|
-
editorOptions?: Partial<EditorOptions>;
|
|
116
|
-
user?: {
|
|
117
|
-
name?: string;
|
|
118
|
-
color?: string;
|
|
119
|
-
};
|
|
120
|
-
onReady?: (editor: Editor) => void;
|
|
121
|
-
autoConnect?: boolean;
|
|
122
|
-
}
|
|
123
|
-
export interface UseTiptapEditorReturn {
|
|
124
|
-
editor: ShallowRef<Editor | null>;
|
|
125
|
-
doc: ShallowRef<Y.Doc>;
|
|
126
|
-
provider: ShallowRef<CollabProvider | null>;
|
|
127
|
-
status: Ref<'disconnected' | 'connecting' | 'connected'>;
|
|
128
|
-
synced: Ref<boolean>;
|
|
129
|
-
persistenceReady: Ref<boolean>;
|
|
130
|
-
loading: Ref<boolean>;
|
|
131
|
-
error: Ref<string>;
|
|
132
|
-
connect: () => Promise<void>;
|
|
133
|
-
disconnect: () => void;
|
|
134
|
-
destroy: () => void;
|
|
135
|
-
clearLocalData: () => Promise<void>;
|
|
136
|
-
}
|
|
137
|
-
export declare function useTiptapEditor(options: UseTiptapEditorOptions): UseTiptapEditorReturn;
|
|
138
|
-
export declare function useCollaborativeDocument(spaceId: string, documentId: string): {
|
|
139
|
-
doc: ShallowRef<Y.Doc>;
|
|
140
|
-
provider: ShallowRef<CollabProvider | null>;
|
|
141
|
-
status: Ref<"connected" | "disconnected" | "connecting", "connected" | "disconnected" | "connecting">;
|
|
142
|
-
synced: Ref<boolean, boolean>;
|
|
143
|
-
connect: () => void;
|
|
144
|
-
disconnect: () => void;
|
|
145
|
-
undo: () => void;
|
|
146
|
-
redo: () => void;
|
|
147
|
-
transact: (callback: (txn: Y.Transaction) => void) => void;
|
|
148
|
-
canUndo: ComputedRef<number | boolean>;
|
|
149
|
-
canRedo: ComputedRef<number | boolean>;
|
|
150
|
-
users: Ref<{
|
|
151
|
-
[x: string]: any;
|
|
152
|
-
clientId: number;
|
|
153
|
-
user: {
|
|
154
|
-
name: string;
|
|
155
|
-
color: string;
|
|
156
|
-
avatar?: string | undefined;
|
|
157
|
-
};
|
|
158
|
-
}[], AwarenessUser[] | {
|
|
159
|
-
[x: string]: any;
|
|
160
|
-
clientId: number;
|
|
161
|
-
user: {
|
|
162
|
-
name: string;
|
|
163
|
-
color: string;
|
|
164
|
-
avatar?: string | undefined;
|
|
165
|
-
};
|
|
166
|
-
}[]>;
|
|
167
|
-
me: Ref<{
|
|
168
|
-
[x: string]: any;
|
|
169
|
-
clientId: number;
|
|
170
|
-
user: {
|
|
171
|
-
name: string;
|
|
172
|
-
color: string;
|
|
173
|
-
avatar?: string | undefined;
|
|
174
|
-
};
|
|
175
|
-
} | null, AwarenessUser | {
|
|
176
|
-
[x: string]: any;
|
|
177
|
-
clientId: number;
|
|
178
|
-
user: {
|
|
179
|
-
name: string;
|
|
180
|
-
color: string;
|
|
181
|
-
avatar?: string | undefined;
|
|
182
|
-
};
|
|
183
|
-
} | null>;
|
|
184
|
-
updatePresence: (state: Partial<AwarenessUser["user"] | any>) => void;
|
|
185
|
-
comments: Ref<any[], any[]>;
|
|
186
|
-
loadingComments: Ref<boolean, boolean>;
|
|
187
|
-
createComment: (content: string, anchor?: any, parentId?: string) => Promise<void>;
|
|
188
|
-
useMap: <T>(name: string) => {
|
|
189
|
-
data: Record<string, T>;
|
|
190
|
-
set: (key: string, value: T) => T | undefined;
|
|
191
|
-
remove: (key: string) => void | undefined;
|
|
192
|
-
clear: () => void | undefined;
|
|
193
|
-
get: (key: string) => T | undefined;
|
|
194
|
-
yMap: ComputedRef<Y.Map<T> | null>;
|
|
195
|
-
};
|
|
196
|
-
useArray: <T>(name: string) => {
|
|
197
|
-
list: Ref<T[], T[]>;
|
|
198
|
-
push: (item: T) => void | undefined;
|
|
199
|
-
unshift: (item: T) => void | undefined;
|
|
200
|
-
insert: (index: number, items: T[]) => void | undefined;
|
|
201
|
-
deleteAt: (index: number, length?: number) => void | undefined;
|
|
202
|
-
replace: (index: number, item: T) => void;
|
|
203
|
-
yArray: ComputedRef<Y.Array<T> | null>;
|
|
204
|
-
};
|
|
205
|
-
useText: (name: string) => {
|
|
206
|
-
text: Ref<string, string>;
|
|
207
|
-
insert: (index: number, content: string, attributes?: Record<string, any>) => void | undefined;
|
|
208
|
-
delete: (index: number, length: number) => void | undefined;
|
|
209
|
-
format: (index: number, length: number, attributes: Record<string, any>) => void | undefined;
|
|
210
|
-
yText: ComputedRef<Y.Text | null>;
|
|
211
|
-
};
|
|
212
|
-
useXml: (name: string) => {
|
|
213
|
-
yXml: ShallowRef<Y.XmlFragment | null, Y.XmlFragment | null>;
|
|
214
|
-
};
|
|
215
|
-
};
|
|
216
|
-
//# sourceMappingURL=useCollab.d.ts.map
|
package/dist/useCollab.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCollab.d.ts","sourceRoot":"","sources":["../src/useCollab.ts"],"names":[],"mappings":"AACA,OAAO,EAYH,KAAK,YAAY,EACjB,KAAK,GAAG,EACR,KAAK,UAAU,EACf,KAAK,WAAW,EACnB,MAAM,KAAK,CAAC;AACb,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EACH,YAAY,EACZ,cAAc,EACd,KAAK,mBAAmB,EAExB,KAAK,WAAW,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAM1D,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,YAAY,CAA8B,CAAC;AAEtF,wBAAgB,mBAAmB,CAAC,iBAAiB,EAAE,mBAAmB,GAAG,YAAY,gBAOxF;AAED,wBAAgB,eAAe,iBAI9B;AAOD,MAAM,WAAW,iBAAiB;IAC9B,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,QAAQ,EAAE,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,CAAC,cAAc,GAAG,YAAY,GAAG,WAAW,CAAC,CAAC;IACzD,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,gBAAgB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,KAAK,IAAI,KAAK,IAAI,CAAC;IAC3D,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB,CA2FlF;AAOD,wBAAgB,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM;;eAqCvD,MAAM,SAAS,CAAC;kBACb,MAAM;;eAET,MAAM;;EAU3B;AAOD,wBAAgB,cAAc,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM;;iBAmCzD,CAAC;oBACE,CAAC;oBACD,MAAM,SAAS,CAAC,EAAE;sBAChB,MAAM;qBAMP,MAAM,QAAQ,CAAC;;EAiB1C;AAOD,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM;;oBAuB3C,MAAM,WAAW,MAAM,eAAe,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;oBAGrD,MAAM,UAAU,MAAM;oBAG1B,MAAM,UAAU,MAAM,cAAc,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;EAUjF;AAOD,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM;;EAYnE;AAMD,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;;;kBAT1D,MAAM;;kBAEN,MAAM;mBACL,MAAM;qBACJ,MAAM;;;;kBAJT,MAAM;;kBAEN,MAAM;mBACL,MAAM;qBACJ,MAAM;;;;;kBAJT,MAAM;;kBAEN,MAAM;mBACL,MAAM;qBACJ,MAAM;;;;kBAJT,MAAM;;kBAEN,MAAM;mBACL,MAAM;qBACJ,MAAM;;;2BAgCW,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;EAWrE;AAOD,wBAAgB,eAAe,CAC3B,QAAQ,EAAE,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,EAC3C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM;;;6BA6BoB,MAAM,WAAW,GAAG,aAAa,MAAM;;EAahF;AAOD,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9C,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAChF,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,wBAAgB,OAAO,CAAC,cAAc,CAAC,EAAE,YAAY,GAAG,aAAa,CA8BpE;AAOD,MAAM,WAAW,sBAAsB;IACnC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACpD,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACvD,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,QAAQ,EAAE,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,CAAC,cAAc,GAAG,YAAY,GAAG,WAAW,CAAC,CAAC;IACzD,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,gBAAgB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CAiMtF;AAMD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;;;;;mBAhqBzD,IAAI;sBACD,IAAI;gBAEV,IAAI;gBACJ,IAAI;yBAFK,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,KAAK,IAAI,KAAK,IAAI;;;;;kBAsShD,MAAM;;kBAEN,MAAM;mBACL,MAAM;qBACJ,MAAM;;;;kBAJT,MAAM;;kBAEN,MAAM;mBACL,MAAM;qBACJ,MAAM;;;;;kBAJT,MAAM;;kBAEN,MAAM;mBACL,MAAM;qBACJ,MAAM;;;;kBAJT,MAAM;;kBAEN,MAAM;mBACL,MAAM;qBACJ,MAAM;;;4BAgCW,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;;;6BAkD5B,MAAM,WAAW,GAAG,aAAa,MAAM;aA+S7D,CAAC,QAAQ,MAAM;;mBA9hBb,MAAM;sBACH,MAAM;;mBAET,MAAM;;;eA4hBN,CAAC,QAAQ,MAAM;;;;wBAteV,MAAM;0BACJ,MAAM;yBAMP,MAAM;;;oBAgeP,MAAM;;wBAjbN,MAAM,WAAW,MAAM,eAAe,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;wBAGrD,MAAM,UAAU,MAAM;wBAG1B,MAAM,UAAU,MAAM,cAAc,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;mBA4axD,MAAM;;;EAkC/B"}
|
package/dist/useCollab.js
DELETED
|
@@ -1,583 +0,0 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
import { inject, provide, ref, reactive, computed, onMounted, onBeforeUnmount, shallowRef, watch, markRaw, nextTick } from 'vue';
|
|
3
|
-
import * as Y from 'yjs';
|
|
4
|
-
import { CollabClient, CollabProvider } from "./collab-provider.js";
|
|
5
|
-
// ----------------------------------------------------------------------
|
|
6
|
-
// 1. Setup & Context
|
|
7
|
-
// ----------------------------------------------------------------------
|
|
8
|
-
export const CollabClientKey = Symbol.for('CollabClient');
|
|
9
|
-
export function provideCollabClient(optionsOrInstance) {
|
|
10
|
-
const client = optionsOrInstance instanceof CollabClient
|
|
11
|
-
? optionsOrInstance
|
|
12
|
-
: new CollabClient(optionsOrInstance);
|
|
13
|
-
provide(CollabClientKey, client);
|
|
14
|
-
return client;
|
|
15
|
-
}
|
|
16
|
-
export function useCollabClient() {
|
|
17
|
-
const client = inject(CollabClientKey);
|
|
18
|
-
if (!client)
|
|
19
|
-
throw new Error('CollabClient not provided. Call provideCollabClient() at the root.');
|
|
20
|
-
return client;
|
|
21
|
-
}
|
|
22
|
-
export function useDocument(spaceId, documentId) {
|
|
23
|
-
const client = useCollabClient();
|
|
24
|
-
// Y.Doc should not be deeply reactive in Vue, so we use shallowRef + markRaw
|
|
25
|
-
const doc = shallowRef(markRaw(new Y.Doc()));
|
|
26
|
-
const provider = shallowRef(null);
|
|
27
|
-
const undoManager = shallowRef(null);
|
|
28
|
-
const status = ref('disconnected');
|
|
29
|
-
const synced = ref(false);
|
|
30
|
-
const persistenceReady = ref(false);
|
|
31
|
-
// Track scope for UndoManager to allow filtering (e.g., only undo text, not layout)
|
|
32
|
-
const trackedTypes = new Set();
|
|
33
|
-
const connect = async () => {
|
|
34
|
-
if (provider.value)
|
|
35
|
-
return;
|
|
36
|
-
const p = await client.getProvider(spaceId, documentId, {
|
|
37
|
-
document: doc.value
|
|
38
|
-
});
|
|
39
|
-
// Wait for persistence to load before syncing
|
|
40
|
-
await p.waitForPersistence();
|
|
41
|
-
persistenceReady.value = p.isPersistenceReady();
|
|
42
|
-
// Event Listeners
|
|
43
|
-
const updateStatus = () => { status.value = p.status; };
|
|
44
|
-
const updateSynced = () => { synced.value = p.synced; };
|
|
45
|
-
p.on('status', updateStatus);
|
|
46
|
-
p.on('synced', updateSynced);
|
|
47
|
-
p.on('disconnect', updateStatus);
|
|
48
|
-
provider.value = markRaw(p);
|
|
49
|
-
// Initialize UndoManager
|
|
50
|
-
// We defer this slightly to allow composables to register their types if needed
|
|
51
|
-
nextTick(() => {
|
|
52
|
-
undoManager.value = new Y.UndoManager(trackedTypes.size > 0 ? Array.from(trackedTypes) : doc.value.share.values(), {
|
|
53
|
-
doc: doc.value,
|
|
54
|
-
captureTransaction: (tr) => tr.origin !== undoManager.value
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
};
|
|
58
|
-
const disconnect = () => {
|
|
59
|
-
provider.value?.destroy();
|
|
60
|
-
provider.value = null;
|
|
61
|
-
undoManager.value?.destroy();
|
|
62
|
-
undoManager.value = null;
|
|
63
|
-
status.value = 'disconnected';
|
|
64
|
-
synced.value = false;
|
|
65
|
-
};
|
|
66
|
-
onMounted(connect);
|
|
67
|
-
onBeforeUnmount(() => {
|
|
68
|
-
disconnect();
|
|
69
|
-
doc.value.destroy();
|
|
70
|
-
});
|
|
71
|
-
const transact = (callback) => {
|
|
72
|
-
doc.value.transact(callback, client);
|
|
73
|
-
};
|
|
74
|
-
const undo = () => undoManager.value?.undo();
|
|
75
|
-
const redo = () => undoManager.value?.redo();
|
|
76
|
-
const clearLocalData = async () => {
|
|
77
|
-
if (provider.value) {
|
|
78
|
-
await provider.value.clearLocalData();
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
return {
|
|
82
|
-
doc,
|
|
83
|
-
provider,
|
|
84
|
-
status,
|
|
85
|
-
synced,
|
|
86
|
-
persistenceReady,
|
|
87
|
-
undoManager,
|
|
88
|
-
connect,
|
|
89
|
-
disconnect,
|
|
90
|
-
transact,
|
|
91
|
-
undo,
|
|
92
|
-
redo,
|
|
93
|
-
clearLocalData
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
// ----------------------------------------------------------------------
|
|
97
|
-
// 3. Factory: useSyncedMap
|
|
98
|
-
// Reactive wrapper for Y.Map
|
|
99
|
-
// ----------------------------------------------------------------------
|
|
100
|
-
export function useSyncedMap(doc, mapName) {
|
|
101
|
-
// We use reactive so properties are directly accessible in templates
|
|
102
|
-
const state = reactive({});
|
|
103
|
-
let _ymap = null;
|
|
104
|
-
const init = (newDoc) => {
|
|
105
|
-
if (_ymap)
|
|
106
|
-
_ymap.unobserve(observer);
|
|
107
|
-
_ymap = newDoc.getMap(mapName);
|
|
108
|
-
// Initial Hydration: clear old keys, set new ones
|
|
109
|
-
for (const key in state)
|
|
110
|
-
delete state[key];
|
|
111
|
-
_ymap.forEach((value, key) => {
|
|
112
|
-
state[key] = value;
|
|
113
|
-
});
|
|
114
|
-
_ymap.observe(observer);
|
|
115
|
-
};
|
|
116
|
-
const observer = (event) => {
|
|
117
|
-
event.keysChanged.forEach(key => {
|
|
118
|
-
if (_ymap.has(key)) {
|
|
119
|
-
state[key] = _ymap.get(key);
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
delete state[key];
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
};
|
|
126
|
-
watch(doc, (newDoc) => { if (newDoc)
|
|
127
|
-
init(newDoc); }, { immediate: true });
|
|
128
|
-
onBeforeUnmount(() => {
|
|
129
|
-
if (_ymap)
|
|
130
|
-
_ymap.unobserve(observer);
|
|
131
|
-
});
|
|
132
|
-
// Mutators
|
|
133
|
-
const set = (key, value) => _ymap?.set(key, value);
|
|
134
|
-
const remove = (key) => _ymap?.delete(key);
|
|
135
|
-
const clear = () => _ymap?.clear();
|
|
136
|
-
const get = (key) => _ymap?.get(key);
|
|
137
|
-
return {
|
|
138
|
-
data: state,
|
|
139
|
-
set,
|
|
140
|
-
remove,
|
|
141
|
-
clear,
|
|
142
|
-
get,
|
|
143
|
-
yMap: computed(() => _ymap)
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
// ----------------------------------------------------------------------
|
|
147
|
-
// 4. Factory: useSyncedArray
|
|
148
|
-
// Reactive wrapper for Y.Array using Deltas for fine-grained DOM updates
|
|
149
|
-
// ----------------------------------------------------------------------
|
|
150
|
-
export function useSyncedArray(doc, arrayName) {
|
|
151
|
-
const list = ref([]);
|
|
152
|
-
let _yarray = null;
|
|
153
|
-
const init = (newDoc) => {
|
|
154
|
-
if (_yarray)
|
|
155
|
-
_yarray.unobserve(observer);
|
|
156
|
-
_yarray = newDoc.getArray(arrayName);
|
|
157
|
-
// Initial full copy
|
|
158
|
-
list.value = _yarray.toArray();
|
|
159
|
-
_yarray.observe(observer);
|
|
160
|
-
};
|
|
161
|
-
const observer = (event) => {
|
|
162
|
-
let index = 0;
|
|
163
|
-
event.delta.forEach((op) => {
|
|
164
|
-
if (op.retain) {
|
|
165
|
-
index += op.retain;
|
|
166
|
-
}
|
|
167
|
-
else if (op.insert) {
|
|
168
|
-
const items = op.insert;
|
|
169
|
-
list.value.splice(index, 0, ...items);
|
|
170
|
-
index += items.length;
|
|
171
|
-
}
|
|
172
|
-
else if (op.delete) {
|
|
173
|
-
list.value.splice(index, op.delete);
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
};
|
|
177
|
-
watch(doc, (newDoc) => { if (newDoc)
|
|
178
|
-
init(newDoc); }, { immediate: true });
|
|
179
|
-
onBeforeUnmount(() => {
|
|
180
|
-
if (_yarray)
|
|
181
|
-
_yarray.unobserve(observer);
|
|
182
|
-
});
|
|
183
|
-
// Mutators
|
|
184
|
-
const push = (item) => _yarray?.push([item]);
|
|
185
|
-
const unshift = (item) => _yarray?.insert(0, [item]);
|
|
186
|
-
const insert = (index, items) => _yarray?.insert(index, items);
|
|
187
|
-
const deleteAt = (index, length = 1) => _yarray?.delete(index, length);
|
|
188
|
-
/**
|
|
189
|
-
* Replaces an item at index. Useful for updating object properties in an array
|
|
190
|
-
* since Y.Array doesn't track deep object property changes automatically.
|
|
191
|
-
*/
|
|
192
|
-
const replace = (index, item) => {
|
|
193
|
-
if (!_yarray)
|
|
194
|
-
return;
|
|
195
|
-
doc.value.transact(() => {
|
|
196
|
-
_yarray.delete(index, 1);
|
|
197
|
-
_yarray.insert(index, [item]);
|
|
198
|
-
});
|
|
199
|
-
};
|
|
200
|
-
return {
|
|
201
|
-
list,
|
|
202
|
-
push,
|
|
203
|
-
unshift,
|
|
204
|
-
insert,
|
|
205
|
-
deleteAt,
|
|
206
|
-
replace,
|
|
207
|
-
yArray: computed(() => _yarray)
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
// ----------------------------------------------------------------------
|
|
211
|
-
// 5. Factory: useSyncedText
|
|
212
|
-
// Reactive wrapper for Y.Text
|
|
213
|
-
// ----------------------------------------------------------------------
|
|
214
|
-
export function useSyncedText(doc, textName) {
|
|
215
|
-
const text = ref('');
|
|
216
|
-
let _ytext = null;
|
|
217
|
-
const init = (newDoc) => {
|
|
218
|
-
if (_ytext)
|
|
219
|
-
_ytext.unobserve(observer);
|
|
220
|
-
_ytext = newDoc.getText(textName);
|
|
221
|
-
text.value = _ytext.toString();
|
|
222
|
-
_ytext.observe(observer);
|
|
223
|
-
};
|
|
224
|
-
const observer = (event) => {
|
|
225
|
-
// For strings, we usually just want the current value.
|
|
226
|
-
// Applying strict deltas to a Javascript string is O(N) anyway.
|
|
227
|
-
text.value = _ytext.toString();
|
|
228
|
-
};
|
|
229
|
-
watch(doc, (newDoc) => { if (newDoc)
|
|
230
|
-
init(newDoc); }, { immediate: true });
|
|
231
|
-
onBeforeUnmount(() => {
|
|
232
|
-
if (_ytext)
|
|
233
|
-
_ytext.unobserve(observer);
|
|
234
|
-
});
|
|
235
|
-
const insert = (index, content, attributes) => _ytext?.insert(index, content, attributes);
|
|
236
|
-
const deleteText = (index, length) => _ytext?.delete(index, length);
|
|
237
|
-
const format = (index, length, attributes) => _ytext?.format(index, length, attributes);
|
|
238
|
-
return {
|
|
239
|
-
text, // Read-only reactive string
|
|
240
|
-
insert,
|
|
241
|
-
delete: deleteText,
|
|
242
|
-
format,
|
|
243
|
-
yText: computed(() => _ytext)
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
// ----------------------------------------------------------------------
|
|
247
|
-
// 6. Factory: useSyncedXml
|
|
248
|
-
// Exposes Y.XmlFragment (for Tiptap/ProseMirror/Quill)
|
|
249
|
-
// ----------------------------------------------------------------------
|
|
250
|
-
export function useSyncedXml(doc, xmlName) {
|
|
251
|
-
const _yxml = shallowRef(null);
|
|
252
|
-
watch(doc, (newDoc) => {
|
|
253
|
-
if (newDoc) {
|
|
254
|
-
_yxml.value = newDoc.getXmlFragment(xmlName);
|
|
255
|
-
}
|
|
256
|
-
}, { immediate: true });
|
|
257
|
-
return {
|
|
258
|
-
yXml: _yxml // Pass this to Tiptap's Collaboration extension
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
export function useAwareness(provider) {
|
|
262
|
-
const states = ref([]);
|
|
263
|
-
const currentUser = ref(null);
|
|
264
|
-
const update = () => {
|
|
265
|
-
if (!provider.value)
|
|
266
|
-
return;
|
|
267
|
-
const awareness = provider.value.awareness;
|
|
268
|
-
states.value = Array.from(awareness.getStates().entries()).map(([id, state]) => ({
|
|
269
|
-
clientId: id,
|
|
270
|
-
...state
|
|
271
|
-
}));
|
|
272
|
-
const local = awareness.getLocalState();
|
|
273
|
-
if (local) {
|
|
274
|
-
currentUser.value = { clientId: awareness.clientID, ...local };
|
|
275
|
-
}
|
|
276
|
-
};
|
|
277
|
-
watch(provider, (p, oldP) => {
|
|
278
|
-
if (oldP)
|
|
279
|
-
oldP.awareness.off('change', update);
|
|
280
|
-
if (p) {
|
|
281
|
-
p.awareness.on('change', update);
|
|
282
|
-
update(); // Initial fetch
|
|
283
|
-
}
|
|
284
|
-
}, { immediate: true });
|
|
285
|
-
const setLocalState = (state) => {
|
|
286
|
-
if (!provider.value)
|
|
287
|
-
return;
|
|
288
|
-
const current = provider.value.awareness.getLocalState() || {};
|
|
289
|
-
provider.value.awareness.setLocalState({ ...current, ...state });
|
|
290
|
-
};
|
|
291
|
-
return {
|
|
292
|
-
states,
|
|
293
|
-
currentUser,
|
|
294
|
-
setLocalState
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
// ----------------------------------------------------------------------
|
|
298
|
-
// 8. Utility: useLiveComments
|
|
299
|
-
// Hybrid REST + Websocket comments
|
|
300
|
-
// ----------------------------------------------------------------------
|
|
301
|
-
export function useLiveComments(provider, spaceId, documentId) {
|
|
302
|
-
const client = useCollabClient();
|
|
303
|
-
const threads = ref([]); // Replace `any` with your CommentThread interface
|
|
304
|
-
const loading = ref(false);
|
|
305
|
-
const fetchComments = async () => {
|
|
306
|
-
loading.value = true;
|
|
307
|
-
try {
|
|
308
|
-
const res = await client.comments.list(spaceId, documentId);
|
|
309
|
-
threads.value = res.threads;
|
|
310
|
-
}
|
|
311
|
-
catch (e) {
|
|
312
|
-
console.error(e);
|
|
313
|
-
}
|
|
314
|
-
finally {
|
|
315
|
-
loading.value = false;
|
|
316
|
-
}
|
|
317
|
-
};
|
|
318
|
-
watch(provider, (p) => {
|
|
319
|
-
if (!p)
|
|
320
|
-
return;
|
|
321
|
-
// Watch for broadcasted events
|
|
322
|
-
const cleanup = p.onComment((event) => {
|
|
323
|
-
// Simple strategy: refetch on any change from others
|
|
324
|
-
// (You can implement optimistic updates here for 'create' events)
|
|
325
|
-
if (['create', 'update', 'delete', 'resolve'].includes(event.action)) {
|
|
326
|
-
fetchComments();
|
|
327
|
-
}
|
|
328
|
-
});
|
|
329
|
-
fetchComments();
|
|
330
|
-
return () => cleanup();
|
|
331
|
-
}, { immediate: true });
|
|
332
|
-
const createComment = async (content, anchor, parentId) => {
|
|
333
|
-
const comment = await client.comments.create(spaceId, documentId, { content, anchor, parentId });
|
|
334
|
-
provider.value?.sendComment('create', comment);
|
|
335
|
-
// Optimistic local update
|
|
336
|
-
if (parentId) {
|
|
337
|
-
const thread = threads.value.find(t => t.id === parentId);
|
|
338
|
-
if (thread)
|
|
339
|
-
thread.replies.push(comment);
|
|
340
|
-
}
|
|
341
|
-
else {
|
|
342
|
-
threads.value.push({ ...comment, replies: [] });
|
|
343
|
-
}
|
|
344
|
-
};
|
|
345
|
-
return { threads, loading, createComment, refresh: fetchComments };
|
|
346
|
-
}
|
|
347
|
-
export function useAuth(providedClient) {
|
|
348
|
-
const client = providedClient || useCollabClient();
|
|
349
|
-
const session = ref(null);
|
|
350
|
-
// Access private authManager
|
|
351
|
-
const authManager = client.authManager;
|
|
352
|
-
if (!authManager) {
|
|
353
|
-
throw new Error('useAuth() requires CollabClient to be initialized with managed auth mode');
|
|
354
|
-
}
|
|
355
|
-
// Get initial session immediately
|
|
356
|
-
session.value = authManager.getSession();
|
|
357
|
-
// Subscribe to auth changes
|
|
358
|
-
const unsubscribe = authManager.subscribe((newSession) => {
|
|
359
|
-
session.value = newSession;
|
|
360
|
-
});
|
|
361
|
-
onBeforeUnmount(() => {
|
|
362
|
-
unsubscribe();
|
|
363
|
-
});
|
|
364
|
-
return {
|
|
365
|
-
session: computed(() => session.value),
|
|
366
|
-
user: computed(() => session.value?.user ?? null),
|
|
367
|
-
isAuthenticated: computed(() => session.value !== null),
|
|
368
|
-
login: (email, password) => client.login(email, password),
|
|
369
|
-
signup: (email, password, name) => client.signup(email, password, name),
|
|
370
|
-
logout: () => client.logout()
|
|
371
|
-
};
|
|
372
|
-
}
|
|
373
|
-
export function useTiptapEditor(options) {
|
|
374
|
-
const client = useCollabClient();
|
|
375
|
-
// Normalize refs
|
|
376
|
-
const spaceId = computed(() => {
|
|
377
|
-
const val = options.spaceId;
|
|
378
|
-
return typeof val === 'string' ? val : val.value;
|
|
379
|
-
});
|
|
380
|
-
const documentId = computed(() => {
|
|
381
|
-
const val = options.documentId;
|
|
382
|
-
return typeof val === 'string' ? val : val.value;
|
|
383
|
-
});
|
|
384
|
-
const editor = shallowRef(null);
|
|
385
|
-
const doc = shallowRef(markRaw(new Y.Doc()));
|
|
386
|
-
const provider = shallowRef(null);
|
|
387
|
-
const status = ref('disconnected');
|
|
388
|
-
const synced = ref(false);
|
|
389
|
-
const persistenceReady = ref(false);
|
|
390
|
-
const loading = ref(false);
|
|
391
|
-
const error = ref('');
|
|
392
|
-
// Generate unique tab ID for multi-tab awareness
|
|
393
|
-
const generateTabId = () => {
|
|
394
|
-
return `tab-${Math.random().toString(36).substring(2, 9)}-${Date.now()}`;
|
|
395
|
-
};
|
|
396
|
-
// Random color for cursor
|
|
397
|
-
const generateColor = () => {
|
|
398
|
-
const colors = [
|
|
399
|
-
'#958DF1', '#F98181', '#FBBC88', '#FAF594', '#70CFF8',
|
|
400
|
-
'#94FADB', '#B9F18D', '#C3E2C2', '#EAECCC', '#AFC8AD'
|
|
401
|
-
];
|
|
402
|
-
return colors[Math.floor(Math.random() * colors.length)];
|
|
403
|
-
};
|
|
404
|
-
const connect = async () => {
|
|
405
|
-
if (provider.value)
|
|
406
|
-
return;
|
|
407
|
-
loading.value = true;
|
|
408
|
-
error.value = '';
|
|
409
|
-
try {
|
|
410
|
-
// Dynamically import TipTap extensions first (needed for server extensions)
|
|
411
|
-
const [tiptapCore, { Collaboration }, { CollaborationCursor }] = await Promise.all([
|
|
412
|
-
import('@tiptap/core'),
|
|
413
|
-
import('@tiptap/extension-collaboration'),
|
|
414
|
-
import('./extensions/collaboration-cursor.js')
|
|
415
|
-
]);
|
|
416
|
-
const { Editor: TiptapEditor } = tiptapCore;
|
|
417
|
-
// Fetch server extensions, providing @tiptap/core for scripts that import it
|
|
418
|
-
const serverExtensions = await client.getExtensions({
|
|
419
|
-
'@tiptap/core': tiptapCore
|
|
420
|
-
});
|
|
421
|
-
// Get provider
|
|
422
|
-
const p = await client.getProvider(spaceId.value, documentId.value, {
|
|
423
|
-
document: doc.value
|
|
424
|
-
});
|
|
425
|
-
// Wait for persistence to load
|
|
426
|
-
await p.waitForPersistence();
|
|
427
|
-
persistenceReady.value = p.isPersistenceReady();
|
|
428
|
-
// Event listeners
|
|
429
|
-
const updateStatus = () => { status.value = p.status; };
|
|
430
|
-
const updateSynced = () => { synced.value = p.synced; };
|
|
431
|
-
p.on('status', updateStatus);
|
|
432
|
-
p.on('synced', updateSynced);
|
|
433
|
-
p.on('disconnect', updateStatus);
|
|
434
|
-
provider.value = markRaw(p);
|
|
435
|
-
// StarterKit is optional - consumer can provide their own extensions
|
|
436
|
-
let StarterKit = null;
|
|
437
|
-
try {
|
|
438
|
-
StarterKit = (await import('@tiptap/starter-kit')).default;
|
|
439
|
-
}
|
|
440
|
-
catch {
|
|
441
|
-
// StarterKit not installed - user should provide extensions via options
|
|
442
|
-
}
|
|
443
|
-
const fragment = doc.value.getXmlFragment('default');
|
|
444
|
-
const tabId = generateTabId();
|
|
445
|
-
const userName = options.user?.name ?? 'Anonymous';
|
|
446
|
-
const userColor = options.user?.color ?? generateColor();
|
|
447
|
-
// Create editor
|
|
448
|
-
const baseExtensions = StarterKit
|
|
449
|
-
? [StarterKit.configure({ undoRedo: false })]
|
|
450
|
-
: [];
|
|
451
|
-
const editorInstance = new TiptapEditor({
|
|
452
|
-
extensions: [
|
|
453
|
-
...baseExtensions,
|
|
454
|
-
Collaboration.configure({
|
|
455
|
-
document: doc.value,
|
|
456
|
-
field: 'default'
|
|
457
|
-
}),
|
|
458
|
-
CollaborationCursor.configure({
|
|
459
|
-
provider: provider.value,
|
|
460
|
-
user: {
|
|
461
|
-
name: userName,
|
|
462
|
-
color: userColor,
|
|
463
|
-
clientId: tabId
|
|
464
|
-
}
|
|
465
|
-
}),
|
|
466
|
-
...serverExtensions,
|
|
467
|
-
...(options.extensions ?? [])
|
|
468
|
-
],
|
|
469
|
-
...options.editorOptions
|
|
470
|
-
});
|
|
471
|
-
editor.value = markRaw(editorInstance);
|
|
472
|
-
loading.value = false;
|
|
473
|
-
if (options.onReady) {
|
|
474
|
-
options.onReady(editorInstance);
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
catch (e) {
|
|
478
|
-
error.value = e.message || 'Failed to initialize editor';
|
|
479
|
-
loading.value = false;
|
|
480
|
-
console.error('[useTiptapEditor] Error:', e);
|
|
481
|
-
}
|
|
482
|
-
};
|
|
483
|
-
const disconnect = () => {
|
|
484
|
-
provider.value?.destroy();
|
|
485
|
-
provider.value = null;
|
|
486
|
-
status.value = 'disconnected';
|
|
487
|
-
synced.value = false;
|
|
488
|
-
};
|
|
489
|
-
const destroy = () => {
|
|
490
|
-
editor.value?.destroy();
|
|
491
|
-
editor.value = null;
|
|
492
|
-
disconnect();
|
|
493
|
-
doc.value.destroy();
|
|
494
|
-
doc.value = markRaw(new Y.Doc());
|
|
495
|
-
};
|
|
496
|
-
const clearLocalData = async () => {
|
|
497
|
-
if (provider.value) {
|
|
498
|
-
await provider.value.clearLocalData();
|
|
499
|
-
}
|
|
500
|
-
};
|
|
501
|
-
// Watch for changes to spaceId/documentId and reconnect
|
|
502
|
-
watch([spaceId, documentId], async ([newSpaceId, newDocId], [oldSpaceId, oldDocId]) => {
|
|
503
|
-
if (!newSpaceId || !newDocId) {
|
|
504
|
-
destroy();
|
|
505
|
-
return;
|
|
506
|
-
}
|
|
507
|
-
// If changed, reconnect
|
|
508
|
-
if (newSpaceId !== oldSpaceId || newDocId !== oldDocId) {
|
|
509
|
-
destroy();
|
|
510
|
-
await connect();
|
|
511
|
-
}
|
|
512
|
-
});
|
|
513
|
-
// Auto-connect if enabled
|
|
514
|
-
if (options.autoConnect !== false) {
|
|
515
|
-
onMounted(async () => {
|
|
516
|
-
if (spaceId.value && documentId.value) {
|
|
517
|
-
await connect();
|
|
518
|
-
}
|
|
519
|
-
});
|
|
520
|
-
}
|
|
521
|
-
onBeforeUnmount(() => {
|
|
522
|
-
destroy();
|
|
523
|
-
});
|
|
524
|
-
return {
|
|
525
|
-
editor,
|
|
526
|
-
doc,
|
|
527
|
-
provider,
|
|
528
|
-
status,
|
|
529
|
-
synced,
|
|
530
|
-
persistenceReady,
|
|
531
|
-
loading,
|
|
532
|
-
error,
|
|
533
|
-
connect,
|
|
534
|
-
disconnect,
|
|
535
|
-
destroy,
|
|
536
|
-
clearLocalData
|
|
537
|
-
};
|
|
538
|
-
}
|
|
539
|
-
// ----------------------------------------------------------------------
|
|
540
|
-
// 11. Master Composable: useCollaborativeDocument
|
|
541
|
-
// ----------------------------------------------------------------------
|
|
542
|
-
export function useCollaborativeDocument(spaceId, documentId) {
|
|
543
|
-
// 1. Initialize Connection
|
|
544
|
-
const { doc, provider, status, synced, undoManager, connect, disconnect, transact, undo, redo } = useDocument(spaceId, documentId);
|
|
545
|
-
// 2. Initialize Utils
|
|
546
|
-
const awareness = useAwareness(provider);
|
|
547
|
-
const comments = useLiveComments(provider, spaceId, documentId);
|
|
548
|
-
// 3. Create Factories (closured around 'doc')
|
|
549
|
-
// We return functions that generate the composables so the user can name them
|
|
550
|
-
const useMap = (name) => useSyncedMap(doc, name);
|
|
551
|
-
const useArray = (name) => useSyncedArray(doc, name);
|
|
552
|
-
const useText = (name) => useSyncedText(doc, name);
|
|
553
|
-
const useXml = (name) => useSyncedXml(doc, name);
|
|
554
|
-
return {
|
|
555
|
-
// Connection & Core
|
|
556
|
-
doc,
|
|
557
|
-
provider,
|
|
558
|
-
status,
|
|
559
|
-
synced,
|
|
560
|
-
connect,
|
|
561
|
-
disconnect,
|
|
562
|
-
// History
|
|
563
|
-
undo,
|
|
564
|
-
redo,
|
|
565
|
-
transact,
|
|
566
|
-
canUndo: computed(() => undoManager.value?.undoStack.length ?? 0 > 0),
|
|
567
|
-
canRedo: computed(() => undoManager.value?.redoStack.length ?? 0 > 0),
|
|
568
|
-
// Presence
|
|
569
|
-
users: awareness.states,
|
|
570
|
-
me: awareness.currentUser,
|
|
571
|
-
updatePresence: awareness.setLocalState,
|
|
572
|
-
// Comments
|
|
573
|
-
comments: comments.threads,
|
|
574
|
-
loadingComments: comments.loading,
|
|
575
|
-
createComment: comments.createComment,
|
|
576
|
-
// Factories
|
|
577
|
-
useMap,
|
|
578
|
-
useArray,
|
|
579
|
-
useText,
|
|
580
|
-
useXml
|
|
581
|
-
};
|
|
582
|
-
}
|
|
583
|
-
//# sourceMappingURL=useCollab.js.map
|
package/dist/useCollab.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCollab.js","sourceRoot":"","sources":["../src/useCollab.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EACH,MAAM,EACN,OAAO,EACP,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,eAAe,EACf,UAAU,EACV,KAAK,EACL,OAAO,EACP,QAAQ,EAKX,MAAM,KAAK,CAAC;AACb,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EACH,YAAY,EACZ,cAAc,EAIjB,MAAM,sBAAsB,CAAC;AAG9B,yEAAyE;AACzE,qBAAqB;AACrB,yEAAyE;AAEzE,MAAM,CAAC,MAAM,eAAe,GAA+B,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEtF,MAAM,UAAU,mBAAmB,CAAC,iBAAqD;IACrF,MAAM,MAAM,GAAG,iBAAiB,YAAY,YAAY;QACpD,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,IAAI,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAE1C,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACnG,OAAO,MAAM,CAAC;AAClB,CAAC;AAsBD,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,UAAkB;IAC3D,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,6EAA6E;IAC7E,MAAM,GAAG,GAAG,UAAU,CAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,UAAU,CAAwB,IAAI,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,UAAU,CAAuB,IAAI,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,GAAG,CAA8C,cAAc,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAEpC,oFAAoF;IACpF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEpD,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACvB,IAAI,QAAQ,CAAC,KAAK;YAAE,OAAO;QAE3B,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE;YACpD,QAAQ,EAAE,GAAG,CAAC,KAAK;SACtB,CAAC,CAAC;QAEH,8CAA8C;QAC9C,MAAM,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAC7B,gBAAgB,CAAC,KAAK,GAAG,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAEhD,kBAAkB;QAClB,MAAM,YAAY,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAExD,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC7B,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC7B,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAEjC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAE5B,yBAAyB;QACzB,gFAAgF;QAChF,QAAQ,CAAC,GAAG,EAAE;YACV,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,CACjC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAC3E;gBACI,GAAG,EAAE,GAAG,CAAC,KAAK;gBACd,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,WAAW,CAAC,KAAK;aAC9D,CACJ,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACpB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;QAC1B,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;QACtB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;QAC7B,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC;QAC9B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACzB,CAAC,CAAC;IAEF,SAAS,CAAC,OAAO,CAAC,CAAC;IACnB,eAAe,CAAC,GAAG,EAAE;QACjB,UAAU,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,CAAC,QAAsC,EAAE,EAAE;QACxD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IAE7C,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAC9B,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1C,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACH,GAAG;QACH,QAAQ;QACR,MAAM;QACN,MAAM;QACN,gBAAgB;QAChB,WAAW;QACX,OAAO;QACP,UAAU;QACV,QAAQ;QACR,IAAI;QACJ,IAAI;QACJ,cAAc;KACjB,CAAC;AACN,CAAC;AAED,yEAAyE;AACzE,2BAA2B;AAC3B,6BAA6B;AAC7B,yEAAyE;AAEzE,MAAM,UAAU,YAAY,CAAU,GAAsB,EAAE,OAAe;IACzE,qEAAqE;IACrE,MAAM,KAAK,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAE9C,IAAI,KAAK,GAAoB,IAAI,CAAC;IAElC,MAAM,IAAI,GAAG,CAAC,MAAa,EAAE,EAAE;QAC3B,IAAI,KAAK;YAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAErC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAI,OAAO,CAAC,CAAC;QAElC,kDAAkD;QAClD,KAAK,MAAM,GAAG,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACzB,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,KAAqB,EAAE,EAAE;QACvC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC5B,IAAI,KAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,KAAK,CAAC,GAAG,CAAC,GAAG,KAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACJ,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3E,eAAe,CAAC,GAAG,EAAE;QACjB,IAAI,KAAK;YAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,WAAW;IACX,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAE7C,OAAO;QACH,IAAI,EAAE,KAAK;QACX,GAAG;QACH,MAAM;QACN,KAAK;QACL,GAAG;QACH,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;KAC9B,CAAC;AACN,CAAC;AAED,yEAAyE;AACzE,6BAA6B;AAC7B,yEAAyE;AACzE,yEAAyE;AAEzE,MAAM,UAAU,cAAc,CAAU,GAAsB,EAAE,SAAiB;IAC7E,MAAM,IAAI,GAAG,GAAG,CAAM,EAAE,CAAa,CAAC;IACtC,IAAI,OAAO,GAAsB,IAAI,CAAC;IAEtC,MAAM,IAAI,GAAG,CAAC,MAAa,EAAE,EAAE;QAC3B,IAAI,OAAO;YAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAI,SAAS,CAAC,CAAC;QAExC,oBAAoB;QACpB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,KAAuB,EAAE,EAAE;QACzC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACvB,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;gBACZ,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;YACvB,CAAC;iBAAM,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,EAAE,CAAC,MAAa,CAAC;gBAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;gBACtC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;YAC1B,CAAC;iBAAM,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3E,eAAe,CAAC,GAAG,EAAE;QACjB,IAAI,OAAO;YAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,WAAW;IACX,MAAM,IAAI,GAAG,CAAC,IAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,CAAC,IAAO,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,KAAU,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAE/E;;;OAGG;IACH,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,IAAO,EAAE,EAAE;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;YACpB,OAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1B,OAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,OAAO;QACH,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,MAAM;QACN,QAAQ;QACR,OAAO;QACP,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;KAClC,CAAC;AACN,CAAC;AAED,yEAAyE;AACzE,4BAA4B;AAC5B,8BAA8B;AAC9B,yEAAyE;AAEzE,MAAM,UAAU,aAAa,CAAC,GAAsB,EAAE,QAAgB;IAClE,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACrB,IAAI,MAAM,GAAkB,IAAI,CAAC;IAEjC,MAAM,IAAI,GAAG,CAAC,MAAa,EAAE,EAAE;QAC3B,IAAI,MAAM;YAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAE,EAAE;QACrC,uDAAuD;QACvD,gEAAgE;QAChE,IAAI,CAAC,KAAK,GAAG,MAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC,CAAC;IAEF,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3E,eAAe,CAAC,GAAG,EAAE;QACjB,IAAI,MAAM;YAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,UAAgC,EAAE,EAAE,CAChF,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,EAAE,CACjD,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAElC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,UAA+B,EAAE,EAAE,CAC9E,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAE9C,OAAO;QACH,IAAI,EAAE,4BAA4B;QAClC,MAAM;QACN,MAAM,EAAE,UAAU;QAClB,MAAM;QACN,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;KAChC,CAAC;AACN,CAAC;AAED,yEAAyE;AACzE,2BAA2B;AAC3B,uDAAuD;AACvD,yEAAyE;AAEzE,MAAM,UAAU,YAAY,CAAC,GAAsB,EAAE,OAAe;IAChE,MAAM,KAAK,GAAG,UAAU,CAAuB,IAAI,CAAC,CAAC;IAErD,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE;QAClB,IAAI,MAAM,EAAE,CAAC;YACT,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExB,OAAO;QACH,IAAI,EAAE,KAAK,CAAC,gDAAgD;KAC/D,CAAC;AACN,CAAC;AAgBD,MAAM,UAAU,YAAY,CAAC,QAA2C;IACpE,MAAM,MAAM,GAAG,GAAG,CAAkB,EAAE,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,GAAG,CAAuB,IAAI,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,GAAG,EAAE;QAChB,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE,OAAO;QAC5B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;QAE3C,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7E,QAAQ,EAAE,EAAE;YACZ,GAAG,KAAK;SACX,CAAC,CAAoB,CAAC;QAEvB,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACR,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,GAAG,KAAK,EAAmB,CAAC;QACpF,CAAC;IACL,CAAC,CAAC;IAEF,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,IAAI;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,CAAC;YACJ,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjC,MAAM,EAAE,CAAC,CAAC,gBAAgB;QAC9B,CAAC;IACL,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExB,MAAM,aAAa,GAAG,CAAC,KAA2C,EAAE,EAAE;QAClE,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE,OAAO;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;QAC/D,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC;IAEF,OAAO;QACH,MAAM;QACN,WAAW;QACX,aAAa;KAChB,CAAC;AACN,CAAC;AAED,yEAAyE;AACzE,8BAA8B;AAC9B,mCAAmC;AACnC,yEAAyE;AAEzE,MAAM,UAAU,eAAe,CAC3B,QAA2C,EAC3C,OAAe,EACf,UAAkB;IAElB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,GAAG,CAAQ,EAAE,CAAC,CAAC,CAAC,kDAAkD;IAClF,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAE3B,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC7B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC5D,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;QAChC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;gBACzB,CAAC;YAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QAAC,CAAC;IACtC,CAAC,CAAC;IAEF,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;QAClB,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,+BAA+B;QAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,KAAmB,EAAE,EAAE;YAChD,qDAAqD;YACrD,kEAAkE;YAClE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,aAAa,EAAE,CAAC;YACpB,CAAC;QACL,CAAC,CAAC,CAAC;QACH,aAAa,EAAE,CAAC;QAChB,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExB,MAAM,aAAa,GAAG,KAAK,EAAE,OAAe,EAAE,MAAY,EAAE,QAAiB,EAAE,EAAE;QAC7E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjG,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,0BAA0B;QAC1B,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;YAC1D,IAAI,MAAM;gBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AACvE,CAAC;AAgBD,MAAM,UAAU,OAAO,CAAC,cAA6B;IACjD,MAAM,MAAM,GAAG,cAAc,IAAI,eAAe,EAAE,CAAC;IACnD,MAAM,OAAO,GAAG,GAAG,CAAqB,IAAI,CAAC,CAAC;IAE9C,6BAA6B;IAC7B,MAAM,WAAW,GAAI,MAAc,CAAC,WAAW,CAAC;IAChD,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAChG,CAAC;IAED,kCAAkC;IAClC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;IAEzC,4BAA4B;IAC5B,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,UAA8B,EAAE,EAAE;QACzE,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,eAAe,CAAC,GAAG,EAAE;QACjB,WAAW,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QACtC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;QACjD,eAAe,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC;QACvD,KAAK,EAAE,CAAC,KAAa,EAAE,QAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC;QACzE,MAAM,EAAE,CAAC,KAAa,EAAE,QAAgB,EAAE,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC;QAC/F,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;KAChC,CAAC;AACN,CAAC;AAgCD,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC3D,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,iBAAiB;IACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;QAC5B,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC;QAC/B,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,UAAU,CAAgB,IAAI,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,UAAU,CAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,UAAU,CAAwB,IAAI,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,GAAG,CAA8C,cAAc,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAEtB,iDAAiD;IACjD,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC7E,CAAC,CAAC;IAEF,0BAA0B;IAC1B,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,MAAM,MAAM,GAAG;YACX,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;YACrD,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;SACxD,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACvB,IAAI,QAAQ,CAAC,KAAK;YAAE,OAAO;QAE3B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QAEjB,IAAI,CAAC;YACD,4EAA4E;YAC5E,MAAM,CACF,UAAU,EACV,EAAE,aAAa,EAAE,EACjB,EAAE,mBAAmB,EAAE,CAC1B,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAClB,MAAM,CAAC,cAAc,CAAC;gBACtB,MAAM,CAAC,iCAAiC,CAAC;gBACzC,MAAM,CAAC,sCAAsC,CAAC;aACjD,CAAC,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC;YAE5C,6EAA6E;YAC7E,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;gBAChD,cAAc,EAAE,UAAU;aAC7B,CAAC,CAAC;YAEH,eAAe;YACf,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE;gBAChE,QAAQ,EAAE,GAAG,CAAC,KAAK;aACtB,CAAC,CAAC;YAEH,+BAA+B;YAC/B,MAAM,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAC7B,gBAAgB,CAAC,KAAK,GAAG,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAEhD,kBAAkB;YAClB,MAAM,YAAY,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,YAAY,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAExD,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7B,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7B,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAEjC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAE5B,qEAAqE;YACrE,IAAI,UAAU,GAAQ,IAAI,CAAC;YAC3B,IAAI,CAAC;gBACD,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/D,CAAC;YAAC,MAAM,CAAC;gBACL,wEAAwE;YAC5E,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,WAAW,CAAC;YACnD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,aAAa,EAAE,CAAC;YAEzD,gBAAgB;YAChB,MAAM,cAAc,GAAG,UAAU;gBAC7B,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7C,CAAC,CAAC,EAAE,CAAC;YAET,MAAM,cAAc,GAAG,IAAI,YAAY,CAAC;gBACpC,UAAU,EAAE;oBACR,GAAG,cAAc;oBACjB,aAAa,CAAC,SAAS,CAAC;wBACpB,QAAQ,EAAE,GAAG,CAAC,KAAK;wBACnB,KAAK,EAAE,SAAS;qBACnB,CAAC;oBACF,mBAAmB,CAAC,SAAS,CAAC;wBAC1B,QAAQ,EAAE,QAAQ,CAAC,KAAK;wBACxB,IAAI,EAAE;4BACF,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,SAAS;4BAChB,QAAQ,EAAE,KAAK;yBAClB;qBACJ,CAAC;oBACF,GAAG,gBAAgB;oBACnB,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;iBAChC;gBACD,GAAG,OAAO,CAAC,aAAa;aAC3B,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YAEtB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,IAAI,6BAA6B,CAAC;YACzD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACpB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;QAC1B,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC;QAC9B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACjB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,UAAU,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAC9B,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1C,CAAC;IACL,CAAC,CAAC;IAEF,wDAAwD;IACxD,KAAK,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE;QAClF,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QAED,wBAAwB;QACxB,IAAI,UAAU,KAAK,UAAU,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,EAAE,CAAC;YACV,MAAM,OAAO,EAAE,CAAC;QACpB,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QAChC,SAAS,CAAC,KAAK,IAAI,EAAE;YACjB,IAAI,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;gBACpC,MAAM,OAAO,EAAE,CAAC;YACpB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,eAAe,CAAC,GAAG,EAAE;QACjB,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,MAAM;QACN,GAAG;QACH,QAAQ;QACR,MAAM;QACN,MAAM;QACN,gBAAgB;QAChB,OAAO;QACP,KAAK;QACL,OAAO;QACP,UAAU;QACV,OAAO;QACP,cAAc;KACjB,CAAC;AACN,CAAC;AAED,yEAAyE;AACzE,kDAAkD;AAClD,yEAAyE;AAEzE,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,UAAkB;IACxE,2BAA2B;IAC3B,MAAM,EACF,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAC1C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAC5C,GAAG,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAErC,sBAAsB;IACtB,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAEhE,8CAA8C;IAC9C,8EAA8E;IAC9E,MAAM,MAAM,GAAG,CAAI,IAAY,EAAE,EAAE,CAAC,YAAY,CAAI,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,CAAI,IAAY,EAAE,EAAE,CAAC,cAAc,CAAI,GAAG,EAAE,IAAI,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEzD,OAAO;QACH,oBAAoB;QACpB,GAAG;QACH,QAAQ;QACR,MAAM;QACN,MAAM;QACN,OAAO;QACP,UAAU;QAEV,UAAU;QACV,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QACrE,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAErE,WAAW;QACX,KAAK,EAAE,SAAS,CAAC,MAAM;QACvB,EAAE,EAAE,SAAS,CAAC,WAAW;QACzB,cAAc,EAAE,SAAS,CAAC,aAAa;QAEvC,WAAW;QACX,QAAQ,EAAE,QAAQ,CAAC,OAAO;QAC1B,eAAe,EAAE,QAAQ,CAAC,OAAO;QACjC,aAAa,EAAE,QAAQ,CAAC,aAAa;QAErC,YAAY;QACZ,MAAM;QACN,QAAQ;QACR,OAAO;QACP,MAAM;KACT,CAAC;AACN,CAAC"}
|