loro-crdt 1.0.8-alpha.2 → 1.0.8-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/bundler/index.d.ts +1 -2
- package/bundler/index.js +1 -2
- package/bundler/index.js.map +1 -1
- package/bundler/vite.config.d.ts +2 -0
- package/nodejs/index.d.ts +72 -0
- package/nodejs/index.js +5 -8
- package/nodejs/index.js.map +1 -1
- package/nodejs/vite.config.d.ts +2 -0
- package/package.json +23 -3
- package/web/index.d.ts +1 -2
- package/web/index.js +2 -2
- package/web/index.js.map +1 -1
- package/web/vite.config.d.ts +2 -0
- package/deno_tests/.vscode/settings.json +0 -3
- package/deno_tests/basic.test.ts +0 -10
- package/deno_tests/deno.json +0 -3
- package/ts/index.ts +0 -217
package/CHANGELOG.md
CHANGED
package/bundler/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export * from "./loro_wasm";
|
|
2
2
|
export type * from "./loro_wasm";
|
|
3
|
-
import
|
|
4
|
-
export default init;
|
|
3
|
+
import { AwarenessWasm, PeerID, Container, ContainerID, ContainerType, LoroCounter, LoroDoc, LoroList, LoroMap, LoroText, LoroTree, OpId, Value, AwarenessListener } from "./loro_wasm";
|
|
5
4
|
/**
|
|
6
5
|
* @deprecated Please use LoroDoc
|
|
7
6
|
*/
|
package/bundler/index.js
CHANGED
package/bundler/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export * from "./loro_wasm";
|
|
2
|
+
export type * from "./loro_wasm";
|
|
3
|
+
import { AwarenessWasm, PeerID, Container, ContainerID, ContainerType, LoroCounter, LoroDoc, LoroList, LoroMap, LoroText, LoroTree, OpId, Value, AwarenessListener } from "./loro_wasm";
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated Please use LoroDoc
|
|
6
|
+
*/
|
|
7
|
+
export declare class Loro extends LoroDoc {
|
|
8
|
+
}
|
|
9
|
+
export declare function isContainerId(s: string): s is ContainerID;
|
|
10
|
+
/** Whether the value is a container.
|
|
11
|
+
*
|
|
12
|
+
* # Example
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* const doc = new LoroDoc();
|
|
16
|
+
* const map = doc.getMap("map");
|
|
17
|
+
* const list = doc.getList("list");
|
|
18
|
+
* const text = doc.getText("text");
|
|
19
|
+
* isContainer(map); // true
|
|
20
|
+
* isContainer(list); // true
|
|
21
|
+
* isContainer(text); // true
|
|
22
|
+
* isContainer(123); // false
|
|
23
|
+
* isContainer("123"); // false
|
|
24
|
+
* isContainer({}); // false
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function isContainer(value: any): value is Container;
|
|
28
|
+
/** Get the type of a value that may be a container.
|
|
29
|
+
*
|
|
30
|
+
* # Example
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
* const doc = new LoroDoc();
|
|
34
|
+
* const map = doc.getMap("map");
|
|
35
|
+
* const list = doc.getList("list");
|
|
36
|
+
* const text = doc.getText("text");
|
|
37
|
+
* getType(map); // "Map"
|
|
38
|
+
* getType(list); // "List"
|
|
39
|
+
* getType(text); // "Text"
|
|
40
|
+
* getType(123); // "Json"
|
|
41
|
+
* getType("123"); // "Json"
|
|
42
|
+
* getType({}); // "Json"
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function getType<T>(value: T): T extends LoroText ? "Text" : T extends LoroMap<any> ? "Map" : T extends LoroTree<any> ? "Tree" : T extends LoroList<any> ? "List" : T extends LoroCounter ? "Counter" : "Json";
|
|
46
|
+
export declare function newContainerID(id: OpId, type: ContainerType): ContainerID;
|
|
47
|
+
export declare function newRootContainerID(name: string, type: ContainerType): ContainerID;
|
|
48
|
+
/**
|
|
49
|
+
* Awareness is a structure that allows to track the ephemeral state of the peers.
|
|
50
|
+
*
|
|
51
|
+
* If we don't receive a state update from a peer within the timeout, we will remove their state.
|
|
52
|
+
* The timeout is in milliseconds. This can be used to handle the off-line state of a peer.
|
|
53
|
+
*/
|
|
54
|
+
export declare class Awareness<T extends Value = Value> {
|
|
55
|
+
inner: AwarenessWasm<T>;
|
|
56
|
+
private peer;
|
|
57
|
+
private timer;
|
|
58
|
+
private timeout;
|
|
59
|
+
private listeners;
|
|
60
|
+
constructor(peer: PeerID, timeout?: number);
|
|
61
|
+
apply(bytes: Uint8Array, origin?: string): void;
|
|
62
|
+
setLocalState(state: T): void;
|
|
63
|
+
getLocalState(): T | undefined;
|
|
64
|
+
getAllStates(): Record<PeerID, T>;
|
|
65
|
+
encode(peers: PeerID[]): Uint8Array;
|
|
66
|
+
encodeAll(): Uint8Array;
|
|
67
|
+
addListener(listener: AwarenessListener): void;
|
|
68
|
+
removeListener(listener: AwarenessListener): void;
|
|
69
|
+
peers(): PeerID[];
|
|
70
|
+
destroy(): void;
|
|
71
|
+
private startTimerIfNotEmpty;
|
|
72
|
+
}
|
package/nodejs/index.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var init = require("./loro_wasm");
|
|
3
|
+
var loroWasm = require("./loro_wasm");
|
|
6
4
|
|
|
7
5
|
/**
|
|
8
6
|
* @deprecated Please use LoroDoc
|
|
9
7
|
*/
|
|
10
|
-
class Loro extends
|
|
8
|
+
class Loro extends loroWasm.LoroDoc {
|
|
11
9
|
}
|
|
12
10
|
const CONTAINER_TYPES = [
|
|
13
11
|
"Map",
|
|
@@ -85,7 +83,7 @@ function newRootContainerID(name, type) {
|
|
|
85
83
|
class Awareness {
|
|
86
84
|
constructor(peer, timeout = 30000) {
|
|
87
85
|
this.listeners = new Set();
|
|
88
|
-
this.inner = new
|
|
86
|
+
this.inner = new loroWasm.AwarenessWasm(peer, timeout);
|
|
89
87
|
this.peer = peer;
|
|
90
88
|
this.timeout = timeout;
|
|
91
89
|
}
|
|
@@ -155,7 +153,6 @@ class Awareness {
|
|
|
155
153
|
}
|
|
156
154
|
}
|
|
157
155
|
|
|
158
|
-
exports.default = init;
|
|
159
156
|
exports.Awareness = Awareness;
|
|
160
157
|
exports.Loro = Loro;
|
|
161
158
|
exports.getType = getType;
|
|
@@ -163,10 +160,10 @@ exports.isContainer = isContainer;
|
|
|
163
160
|
exports.isContainerId = isContainerId;
|
|
164
161
|
exports.newContainerID = newContainerID;
|
|
165
162
|
exports.newRootContainerID = newRootContainerID;
|
|
166
|
-
Object.keys(
|
|
163
|
+
Object.keys(loroWasm).forEach(function (k) {
|
|
167
164
|
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
168
165
|
enumerable: true,
|
|
169
|
-
get: function () { return
|
|
166
|
+
get: function () { return loroWasm[k]; }
|
|
170
167
|
});
|
|
171
168
|
});
|
|
172
169
|
//# sourceMappingURL=index.js.map
|
package/nodejs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../index.ts"],"sourcesContent":[null],"names":["LoroDoc","AwarenessWasm"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loro-crdt",
|
|
3
|
-
"version": "1.0.8-alpha.
|
|
3
|
+
"version": "1.0.8-alpha.3",
|
|
4
4
|
"description": "Loro CRDTs is a high-performance CRDT framework that makes your app state synchronized, collaborative and maintainable effortlessly.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"crdt",
|
|
@@ -17,10 +17,19 @@
|
|
|
17
17
|
"main": "nodejs/index.js",
|
|
18
18
|
"module": "bundler/index.js",
|
|
19
19
|
"types": "bundler/index.d.ts",
|
|
20
|
+
"files": [
|
|
21
|
+
"./bundler",
|
|
22
|
+
"./nodejs",
|
|
23
|
+
"./web",
|
|
24
|
+
"CHANGELOG.md",
|
|
25
|
+
"README.md",
|
|
26
|
+
"LICENSE",
|
|
27
|
+
"package.json"
|
|
28
|
+
],
|
|
20
29
|
"scripts": {
|
|
21
30
|
"build-dev": "deno run -A ./scripts/build.ts dev && rollup -c && deno run -A ./scripts/post-rollup.ts && npm run test",
|
|
22
31
|
"build-release": "deno run -A ./scripts/build.ts release && rollup -c && deno run -A ./scripts/post-rollup.ts && npm run test",
|
|
23
|
-
"test": "cd ./deno_tests && deno test -A"
|
|
32
|
+
"test": "node --expose-gc ./node_modules/vitest/vitest.mjs run && npx tsc --noEmit && cd ./deno_tests && deno test -A"
|
|
24
33
|
},
|
|
25
34
|
"homepage": "https://loro.dev",
|
|
26
35
|
"author": "",
|
|
@@ -33,6 +42,17 @@
|
|
|
33
42
|
"tslib": "^2.8.0",
|
|
34
43
|
"typescript": "^5.6.3",
|
|
35
44
|
"vite-plugin-top-level-await": "^1.2.2",
|
|
36
|
-
"vite-plugin-wasm": "^3.1.0"
|
|
45
|
+
"vite-plugin-wasm": "^3.1.0",
|
|
46
|
+
"@typescript-eslint/parser": "^6.2.0",
|
|
47
|
+
"@vitest/ui": "^1.0.4",
|
|
48
|
+
"esbuild": "^0.18.20",
|
|
49
|
+
"eslint": "^8.46.0",
|
|
50
|
+
"loro-crdt-old": "npm:loro-crdt@=0.16.0",
|
|
51
|
+
"loro-crdt-alpha-4": "npm:loro-crdt@=1.0.0-alpha.4",
|
|
52
|
+
"prettier": "^3.0.0",
|
|
53
|
+
"rollup-plugin-dts": "^5.3.0",
|
|
54
|
+
"rollup-plugin-esbuild": "^5.0.0",
|
|
55
|
+
"vite": "^4.2.1",
|
|
56
|
+
"vitest": "^1.4.0"
|
|
37
57
|
}
|
|
38
58
|
}
|
package/web/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export * from "./loro_wasm";
|
|
2
2
|
export type * from "./loro_wasm";
|
|
3
|
-
import
|
|
4
|
-
export default init;
|
|
3
|
+
import { AwarenessWasm, PeerID, Container, ContainerID, ContainerType, LoroCounter, LoroDoc, LoroList, LoroMap, LoroText, LoroTree, OpId, Value, AwarenessListener } from "./loro_wasm";
|
|
5
4
|
/**
|
|
6
5
|
* @deprecated Please use LoroDoc
|
|
7
6
|
*/
|
package/web/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import init__default, { LoroDoc, AwarenessWasm } from "./loro_wasm.js";
|
|
2
|
-
export * from "./loro_wasm.js";
|
|
3
1
|
export { default } from "./loro_wasm.js";
|
|
2
|
+
import { LoroDoc, AwarenessWasm } from "./loro_wasm.js";
|
|
3
|
+
export * from "./loro_wasm.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @deprecated Please use LoroDoc
|
package/web/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/deno_tests/basic.test.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import init, { initSync, LoroDoc } from "../web/loro_wasm.js";
|
|
2
|
-
import { expect } from "npm:expect";
|
|
3
|
-
|
|
4
|
-
await init();
|
|
5
|
-
|
|
6
|
-
Deno.test("basic", () => {
|
|
7
|
-
const doc = new LoroDoc();
|
|
8
|
-
doc.getText("text").insert(0, "Hello, world!");
|
|
9
|
-
expect(doc.getText("text").toString()).toBe("Hello, world!");
|
|
10
|
-
});
|
package/deno_tests/deno.json
DELETED
package/ts/index.ts
DELETED
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
export * from "loro-wasm";
|
|
2
|
-
export type * from "loro-wasm";
|
|
3
|
-
import init, {
|
|
4
|
-
AwarenessWasm,
|
|
5
|
-
PeerID,
|
|
6
|
-
Container,
|
|
7
|
-
ContainerID,
|
|
8
|
-
ContainerType,
|
|
9
|
-
Delta,
|
|
10
|
-
LoroCounter,
|
|
11
|
-
LoroDoc,
|
|
12
|
-
LoroList,
|
|
13
|
-
LoroMap,
|
|
14
|
-
LoroText,
|
|
15
|
-
LoroTree,
|
|
16
|
-
OpId,
|
|
17
|
-
Value,
|
|
18
|
-
AwarenessListener,
|
|
19
|
-
} from "loro-wasm";
|
|
20
|
-
export default init;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* @deprecated Please use LoroDoc
|
|
24
|
-
*/
|
|
25
|
-
export class Loro extends LoroDoc { }
|
|
26
|
-
|
|
27
|
-
const CONTAINER_TYPES = [
|
|
28
|
-
"Map",
|
|
29
|
-
"Text",
|
|
30
|
-
"List",
|
|
31
|
-
"Tree",
|
|
32
|
-
"MovableList",
|
|
33
|
-
"Counter",
|
|
34
|
-
];
|
|
35
|
-
|
|
36
|
-
export function isContainerId(s: string): s is ContainerID {
|
|
37
|
-
return s.startsWith("cid:");
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Whether the value is a container.
|
|
41
|
-
*
|
|
42
|
-
* # Example
|
|
43
|
-
*
|
|
44
|
-
* ```ts
|
|
45
|
-
* const doc = new LoroDoc();
|
|
46
|
-
* const map = doc.getMap("map");
|
|
47
|
-
* const list = doc.getList("list");
|
|
48
|
-
* const text = doc.getText("text");
|
|
49
|
-
* isContainer(map); // true
|
|
50
|
-
* isContainer(list); // true
|
|
51
|
-
* isContainer(text); // true
|
|
52
|
-
* isContainer(123); // false
|
|
53
|
-
* isContainer("123"); // false
|
|
54
|
-
* isContainer({}); // false
|
|
55
|
-
* ```
|
|
56
|
-
*/
|
|
57
|
-
export function isContainer(value: any): value is Container {
|
|
58
|
-
if (typeof value !== "object" || value == null) {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const p = Object.getPrototypeOf(value);
|
|
63
|
-
if (p == null || typeof p !== "object" || typeof p["kind"] !== "function") {
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return CONTAINER_TYPES.includes(value.kind());
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
/** Get the type of a value that may be a container.
|
|
72
|
-
*
|
|
73
|
-
* # Example
|
|
74
|
-
*
|
|
75
|
-
* ```ts
|
|
76
|
-
* const doc = new LoroDoc();
|
|
77
|
-
* const map = doc.getMap("map");
|
|
78
|
-
* const list = doc.getList("list");
|
|
79
|
-
* const text = doc.getText("text");
|
|
80
|
-
* getType(map); // "Map"
|
|
81
|
-
* getType(list); // "List"
|
|
82
|
-
* getType(text); // "Text"
|
|
83
|
-
* getType(123); // "Json"
|
|
84
|
-
* getType("123"); // "Json"
|
|
85
|
-
* getType({}); // "Json"
|
|
86
|
-
* ```
|
|
87
|
-
*/
|
|
88
|
-
export function getType<T>(
|
|
89
|
-
value: T,
|
|
90
|
-
): T extends LoroText ? "Text"
|
|
91
|
-
: T extends LoroMap<any> ? "Map"
|
|
92
|
-
: T extends LoroTree<any> ? "Tree"
|
|
93
|
-
: T extends LoroList<any> ? "List"
|
|
94
|
-
: T extends LoroCounter ? "Counter"
|
|
95
|
-
: "Json" {
|
|
96
|
-
if (isContainer(value)) {
|
|
97
|
-
return value.kind() as unknown as any;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return "Json" as any;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
export function newContainerID(id: OpId, type: ContainerType): ContainerID {
|
|
105
|
-
return `cid:${id.counter}@${id.peer}:${type}`;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export function newRootContainerID(
|
|
109
|
-
name: string,
|
|
110
|
-
type: ContainerType,
|
|
111
|
-
): ContainerID {
|
|
112
|
-
return `cid:root-${name}:${type}`;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Awareness is a structure that allows to track the ephemeral state of the peers.
|
|
119
|
-
*
|
|
120
|
-
* If we don't receive a state update from a peer within the timeout, we will remove their state.
|
|
121
|
-
* The timeout is in milliseconds. This can be used to handle the off-line state of a peer.
|
|
122
|
-
*/
|
|
123
|
-
export class Awareness<T extends Value = Value> {
|
|
124
|
-
inner: AwarenessWasm<T>;
|
|
125
|
-
private peer: PeerID;
|
|
126
|
-
private timer: number | undefined;
|
|
127
|
-
private timeout: number;
|
|
128
|
-
private listeners: Set<AwarenessListener> = new Set();
|
|
129
|
-
constructor(peer: PeerID, timeout: number = 30000) {
|
|
130
|
-
this.inner = new AwarenessWasm(peer, timeout);
|
|
131
|
-
this.peer = peer;
|
|
132
|
-
this.timeout = timeout;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
apply(bytes: Uint8Array, origin = "remote") {
|
|
136
|
-
const { updated, added } = this.inner.apply(bytes);
|
|
137
|
-
this.listeners.forEach((listener) => {
|
|
138
|
-
listener({ updated, added, removed: [] }, origin);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
this.startTimerIfNotEmpty();
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
setLocalState(state: T) {
|
|
145
|
-
const wasEmpty = this.inner.getState(this.peer) == null;
|
|
146
|
-
this.inner.setLocalState(state);
|
|
147
|
-
if (wasEmpty) {
|
|
148
|
-
this.listeners.forEach((listener) => {
|
|
149
|
-
listener(
|
|
150
|
-
{ updated: [], added: [this.inner.peer()], removed: [] },
|
|
151
|
-
"local",
|
|
152
|
-
);
|
|
153
|
-
});
|
|
154
|
-
} else {
|
|
155
|
-
this.listeners.forEach((listener) => {
|
|
156
|
-
listener(
|
|
157
|
-
{ updated: [this.inner.peer()], added: [], removed: [] },
|
|
158
|
-
"local",
|
|
159
|
-
);
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
this.startTimerIfNotEmpty();
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
getLocalState(): T | undefined {
|
|
167
|
-
return this.inner.getState(this.peer);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
getAllStates(): Record<PeerID, T> {
|
|
171
|
-
return this.inner.getAllStates();
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
encode(peers: PeerID[]): Uint8Array {
|
|
175
|
-
return this.inner.encode(peers);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
encodeAll(): Uint8Array {
|
|
179
|
-
return this.inner.encodeAll();
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
addListener(listener: AwarenessListener) {
|
|
183
|
-
this.listeners.add(listener);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
removeListener(listener: AwarenessListener) {
|
|
187
|
-
this.listeners.delete(listener);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
peers(): PeerID[] {
|
|
191
|
-
return this.inner.peers();
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
destroy() {
|
|
195
|
-
clearInterval(this.timer);
|
|
196
|
-
this.listeners.clear();
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
private startTimerIfNotEmpty() {
|
|
200
|
-
if (this.inner.isEmpty() || this.timer != null) {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
this.timer = setInterval(() => {
|
|
205
|
-
const removed = this.inner.removeOutdated();
|
|
206
|
-
if (removed.length > 0) {
|
|
207
|
-
this.listeners.forEach((listener) => {
|
|
208
|
-
listener({ updated: [], added: [], removed }, "timeout");
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
if (this.inner.isEmpty()) {
|
|
212
|
-
clearInterval(this.timer);
|
|
213
|
-
this.timer = undefined;
|
|
214
|
-
}
|
|
215
|
-
}, this.timeout / 2) as unknown as number;
|
|
216
|
-
}
|
|
217
|
-
}
|