@verdant-web/server 1.7.8 → 1.7.9
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/cjs/Baselines.d.ts +14 -14
- package/dist/cjs/Baselines.js +77 -77
- package/dist/cjs/ClientConnection.d.ts +18 -18
- package/dist/cjs/ClientConnection.js +105 -105
- package/dist/cjs/MessageSender.d.ts +5 -5
- package/dist/cjs/MessageSender.js +2 -2
- package/dist/cjs/OperationHistory.d.ts +34 -34
- package/dist/cjs/OperationHistory.js +108 -108
- package/dist/cjs/Presence.d.ts +15 -15
- package/dist/cjs/Presence.js +59 -59
- package/dist/cjs/Profiles.d.ts +10 -10
- package/dist/cjs/Profiles.js +19 -19
- package/dist/cjs/ReplicaKeepaliveTimers.d.ts +17 -17
- package/dist/cjs/ReplicaKeepaliveTimers.js +30 -30
- package/dist/cjs/Replicas.d.ts +23 -23
- package/dist/cjs/Replicas.js +132 -132
- package/dist/cjs/Server.d.ts +121 -121
- package/dist/cjs/Server.js +377 -377
- package/dist/cjs/ServerLibrary.d.ts +63 -63
- package/dist/cjs/ServerLibrary.js +467 -467
- package/dist/cjs/TokenProvider.d.ts +16 -16
- package/dist/cjs/TokenProvider.js +26 -26
- package/dist/cjs/TokenVerifier.d.ts +16 -16
- package/dist/cjs/TokenVerifier.js +28 -28
- package/dist/cjs/files/FileMetadata.d.ts +28 -28
- package/dist/cjs/files/FileMetadata.js +46 -46
- package/dist/cjs/files/FileStorage.d.ts +35 -35
- package/dist/cjs/files/FileStorage.js +71 -71
- package/dist/cjs/index.d.ts +9 -9
- package/dist/cjs/index.js +11 -11
- package/dist/cjs/migrations/v0.sql.d.ts +2 -2
- package/dist/cjs/migrations/v0.sql.js +3 -3
- package/dist/cjs/migrations/v1.sql.d.ts +2 -2
- package/dist/cjs/migrations/v1.sql.js +3 -3
- package/dist/cjs/migrations/v2.sql.d.ts +2 -2
- package/dist/cjs/migrations/v2.sql.js +4 -4
- package/dist/cjs/migrations/v3.sql.d.ts +2 -2
- package/dist/cjs/migrations/v3.sql.js +4 -4
- package/dist/cjs/migrations/v4.sql.d.ts +2 -2
- package/dist/cjs/migrations/v4.sql.js +4 -4
- package/dist/cjs/migrations.d.ts +2 -2
- package/dist/cjs/migrations.js +32 -32
- package/dist/cjs/types.d.ts +22 -22
- package/dist/cjs/types.js +2 -2
- package/dist/esm/Baselines.d.ts +14 -14
- package/dist/esm/Baselines.js +73 -73
- package/dist/esm/ClientConnection.d.ts +18 -18
- package/dist/esm/ClientConnection.js +101 -101
- package/dist/esm/MessageSender.d.ts +5 -5
- package/dist/esm/MessageSender.js +1 -1
- package/dist/esm/OperationHistory.d.ts +34 -34
- package/dist/esm/OperationHistory.js +104 -104
- package/dist/esm/Presence.d.ts +15 -15
- package/dist/esm/Presence.js +52 -52
- package/dist/esm/Profiles.d.ts +10 -10
- package/dist/esm/Profiles.js +15 -15
- package/dist/esm/ReplicaKeepaliveTimers.d.ts +17 -17
- package/dist/esm/ReplicaKeepaliveTimers.js +26 -26
- package/dist/esm/Replicas.d.ts +23 -23
- package/dist/esm/Replicas.js +128 -128
- package/dist/esm/Server.d.ts +121 -121
- package/dist/esm/Server.js +370 -370
- package/dist/esm/ServerLibrary.d.ts +63 -63
- package/dist/esm/ServerLibrary.js +463 -463
- package/dist/esm/TokenProvider.d.ts +16 -16
- package/dist/esm/TokenProvider.js +19 -19
- package/dist/esm/TokenVerifier.d.ts +16 -16
- package/dist/esm/TokenVerifier.js +21 -21
- package/dist/esm/files/FileMetadata.d.ts +28 -28
- package/dist/esm/files/FileMetadata.js +42 -42
- package/dist/esm/files/FileStorage.d.ts +35 -35
- package/dist/esm/files/FileStorage.js +44 -44
- package/dist/esm/index.d.ts +9 -9
- package/dist/esm/index.js +4 -4
- package/dist/esm/migrations/v0.sql.d.ts +2 -2
- package/dist/esm/migrations/v0.sql.js +1 -1
- package/dist/esm/migrations/v1.sql.d.ts +2 -2
- package/dist/esm/migrations/v1.sql.js +1 -1
- package/dist/esm/migrations/v2.sql.d.ts +2 -2
- package/dist/esm/migrations/v2.sql.js +2 -2
- package/dist/esm/migrations/v3.sql.d.ts +2 -2
- package/dist/esm/migrations/v3.sql.js +2 -2
- package/dist/esm/migrations/v4.sql.d.ts +2 -2
- package/dist/esm/migrations/v4.sql.js +2 -2
- package/dist/esm/migrations.d.ts +2 -2
- package/dist/esm/migrations.js +25 -25
- package/dist/esm/types.d.ts +22 -22
- package/dist/esm/types.js +1 -1
- package/dist/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/dist/cjs/ServerStorage.d.ts +0 -35
- package/dist/cjs/ServerStorage.js +0 -60
- package/dist/cjs/ServerStorage.js.map +0 -1
- package/dist/esm/ServerStorage.d.ts +0 -44
- package/dist/esm/ServerStorage.js +0 -58
- package/dist/esm/ServerStorage.js.map +0 -1
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { Database } from 'better-sqlite3';
|
|
2
|
-
import { ClientMessage } from '@lo-fi/common';
|
|
3
|
-
import { MessageSender } from './MessageSender.js';
|
|
4
|
-
import { UserProfiles } from './Profiles.js';
|
|
5
|
-
import { TokenInfo } from './TokenVerifier.js';
|
|
6
|
-
interface ServerStorageOptions {
|
|
7
|
-
db: Database;
|
|
8
|
-
sender: MessageSender;
|
|
9
|
-
profiles: UserProfiles<any>;
|
|
10
|
-
replicaTruancyMinutes: number;
|
|
11
|
-
log?: (...args: any[]) => void;
|
|
12
|
-
disableRebasing?: boolean;
|
|
13
|
-
}
|
|
14
|
-
export declare class ServerStorage {
|
|
15
|
-
private profileLoader;
|
|
16
|
-
private libraries;
|
|
17
|
-
private db;
|
|
18
|
-
private sender;
|
|
19
|
-
constructor({ db, sender, profiles, replicaTruancyMinutes, disableRebasing, log, }: ServerStorageOptions);
|
|
20
|
-
/**
|
|
21
|
-
* Call with any message from any replica
|
|
22
|
-
*/
|
|
23
|
-
receive: (libraryId: string, clientKey: string, message: ClientMessage, info: TokenInfo) => Promise<void>;
|
|
24
|
-
/**
|
|
25
|
-
* Call when a replica disconnects from the server
|
|
26
|
-
*/
|
|
27
|
-
remove: (libraryId: string, replicaId: string) => void;
|
|
28
|
-
evictLibrary: (libraryId: string) => void;
|
|
29
|
-
evictUser: (libraryId: string, userId: string) => void;
|
|
30
|
-
private createSchema;
|
|
31
|
-
close: () => Promise<void>;
|
|
32
|
-
getLibraryPresence: (libraryId: string) => Record<string, import("@lo-fi/common").UserInfo<any, any>>;
|
|
33
|
-
getDocumentSnapshot: (libraryId: string, documentId: string) => any;
|
|
34
|
-
}
|
|
35
|
-
export {};
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ServerStorage = void 0;
|
|
4
|
-
const ServerLibrary_js_1 = require("./ServerLibrary.js");
|
|
5
|
-
const Profiles_js_1 = require("./Profiles.js");
|
|
6
|
-
const migrations_js_1 = require("./migrations.js");
|
|
7
|
-
class ServerStorage {
|
|
8
|
-
constructor({ db, sender, profiles, replicaTruancyMinutes, disableRebasing = false, log = () => { }, }) {
|
|
9
|
-
/**
|
|
10
|
-
* Call with any message from any replica
|
|
11
|
-
*/
|
|
12
|
-
this.receive = (libraryId, clientKey, message, info) => {
|
|
13
|
-
const library = this.libraries.open(libraryId);
|
|
14
|
-
return library.receive(message, clientKey, info);
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* Call when a replica disconnects from the server
|
|
18
|
-
*/
|
|
19
|
-
this.remove = (libraryId, replicaId) => {
|
|
20
|
-
const library = this.libraries.open(libraryId);
|
|
21
|
-
library.remove(replicaId);
|
|
22
|
-
};
|
|
23
|
-
this.evictLibrary = (libraryId) => {
|
|
24
|
-
const library = this.libraries.open(libraryId);
|
|
25
|
-
library.destroy();
|
|
26
|
-
};
|
|
27
|
-
this.evictUser = (libraryId, userId) => {
|
|
28
|
-
const library = this.libraries.open(libraryId);
|
|
29
|
-
library.evictUser(userId);
|
|
30
|
-
};
|
|
31
|
-
this.createSchema = () => {
|
|
32
|
-
(0, migrations_js_1.migrations)(this.db);
|
|
33
|
-
};
|
|
34
|
-
this.close = async () => {
|
|
35
|
-
this.db.close();
|
|
36
|
-
};
|
|
37
|
-
this.getLibraryPresence = (libraryId) => {
|
|
38
|
-
const library = this.libraries.open(libraryId);
|
|
39
|
-
return library.getPresence();
|
|
40
|
-
};
|
|
41
|
-
this.getDocumentSnapshot = (libraryId, documentId) => {
|
|
42
|
-
const library = this.libraries.open(libraryId);
|
|
43
|
-
return library.getDocumentSnapshot(documentId);
|
|
44
|
-
};
|
|
45
|
-
this.db = db;
|
|
46
|
-
this.sender = sender;
|
|
47
|
-
this.createSchema();
|
|
48
|
-
this.profileLoader = new Profiles_js_1.UserProfileLoader(profiles);
|
|
49
|
-
this.libraries = new ServerLibrary_js_1.ServerLibraryManager({
|
|
50
|
-
db: this.db,
|
|
51
|
-
sender: this.sender,
|
|
52
|
-
profileLoader: this.profileLoader,
|
|
53
|
-
replicaTruancyMinutes,
|
|
54
|
-
log,
|
|
55
|
-
disableRebasing,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
exports.ServerStorage = ServerStorage;
|
|
60
|
-
//# sourceMappingURL=ServerStorage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ServerStorage.js","sourceRoot":"","sources":["../../src/ServerStorage.ts"],"names":[],"mappings":";;;AAEA,yDAA0D;AAE1D,+CAAgE;AAEhE,mDAA6C;AAW7C,MAAa,aAAa;IAMzB,YAAY,EACX,EAAE,EACF,MAAM,EACN,QAAQ,EACR,qBAAqB,EACrB,eAAe,GAAG,KAAK,EACvB,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,GACQ;QAevB;;WAEG;QACH,YAAO,GAAG,CACT,SAAiB,EACjB,SAAiB,EACjB,OAAsB,EACtB,IAAe,EACd,EAAE;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC,CAAC;QAEF;;WAEG;QACH,WAAM,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,EAAE;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,iBAAY,GAAG,CAAC,SAAiB,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC;QAEF,cAAS,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,EAAE;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEM,iBAAY,GAAG,GAAG,EAAE;YAC3B,IAAA,0BAAU,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,UAAK,GAAG,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC,CAAC;QAEF,uBAAkB,GAAG,CAAC,SAAiB,EAAE,EAAE;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC;QAC9B,CAAC,CAAC;QAEF,wBAAmB,GAAG,CAAC,SAAiB,EAAE,UAAkB,EAAE,EAAE;YAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC,CAAC;QA7DD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,IAAI,+BAAiB,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,IAAI,uCAAoB,CAAC;YACzC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,qBAAqB;YACrB,GAAG;YACH,eAAe;SACf,CAAC,CAAC;IACJ,CAAC;CAkDD;AA5ED,sCA4EC"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { Database } from 'better-sqlite3';
|
|
2
|
-
import { ClientMessage } from '@lo-fi/common';
|
|
3
|
-
import { MessageSender } from './MessageSender.js';
|
|
4
|
-
import { UserProfiles } from './Profiles.js';
|
|
5
|
-
import { TokenInfo } from './TokenVerifier.js';
|
|
6
|
-
import { FileInfo } from './files/FileStorage.js';
|
|
7
|
-
interface ServerStorageOptions {
|
|
8
|
-
db: Database;
|
|
9
|
-
sender: MessageSender;
|
|
10
|
-
profiles: UserProfiles<any>;
|
|
11
|
-
replicaTruancyMinutes: number;
|
|
12
|
-
log?: (...args: any[]) => void;
|
|
13
|
-
disableRebasing?: boolean;
|
|
14
|
-
}
|
|
15
|
-
export declare class ServerStorage {
|
|
16
|
-
private profileLoader;
|
|
17
|
-
private library;
|
|
18
|
-
private db;
|
|
19
|
-
private sender;
|
|
20
|
-
private fileMetadata;
|
|
21
|
-
constructor({ db, sender, profiles, replicaTruancyMinutes, disableRebasing, log, }: ServerStorageOptions);
|
|
22
|
-
/**
|
|
23
|
-
* Call with any message from any replica
|
|
24
|
-
*/
|
|
25
|
-
receive: (libraryId: string, clientKey: string, message: ClientMessage, info: TokenInfo) => Promise<void>;
|
|
26
|
-
/**
|
|
27
|
-
* Call when a replica disconnects from the server
|
|
28
|
-
*/
|
|
29
|
-
remove: (libraryId: string, replicaId: string) => void;
|
|
30
|
-
evictLibrary: (libraryId: string) => void;
|
|
31
|
-
evictUser: (libraryId: string, userId: string) => void;
|
|
32
|
-
private createSchema;
|
|
33
|
-
close: () => Promise<void>;
|
|
34
|
-
getLibraryPresence: (libraryId: string) => Record<string, import("@lo-fi/common").UserInfo<any, any>>;
|
|
35
|
-
getDocumentSnapshot: (libraryId: string, oid: string) => any;
|
|
36
|
-
putFileInfo: (libraryId: string, fileInfo: FileInfo) => void;
|
|
37
|
-
getFileInfo: (libraryId: string, fileId: string) => {
|
|
38
|
-
libraryId: string;
|
|
39
|
-
fileId: string;
|
|
40
|
-
name: string;
|
|
41
|
-
type: string;
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
export {};
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { ServerLibrary } from './ServerLibrary.js';
|
|
2
|
-
import { UserProfileLoader } from './Profiles.js';
|
|
3
|
-
import { migrations } from './migrations.js';
|
|
4
|
-
import { FileMetadata } from './files/FileMetadata.js';
|
|
5
|
-
export class ServerStorage {
|
|
6
|
-
constructor({ db, sender, profiles, replicaTruancyMinutes, disableRebasing = false, log = () => { }, }) {
|
|
7
|
-
/**
|
|
8
|
-
* Call with any message from any replica
|
|
9
|
-
*/
|
|
10
|
-
this.receive = (libraryId, clientKey, message, info) => {
|
|
11
|
-
return this.library.receive(message, clientKey, info);
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* Call when a replica disconnects from the server
|
|
15
|
-
*/
|
|
16
|
-
this.remove = (libraryId, replicaId) => {
|
|
17
|
-
this.library.remove(libraryId, replicaId);
|
|
18
|
-
};
|
|
19
|
-
this.evictLibrary = (libraryId) => {
|
|
20
|
-
this.library.destroy(libraryId);
|
|
21
|
-
};
|
|
22
|
-
this.evictUser = (libraryId, userId) => {
|
|
23
|
-
this.library.evictUser(libraryId, userId);
|
|
24
|
-
};
|
|
25
|
-
this.createSchema = () => {
|
|
26
|
-
migrations(this.db);
|
|
27
|
-
};
|
|
28
|
-
this.close = async () => {
|
|
29
|
-
this.db.close();
|
|
30
|
-
};
|
|
31
|
-
this.getLibraryPresence = (libraryId) => {
|
|
32
|
-
return this.library.getPresence(libraryId);
|
|
33
|
-
};
|
|
34
|
-
this.getDocumentSnapshot = (libraryId, oid) => {
|
|
35
|
-
return this.library.getDocumentSnapshot(libraryId, oid);
|
|
36
|
-
};
|
|
37
|
-
this.putFileInfo = (libraryId, fileInfo) => {
|
|
38
|
-
this.fileMetadata.put(libraryId, fileInfo);
|
|
39
|
-
};
|
|
40
|
-
this.getFileInfo = (libraryId, fileId) => {
|
|
41
|
-
return this.fileMetadata.get(libraryId, fileId);
|
|
42
|
-
};
|
|
43
|
-
this.db = db;
|
|
44
|
-
this.sender = sender;
|
|
45
|
-
this.createSchema();
|
|
46
|
-
this.profileLoader = new UserProfileLoader(profiles);
|
|
47
|
-
this.library = new ServerLibrary({
|
|
48
|
-
db: this.db,
|
|
49
|
-
sender: this.sender,
|
|
50
|
-
profiles: this.profileLoader,
|
|
51
|
-
replicaTruancyMinutes,
|
|
52
|
-
log,
|
|
53
|
-
disableRebasing,
|
|
54
|
-
});
|
|
55
|
-
this.fileMetadata = new FileMetadata(this.db);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=ServerStorage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ServerStorage.js","sourceRoot":"","sources":["../../src/ServerStorage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAgB,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAWvD,MAAM,OAAO,aAAa;IAOzB,YAAY,EACX,EAAE,EACF,MAAM,EACN,QAAQ,EACR,qBAAqB,EACrB,eAAe,GAAG,KAAK,EACvB,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,GACQ;QAgBvB;;WAEG;QACH,YAAO,GAAG,CACT,SAAiB,EACjB,SAAiB,EACjB,OAAsB,EACtB,IAAe,EACd,EAAE;YACH,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC;QAEF;;WAEG;QACH,WAAM,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,EAAE;YACjD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,iBAAY,GAAG,CAAC,SAAiB,EAAE,EAAE;YACpC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC,CAAC;QAEF,cAAS,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,EAAE;YACjD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEM,iBAAY,GAAG,GAAG,EAAE;YAC3B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,UAAK,GAAG,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC,CAAC;QAEF,uBAAkB,GAAG,CAAC,SAAiB,EAAE,EAAE;YAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF,wBAAmB,GAAG,CAAC,SAAiB,EAAE,GAAW,EAAE,EAAE;YACxD,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC,CAAC;QAEF,gBAAW,GAAG,CAAC,SAAiB,EAAE,QAAkB,EAAE,EAAE;YACvD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF,gBAAW,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,EAAE;YACnD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC;QAhED,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC;YAChC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,aAAa;YAC5B,qBAAqB;YACrB,GAAG;YACH,eAAe;SACf,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;CAoDD"}
|