@lossless.org/nosqldb 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.smartconfig.json +107 -0
- package/dist_rust/rustdb_linux_amd64 +0 -0
- package/dist_rust/rustdb_linux_amd64.tsrust-build.json +14 -0
- package/dist_rust/rustdb_linux_arm64 +0 -0
- package/dist_rust/rustdb_linux_arm64.tsrust-build.json +14 -0
- package/dist_rust/rustdb_macos_amd64 +0 -0
- package/dist_rust/rustdb_macos_amd64.tsrust-build.json +14 -0
- package/dist_rust/rustdb_macos_arm64 +0 -0
- package/dist_rust/rustdb_macos_arm64.tsrust-build.json +14 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/index.d.ts +8 -0
- package/dist_ts/index.js +10 -0
- package/dist_ts/ts_local/classes.localnosqldb.d.ts +119 -0
- package/dist_ts/ts_local/classes.localnosqldb.js +386 -0
- package/dist_ts/ts_local/index.d.ts +5 -0
- package/dist_ts/ts_local/index.js +3 -0
- package/dist_ts/ts_local/plugins.d.ts +1 -0
- package/dist_ts/ts_local/plugins.js +3 -0
- package/dist_ts/ts_nosqldb/classes.storagerehearsal.d.ts +19 -0
- package/dist_ts/ts_nosqldb/classes.storagerehearsal.js +122 -0
- package/dist_ts/ts_nosqldb/file-storage-options.d.ts +13 -0
- package/dist_ts/ts_nosqldb/file-storage-options.js +24 -0
- package/dist_ts/ts_nosqldb/file-storage-startup.d.ts +3 -0
- package/dist_ts/ts_nosqldb/file-storage-startup.js +6 -0
- package/dist_ts/ts_nosqldb/index.d.ts +14 -0
- package/dist_ts/ts_nosqldb/index.js +11 -0
- package/dist_ts/ts_nosqldb/offline-inspection.d.ts +72 -0
- package/dist_ts/ts_nosqldb/offline-inspection.js +282 -0
- package/dist_ts/ts_nosqldb/plugins.d.ts +7 -0
- package/dist_ts/ts_nosqldb/plugins.js +10 -0
- package/dist_ts/ts_nosqldb/resource-fencing.d.ts +39 -0
- package/dist_ts/ts_nosqldb/resource-fencing.js +271 -0
- package/dist_ts/ts_nosqldb/rust-db-bridge.d.ts +213 -0
- package/dist_ts/ts_nosqldb/rust-db-bridge.js +439 -0
- package/dist_ts/ts_nosqldb/server/classes.nosqldbserver.d.ts +204 -0
- package/dist_ts/ts_nosqldb/server/classes.nosqldbserver.js +456 -0
- package/dist_ts/ts_nosqldb/server/index.d.ts +3 -0
- package/dist_ts/ts_nosqldb/server/index.js +3 -0
- package/dist_ts/ts_nosqldb/service-types.d.ts +341 -0
- package/dist_ts/ts_nosqldb/service-types.js +62 -0
- package/dist_ts/ts_nosqldb/storage-rehearsal.d.ts +103 -0
- package/dist_ts/ts_nosqldb/storage-rehearsal.js +131 -0
- package/dist_ts/ts_nosqldb/storage-root-relocation.d.ts +27 -0
- package/dist_ts/ts_nosqldb/storage-root-relocation.js +211 -0
- package/dist_ts_debugserver/bundled.d.ts +4 -0
- package/dist_ts_debugserver/bundled.js +16 -0
- package/dist_ts_debugserver/classes.debugserver.d.ts +36 -0
- package/dist_ts_debugserver/classes.debugserver.js +95 -0
- package/dist_ts_debugserver/index.d.ts +2 -0
- package/dist_ts_debugserver/index.js +2 -0
- package/dist_ts_debugserver/plugins.d.ts +2 -0
- package/dist_ts_debugserver/plugins.js +3 -0
- package/dist_ts_debugui/index.d.ts +2 -0
- package/dist_ts_debugui/index.js +2 -0
- package/dist_ts_debugui/nosqldb-debugui.d.ts +62 -0
- package/dist_ts_debugui/nosqldb-debugui.js +1132 -0
- package/dist_ts_debugui/plugins.d.ts +1 -0
- package/dist_ts_debugui/plugins.js +2 -0
- package/license +21 -0
- package/package.json +82 -0
- package/readme.md +1733 -0
- package/third-party-notices.md +925 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/index.ts +85 -0
- package/ts/ts_local/classes.localnosqldb.ts +500 -0
- package/ts/ts_local/index.ts +19 -0
- package/ts/ts_local/plugins.ts +1 -0
- package/ts/ts_nosqldb/classes.storagerehearsal.ts +109 -0
- package/ts/ts_nosqldb/file-storage-options.ts +33 -0
- package/ts/ts_nosqldb/file-storage-startup.ts +9 -0
- package/ts/ts_nosqldb/index.ts +104 -0
- package/ts/ts_nosqldb/offline-inspection.ts +375 -0
- package/ts/ts_nosqldb/plugins.ts +12 -0
- package/ts/ts_nosqldb/resource-fencing.ts +368 -0
- package/ts/ts_nosqldb/rust-db-bridge.ts +964 -0
- package/ts/ts_nosqldb/server/classes.nosqldbserver.ts +696 -0
- package/ts/ts_nosqldb/server/index.ts +4 -0
- package/ts/ts_nosqldb/service-types.ts +484 -0
- package/ts/ts_nosqldb/storage-rehearsal.ts +215 -0
- package/ts/ts_nosqldb/storage-root-relocation.ts +277 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare const localNoSqlDbStorageRootRelocationErrorCodes: readonly ["INVALID_REQUEST", "UNSUPPORTED", "BUSY", "NOT_FOUND", "DESTINATION_CONFLICT", "IDENTITY_MISMATCH", "STATE_CORRUPT", "SOURCE_CHANGED", "CAPACITY", "CANCELLED", "IO", "RECOVERY_REQUIRED"];
|
|
2
|
+
export type TLocalNoSqlDbStorageRootRelocationErrorCode = (typeof localNoSqlDbStorageRootRelocationErrorCodes)[number];
|
|
3
|
+
export interface ILocalNoSqlDbStoppedStorageRootRelocationInput {
|
|
4
|
+
sourceFolderPath: string;
|
|
5
|
+
destinationFolderPath: string;
|
|
6
|
+
relocationId: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ILocalNoSqlDbStoppedStorageRootRelocationReceipt {
|
|
9
|
+
format: 'smartdb.storage-root-relocation.receipt.v1';
|
|
10
|
+
version: 1;
|
|
11
|
+
relocationId: string;
|
|
12
|
+
sourceFolderPath: string;
|
|
13
|
+
destinationFolderPath: string;
|
|
14
|
+
providerRootId: string;
|
|
15
|
+
storageRootDevice: string;
|
|
16
|
+
storageRootInode: string;
|
|
17
|
+
receiptSha256: string;
|
|
18
|
+
sourceReceiptRetained: true;
|
|
19
|
+
}
|
|
20
|
+
export declare class LocalNoSqlDbStorageRootRelocationError extends Error {
|
|
21
|
+
readonly code: TLocalNoSqlDbStorageRootRelocationErrorCode;
|
|
22
|
+
constructor(codeArg: TLocalNoSqlDbStorageRootRelocationErrorCode);
|
|
23
|
+
}
|
|
24
|
+
export declare const normalizeLocalNoSqlDbStoppedStorageRootRelocationInput: (inputArg: ILocalNoSqlDbStoppedStorageRootRelocationInput) => ILocalNoSqlDbStoppedStorageRootRelocationInput;
|
|
25
|
+
export declare const normalizeLocalNoSqlDbStoppedStorageRootRelocationReceipt: (valueArg: unknown, inputArg: ILocalNoSqlDbStoppedStorageRootRelocationInput) => ILocalNoSqlDbStoppedStorageRootRelocationReceipt;
|
|
26
|
+
export declare const assertNoLocalNoSqlDbStorageRootRelocationWorkspace: (storagePathArg: string) => Promise<void>;
|
|
27
|
+
export declare const isLocalNoSqlDbStorageRootRelocationErrorCode: (valueArg: unknown) => valueArg is TLocalNoSqlDbStorageRootRelocationErrorCode;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export const localNoSqlDbStorageRootRelocationErrorCodes = [
|
|
3
|
+
'INVALID_REQUEST',
|
|
4
|
+
'UNSUPPORTED',
|
|
5
|
+
'BUSY',
|
|
6
|
+
'NOT_FOUND',
|
|
7
|
+
'DESTINATION_CONFLICT',
|
|
8
|
+
'IDENTITY_MISMATCH',
|
|
9
|
+
'STATE_CORRUPT',
|
|
10
|
+
'SOURCE_CHANGED',
|
|
11
|
+
'CAPACITY',
|
|
12
|
+
'CANCELLED',
|
|
13
|
+
'IO',
|
|
14
|
+
'RECOVERY_REQUIRED',
|
|
15
|
+
];
|
|
16
|
+
export class LocalNoSqlDbStorageRootRelocationError extends Error {
|
|
17
|
+
constructor(codeArg) {
|
|
18
|
+
super(`NoSQLDB stopped storage-root relocation failed with code ${codeArg}`);
|
|
19
|
+
this.name = 'LocalNoSqlDbStorageRootRelocationError';
|
|
20
|
+
this.code = codeArg;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const relocationInputKeys = [
|
|
24
|
+
'sourceFolderPath',
|
|
25
|
+
'destinationFolderPath',
|
|
26
|
+
'relocationId',
|
|
27
|
+
];
|
|
28
|
+
const relocationReceiptKeys = [
|
|
29
|
+
'format',
|
|
30
|
+
'version',
|
|
31
|
+
'relocationId',
|
|
32
|
+
'sourceFolderPath',
|
|
33
|
+
'destinationFolderPath',
|
|
34
|
+
'providerRootId',
|
|
35
|
+
'storageRootDevice',
|
|
36
|
+
'storageRootInode',
|
|
37
|
+
'receiptSha256',
|
|
38
|
+
'sourceReceiptRetained',
|
|
39
|
+
];
|
|
40
|
+
const maximumFolderPathBytes = 4095;
|
|
41
|
+
const maximumRelocationIdBytes = 256;
|
|
42
|
+
const maximumU64Decimal = '18446744073709551615';
|
|
43
|
+
const receiptDigestDomain = 'smartdb.storage-root-relocation.receipt.v1\0';
|
|
44
|
+
const relocationError = (codeArg) => new LocalNoSqlDbStorageRootRelocationError(codeArg);
|
|
45
|
+
const isPlainExactDataObject = (valueArg, keysArg) => {
|
|
46
|
+
if (typeof valueArg !== 'object'
|
|
47
|
+
|| valueArg === null
|
|
48
|
+
|| Array.isArray(valueArg)
|
|
49
|
+
|| Object.getPrototypeOf(valueArg) !== Object.prototype) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const ownKeys = Reflect.ownKeys(valueArg);
|
|
53
|
+
if (ownKeys.length !== keysArg.length
|
|
54
|
+
|| ownKeys.some((keyArg) => typeof keyArg !== 'string' || !keysArg.includes(keyArg))) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const descriptors = Object.getOwnPropertyDescriptors(valueArg);
|
|
58
|
+
return keysArg.every((keyArg) => {
|
|
59
|
+
const descriptor = descriptors[keyArg];
|
|
60
|
+
return descriptor !== undefined
|
|
61
|
+
&& descriptor.enumerable
|
|
62
|
+
&& Object.prototype.hasOwnProperty.call(descriptor, 'value');
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const isValidUnicodeScalarString = (valueArg) => {
|
|
66
|
+
for (let index = 0; index < valueArg.length; index++) {
|
|
67
|
+
const code = valueArg.charCodeAt(index);
|
|
68
|
+
if (code >= 0xd800 && code <= 0xdbff) {
|
|
69
|
+
const next = valueArg.charCodeAt(index + 1);
|
|
70
|
+
if (next < 0xdc00 || next > 0xdfff)
|
|
71
|
+
return false;
|
|
72
|
+
index++;
|
|
73
|
+
}
|
|
74
|
+
else if (code >= 0xdc00 && code <= 0xdfff) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
79
|
+
};
|
|
80
|
+
const isNestedPath = (parentArg, childArg) => {
|
|
81
|
+
const relative = plugins.path.relative(parentArg, childArg);
|
|
82
|
+
return relative !== ''
|
|
83
|
+
&& relative !== '..'
|
|
84
|
+
&& !relative.startsWith(`..${plugins.path.sep}`)
|
|
85
|
+
&& !plugins.path.isAbsolute(relative);
|
|
86
|
+
};
|
|
87
|
+
const normalizeFolderPath = (valueArg) => {
|
|
88
|
+
if (typeof valueArg !== 'string'
|
|
89
|
+
|| !plugins.path.isAbsolute(valueArg)
|
|
90
|
+
|| !isValidUnicodeScalarString(valueArg)
|
|
91
|
+
|| [...valueArg].some(characterArg => /\p{Cc}/u.test(characterArg))) {
|
|
92
|
+
throw relocationError('INVALID_REQUEST');
|
|
93
|
+
}
|
|
94
|
+
const initialBytes = plugins.buffer.Buffer.byteLength(valueArg, 'utf8');
|
|
95
|
+
if (initialBytes < 1 || initialBytes > maximumFolderPathBytes) {
|
|
96
|
+
throw relocationError('INVALID_REQUEST');
|
|
97
|
+
}
|
|
98
|
+
const normalized = plugins.path.resolve(valueArg);
|
|
99
|
+
const normalizedBytes = plugins.buffer.Buffer.byteLength(normalized, 'utf8');
|
|
100
|
+
if (normalizedBytes < 1
|
|
101
|
+
|| normalizedBytes > maximumFolderPathBytes
|
|
102
|
+
|| plugins.path.parse(normalized).root === normalized
|
|
103
|
+
|| !isValidUnicodeScalarString(normalized)
|
|
104
|
+
|| [...normalized].some(characterArg => /\p{Cc}/u.test(characterArg))) {
|
|
105
|
+
throw relocationError('INVALID_REQUEST');
|
|
106
|
+
}
|
|
107
|
+
return normalized;
|
|
108
|
+
};
|
|
109
|
+
export const normalizeLocalNoSqlDbStoppedStorageRootRelocationInput = (inputArg) => {
|
|
110
|
+
if (!isPlainExactDataObject(inputArg, relocationInputKeys)) {
|
|
111
|
+
throw relocationError('INVALID_REQUEST');
|
|
112
|
+
}
|
|
113
|
+
const sourceFolderPath = normalizeFolderPath(inputArg.sourceFolderPath);
|
|
114
|
+
const destinationFolderPath = normalizeFolderPath(inputArg.destinationFolderPath);
|
|
115
|
+
if (sourceFolderPath === destinationFolderPath
|
|
116
|
+
|| isNestedPath(sourceFolderPath, destinationFolderPath)
|
|
117
|
+
|| isNestedPath(destinationFolderPath, sourceFolderPath)) {
|
|
118
|
+
throw relocationError('INVALID_REQUEST');
|
|
119
|
+
}
|
|
120
|
+
if (typeof inputArg.relocationId !== 'string'
|
|
121
|
+
|| plugins.buffer.Buffer.byteLength(inputArg.relocationId, 'utf8') > maximumRelocationIdBytes
|
|
122
|
+
|| !/^[A-Za-z0-9][A-Za-z0-9._:@-]*$/.test(inputArg.relocationId)) {
|
|
123
|
+
throw relocationError('INVALID_REQUEST');
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
sourceFolderPath,
|
|
127
|
+
destinationFolderPath,
|
|
128
|
+
relocationId: inputArg.relocationId,
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
const receiptDigest = (receiptArg) => plugins.crypto
|
|
132
|
+
.createHash('sha256')
|
|
133
|
+
.update(receiptDigestDomain, 'utf8')
|
|
134
|
+
.update(JSON.stringify(receiptArg), 'utf8')
|
|
135
|
+
.digest('hex');
|
|
136
|
+
const isCanonicalU64Decimal = (valueArg) => typeof valueArg === 'string'
|
|
137
|
+
&& /^(?:0|[1-9][0-9]{0,19})$/.test(valueArg)
|
|
138
|
+
&& (valueArg.length < 20 || valueArg <= maximumU64Decimal);
|
|
139
|
+
const isLowercaseSha256 = (valueArg) => typeof valueArg === 'string' && /^[0-9a-f]{64}$/.test(valueArg);
|
|
140
|
+
export const normalizeLocalNoSqlDbStoppedStorageRootRelocationReceipt = (valueArg, inputArg) => {
|
|
141
|
+
if (!isPlainExactDataObject(valueArg, relocationReceiptKeys)) {
|
|
142
|
+
throw relocationError('RECOVERY_REQUIRED');
|
|
143
|
+
}
|
|
144
|
+
const receipt = valueArg;
|
|
145
|
+
if (receipt.format !== 'smartdb.storage-root-relocation.receipt.v1'
|
|
146
|
+
|| receipt.version !== 1
|
|
147
|
+
|| receipt.relocationId !== inputArg.relocationId
|
|
148
|
+
|| receipt.sourceFolderPath !== inputArg.sourceFolderPath
|
|
149
|
+
|| receipt.destinationFolderPath !== inputArg.destinationFolderPath
|
|
150
|
+
|| !isLowercaseSha256(receipt.providerRootId)
|
|
151
|
+
|| !isCanonicalU64Decimal(receipt.storageRootDevice)
|
|
152
|
+
|| !isCanonicalU64Decimal(receipt.storageRootInode)
|
|
153
|
+
|| !isLowercaseSha256(receipt.receiptSha256)
|
|
154
|
+
|| receipt.sourceReceiptRetained !== true) {
|
|
155
|
+
throw relocationError('RECOVERY_REQUIRED');
|
|
156
|
+
}
|
|
157
|
+
const withoutDigest = {
|
|
158
|
+
format: receipt.format,
|
|
159
|
+
version: receipt.version,
|
|
160
|
+
relocationId: receipt.relocationId,
|
|
161
|
+
sourceFolderPath: receipt.sourceFolderPath,
|
|
162
|
+
destinationFolderPath: receipt.destinationFolderPath,
|
|
163
|
+
providerRootId: receipt.providerRootId,
|
|
164
|
+
storageRootDevice: receipt.storageRootDevice,
|
|
165
|
+
storageRootInode: receipt.storageRootInode,
|
|
166
|
+
sourceReceiptRetained: receipt.sourceReceiptRetained,
|
|
167
|
+
};
|
|
168
|
+
if (receiptDigest(withoutDigest) !== receipt.receiptSha256) {
|
|
169
|
+
throw relocationError('RECOVERY_REQUIRED');
|
|
170
|
+
}
|
|
171
|
+
return { ...withoutDigest, receiptSha256: receipt.receiptSha256 };
|
|
172
|
+
};
|
|
173
|
+
export const assertNoLocalNoSqlDbStorageRootRelocationWorkspace = async (storagePathArg) => {
|
|
174
|
+
const storagePath = plugins.path.resolve(storagePathArg);
|
|
175
|
+
const internalPath = plugins.path.join(storagePath, '.__rustdb_internal');
|
|
176
|
+
const workspacePath = plugins.path.join(internalPath, 'storage-root-relocation');
|
|
177
|
+
try {
|
|
178
|
+
const storage = await plugins.fs.stat(storagePath);
|
|
179
|
+
if (!storage.isDirectory()) {
|
|
180
|
+
throw new Error('not a directory');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
if (error.code === 'ENOENT')
|
|
185
|
+
return;
|
|
186
|
+
throw new Error('NoSQLDB storage-root relocation workspace inspection is ambiguous');
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
const internal = await plugins.fs.lstat(internalPath);
|
|
190
|
+
if (internal.isSymbolicLink() || !internal.isDirectory()) {
|
|
191
|
+
throw new Error('not a safe directory');
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (error.code === 'ENOENT')
|
|
196
|
+
return;
|
|
197
|
+
throw new Error('NoSQLDB storage-root relocation workspace inspection is ambiguous');
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
await plugins.fs.lstat(workspacePath);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
if (error.code === 'ENOENT')
|
|
204
|
+
return;
|
|
205
|
+
throw new Error('NoSQLDB storage-root relocation workspace inspection is ambiguous');
|
|
206
|
+
}
|
|
207
|
+
throw new Error('NoSQLDB storage-root relocation recovery must complete before startup');
|
|
208
|
+
};
|
|
209
|
+
export const isLocalNoSqlDbStorageRootRelocationErrorCode = (valueArg) => typeof valueArg === 'string'
|
|
210
|
+
&& localNoSqlDbStorageRootRelocationErrorCodes.includes(valueArg);
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1yb290LXJlbG9jYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19ub3NxbGRiL3N0b3JhZ2Utcm9vdC1yZWxvY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLDJDQUEyQyxHQUFHO0lBQ3pELGlCQUFpQjtJQUNqQixhQUFhO0lBQ2IsTUFBTTtJQUNOLFdBQVc7SUFDWCxzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxJQUFJO0lBQ0osbUJBQW1CO0NBQ1gsQ0FBQztBQXdCWCxNQUFNLE9BQU8sc0NBQXVDLFNBQVEsS0FBSztJQUcvRCxZQUFtQixPQUFvRDtRQUNyRSxLQUFLLENBQUMsNERBQTRELE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLElBQUksR0FBRyx3Q0FBd0MsQ0FBQztRQUNyRCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsY0FBYztDQUNOLENBQUM7QUFDWCxNQUFNLHFCQUFxQixHQUFHO0lBQzVCLFFBQVE7SUFDUixTQUFTO0lBQ1QsY0FBYztJQUNkLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLHVCQUF1QjtDQUNmLENBQUM7QUFDWCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQztBQUNwQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUNyQyxNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO0FBQ2pELE1BQU0sbUJBQW1CLEdBQUcsOENBQThDLENBQUM7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
|