@secrecy/lib 1.0.0-dev.64 → 1.0.0-dev.66
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/BaseClient-7c38f650.d.ts +351 -0
- package/dist/BaseClient.cjs +2 -0
- package/dist/BaseClient.cjs.map +1 -0
- package/dist/BaseClient.d.ts +16 -104
- package/dist/BaseClient.js +2 -430
- package/dist/BaseClient.js.map +1 -0
- package/dist/PopupTools.cjs +2 -0
- package/dist/PopupTools.cjs.map +1 -0
- package/dist/PopupTools.d.ts +5 -4
- package/dist/PopupTools.js +2 -196
- package/dist/PopupTools.js.map +1 -0
- package/dist/ZeusThunder.cjs +2 -0
- package/dist/ZeusThunder.cjs.map +1 -0
- package/dist/ZeusThunder.d.ts +6 -2
- package/dist/ZeusThunder.js +2 -65
- package/dist/ZeusThunder.js.map +1 -0
- package/dist/cache.cjs +2 -0
- package/dist/cache.cjs.map +1 -0
- package/dist/cache.d.ts +22 -4
- package/dist/cache.js +2 -4
- package/dist/cache.js.map +1 -0
- package/dist/chunk-5WPCTUWH.cjs +2 -0
- package/dist/chunk-5WPCTUWH.cjs.map +1 -0
- package/dist/chunk-KMTF2BZE.js +2 -0
- package/dist/chunk-KMTF2BZE.js.map +1 -0
- package/dist/client/SecrecyAppClient.cjs +2 -0
- package/dist/client/SecrecyAppClient.cjs.map +1 -0
- package/dist/client/SecrecyAppClient.d.ts +16 -17
- package/dist/client/SecrecyAppClient.js +2 -227
- package/dist/client/SecrecyAppClient.js.map +1 -0
- package/dist/client/SecrecyCloudClient.cjs +2 -0
- package/dist/client/SecrecyCloudClient.cjs.map +1 -0
- package/dist/client/SecrecyCloudClient.d.ts +16 -89
- package/dist/client/SecrecyCloudClient.js +2 -1411
- package/dist/client/SecrecyCloudClient.js.map +1 -0
- package/dist/client/SecrecyDbClient.cjs +2 -0
- package/dist/client/SecrecyDbClient.cjs.map +1 -0
- package/dist/client/SecrecyDbClient.d.ts +16 -21
- package/dist/client/SecrecyDbClient.js +2 -177
- package/dist/client/SecrecyDbClient.js.map +1 -0
- package/dist/client/SecrecyMailClient.cjs +2 -0
- package/dist/client/SecrecyMailClient.cjs.map +1 -0
- package/dist/client/SecrecyMailClient.d.ts +16 -42
- package/dist/client/SecrecyMailClient.js +2 -1022
- package/dist/client/SecrecyMailClient.js.map +1 -0
- package/dist/client/SecrecyPayClient.cjs +2 -0
- package/dist/client/SecrecyPayClient.cjs.map +1 -0
- package/dist/client/SecrecyPayClient.d.ts +16 -7
- package/dist/client/SecrecyPayClient.js +2 -36
- package/dist/client/SecrecyPayClient.js.map +1 -0
- package/dist/client/SecrecyWalletClient.cjs +2 -0
- package/dist/client/SecrecyWalletClient.cjs.map +1 -0
- package/dist/client/SecrecyWalletClient.d.ts +16 -30
- package/dist/client/SecrecyWalletClient.js +2 -73
- package/dist/client/SecrecyWalletClient.js.map +1 -0
- package/dist/client/convert/file.cjs +2 -0
- package/dist/client/convert/file.cjs.map +1 -0
- package/dist/client/convert/file.d.ts +11 -5
- package/dist/client/convert/file.js +2 -33
- package/dist/client/convert/file.js.map +1 -0
- package/dist/client/convert/mail.cjs +2 -0
- package/dist/client/convert/mail.cjs.map +1 -0
- package/dist/client/convert/mail.d.ts +13 -3
- package/dist/client/convert/mail.js +2 -43
- package/dist/client/convert/mail.js.map +1 -0
- package/dist/client/convert/node.cjs +2 -0
- package/dist/client/convert/node.cjs.map +1 -0
- package/dist/client/convert/node.d.ts +18 -9
- package/dist/client/convert/node.js +2 -88
- package/dist/client/convert/node.js.map +1 -0
- package/dist/client/helpers.cjs +2 -0
- package/dist/client/helpers.cjs.map +1 -0
- package/dist/client/helpers.d.ts +16 -28
- package/dist/client/helpers.js +2 -113
- package/dist/client/helpers.js.map +1 -0
- package/dist/client/index.cjs +2 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.ts +16 -34
- package/dist/client/index.js +2 -46
- package/dist/client/index.js.map +1 -0
- package/dist/client/storage.cjs +2 -0
- package/dist/client/storage.cjs.map +1 -0
- package/dist/client/storage.d.ts +6 -3
- package/dist/client/storage.js +2 -12
- package/dist/client/storage.js.map +1 -0
- package/dist/client/types/File.cjs +1 -0
- package/dist/client/types/File.cjs.map +1 -0
- package/dist/client/types/File.d.ts +9 -5
- package/dist/client/types/File.js +1 -3
- package/dist/client/types/File.js.map +1 -0
- package/dist/client/types/Inputs.cjs +1 -0
- package/dist/client/types/Inputs.cjs.map +1 -0
- package/dist/client/types/Inputs.d.ts +6 -4
- package/dist/client/types/Inputs.js +1 -3
- package/dist/client/types/Inputs.js.map +1 -0
- package/dist/client/types/Node.cjs +1 -0
- package/dist/client/types/Node.cjs.map +1 -0
- package/dist/client/types/Node.d.ts +9 -56
- package/dist/client/types/Node.js +1 -3
- package/dist/client/types/Node.js.map +1 -0
- package/dist/client/types/UserAppNotifications.cjs +1 -0
- package/dist/client/types/UserAppNotifications.cjs.map +1 -0
- package/dist/client/types/UserAppNotifications.d.ts +3 -1
- package/dist/client/types/UserAppNotifications.js +1 -3
- package/dist/client/types/UserAppNotifications.js.map +1 -0
- package/dist/client/types/UserAppSettings.cjs +1 -0
- package/dist/client/types/UserAppSettings.cjs.map +1 -0
- package/dist/client/types/UserAppSettings.d.ts +3 -1
- package/dist/client/types/UserAppSettings.js +1 -3
- package/dist/client/types/UserAppSettings.js.map +1 -0
- package/dist/client/types/index.cjs +2 -0
- package/dist/client/types/index.cjs.map +1 -0
- package/dist/client/types/index.d.ts +86 -30
- package/dist/client/types/index.js +2 -8
- package/dist/client/types/index.js.map +1 -0
- package/dist/client/types/selectors.cjs +2 -0
- package/dist/client/types/selectors.cjs.map +1 -0
- package/dist/client/types/selectors.d.ts +7 -5
- package/dist/client/types/selectors.js +2 -135
- package/dist/client/types/selectors.js.map +1 -0
- package/dist/crypto/file.cjs +2 -0
- package/dist/crypto/file.cjs.map +1 -0
- package/dist/crypto/file.d.ts +8 -6
- package/dist/crypto/file.js +2 -195
- package/dist/crypto/file.js.map +1 -0
- package/dist/crypto/index.cjs +2 -0
- package/dist/crypto/index.cjs.map +1 -0
- package/dist/crypto/index.d.ts +11 -9
- package/dist/crypto/index.js +2 -45
- package/dist/crypto/index.js.map +1 -0
- package/dist/error.cjs +1 -0
- package/dist/error.cjs.map +1 -0
- package/dist/error.d.ts +15 -10
- package/dist/error.js +1 -3
- package/dist/error.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +19 -11
- package/dist/index.js +2 -9
- package/dist/index.js.map +1 -0
- package/dist/minify/index.cjs +2 -0
- package/dist/minify/index.cjs.map +1 -0
- package/dist/minify/index.d.ts +4 -2
- package/dist/minify/index.js +2 -23
- package/dist/minify/index.js.map +1 -0
- package/dist/minify/lz4.cjs +3 -0
- package/dist/minify/lz4.cjs.map +1 -0
- package/dist/minify/lz4.d.ts +7 -5
- package/dist/minify/lz4.js +3 -539
- package/dist/minify/lz4.js.map +1 -0
- package/dist/sodium.cjs +2 -0
- package/dist/sodium.cjs.map +1 -0
- package/dist/sodium.d.ts +5 -3
- package/dist/sodium.js +2 -6
- package/dist/sodium.js.map +1 -0
- package/dist/utils/store-buddy.cjs +2 -0
- package/dist/utils/store-buddy.cjs.map +1 -0
- package/dist/utils/store-buddy.d.ts +4 -3
- package/dist/utils/store-buddy.js +2 -58
- package/dist/utils/store-buddy.js.map +1 -0
- package/dist/utils/time.cjs +2 -0
- package/dist/utils/time.cjs.map +1 -0
- package/dist/utils/time.d.ts +4 -2
- package/dist/utils/time.js +2 -12
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/utils.cjs +2 -0
- package/dist/utils/utils.cjs.map +1 -0
- package/dist/utils/utils.d.ts +6 -4
- package/dist/utils/utils.js +2 -47
- package/dist/utils/utils.js.map +1 -0
- package/dist/worker/md5.cjs +2 -0
- package/dist/worker/md5.cjs.map +1 -0
- package/dist/worker/md5.d.ts +3 -1
- package/dist/worker/md5.js +2 -24
- package/dist/worker/md5.js.map +1 -0
- package/dist/worker/sodium.cjs +2 -0
- package/dist/worker/sodium.cjs.map +1 -0
- package/dist/worker/sodium.d.ts +6 -3
- package/dist/worker/sodium.js +2 -118
- package/dist/worker/sodium.js.map +1 -0
- package/dist/worker/workerCodes.cjs +254 -0
- package/dist/worker/workerCodes.cjs.map +1 -0
- package/dist/worker/workerCodes.d.ts +4 -2
- package/dist/worker/workerCodes.js +4 -5
- package/dist/worker/workerCodes.js.map +1 -0
- package/dist/zeus/const.cjs +2 -0
- package/dist/zeus/const.cjs.map +1 -0
- package/dist/zeus/const.d.ts +5 -3
- package/dist/zeus/const.js +2 -1287
- package/dist/zeus/const.js.map +1 -0
- package/dist/zeus/index.cjs +5 -0
- package/dist/zeus/index.cjs.map +1 -0
- package/dist/zeus/index.d.ts +2215 -116
- package/dist/zeus/index.js +5 -562
- package/dist/zeus/index.js.map +1 -0
- package/package.json +21 -21
|
@@ -1,1411 +1,2 @@
|
|
|
1
|
-
import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase";
|
|
2
|
-
|
|
3
|
-
/* eslint-disable @typescript-eslint/naming-convention */
|
|
4
|
-
|
|
5
|
-
import axios from "axios";
|
|
6
|
-
import ky from "ky";
|
|
7
|
-
import { encryptName } from "../index.js";
|
|
8
|
-
import { nodesCache, filesCache } from "../cache.js";
|
|
9
|
-
import { secretstreamKeygen } from "../crypto/file.js";
|
|
10
|
-
import { decryptCryptoBox } from "../crypto/index.js";
|
|
11
|
-
import { encryptCryptoBox } from "../crypto/index.js";
|
|
12
|
-
import { compress, uncompress } from "../minify/index.js";
|
|
13
|
-
import { sodium } from "../sodium.js";
|
|
14
|
-
import { enumerate, chunks, promiseAllLimit, concatenate } from "../utils/utils.js";
|
|
15
|
-
import { md5 } from "../worker/md5.js";
|
|
16
|
-
import { decrypt, encrypt } from "../worker/sodium.js";
|
|
17
|
-
import { gqlFileToExternal } from "./convert/file.js";
|
|
18
|
-
import { gqlNodeFullToInternalFull, gqlNodeToExternal, gqlNodeToExternalNodeFull, internalNodeToNode } from "./convert/node.js";
|
|
19
|
-
import { fileSelector, nodeFullSelector, nodeSelector } from "./types/selectors.js";
|
|
20
|
-
// import { md5 } from "../worker/index.js";
|
|
21
|
-
// import { firstValueFrom, of } from "rxjs";
|
|
22
|
-
var _client = /*#__PURE__*/_classPrivateFieldLooseKey("client");
|
|
23
|
-
var _keys = /*#__PURE__*/_classPrivateFieldLooseKey("keys");
|
|
24
|
-
var _thunder = /*#__PURE__*/_classPrivateFieldLooseKey("thunder");
|
|
25
|
-
export class SecrecyCloudClient {
|
|
26
|
-
constructor(client, keys, thunder) {
|
|
27
|
-
Object.defineProperty(this, _client, {
|
|
28
|
-
writable: true,
|
|
29
|
-
value: void 0
|
|
30
|
-
});
|
|
31
|
-
Object.defineProperty(this, _keys, {
|
|
32
|
-
writable: true,
|
|
33
|
-
value: void 0
|
|
34
|
-
});
|
|
35
|
-
Object.defineProperty(this, _thunder, {
|
|
36
|
-
writable: true,
|
|
37
|
-
value: void 0
|
|
38
|
-
});
|
|
39
|
-
this.perNode = async (nodeId, publicKey) => {
|
|
40
|
-
var _node$access;
|
|
41
|
-
let node = nodesCache.get(nodeId);
|
|
42
|
-
if (!node) {
|
|
43
|
-
await this.node({
|
|
44
|
-
id: nodeId
|
|
45
|
-
});
|
|
46
|
-
node = nodesCache.get(nodeId);
|
|
47
|
-
if (!node) {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
const nameKey = (_node$access = node.access) == null ? void 0 : _node$access.nameKey;
|
|
52
|
-
if (!nameKey) {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
return {
|
|
56
|
-
id: node.id,
|
|
57
|
-
nameKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(nameKey), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
|
|
58
|
-
files: "history" in node ? node.history.map(f => ({
|
|
59
|
-
id: f.id,
|
|
60
|
-
key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(f.key), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
|
|
61
|
-
})) : []
|
|
62
|
-
};
|
|
63
|
-
};
|
|
64
|
-
_classPrivateFieldLooseBase(this, _client)[_client] = client;
|
|
65
|
-
_classPrivateFieldLooseBase(this, _keys)[_keys] = keys;
|
|
66
|
-
_classPrivateFieldLooseBase(this, _thunder)[_thunder] = thunder;
|
|
67
|
-
}
|
|
68
|
-
async addFileToHistory(_ref) {
|
|
69
|
-
let {
|
|
70
|
-
fileId,
|
|
71
|
-
nodeId
|
|
72
|
-
} = _ref;
|
|
73
|
-
const {
|
|
74
|
-
addFileToHistory
|
|
75
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
76
|
-
addFileToHistory: [{
|
|
77
|
-
fileId,
|
|
78
|
-
nodeId
|
|
79
|
-
}, {
|
|
80
|
-
"...on ErrorAccessDenied": {
|
|
81
|
-
__typename: true,
|
|
82
|
-
message: true
|
|
83
|
-
},
|
|
84
|
-
"...on ErrorNotExist": {
|
|
85
|
-
__typename: true,
|
|
86
|
-
message: true
|
|
87
|
-
},
|
|
88
|
-
"...on AddFileToHistoryResponse": {
|
|
89
|
-
__typename: true,
|
|
90
|
-
addFileToHistory: nodeFullSelector
|
|
91
|
-
}
|
|
92
|
-
}]
|
|
93
|
-
});
|
|
94
|
-
if (!addFileToHistory) {
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
if (addFileToHistory.__typename === "ErrorAccessDenied") {
|
|
98
|
-
return addFileToHistory;
|
|
99
|
-
}
|
|
100
|
-
if (addFileToHistory.__typename === "ErrorNotExist") {
|
|
101
|
-
return addFileToHistory;
|
|
102
|
-
}
|
|
103
|
-
const node = await gqlNodeFullToInternalFull(addFileToHistory.addFileToHistory, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
104
|
-
const file = node.history.find(f => f.id === fileId);
|
|
105
|
-
if (file) {
|
|
106
|
-
const users = node.users.filter(_ref2 => {
|
|
107
|
-
let [u] = _ref2;
|
|
108
|
-
return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
|
|
109
|
-
});
|
|
110
|
-
const input = {
|
|
111
|
-
fileId: file.id,
|
|
112
|
-
users: users.map(_ref3 => {
|
|
113
|
-
let [u] = _ref3;
|
|
114
|
-
return {
|
|
115
|
-
id: u.id,
|
|
116
|
-
key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
|
|
117
|
-
};
|
|
118
|
-
})
|
|
119
|
-
};
|
|
120
|
-
await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
121
|
-
shareFileInHistory: [{
|
|
122
|
-
input,
|
|
123
|
-
nodeId
|
|
124
|
-
}, {
|
|
125
|
-
"...on ErrorAccessDenied": {
|
|
126
|
-
__typename: true,
|
|
127
|
-
message: true
|
|
128
|
-
},
|
|
129
|
-
"...on ErrorNotFound": {
|
|
130
|
-
__typename: true,
|
|
131
|
-
message: true
|
|
132
|
-
},
|
|
133
|
-
"...on ShareFileInHistoryResponse": {
|
|
134
|
-
__typename: true,
|
|
135
|
-
shareFileInHistory: true
|
|
136
|
-
}
|
|
137
|
-
}]
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
const result = internalNodeToNode(node);
|
|
141
|
-
return {
|
|
142
|
-
__typename: "SuccessResponse",
|
|
143
|
-
data: result
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
async uploadFile(_ref4) {
|
|
147
|
-
let {
|
|
148
|
-
file,
|
|
149
|
-
encryptProgress,
|
|
150
|
-
uploadProgress,
|
|
151
|
-
signal
|
|
152
|
-
} = _ref4;
|
|
153
|
-
const fileKey = secretstreamKeygen();
|
|
154
|
-
const fileBuffer = file instanceof File ? new Uint8Array(await file.arrayBuffer()) : file;
|
|
155
|
-
const compressed = compress(fileBuffer);
|
|
156
|
-
const {
|
|
157
|
-
data: encryptedFile,
|
|
158
|
-
md5: md5File,
|
|
159
|
-
md5Encrypted
|
|
160
|
-
} = await encrypt(fileKey, compressed, encryptProgress, signal);
|
|
161
|
-
const encryptedFileKey = encryptCryptoBox(fileKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
|
|
162
|
-
const {
|
|
163
|
-
uploadFile
|
|
164
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation", {
|
|
165
|
-
scalars: {
|
|
166
|
-
Json: {
|
|
167
|
-
encode: e => JSON.stringify(e),
|
|
168
|
-
decode: e => JSON.parse(e)
|
|
169
|
-
},
|
|
170
|
-
DateTime: {
|
|
171
|
-
decode: e => new Date(e),
|
|
172
|
-
encode: e => e.toISOString()
|
|
173
|
-
},
|
|
174
|
-
BigInt: {
|
|
175
|
-
decode: e => BigInt(e),
|
|
176
|
-
encode: e => e.toString()
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
})({
|
|
180
|
-
uploadFile: [{
|
|
181
|
-
fileSize: encryptedFile.byteLength,
|
|
182
|
-
fileSizeBefore: fileBuffer.byteLength,
|
|
183
|
-
fileKey: sodium.to_hex(encryptedFileKey),
|
|
184
|
-
md5Encrypted,
|
|
185
|
-
md5: md5File
|
|
186
|
-
}, {
|
|
187
|
-
"...on ErrorAccessDenied": {
|
|
188
|
-
__typename: true,
|
|
189
|
-
message: true
|
|
190
|
-
},
|
|
191
|
-
"...on ErrorLimit": {
|
|
192
|
-
__typename: true,
|
|
193
|
-
message: true
|
|
194
|
-
},
|
|
195
|
-
"...on ErrorNotFound": {
|
|
196
|
-
__typename: true,
|
|
197
|
-
message: true
|
|
198
|
-
},
|
|
199
|
-
"...on UploadFileResponse": {
|
|
200
|
-
__typename: true,
|
|
201
|
-
uploadFile: {
|
|
202
|
-
fileId: true,
|
|
203
|
-
filePartSize: true,
|
|
204
|
-
parts: {
|
|
205
|
-
fields: true,
|
|
206
|
-
order: true,
|
|
207
|
-
url: true
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}]
|
|
212
|
-
});
|
|
213
|
-
if (!uploadFile) {
|
|
214
|
-
return null;
|
|
215
|
-
}
|
|
216
|
-
if (uploadFile.__typename === "ErrorAccessDenied") {
|
|
217
|
-
return uploadFile;
|
|
218
|
-
}
|
|
219
|
-
if (uploadFile.__typename === "ErrorLimit") {
|
|
220
|
-
return uploadFile;
|
|
221
|
-
}
|
|
222
|
-
if (uploadFile.__typename === "ErrorNotFound") {
|
|
223
|
-
return uploadFile;
|
|
224
|
-
}
|
|
225
|
-
if (!uploadFile.uploadFile) {
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
228
|
-
uploadProgress == null ? void 0 : uploadProgress({
|
|
229
|
-
total: encryptedFile.byteLength,
|
|
230
|
-
current: 0,
|
|
231
|
-
percent: 0
|
|
232
|
-
});
|
|
233
|
-
if (uploadFile.uploadFile.parts.length === 0) {
|
|
234
|
-
uploadProgress == null ? void 0 : uploadProgress({
|
|
235
|
-
total: encryptedFile.byteLength,
|
|
236
|
-
current: encryptedFile.byteLength,
|
|
237
|
-
percent: 1
|
|
238
|
-
});
|
|
239
|
-
return {
|
|
240
|
-
__typename: "SuccessResponse",
|
|
241
|
-
data: uploadFile.uploadFile.fileId
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
const uploadPartEnded = async (md5, order) => {
|
|
245
|
-
if (!uploadFile.uploadFile) {
|
|
246
|
-
return null;
|
|
247
|
-
}
|
|
248
|
-
const {
|
|
249
|
-
uploadFilePartEnd
|
|
250
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
251
|
-
uploadFilePartEnd: [{
|
|
252
|
-
fileId: uploadFile.uploadFile.fileId,
|
|
253
|
-
md5,
|
|
254
|
-
order
|
|
255
|
-
}, {
|
|
256
|
-
"...on ErrorAccessDenied": {
|
|
257
|
-
__typename: true,
|
|
258
|
-
message: true
|
|
259
|
-
},
|
|
260
|
-
"...on UploadFilePartEndResponse": {
|
|
261
|
-
__typename: true,
|
|
262
|
-
uploadFilePartEnd: true
|
|
263
|
-
}
|
|
264
|
-
}]
|
|
265
|
-
});
|
|
266
|
-
if (!uploadFilePartEnd) {
|
|
267
|
-
return null;
|
|
268
|
-
}
|
|
269
|
-
if (uploadFilePartEnd.__typename === "ErrorAccessDenied") {
|
|
270
|
-
return uploadFilePartEnd;
|
|
271
|
-
}
|
|
272
|
-
return {
|
|
273
|
-
__typename: "SuccessResponse",
|
|
274
|
-
data: uploadFilePartEnd.uploadFilePartEnd
|
|
275
|
-
};
|
|
276
|
-
};
|
|
277
|
-
const uploadEnded = async () => {
|
|
278
|
-
if (!uploadFile.uploadFile) {
|
|
279
|
-
return null;
|
|
280
|
-
}
|
|
281
|
-
const {
|
|
282
|
-
uploadFileEnd
|
|
283
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
284
|
-
uploadFileEnd: [{
|
|
285
|
-
fileId: uploadFile.uploadFile.fileId
|
|
286
|
-
}, {
|
|
287
|
-
"...on ErrorAccessDenied": {
|
|
288
|
-
__typename: true,
|
|
289
|
-
message: true
|
|
290
|
-
},
|
|
291
|
-
"...on ErrorNotFound": {
|
|
292
|
-
__typename: true,
|
|
293
|
-
message: true
|
|
294
|
-
},
|
|
295
|
-
"...on UploadFileEndResponse": {
|
|
296
|
-
__typename: true,
|
|
297
|
-
uploadFileEnd: true
|
|
298
|
-
}
|
|
299
|
-
}]
|
|
300
|
-
});
|
|
301
|
-
if (!uploadFileEnd) {
|
|
302
|
-
return null;
|
|
303
|
-
}
|
|
304
|
-
if (uploadFileEnd.__typename === "ErrorAccessDenied") {
|
|
305
|
-
return uploadFileEnd;
|
|
306
|
-
}
|
|
307
|
-
if (uploadFileEnd.__typename === "ErrorNotFound") {
|
|
308
|
-
return uploadFileEnd;
|
|
309
|
-
}
|
|
310
|
-
if (!uploadFileEnd.uploadFileEnd) {
|
|
311
|
-
return null;
|
|
312
|
-
}
|
|
313
|
-
return {
|
|
314
|
-
__typename: "SuccessResponse",
|
|
315
|
-
data: uploadFileEnd.uploadFileEnd
|
|
316
|
-
};
|
|
317
|
-
};
|
|
318
|
-
const chunkParts = new Array();
|
|
319
|
-
for (const [index, chunk] of enumerate(chunks(encryptedFile, Number(uploadFile.uploadFile.filePartSize)))) {
|
|
320
|
-
chunkParts.push({
|
|
321
|
-
order: index + 1,
|
|
322
|
-
data: chunk,
|
|
323
|
-
md5: await md5(chunk)
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
const progressParts = {};
|
|
327
|
-
const onProgress = (part, progressEvent) => {
|
|
328
|
-
progressParts[part] = progressEvent;
|
|
329
|
-
const current = Object.values(progressParts).reduce((prv, cur) => prv + cur.loaded, 0);
|
|
330
|
-
uploadProgress == null ? void 0 : uploadProgress({
|
|
331
|
-
percent: current / encryptedFile.byteLength,
|
|
332
|
-
total: encryptedFile.byteLength,
|
|
333
|
-
current
|
|
334
|
-
});
|
|
335
|
-
};
|
|
336
|
-
const byPart = async part => {
|
|
337
|
-
if (!uploadFile.uploadFile) {
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
const formData = new FormData();
|
|
341
|
-
const chunk = chunkParts.find(p => p.order === part.order);
|
|
342
|
-
if (!chunk) {
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
for (const [key, value] of Object.entries(part.fields)) {
|
|
346
|
-
formData.append(key, value);
|
|
347
|
-
}
|
|
348
|
-
formData.append("file", new Blob([chunk.data]), `${uploadFile.uploadFile.fileId}-${chunk.order}`);
|
|
349
|
-
await axios.post(part.url, formData, {
|
|
350
|
-
onUploadProgress: progressEvent => onProgress(part.order, progressEvent),
|
|
351
|
-
signal
|
|
352
|
-
});
|
|
353
|
-
await uploadPartEnded(chunk.md5, chunk.order);
|
|
354
|
-
// if ((e as any).response.status === 0) {
|
|
355
|
-
// // TODO https://github.com/sindresorhus/ky/issues/305
|
|
356
|
-
// } else {
|
|
357
|
-
// throw e;
|
|
358
|
-
// }
|
|
359
|
-
};
|
|
360
|
-
|
|
361
|
-
if (!uploadFile.uploadFile) {
|
|
362
|
-
return null;
|
|
363
|
-
}
|
|
364
|
-
await promiseAllLimit(3, uploadFile.uploadFile.parts.map(p => () => byPart(p)));
|
|
365
|
-
const result = await uploadEnded();
|
|
366
|
-
if (!result) {
|
|
367
|
-
return null;
|
|
368
|
-
}
|
|
369
|
-
if (result.__typename === "ErrorAccessDenied") {
|
|
370
|
-
return result;
|
|
371
|
-
}
|
|
372
|
-
if (result.__typename === "ErrorNotFound") {
|
|
373
|
-
return result;
|
|
374
|
-
}
|
|
375
|
-
return {
|
|
376
|
-
__typename: "SuccessResponse",
|
|
377
|
-
data: result.data
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
async uploadFileInCloud(_ref5) {
|
|
381
|
-
let {
|
|
382
|
-
file,
|
|
383
|
-
name,
|
|
384
|
-
nodeId,
|
|
385
|
-
encryptProgress,
|
|
386
|
-
uploadProgress,
|
|
387
|
-
signal
|
|
388
|
-
} = _ref5;
|
|
389
|
-
const fileId = await this.uploadFile({
|
|
390
|
-
file,
|
|
391
|
-
encryptProgress,
|
|
392
|
-
uploadProgress,
|
|
393
|
-
signal
|
|
394
|
-
});
|
|
395
|
-
if (!fileId) {
|
|
396
|
-
return null;
|
|
397
|
-
}
|
|
398
|
-
if (fileId.__typename === "ErrorAccessDenied") {
|
|
399
|
-
return fileId;
|
|
400
|
-
}
|
|
401
|
-
if (fileId.__typename === "ErrorLimit") {
|
|
402
|
-
return fileId;
|
|
403
|
-
}
|
|
404
|
-
if (fileId.__typename === "ErrorNotFound") {
|
|
405
|
-
return fileId;
|
|
406
|
-
}
|
|
407
|
-
const result = await this.saveInCloud({
|
|
408
|
-
fileId: fileId.data,
|
|
409
|
-
name,
|
|
410
|
-
nodeId
|
|
411
|
-
});
|
|
412
|
-
if (!result) {
|
|
413
|
-
return null;
|
|
414
|
-
}
|
|
415
|
-
if (result.__typename === "ErrorAccessDenied") {
|
|
416
|
-
return result;
|
|
417
|
-
}
|
|
418
|
-
if (result.__typename === "ErrorBasic") {
|
|
419
|
-
return result;
|
|
420
|
-
}
|
|
421
|
-
if (result.__typename === "ErrorLimit") {
|
|
422
|
-
return result;
|
|
423
|
-
}
|
|
424
|
-
if (result.__typename === "ErrorNotFound") {
|
|
425
|
-
return result;
|
|
426
|
-
}
|
|
427
|
-
if (result.__typename === "ErrorNotExist") {
|
|
428
|
-
return result;
|
|
429
|
-
}
|
|
430
|
-
return {
|
|
431
|
-
__typename: "SuccessResponse",
|
|
432
|
-
data: result.data
|
|
433
|
-
};
|
|
434
|
-
}
|
|
435
|
-
async deletedNodes() {
|
|
436
|
-
const {
|
|
437
|
-
deletedNodes
|
|
438
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
|
|
439
|
-
deletedNodes: {
|
|
440
|
-
"...on ErrorAccessDenied": {
|
|
441
|
-
__typename: true,
|
|
442
|
-
message: true
|
|
443
|
-
},
|
|
444
|
-
"...on DeletedNodesResponse": {
|
|
445
|
-
__typename: true,
|
|
446
|
-
deletedNodes: nodeSelector
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
});
|
|
450
|
-
if (!deletedNodes) {
|
|
451
|
-
return null;
|
|
452
|
-
}
|
|
453
|
-
if (deletedNodes.__typename === "ErrorAccessDenied") {
|
|
454
|
-
return deletedNodes;
|
|
455
|
-
}
|
|
456
|
-
const nodes = new Array();
|
|
457
|
-
for (const node of deletedNodes.deletedNodes) {
|
|
458
|
-
nodes.push(await gqlNodeToExternal(node, _classPrivateFieldLooseBase(this, _keys)[_keys]));
|
|
459
|
-
}
|
|
460
|
-
return {
|
|
461
|
-
__typename: "SuccessResponse",
|
|
462
|
-
data: nodes
|
|
463
|
-
};
|
|
464
|
-
}
|
|
465
|
-
async sharedNodes() {
|
|
466
|
-
const {
|
|
467
|
-
sharedNodes
|
|
468
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
|
|
469
|
-
sharedNodes: {
|
|
470
|
-
"...on ErrorAccessDenied": {
|
|
471
|
-
__typename: true,
|
|
472
|
-
message: true
|
|
473
|
-
},
|
|
474
|
-
"...on SharedNodesResponse": {
|
|
475
|
-
__typename: true,
|
|
476
|
-
sharedNodes: nodeSelector
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
});
|
|
480
|
-
if (!sharedNodes) {
|
|
481
|
-
return null;
|
|
482
|
-
}
|
|
483
|
-
if (sharedNodes.__typename === "ErrorAccessDenied") {
|
|
484
|
-
return sharedNodes;
|
|
485
|
-
}
|
|
486
|
-
const nodes = new Array();
|
|
487
|
-
for (const folder of sharedNodes.sharedNodes) {
|
|
488
|
-
nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
|
|
489
|
-
}
|
|
490
|
-
return {
|
|
491
|
-
__typename: "SuccessResponse",
|
|
492
|
-
data: nodes
|
|
493
|
-
};
|
|
494
|
-
}
|
|
495
|
-
async nodesSharedWithMe(type) {
|
|
496
|
-
const {
|
|
497
|
-
nodesSharedWithMe
|
|
498
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
|
|
499
|
-
nodesSharedWithMe: [{
|
|
500
|
-
type
|
|
501
|
-
}, {
|
|
502
|
-
"...on ErrorAccessDenied": {
|
|
503
|
-
__typename: true,
|
|
504
|
-
message: true
|
|
505
|
-
},
|
|
506
|
-
"...on NodesSharedWithMeResponse": {
|
|
507
|
-
__typename: true,
|
|
508
|
-
nodesSharedWithMe: nodeSelector
|
|
509
|
-
}
|
|
510
|
-
}]
|
|
511
|
-
});
|
|
512
|
-
if (!nodesSharedWithMe) {
|
|
513
|
-
return null;
|
|
514
|
-
}
|
|
515
|
-
if (nodesSharedWithMe.__typename === "ErrorAccessDenied") {
|
|
516
|
-
return nodesSharedWithMe;
|
|
517
|
-
}
|
|
518
|
-
const nodes = new Array();
|
|
519
|
-
for (const folder of nodesSharedWithMe.nodesSharedWithMe) {
|
|
520
|
-
nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
|
|
521
|
-
}
|
|
522
|
-
return {
|
|
523
|
-
__typename: "SuccessResponse",
|
|
524
|
-
data: nodes
|
|
525
|
-
};
|
|
526
|
-
}
|
|
527
|
-
async deleteNodeSharing(_ref6) {
|
|
528
|
-
let {
|
|
529
|
-
nodeId,
|
|
530
|
-
userId
|
|
531
|
-
} = _ref6;
|
|
532
|
-
const {
|
|
533
|
-
deleteNodeSharing
|
|
534
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
535
|
-
deleteNodeSharing: [{
|
|
536
|
-
nodeId,
|
|
537
|
-
userId
|
|
538
|
-
}, {
|
|
539
|
-
"...on ErrorAccessDenied": {
|
|
540
|
-
__typename: true,
|
|
541
|
-
message: true
|
|
542
|
-
},
|
|
543
|
-
"...on DeleteNodeSharingResponse": {
|
|
544
|
-
__typename: true,
|
|
545
|
-
deleteNodeSharing: true
|
|
546
|
-
}
|
|
547
|
-
}]
|
|
548
|
-
});
|
|
549
|
-
if (!deleteNodeSharing) {
|
|
550
|
-
return null;
|
|
551
|
-
}
|
|
552
|
-
if (deleteNodeSharing.__typename === "ErrorAccessDenied") {
|
|
553
|
-
return deleteNodeSharing;
|
|
554
|
-
}
|
|
555
|
-
return {
|
|
556
|
-
__typename: "SuccessResponse",
|
|
557
|
-
data: deleteNodeSharing.deleteNodeSharing
|
|
558
|
-
};
|
|
559
|
-
}
|
|
560
|
-
async duplicateNode(_ref7) {
|
|
561
|
-
var _node$access2;
|
|
562
|
-
let {
|
|
563
|
-
nodeId,
|
|
564
|
-
folderId,
|
|
565
|
-
customName
|
|
566
|
-
} = _ref7;
|
|
567
|
-
let node = nodesCache.get(nodeId);
|
|
568
|
-
if (!node) {
|
|
569
|
-
await this.node({
|
|
570
|
-
id: nodeId
|
|
571
|
-
});
|
|
572
|
-
node = nodesCache.get(nodeId);
|
|
573
|
-
if (!node) {
|
|
574
|
-
throw new Error(`Node (${nodeId}) does not exists`);
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
if (!((_node$access2 = node.access) != null && _node$access2.nameKey)) {
|
|
578
|
-
throw new Error(`Can't have access to node ${nodeId}`);
|
|
579
|
-
}
|
|
580
|
-
customName = customName ? await encryptName(customName, node.access.nameKey) : null;
|
|
581
|
-
const {
|
|
582
|
-
duplicateNode
|
|
583
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
584
|
-
duplicateNode: [{
|
|
585
|
-
nodeId,
|
|
586
|
-
folderId,
|
|
587
|
-
customName
|
|
588
|
-
}, {
|
|
589
|
-
"...on ErrorAccessDenied": {
|
|
590
|
-
__typename: true,
|
|
591
|
-
message: true
|
|
592
|
-
},
|
|
593
|
-
"...on ErrorNotFound": {
|
|
594
|
-
__typename: true,
|
|
595
|
-
message: true
|
|
596
|
-
},
|
|
597
|
-
"...on DuplicateNodeResponse": {
|
|
598
|
-
__typename: true,
|
|
599
|
-
duplicateNode: true
|
|
600
|
-
}
|
|
601
|
-
}]
|
|
602
|
-
});
|
|
603
|
-
if (!duplicateNode) {
|
|
604
|
-
return null;
|
|
605
|
-
}
|
|
606
|
-
if (duplicateNode.__typename === "ErrorAccessDenied") {
|
|
607
|
-
return duplicateNode;
|
|
608
|
-
}
|
|
609
|
-
if (duplicateNode.__typename === "ErrorNotFound") {
|
|
610
|
-
return duplicateNode;
|
|
611
|
-
}
|
|
612
|
-
return {
|
|
613
|
-
__typename: "SuccessResponse",
|
|
614
|
-
data: duplicateNode.duplicateNode
|
|
615
|
-
};
|
|
616
|
-
}
|
|
617
|
-
async deleteNodeCloudTrash(_ref8) {
|
|
618
|
-
let {
|
|
619
|
-
ids
|
|
620
|
-
} = _ref8;
|
|
621
|
-
const {
|
|
622
|
-
deleteNodeCloudTrash
|
|
623
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
624
|
-
deleteNodeCloudTrash: [{
|
|
625
|
-
ids
|
|
626
|
-
}, {
|
|
627
|
-
"...on ErrorAccessDenied": {
|
|
628
|
-
__typename: true,
|
|
629
|
-
message: true
|
|
630
|
-
},
|
|
631
|
-
"...on DeleteNodeCloudTrashResponse": {
|
|
632
|
-
__typename: true,
|
|
633
|
-
deleteNodeCloudTrash: true
|
|
634
|
-
}
|
|
635
|
-
}]
|
|
636
|
-
});
|
|
637
|
-
if (!deleteNodeCloudTrash) {
|
|
638
|
-
return null;
|
|
639
|
-
}
|
|
640
|
-
if (deleteNodeCloudTrash.__typename === "ErrorAccessDenied") {
|
|
641
|
-
return deleteNodeCloudTrash;
|
|
642
|
-
}
|
|
643
|
-
return {
|
|
644
|
-
__typename: "SuccessResponse",
|
|
645
|
-
data: deleteNodeCloudTrash.deleteNodeCloudTrash ?? false
|
|
646
|
-
};
|
|
647
|
-
}
|
|
648
|
-
async createFolder(_ref9) {
|
|
649
|
-
var _folder$parent, _folder$parent$users;
|
|
650
|
-
let {
|
|
651
|
-
name,
|
|
652
|
-
parentFolderId
|
|
653
|
-
} = _ref9;
|
|
654
|
-
const key = secretstreamKeygen();
|
|
655
|
-
const encryptedName = await encryptName(name, sodium.to_hex(key));
|
|
656
|
-
const encryptedKey = encryptCryptoBox(key, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
|
|
657
|
-
const {
|
|
658
|
-
createFolder
|
|
659
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
660
|
-
createFolder: [{
|
|
661
|
-
name: encryptedName,
|
|
662
|
-
parentFolderId,
|
|
663
|
-
key: sodium.to_hex(encryptedKey)
|
|
664
|
-
}, {
|
|
665
|
-
"...on ErrorAccessDenied": {
|
|
666
|
-
__typename: true,
|
|
667
|
-
message: true
|
|
668
|
-
},
|
|
669
|
-
"...on ErrorNotExist": {
|
|
670
|
-
__typename: true,
|
|
671
|
-
message: true
|
|
672
|
-
},
|
|
673
|
-
"...on CreateFolderResponse": {
|
|
674
|
-
__typename: true,
|
|
675
|
-
createFolder: nodeFullSelector
|
|
676
|
-
}
|
|
677
|
-
}]
|
|
678
|
-
});
|
|
679
|
-
if (!createFolder) {
|
|
680
|
-
//throw new Error(`Can't create folder`);
|
|
681
|
-
return null;
|
|
682
|
-
}
|
|
683
|
-
if (createFolder.__typename === "ErrorAccessDenied") {
|
|
684
|
-
return createFolder;
|
|
685
|
-
}
|
|
686
|
-
if (createFolder.__typename === "ErrorNotExist") {
|
|
687
|
-
return createFolder;
|
|
688
|
-
}
|
|
689
|
-
if (!createFolder.createFolder) {
|
|
690
|
-
return null;
|
|
691
|
-
}
|
|
692
|
-
const folder = await gqlNodeToExternalNodeFull(createFolder.createFolder, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
693
|
-
const users = ((_folder$parent = folder.parent) == null ? void 0 : (_folder$parent$users = _folder$parent.users) == null ? void 0 : _folder$parent$users.filter(_ref10 => {
|
|
694
|
-
let [u] = _ref10;
|
|
695
|
-
return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
|
|
696
|
-
})) ?? [];
|
|
697
|
-
if (users.length) {
|
|
698
|
-
await Promise.all(users.map(_ref11 => {
|
|
699
|
-
let [u, rights] = _ref11;
|
|
700
|
-
return this.shareNode({
|
|
701
|
-
nodeId: folder.id,
|
|
702
|
-
rights,
|
|
703
|
-
userId: u.id
|
|
704
|
-
});
|
|
705
|
-
}));
|
|
706
|
-
}
|
|
707
|
-
return {
|
|
708
|
-
__typename: "SuccessResponse",
|
|
709
|
-
data: folder
|
|
710
|
-
};
|
|
711
|
-
}
|
|
712
|
-
async node(_temp) {
|
|
713
|
-
let {
|
|
714
|
-
id,
|
|
715
|
-
deleted
|
|
716
|
-
} = _temp === void 0 ? {} : _temp;
|
|
717
|
-
const {
|
|
718
|
-
node
|
|
719
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
|
|
720
|
-
node: [{
|
|
721
|
-
deleted,
|
|
722
|
-
id
|
|
723
|
-
}, {
|
|
724
|
-
"...on ErrorAccessDenied": {
|
|
725
|
-
__typename: true,
|
|
726
|
-
message: true
|
|
727
|
-
},
|
|
728
|
-
"...on NodeResponse": {
|
|
729
|
-
__typename: true,
|
|
730
|
-
node: nodeFullSelector
|
|
731
|
-
}
|
|
732
|
-
}]
|
|
733
|
-
});
|
|
734
|
-
if (!node) {
|
|
735
|
-
return null;
|
|
736
|
-
}
|
|
737
|
-
if (node.__typename === "ErrorAccessDenied") {
|
|
738
|
-
return node;
|
|
739
|
-
}
|
|
740
|
-
if (!node.node) {
|
|
741
|
-
return null;
|
|
742
|
-
}
|
|
743
|
-
const result = await gqlNodeToExternalNodeFull(node.node, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
744
|
-
return {
|
|
745
|
-
__typename: "SuccessResponse",
|
|
746
|
-
data: result
|
|
747
|
-
};
|
|
748
|
-
}
|
|
749
|
-
async fileMetadata(_ref12) {
|
|
750
|
-
let {
|
|
751
|
-
id
|
|
752
|
-
} = _ref12;
|
|
753
|
-
const {
|
|
754
|
-
file
|
|
755
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
|
|
756
|
-
file: [{
|
|
757
|
-
id
|
|
758
|
-
}, {
|
|
759
|
-
"...on ErrorAccessDenied": {
|
|
760
|
-
__typename: true,
|
|
761
|
-
message: true
|
|
762
|
-
},
|
|
763
|
-
"...on FileQueryResponse": {
|
|
764
|
-
__typename: true,
|
|
765
|
-
file: fileSelector
|
|
766
|
-
}
|
|
767
|
-
}]
|
|
768
|
-
});
|
|
769
|
-
if (!file) {
|
|
770
|
-
return null;
|
|
771
|
-
}
|
|
772
|
-
if (file.__typename === "ErrorAccessDenied") {
|
|
773
|
-
return file;
|
|
774
|
-
}
|
|
775
|
-
if (!file.file) {
|
|
776
|
-
return null;
|
|
777
|
-
}
|
|
778
|
-
const result = gqlFileToExternal(file.file, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
779
|
-
return {
|
|
780
|
-
__typename: "SuccessResponse",
|
|
781
|
-
data: result
|
|
782
|
-
};
|
|
783
|
-
}
|
|
784
|
-
async shareNode(_ref13) {
|
|
785
|
-
let {
|
|
786
|
-
nodeId,
|
|
787
|
-
userId,
|
|
788
|
-
rights
|
|
789
|
-
} = _ref13;
|
|
790
|
-
const user = await _classPrivateFieldLooseBase(this, _client)[_client].user({
|
|
791
|
-
userId,
|
|
792
|
-
withPublicKey: true
|
|
793
|
-
});
|
|
794
|
-
if (!user) {
|
|
795
|
-
return user;
|
|
796
|
-
}
|
|
797
|
-
if (user.__typename === "ErrorNotFound") {
|
|
798
|
-
return user;
|
|
799
|
-
}
|
|
800
|
-
const {
|
|
801
|
-
shareNode
|
|
802
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
803
|
-
shareNode: [{
|
|
804
|
-
nodeId,
|
|
805
|
-
userId
|
|
806
|
-
}, {
|
|
807
|
-
"...on ErrorAccessDenied": {
|
|
808
|
-
__typename: true,
|
|
809
|
-
message: true
|
|
810
|
-
},
|
|
811
|
-
"...on ErrorNotFound": {
|
|
812
|
-
__typename: true,
|
|
813
|
-
message: true
|
|
814
|
-
},
|
|
815
|
-
"...on ShareNodeResponse": {
|
|
816
|
-
__typename: true,
|
|
817
|
-
nodes: true
|
|
818
|
-
}
|
|
819
|
-
}]
|
|
820
|
-
});
|
|
821
|
-
if (!shareNode) {
|
|
822
|
-
return null;
|
|
823
|
-
}
|
|
824
|
-
if (shareNode.__typename === "ErrorAccessDenied") {
|
|
825
|
-
return shareNode;
|
|
826
|
-
}
|
|
827
|
-
if (shareNode.__typename === "ErrorNotFound") {
|
|
828
|
-
return shareNode;
|
|
829
|
-
}
|
|
830
|
-
const shareNodes = {
|
|
831
|
-
nodes: []
|
|
832
|
-
};
|
|
833
|
-
for (const id of shareNode.nodes) {
|
|
834
|
-
const nameKey = await this.perNode(id, user.data.publicKey);
|
|
835
|
-
if (nameKey) {
|
|
836
|
-
shareNodes.nodes.push(nameKey);
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
const {
|
|
840
|
-
shareNodeFinish
|
|
841
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
842
|
-
shareNodeFinish: [{
|
|
843
|
-
rights,
|
|
844
|
-
userId,
|
|
845
|
-
shareNodes
|
|
846
|
-
}, {
|
|
847
|
-
"...on ErrorAccessDenied": {
|
|
848
|
-
__typename: true,
|
|
849
|
-
message: true
|
|
850
|
-
},
|
|
851
|
-
"...on ErrorNotFound": {
|
|
852
|
-
__typename: true,
|
|
853
|
-
message: true
|
|
854
|
-
},
|
|
855
|
-
"...on ShareNodeFinishResponse": {
|
|
856
|
-
__typename: true,
|
|
857
|
-
shareNodeFinish: true
|
|
858
|
-
}
|
|
859
|
-
}]
|
|
860
|
-
});
|
|
861
|
-
if (!shareNodeFinish) {
|
|
862
|
-
return null;
|
|
863
|
-
}
|
|
864
|
-
if (shareNodeFinish.__typename === "ErrorAccessDenied") {
|
|
865
|
-
return shareNodeFinish;
|
|
866
|
-
}
|
|
867
|
-
if (shareNodeFinish.__typename === "ErrorNotFound") {
|
|
868
|
-
return shareNodeFinish;
|
|
869
|
-
}
|
|
870
|
-
return {
|
|
871
|
-
__typename: "SuccessResponse",
|
|
872
|
-
data: shareNodeFinish.shareNodeFinish ?? false
|
|
873
|
-
};
|
|
874
|
-
}
|
|
875
|
-
async updateNode(_ref14) {
|
|
876
|
-
var _node$access3, _node$access4;
|
|
877
|
-
let {
|
|
878
|
-
nodeId,
|
|
879
|
-
name,
|
|
880
|
-
isFavorite,
|
|
881
|
-
deletedAt
|
|
882
|
-
} = _ref14;
|
|
883
|
-
let node = nodesCache.get(nodeId);
|
|
884
|
-
if (!node) {
|
|
885
|
-
await this.node({
|
|
886
|
-
id: nodeId
|
|
887
|
-
});
|
|
888
|
-
node = nodesCache.get(nodeId);
|
|
889
|
-
if (!node) {
|
|
890
|
-
throw `Can't find Node ${nodeId}`;
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
if (!((_node$access3 = node.access) != null && _node$access3.nameKey)) {
|
|
894
|
-
throw new Error(`Can't have access to node ${nodeId}`);
|
|
895
|
-
}
|
|
896
|
-
name = name ? (_node$access4 = node.access) != null && _node$access4.nameKey ? await encryptName(name, node.access.nameKey) : name : null;
|
|
897
|
-
const {
|
|
898
|
-
updateNode
|
|
899
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
900
|
-
updateNode: [{
|
|
901
|
-
nodeId,
|
|
902
|
-
name,
|
|
903
|
-
isFavorite,
|
|
904
|
-
deletedAt
|
|
905
|
-
}, {
|
|
906
|
-
"...on ErrorAccessDenied": {
|
|
907
|
-
__typename: true,
|
|
908
|
-
message: true
|
|
909
|
-
},
|
|
910
|
-
"...on ErrorNotExist": {
|
|
911
|
-
__typename: true,
|
|
912
|
-
message: true
|
|
913
|
-
},
|
|
914
|
-
"...on UpdateNodeResponse": {
|
|
915
|
-
__typename: true,
|
|
916
|
-
updateNode: nodeFullSelector
|
|
917
|
-
}
|
|
918
|
-
}]
|
|
919
|
-
});
|
|
920
|
-
if (!updateNode) {
|
|
921
|
-
return null;
|
|
922
|
-
}
|
|
923
|
-
if (updateNode.__typename === "ErrorAccessDenied") {
|
|
924
|
-
return updateNode;
|
|
925
|
-
}
|
|
926
|
-
if (updateNode.__typename === "ErrorNotExist") {
|
|
927
|
-
return updateNode;
|
|
928
|
-
}
|
|
929
|
-
if (!updateNode.updateNode) {
|
|
930
|
-
return null;
|
|
931
|
-
}
|
|
932
|
-
const result = await gqlNodeToExternalNodeFull(updateNode.updateNode, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
933
|
-
return {
|
|
934
|
-
__typename: "SuccessResponse",
|
|
935
|
-
data: result
|
|
936
|
-
};
|
|
937
|
-
}
|
|
938
|
-
async fileContent(_ref15) {
|
|
939
|
-
let {
|
|
940
|
-
fileId,
|
|
941
|
-
onDownloadProgress,
|
|
942
|
-
progressDecrypt,
|
|
943
|
-
signal
|
|
944
|
-
} = _ref15;
|
|
945
|
-
const {
|
|
946
|
-
fileContent
|
|
947
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
|
|
948
|
-
scalars: {
|
|
949
|
-
Bytes: {
|
|
950
|
-
decode: e => {
|
|
951
|
-
console.log(e, typeof e);
|
|
952
|
-
return Uint8Array.from([1, 2, 3]);
|
|
953
|
-
},
|
|
954
|
-
encode: e => e.toString()
|
|
955
|
-
}
|
|
956
|
-
}
|
|
957
|
-
})({
|
|
958
|
-
fileContent: [{
|
|
959
|
-
fileId
|
|
960
|
-
}, {
|
|
961
|
-
"...on ErrorAccessDenied": {
|
|
962
|
-
__typename: true,
|
|
963
|
-
message: true
|
|
964
|
-
},
|
|
965
|
-
"...on ErrorBasic": {
|
|
966
|
-
__typename: true,
|
|
967
|
-
message: true
|
|
968
|
-
},
|
|
969
|
-
"...on FileContentResponse": {
|
|
970
|
-
__typename: true,
|
|
971
|
-
file: {
|
|
972
|
-
"...on FileContentCloud": {
|
|
973
|
-
__typename: true,
|
|
974
|
-
parts: {
|
|
975
|
-
contentUrl: true,
|
|
976
|
-
order: true,
|
|
977
|
-
md5: true
|
|
978
|
-
},
|
|
979
|
-
key: true,
|
|
980
|
-
publicKey: true,
|
|
981
|
-
totalSize: true,
|
|
982
|
-
md5: true,
|
|
983
|
-
md5Encrypted: true
|
|
984
|
-
},
|
|
985
|
-
"...on FileContentLite": {
|
|
986
|
-
__typename: true,
|
|
987
|
-
content: true,
|
|
988
|
-
id: true,
|
|
989
|
-
key: true,
|
|
990
|
-
publicKey: true,
|
|
991
|
-
md5: true,
|
|
992
|
-
md5Encrypted: true,
|
|
993
|
-
totalSize: true
|
|
994
|
-
},
|
|
995
|
-
"...on FileContentReceivedMail": {
|
|
996
|
-
__typename: true,
|
|
997
|
-
maybeParts: {
|
|
998
|
-
contentUrl: true,
|
|
999
|
-
order: true,
|
|
1000
|
-
md5: true
|
|
1001
|
-
},
|
|
1002
|
-
maybeContent: true,
|
|
1003
|
-
key: true,
|
|
1004
|
-
senderPublicKey: true,
|
|
1005
|
-
totalSize: true,
|
|
1006
|
-
md5: true,
|
|
1007
|
-
md5Encrypted: true
|
|
1008
|
-
},
|
|
1009
|
-
"...on FileContentSentMail": {
|
|
1010
|
-
__typename: true,
|
|
1011
|
-
maybeParts: {
|
|
1012
|
-
contentUrl: true,
|
|
1013
|
-
order: true,
|
|
1014
|
-
md5: true
|
|
1015
|
-
},
|
|
1016
|
-
maybeContent: true,
|
|
1017
|
-
key: true,
|
|
1018
|
-
totalSize: true,
|
|
1019
|
-
md5: true,
|
|
1020
|
-
md5Encrypted: true
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
}
|
|
1024
|
-
}]
|
|
1025
|
-
});
|
|
1026
|
-
if (!fileContent) {
|
|
1027
|
-
return null;
|
|
1028
|
-
}
|
|
1029
|
-
if (fileContent.__typename === "ErrorAccessDenied") {
|
|
1030
|
-
return fileContent;
|
|
1031
|
-
}
|
|
1032
|
-
if (fileContent.__typename === "ErrorBasic") {
|
|
1033
|
-
return fileContent;
|
|
1034
|
-
}
|
|
1035
|
-
const file = fileContent.file;
|
|
1036
|
-
if (!file) {
|
|
1037
|
-
return null;
|
|
1038
|
-
}
|
|
1039
|
-
const progressParts = {};
|
|
1040
|
-
const onProgress = (part, progressEvent) => {
|
|
1041
|
-
progressParts[part] = progressEvent;
|
|
1042
|
-
const transferredBytes = Object.values(progressParts).reduce((prv, cur) => prv + cur.transferredBytes, 0);
|
|
1043
|
-
const totalBytes = Number(file.totalSize);
|
|
1044
|
-
onDownloadProgress == null ? void 0 : onDownloadProgress({
|
|
1045
|
-
percent: transferredBytes / totalBytes,
|
|
1046
|
-
totalBytes,
|
|
1047
|
-
transferredBytes
|
|
1048
|
-
});
|
|
1049
|
-
};
|
|
1050
|
-
const encryptedContentFromParts = async fileParts => {
|
|
1051
|
-
const parts = new Array();
|
|
1052
|
-
const byPart = async part => {
|
|
1053
|
-
const buf = new Uint8Array(await ky.get(part.contentUrl, {
|
|
1054
|
-
timeout: false,
|
|
1055
|
-
onDownloadProgress: pr => onProgress(part.order, pr),
|
|
1056
|
-
signal: signal
|
|
1057
|
-
}).arrayBuffer());
|
|
1058
|
-
const md5Part = await md5(buf);
|
|
1059
|
-
if (md5Part !== part.md5) {
|
|
1060
|
-
throw new Error(`Invalid md5 for part ${part.order} of file ${fileId}`);
|
|
1061
|
-
}
|
|
1062
|
-
parts.push({
|
|
1063
|
-
data: buf,
|
|
1064
|
-
order: part.order
|
|
1065
|
-
});
|
|
1066
|
-
};
|
|
1067
|
-
await promiseAllLimit(3, fileParts.map(p => () => byPart(p)));
|
|
1068
|
-
return concatenate(...parts.sort((a, b) => a.order - b.order).map(p => p.data));
|
|
1069
|
-
};
|
|
1070
|
-
const finalize = async encryptedContent => {
|
|
1071
|
-
// const md5Encrypted = await firstValueFrom(md5(of(encryptedContent)));
|
|
1072
|
-
const md5Encrypted = await md5(encryptedContent);
|
|
1073
|
-
if (md5Encrypted !== file.md5Encrypted) {
|
|
1074
|
-
throw new Error(`Encrypted content does not match`);
|
|
1075
|
-
}
|
|
1076
|
-
const key = decryptCryptoBox(sodium.from_hex(file.key), file.__typename === "FileContentReceivedMail" ? file.senderPublicKey : file.__typename === "FileContentCloud" ? file.publicKey : _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
|
|
1077
|
-
const src = await decrypt(key, encryptedContent, progressDecrypt, signal);
|
|
1078
|
-
|
|
1079
|
-
// const md5Content = await firstValueFrom(md5(of(src)));
|
|
1080
|
-
const md5Content = await md5(src);
|
|
1081
|
-
if (md5Content !== file.md5) {
|
|
1082
|
-
throw new Error(`Content does not match`);
|
|
1083
|
-
}
|
|
1084
|
-
return uncompress(src);
|
|
1085
|
-
};
|
|
1086
|
-
const encryptedContent = file.__typename === "FileContentLite" ? file.content : file.__typename === "FileContentCloud" ? await encryptedContentFromParts(file.parts) : file.maybeContent ? file.maybeContent : file.maybeParts ? await encryptedContentFromParts(file.maybeParts) : null;
|
|
1087
|
-
if (!encryptedContent) {
|
|
1088
|
-
return null;
|
|
1089
|
-
}
|
|
1090
|
-
return {
|
|
1091
|
-
__typename: "SuccessResponse",
|
|
1092
|
-
data: await finalize(encryptedContent)
|
|
1093
|
-
};
|
|
1094
|
-
}
|
|
1095
|
-
async deleteFile(_ref16) {
|
|
1096
|
-
let {
|
|
1097
|
-
fileId,
|
|
1098
|
-
nodeId
|
|
1099
|
-
} = _ref16;
|
|
1100
|
-
const {
|
|
1101
|
-
deleteFile
|
|
1102
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
1103
|
-
deleteFile: [{
|
|
1104
|
-
fileId,
|
|
1105
|
-
nodeId
|
|
1106
|
-
}, {
|
|
1107
|
-
"...on ErrorAccessDenied": {
|
|
1108
|
-
__typename: true,
|
|
1109
|
-
message: true
|
|
1110
|
-
},
|
|
1111
|
-
"...on ErrorNotExist": {
|
|
1112
|
-
__typename: true,
|
|
1113
|
-
message: true
|
|
1114
|
-
},
|
|
1115
|
-
"...on DeleteFileResponse": {
|
|
1116
|
-
__typename: true,
|
|
1117
|
-
deleteFile: true
|
|
1118
|
-
}
|
|
1119
|
-
}]
|
|
1120
|
-
});
|
|
1121
|
-
if (!deleteFile) {
|
|
1122
|
-
return null;
|
|
1123
|
-
}
|
|
1124
|
-
if (deleteFile.__typename === "ErrorAccessDenied") {
|
|
1125
|
-
return deleteFile;
|
|
1126
|
-
}
|
|
1127
|
-
if (deleteFile.__typename === "ErrorNotExist") {
|
|
1128
|
-
return deleteFile;
|
|
1129
|
-
}
|
|
1130
|
-
return {
|
|
1131
|
-
__typename: "SuccessResponse",
|
|
1132
|
-
data: deleteFile.deleteFile
|
|
1133
|
-
};
|
|
1134
|
-
}
|
|
1135
|
-
async deleteNode(_ref17) {
|
|
1136
|
-
let {
|
|
1137
|
-
nodeId
|
|
1138
|
-
} = _ref17;
|
|
1139
|
-
const {
|
|
1140
|
-
deleteNode
|
|
1141
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
1142
|
-
deleteNode: [{
|
|
1143
|
-
id: nodeId
|
|
1144
|
-
}, {
|
|
1145
|
-
"...on ErrorAccessDenied": {
|
|
1146
|
-
__typename: true,
|
|
1147
|
-
message: true
|
|
1148
|
-
},
|
|
1149
|
-
"...on DeleteNodeResponse": {
|
|
1150
|
-
__typename: true,
|
|
1151
|
-
deleteNode: true
|
|
1152
|
-
}
|
|
1153
|
-
}]
|
|
1154
|
-
});
|
|
1155
|
-
if (!deleteNode) {
|
|
1156
|
-
return null;
|
|
1157
|
-
}
|
|
1158
|
-
if (deleteNode.__typename === "ErrorAccessDenied") {
|
|
1159
|
-
return deleteNode;
|
|
1160
|
-
}
|
|
1161
|
-
return {
|
|
1162
|
-
__typename: "SuccessResponse",
|
|
1163
|
-
data: deleteNode.deleteNode
|
|
1164
|
-
};
|
|
1165
|
-
}
|
|
1166
|
-
async emptyTrash() {
|
|
1167
|
-
const {
|
|
1168
|
-
emptyCloudTrash
|
|
1169
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
1170
|
-
emptyCloudTrash: {
|
|
1171
|
-
"...on ErrorAccessDenied": {
|
|
1172
|
-
__typename: true,
|
|
1173
|
-
message: true
|
|
1174
|
-
},
|
|
1175
|
-
"...on EmptyCloudTrashResponse": {
|
|
1176
|
-
__typename: true,
|
|
1177
|
-
emptyCloudTrash: true
|
|
1178
|
-
}
|
|
1179
|
-
}
|
|
1180
|
-
});
|
|
1181
|
-
if (!emptyCloudTrash) {
|
|
1182
|
-
return null;
|
|
1183
|
-
}
|
|
1184
|
-
if (emptyCloudTrash.__typename === "ErrorAccessDenied") {
|
|
1185
|
-
return emptyCloudTrash;
|
|
1186
|
-
}
|
|
1187
|
-
if (!emptyCloudTrash.emptyCloudTrash) {
|
|
1188
|
-
return null;
|
|
1189
|
-
}
|
|
1190
|
-
return {
|
|
1191
|
-
__typename: "SuccessResponse",
|
|
1192
|
-
data: emptyCloudTrash.emptyCloudTrash
|
|
1193
|
-
};
|
|
1194
|
-
}
|
|
1195
|
-
async recoverNode(id) {
|
|
1196
|
-
const {
|
|
1197
|
-
recoverNode
|
|
1198
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
1199
|
-
recoverNode: [{
|
|
1200
|
-
id
|
|
1201
|
-
}, {
|
|
1202
|
-
"...on ErrorAccessDenied": {
|
|
1203
|
-
__typename: true,
|
|
1204
|
-
message: true
|
|
1205
|
-
},
|
|
1206
|
-
"...on ErrorNotExist": {
|
|
1207
|
-
__typename: true,
|
|
1208
|
-
message: true
|
|
1209
|
-
},
|
|
1210
|
-
"...on RecoverNodeResponse": {
|
|
1211
|
-
__typename: true,
|
|
1212
|
-
recoverNode: true
|
|
1213
|
-
}
|
|
1214
|
-
}]
|
|
1215
|
-
});
|
|
1216
|
-
if (!recoverNode) {
|
|
1217
|
-
return null;
|
|
1218
|
-
}
|
|
1219
|
-
if (recoverNode.__typename === "ErrorAccessDenied") {
|
|
1220
|
-
return recoverNode;
|
|
1221
|
-
}
|
|
1222
|
-
if (recoverNode.__typename === "ErrorNotExist") {
|
|
1223
|
-
return recoverNode;
|
|
1224
|
-
}
|
|
1225
|
-
return {
|
|
1226
|
-
__typename: "SuccessResponse",
|
|
1227
|
-
data: recoverNode.recoverNode ?? false
|
|
1228
|
-
};
|
|
1229
|
-
}
|
|
1230
|
-
async moveNodes(_ref18) {
|
|
1231
|
-
let {
|
|
1232
|
-
nodeIds,
|
|
1233
|
-
parentNodeId
|
|
1234
|
-
} = _ref18;
|
|
1235
|
-
const {
|
|
1236
|
-
moveNodes
|
|
1237
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
1238
|
-
moveNodes: [{
|
|
1239
|
-
nodeIds,
|
|
1240
|
-
parentNodeId
|
|
1241
|
-
}, {
|
|
1242
|
-
"...on ErrorAccessDenied": {
|
|
1243
|
-
__typename: true,
|
|
1244
|
-
message: true
|
|
1245
|
-
},
|
|
1246
|
-
"...on MoveNodesResponse": {
|
|
1247
|
-
__typename: true,
|
|
1248
|
-
moveNodes: true
|
|
1249
|
-
}
|
|
1250
|
-
}]
|
|
1251
|
-
});
|
|
1252
|
-
if (!moveNodes) {
|
|
1253
|
-
return null;
|
|
1254
|
-
}
|
|
1255
|
-
if (moveNodes.__typename === "ErrorAccessDenied") {
|
|
1256
|
-
return moveNodes;
|
|
1257
|
-
}
|
|
1258
|
-
return {
|
|
1259
|
-
__typename: "SuccessResponse",
|
|
1260
|
-
data: moveNodes.moveNodes ?? false
|
|
1261
|
-
};
|
|
1262
|
-
}
|
|
1263
|
-
async saveInCloud(_ref19) {
|
|
1264
|
-
var _node$parent;
|
|
1265
|
-
let {
|
|
1266
|
-
fileId,
|
|
1267
|
-
name,
|
|
1268
|
-
nodeId
|
|
1269
|
-
} = _ref19;
|
|
1270
|
-
if (nodeId && !nodesCache.has(nodeId)) {
|
|
1271
|
-
await this.node({
|
|
1272
|
-
id: nodeId
|
|
1273
|
-
});
|
|
1274
|
-
if (!nodesCache.has(nodeId)) {
|
|
1275
|
-
return {
|
|
1276
|
-
__typename: "ErrorBasic",
|
|
1277
|
-
message: `The node ${nodeId} does not exists`
|
|
1278
|
-
};
|
|
1279
|
-
}
|
|
1280
|
-
}
|
|
1281
|
-
let key = "";
|
|
1282
|
-
const file = filesCache.get(fileId);
|
|
1283
|
-
if (!file) {
|
|
1284
|
-
await this.fileMetadata({
|
|
1285
|
-
id: fileId
|
|
1286
|
-
});
|
|
1287
|
-
const file = filesCache.get(fileId) ?? null;
|
|
1288
|
-
if (!file) {
|
|
1289
|
-
const receivedMails = await _classPrivateFieldLooseBase(this, _client)[_client].mail.receivedMails();
|
|
1290
|
-
if (!receivedMails) {
|
|
1291
|
-
return null;
|
|
1292
|
-
}
|
|
1293
|
-
if (receivedMails.__typename !== "SuccessResponse") {
|
|
1294
|
-
return null;
|
|
1295
|
-
}
|
|
1296
|
-
const mail = receivedMails.data.find(m => m.files.some(f => f.id === fileId));
|
|
1297
|
-
if (!mail) {
|
|
1298
|
-
return {
|
|
1299
|
-
__typename: "ErrorBasic",
|
|
1300
|
-
message: `Can't find mail with the file ${fileId}`
|
|
1301
|
-
};
|
|
1302
|
-
}
|
|
1303
|
-
const fileMail = mail.files.find(f => f.id === fileId);
|
|
1304
|
-
if (!fileMail) {
|
|
1305
|
-
return {
|
|
1306
|
-
__typename: "ErrorBasic",
|
|
1307
|
-
message: `Can't find mail with the file ${fileId}`
|
|
1308
|
-
};
|
|
1309
|
-
}
|
|
1310
|
-
const fileKey = decryptCryptoBox(sodium.from_hex(fileMail.key), mail.sender.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
|
|
1311
|
-
key = sodium.to_hex(fileKey);
|
|
1312
|
-
} else {
|
|
1313
|
-
key = file.key;
|
|
1314
|
-
}
|
|
1315
|
-
} else {
|
|
1316
|
-
key = file.key;
|
|
1317
|
-
}
|
|
1318
|
-
if (key === "") {
|
|
1319
|
-
return {
|
|
1320
|
-
__typename: "ErrorBasic",
|
|
1321
|
-
message: "Unexpected error 3"
|
|
1322
|
-
};
|
|
1323
|
-
}
|
|
1324
|
-
key = sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
|
|
1325
|
-
const nameKey = secretstreamKeygen();
|
|
1326
|
-
const encryptedName = await encryptName(name, sodium.to_hex(nameKey));
|
|
1327
|
-
const encryptedNameKey = sodium.to_hex(encryptCryptoBox(nameKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
|
|
1328
|
-
const {
|
|
1329
|
-
saveInCloud
|
|
1330
|
-
} = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
|
|
1331
|
-
saveInCloud: [{
|
|
1332
|
-
fileId,
|
|
1333
|
-
key,
|
|
1334
|
-
nodeId,
|
|
1335
|
-
filename: encryptedName,
|
|
1336
|
-
nameKey: encryptedNameKey
|
|
1337
|
-
}, {
|
|
1338
|
-
"...on ErrorAccessDenied": {
|
|
1339
|
-
__typename: true,
|
|
1340
|
-
message: true
|
|
1341
|
-
},
|
|
1342
|
-
"...on ErrorNotFound": {
|
|
1343
|
-
__typename: true,
|
|
1344
|
-
message: true
|
|
1345
|
-
},
|
|
1346
|
-
"...on ErrorLimit": {
|
|
1347
|
-
__typename: true,
|
|
1348
|
-
message: true
|
|
1349
|
-
},
|
|
1350
|
-
"...on ErrorBasic": {
|
|
1351
|
-
__typename: true,
|
|
1352
|
-
message: true
|
|
1353
|
-
},
|
|
1354
|
-
"...on ErrorNotExist": {
|
|
1355
|
-
__typename: true,
|
|
1356
|
-
message: true
|
|
1357
|
-
},
|
|
1358
|
-
"...on SaveInCloudResponse": {
|
|
1359
|
-
__typename: true,
|
|
1360
|
-
saveInCloud: nodeFullSelector
|
|
1361
|
-
}
|
|
1362
|
-
}]
|
|
1363
|
-
});
|
|
1364
|
-
if (!saveInCloud) {
|
|
1365
|
-
return null;
|
|
1366
|
-
}
|
|
1367
|
-
if (saveInCloud.__typename === "ErrorAccessDenied") {
|
|
1368
|
-
return saveInCloud;
|
|
1369
|
-
}
|
|
1370
|
-
if (saveInCloud.__typename === "ErrorNotFound") {
|
|
1371
|
-
return saveInCloud;
|
|
1372
|
-
}
|
|
1373
|
-
if (saveInCloud.__typename === "ErrorLimit") {
|
|
1374
|
-
return saveInCloud;
|
|
1375
|
-
}
|
|
1376
|
-
if (saveInCloud.__typename === "ErrorBasic") {
|
|
1377
|
-
return saveInCloud;
|
|
1378
|
-
}
|
|
1379
|
-
if (saveInCloud.__typename === "ErrorNotExist") {
|
|
1380
|
-
return saveInCloud;
|
|
1381
|
-
}
|
|
1382
|
-
if (!saveInCloud.saveInCloud) {
|
|
1383
|
-
return null;
|
|
1384
|
-
}
|
|
1385
|
-
const node = await gqlNodeToExternalNodeFull(saveInCloud.saveInCloud, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
1386
|
-
const me = (_node$parent = node.parent) == null ? void 0 : _node$parent.users.find(_ref20 => {
|
|
1387
|
-
let [u] = _ref20;
|
|
1388
|
-
return u.publicKey === _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
|
|
1389
|
-
});
|
|
1390
|
-
if (me && ["admin", "write"].includes(me[1])) {
|
|
1391
|
-
var _node$parent2;
|
|
1392
|
-
const others = ((_node$parent2 = node.parent) == null ? void 0 : _node$parent2.users.filter(_ref21 => {
|
|
1393
|
-
let [u] = _ref21;
|
|
1394
|
-
return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
|
|
1395
|
-
})) ?? [];
|
|
1396
|
-
await Promise.all(others.map(_ref22 => {
|
|
1397
|
-
let [u, rights] = _ref22;
|
|
1398
|
-
return this.shareNode({
|
|
1399
|
-
nodeId: node.id,
|
|
1400
|
-
rights,
|
|
1401
|
-
userId: u.id
|
|
1402
|
-
});
|
|
1403
|
-
}));
|
|
1404
|
-
}
|
|
1405
|
-
return {
|
|
1406
|
-
__typename: "SuccessResponse",
|
|
1407
|
-
data: node
|
|
1408
|
-
};
|
|
1409
|
-
}
|
|
1410
|
-
}
|
|
1411
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJheGlvcyIsImt5IiwiZW5jcnlwdE5hbWUiLCJub2Rlc0NhY2hlIiwiZmlsZXNDYWNoZSIsInNlY3JldHN0cmVhbUtleWdlbiIsImRlY3J5cHRDcnlwdG9Cb3giLCJlbmNyeXB0Q3J5cHRvQm94IiwiY29tcHJlc3MiLCJ1bmNvbXByZXNzIiwic29kaXVtIiwiZW51bWVyYXRlIiwiY2h1bmtzIiwicHJvbWlzZUFsbExpbWl0IiwiY29uY2F0ZW5hdGUiLCJtZDUiLCJkZWNyeXB0IiwiZW5jcnlwdCIsImdxbEZpbGVUb0V4dGVybmFsIiwiZ3FsTm9kZUZ1bGxUb0ludGVybmFsRnVsbCIsImdxbE5vZGVUb0V4dGVybmFsIiwiZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbCIsImludGVybmFsTm9kZVRvTm9kZSIsImZpbGVTZWxlY3RvciIsIm5vZGVGdWxsU2VsZWN0b3IiLCJub2RlU2VsZWN0b3IiLCJTZWNyZWN5Q2xvdWRDbGllbnQiLCJjb25zdHJ1Y3RvciIsImNsaWVudCIsImtleXMiLCJ0aHVuZGVyIiwicGVyTm9kZSIsIm5vZGVJZCIsInB1YmxpY0tleSIsIm5vZGUiLCJnZXQiLCJpZCIsIm5hbWVLZXkiLCJhY2Nlc3MiLCJ0b19oZXgiLCJmcm9tX2hleCIsInByaXZhdGVLZXkiLCJmaWxlcyIsImhpc3RvcnkiLCJtYXAiLCJmIiwia2V5IiwiYWRkRmlsZVRvSGlzdG9yeSIsImZpbGVJZCIsIl9fdHlwZW5hbWUiLCJtZXNzYWdlIiwiZmlsZSIsImZpbmQiLCJ1c2VycyIsImZpbHRlciIsInUiLCJpbnB1dCIsInNoYXJlRmlsZUluSGlzdG9yeSIsInJlc3VsdCIsImRhdGEiLCJ1cGxvYWRGaWxlIiwiZW5jcnlwdFByb2dyZXNzIiwidXBsb2FkUHJvZ3Jlc3MiLCJzaWduYWwiLCJmaWxlS2V5IiwiZmlsZUJ1ZmZlciIsIkZpbGUiLCJVaW50OEFycmF5IiwiYXJyYXlCdWZmZXIiLCJjb21wcmVzc2VkIiwiZW5jcnlwdGVkRmlsZSIsIm1kNUZpbGUiLCJtZDVFbmNyeXB0ZWQiLCJlbmNyeXB0ZWRGaWxlS2V5Iiwic2NhbGFycyIsIkpzb24iLCJlbmNvZGUiLCJlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRlY29kZSIsInBhcnNlIiwiRGF0ZVRpbWUiLCJEYXRlIiwidG9JU09TdHJpbmciLCJCaWdJbnQiLCJ0b1N0cmluZyIsImZpbGVTaXplIiwiYnl0ZUxlbmd0aCIsImZpbGVTaXplQmVmb3JlIiwiZmlsZVBhcnRTaXplIiwicGFydHMiLCJmaWVsZHMiLCJvcmRlciIsInVybCIsInRvdGFsIiwiY3VycmVudCIsInBlcmNlbnQiLCJsZW5ndGgiLCJ1cGxvYWRQYXJ0RW5kZWQiLCJ1cGxvYWRGaWxlUGFydEVuZCIsInVwbG9hZEVuZGVkIiwidXBsb2FkRmlsZUVuZCIsImNodW5rUGFydHMiLCJBcnJheSIsImluZGV4IiwiY2h1bmsiLCJOdW1iZXIiLCJwdXNoIiwicHJvZ3Jlc3NQYXJ0cyIsIm9uUHJvZ3Jlc3MiLCJwYXJ0IiwicHJvZ3Jlc3NFdmVudCIsIk9iamVjdCIsInZhbHVlcyIsInJlZHVjZSIsInBydiIsImN1ciIsImxvYWRlZCIsImJ5UGFydCIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJwIiwidmFsdWUiLCJlbnRyaWVzIiwiYXBwZW5kIiwiQmxvYiIsInBvc3QiLCJvblVwbG9hZFByb2dyZXNzIiwidXBsb2FkRmlsZUluQ2xvdWQiLCJuYW1lIiwic2F2ZUluQ2xvdWQiLCJkZWxldGVkTm9kZXMiLCJub2RlcyIsInNoYXJlZE5vZGVzIiwiZm9sZGVyIiwibm9kZXNTaGFyZWRXaXRoTWUiLCJ0eXBlIiwiZGVsZXRlTm9kZVNoYXJpbmciLCJ1c2VySWQiLCJkdXBsaWNhdGVOb2RlIiwiZm9sZGVySWQiLCJjdXN0b21OYW1lIiwiRXJyb3IiLCJkZWxldGVOb2RlQ2xvdWRUcmFzaCIsImlkcyIsImNyZWF0ZUZvbGRlciIsInBhcmVudEZvbGRlcklkIiwiZW5jcnlwdGVkTmFtZSIsImVuY3J5cHRlZEtleSIsInBhcmVudCIsIlByb21pc2UiLCJhbGwiLCJyaWdodHMiLCJzaGFyZU5vZGUiLCJkZWxldGVkIiwiZmlsZU1ldGFkYXRhIiwidXNlciIsIndpdGhQdWJsaWNLZXkiLCJzaGFyZU5vZGVzIiwic2hhcmVOb2RlRmluaXNoIiwidXBkYXRlTm9kZSIsImlzRmF2b3JpdGUiLCJkZWxldGVkQXQiLCJmaWxlQ29udGVudCIsIm9uRG93bmxvYWRQcm9ncmVzcyIsInByb2dyZXNzRGVjcnlwdCIsIkJ5dGVzIiwiY29uc29sZSIsImxvZyIsImZyb20iLCJjb250ZW50VXJsIiwidG90YWxTaXplIiwiY29udGVudCIsIm1heWJlUGFydHMiLCJtYXliZUNvbnRlbnQiLCJzZW5kZXJQdWJsaWNLZXkiLCJ0cmFuc2ZlcnJlZEJ5dGVzIiwidG90YWxCeXRlcyIsImVuY3J5cHRlZENvbnRlbnRGcm9tUGFydHMiLCJmaWxlUGFydHMiLCJidWYiLCJ0aW1lb3V0IiwicHIiLCJtZDVQYXJ0Iiwic29ydCIsImEiLCJiIiwiZmluYWxpemUiLCJlbmNyeXB0ZWRDb250ZW50Iiwic3JjIiwibWQ1Q29udGVudCIsImRlbGV0ZUZpbGUiLCJkZWxldGVOb2RlIiwiZW1wdHlUcmFzaCIsImVtcHR5Q2xvdWRUcmFzaCIsInJlY292ZXJOb2RlIiwibW92ZU5vZGVzIiwibm9kZUlkcyIsInBhcmVudE5vZGVJZCIsImhhcyIsInJlY2VpdmVkTWFpbHMiLCJtYWlsIiwibSIsInNvbWUiLCJmaWxlTWFpbCIsInNlbmRlciIsImVuY3J5cHRlZE5hbWVLZXkiLCJmaWxlbmFtZSIsIm1lIiwiaW5jbHVkZXMiLCJvdGhlcnMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L1NlY3JlY3lDbG91ZENsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cbmltcG9ydCB0eXBlIHsgQXhpb3NQcm9ncmVzc0V2ZW50IH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQga3kgZnJvbSBcImt5XCI7XG5pbXBvcnQgdHlwZSB7XG4gIERvd25sb2FkUHJvZ3Jlc3MsXG4gIFByb2dyZXNzQ2FsbGJhY2ssXG4gIFNlY3JlY3lDbGllbnQsXG4gIFN1Y2Nlc3NSZXNwb25zZVxufSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IGVuY3J5cHROYW1lIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBub2Rlc0NhY2hlLCBmaWxlc0NhY2hlIH0gZnJvbSBcIi4uL2NhY2hlLmpzXCI7XG5pbXBvcnQgeyBzZWNyZXRzdHJlYW1LZXlnZW4gfSBmcm9tIFwiLi4vY3J5cHRvL2ZpbGUuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5UGFpciB9IGZyb20gXCIuLi9jcnlwdG8vaW5kZXguanNcIjtcbmltcG9ydCB7IGRlY3J5cHRDcnlwdG9Cb3ggfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlbmNyeXB0Q3J5cHRvQm94IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFcnJvckFjY2Vzc0RlbmllZCxcbiAgRXJyb3JCYXNpYyxcbiAgRXJyb3JMaW1pdCxcbiAgRXJyb3JOb3RFeGlzdCxcbiAgRXJyb3JOb3RGb3VuZFxufSBmcm9tIFwiLi4vZXJyb3IuanNcIjtcbmltcG9ydCB7IGNvbXByZXNzLCB1bmNvbXByZXNzIH0gZnJvbSBcIi4uL21pbmlmeS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgc29kaXVtIH0gZnJvbSBcIi4uL3NvZGl1bS5qc1wiO1xuaW1wb3J0IHtcbiAgZW51bWVyYXRlLFxuICBjaHVua3MsXG4gIHByb21pc2VBbGxMaW1pdCxcbiAgY29uY2F0ZW5hdGVcbn0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBtZDUgfSBmcm9tIFwiLi4vd29ya2VyL21kNS5qc1wiO1xuaW1wb3J0IHsgZGVjcnlwdCwgZW5jcnlwdCB9IGZyb20gXCIuLi93b3JrZXIvc29kaXVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVUeXBlLCBSaWdodHMsIFRodW5kZXIgfSBmcm9tIFwiLi4vemV1cy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ3FsRmlsZVRvRXh0ZXJuYWwgfSBmcm9tIFwiLi9jb252ZXJ0L2ZpbGUuanNcIjtcbmltcG9ydCB7XG4gIGdxbE5vZGVGdWxsVG9JbnRlcm5hbEZ1bGwsXG4gIGdxbE5vZGVUb0V4dGVybmFsLFxuICBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsLFxuICBpbnRlcm5hbE5vZGVUb05vZGVcbn0gZnJvbSBcIi4vY29udmVydC9ub2RlLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpbGVDb250ZW50UGFydCxcbiAgRmlsZU1ldGFkYXRhLFxuICBGaWxlUGFydFJlc3BvbnNlLFxuICBOYW1lS2V5SW5wdXQsXG4gIE5vZGUsXG4gIE5vZGVGdWxsLFxuICBTaGFyZUZpbGVJbkhpc3RvcnlJbnB1dCxcbiAgU2hhcmVOb2Rlc0lucHV0XG59IGZyb20gXCIuL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQge1xuICBmaWxlU2VsZWN0b3IsXG4gIG5vZGVGdWxsU2VsZWN0b3IsXG4gIG5vZGVTZWxlY3RvclxufSBmcm9tIFwiLi90eXBlcy9zZWxlY3RvcnMuanNcIjtcbi8vIGltcG9ydCB7IG1kNSB9IGZyb20gXCIuLi93b3JrZXIvaW5kZXguanNcIjtcbi8vIGltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZWNyZWN5Q2xvdWRDbGllbnQge1xuICAjY2xpZW50OiBTZWNyZWN5Q2xpZW50O1xuXG4gICNrZXlzOiBLZXlQYWlyO1xuXG4gICN0aHVuZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBUaHVuZGVyPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnQ6IFNlY3JlY3lDbGllbnQsXG4gICAga2V5czogS2V5UGFpcixcbiAgICB0aHVuZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBUaHVuZGVyPlxuICApIHtcbiAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy4ja2V5cyA9IGtleXM7XG4gICAgdGhpcy4jdGh1bmRlciA9IHRodW5kZXI7XG4gIH1cblxuICBhc3luYyBhZGRGaWxlVG9IaXN0b3J5KHtcbiAgICBmaWxlSWQsXG4gICAgbm9kZUlkXG4gIH06IHtcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPE5vZGU+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEV4aXN0IHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IGFkZEZpbGVUb0hpc3RvcnkgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBhZGRGaWxlVG9IaXN0b3J5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgbm9kZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gQWRkRmlsZVRvSGlzdG9yeVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBhZGRGaWxlVG9IaXN0b3J5OiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWFkZEZpbGVUb0hpc3RvcnkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChhZGRGaWxlVG9IaXN0b3J5Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGFkZEZpbGVUb0hpc3Rvcnk7XG4gICAgfVxuXG4gICAgaWYgKGFkZEZpbGVUb0hpc3RvcnkuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBhZGRGaWxlVG9IaXN0b3J5O1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCBncWxOb2RlRnVsbFRvSW50ZXJuYWxGdWxsKFxuICAgICAgYWRkRmlsZVRvSGlzdG9yeS5hZGRGaWxlVG9IaXN0b3J5LFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG4gICAgY29uc3QgZmlsZSA9IG5vZGUuaGlzdG9yeS5maW5kKGYgPT4gZi5pZCA9PT0gZmlsZUlkKTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgY29uc3QgdXNlcnMgPSBub2RlLnVzZXJzLmZpbHRlcihcbiAgICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgIT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgICApO1xuICAgICAgY29uc3QgaW5wdXQ6IFNoYXJlRmlsZUluSGlzdG9yeUlucHV0ID0ge1xuICAgICAgICBmaWxlSWQ6IGZpbGUuaWQsXG4gICAgICAgIHVzZXJzOiB1c2Vycy5tYXAoKFt1XSkgPT4gKHtcbiAgICAgICAgICBpZDogdS5pZCxcbiAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZmlsZS5rZXkpLFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9KSlcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICAgIHNoYXJlRmlsZUluSGlzdG9yeTogW1xuICAgICAgICAgIHsgaW5wdXQsIG5vZGVJZCB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gU2hhcmVGaWxlSW5IaXN0b3J5UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBzaGFyZUZpbGVJbkhpc3Rvcnk6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBpbnRlcm5hbE5vZGVUb05vZGUobm9kZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdXBsb2FkRmlsZSh7XG4gICAgZmlsZSxcbiAgICBlbmNyeXB0UHJvZ3Jlc3MsXG4gICAgdXBsb2FkUHJvZ3Jlc3MsXG4gICAgc2lnbmFsXG4gIH06IHtcbiAgICBmaWxlOiBnbG9iYWxUaGlzLkZpbGUgfCBVaW50OEFycmF5O1xuICAgIGVuY3J5cHRQcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgdXBsb2FkUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxzdHJpbmc+XG4gICAgfCBFcnJvckFjY2Vzc0RlbmllZFxuICAgIHwgRXJyb3JMaW1pdFxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBmaWxlS2V5ID0gc2VjcmV0c3RyZWFtS2V5Z2VuKCk7XG4gICAgY29uc3QgZmlsZUJ1ZmZlciA9XG4gICAgICBmaWxlIGluc3RhbmNlb2YgRmlsZSA/IG5ldyBVaW50OEFycmF5KGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKSkgOiBmaWxlO1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBjb21wcmVzcyhmaWxlQnVmZmVyKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGRhdGE6IGVuY3J5cHRlZEZpbGUsXG4gICAgICBtZDU6IG1kNUZpbGUsXG4gICAgICBtZDVFbmNyeXB0ZWRcbiAgICB9ID0gYXdhaXQgZW5jcnlwdChmaWxlS2V5LCBjb21wcmVzc2VkLCBlbmNyeXB0UHJvZ3Jlc3MsIHNpZ25hbCk7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRGaWxlS2V5ID0gZW5jcnlwdENyeXB0b0JveChcbiAgICAgIGZpbGVLZXksXG4gICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICk7XG5cbiAgICBjb25zdCB7IHVwbG9hZEZpbGUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIEpzb246IHtcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnN0cmluZ2lmeShlKSxcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnBhcnNlKGUgYXMgc3RyaW5nKVxuICAgICAgICB9LFxuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH0sXG4gICAgICAgIEJpZ0ludDoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEJpZ0ludChlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgYmlnaW50KS50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1cGxvYWRGaWxlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlU2l6ZTogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICAgIGZpbGVTaXplQmVmb3JlOiBmaWxlQnVmZmVyLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgZmlsZUtleTogc29kaXVtLnRvX2hleChlbmNyeXB0ZWRGaWxlS2V5KSxcbiAgICAgICAgICBtZDVFbmNyeXB0ZWQsXG4gICAgICAgICAgbWQ1OiBtZDVGaWxlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTGltaXRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVcGxvYWRGaWxlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVwbG9hZEZpbGU6IHtcbiAgICAgICAgICAgICAgZmlsZUlkOiB0cnVlLFxuICAgICAgICAgICAgICBmaWxlUGFydFNpemU6IHRydWUsXG4gICAgICAgICAgICAgIHBhcnRzOiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiB0cnVlLFxuICAgICAgICAgICAgICAgIG9yZGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgIHVybDogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVwbG9hZEZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1cGxvYWRGaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVwbG9hZEZpbGU7XG4gICAgfVxuXG4gICAgaWYgKHVwbG9hZEZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckxpbWl0XCIpIHtcbiAgICAgIHJldHVybiB1cGxvYWRGaWxlO1xuICAgIH1cblxuICAgIGlmICh1cGxvYWRGaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXBsb2FkRmlsZTtcbiAgICB9XG5cbiAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdXBsb2FkUHJvZ3Jlc3M/Lih7XG4gICAgICB0b3RhbDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgY3VycmVudDogMCxcbiAgICAgIHBlcmNlbnQ6IDBcbiAgICB9KTtcblxuICAgIGlmICh1cGxvYWRGaWxlLnVwbG9hZEZpbGUucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB1cGxvYWRQcm9ncmVzcz8uKHtcbiAgICAgICAgdG90YWw6IGVuY3J5cHRlZEZpbGUuYnl0ZUxlbmd0aCxcbiAgICAgICAgY3VycmVudDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBwZXJjZW50OiAxXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogdXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGxvYWRQYXJ0RW5kZWQgPSBhc3luYyAoXG4gICAgICBtZDU6IHN0cmluZyxcbiAgICAgIG9yZGVyOiBudW1iZXJcbiAgICApOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4gPT4ge1xuICAgICAgaWYgKCF1cGxvYWRGaWxlLnVwbG9hZEZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHVwbG9hZEZpbGVQYXJ0RW5kIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgICB1cGxvYWRGaWxlUGFydEVuZDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZCxcbiAgICAgICAgICAgIG1kNSxcbiAgICAgICAgICAgIG9yZGVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gVXBsb2FkRmlsZVBhcnRFbmRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIHVwbG9hZEZpbGVQYXJ0RW5kOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF1cGxvYWRGaWxlUGFydEVuZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwbG9hZEZpbGVQYXJ0RW5kLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgICByZXR1cm4gdXBsb2FkRmlsZVBhcnRFbmQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IHVwbG9hZEZpbGVQYXJ0RW5kLnVwbG9hZEZpbGVQYXJ0RW5kXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCB1cGxvYWRFbmRlZCA9IGFzeW5jICgpOiBQcm9taXNlPFxuICAgICAgU3VjY2Vzc1Jlc3BvbnNlPHN0cmluZz4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90Rm91bmQgfCBudWxsXG4gICAgPiA9PiB7XG4gICAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXBsb2FkRmlsZUVuZCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgICAgdXBsb2FkRmlsZUVuZDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBVcGxvYWRGaWxlRW5kUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICB1cGxvYWRGaWxlRW5kOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF1cGxvYWRGaWxlRW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodXBsb2FkRmlsZUVuZC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgICAgcmV0dXJuIHVwbG9hZEZpbGVFbmQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGxvYWRGaWxlRW5kLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICAgIHJldHVybiB1cGxvYWRGaWxlRW5kO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVwbG9hZEZpbGVFbmQudXBsb2FkRmlsZUVuZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogdXBsb2FkRmlsZUVuZC51cGxvYWRGaWxlRW5kXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBjaHVua1BhcnRzID0gbmV3IEFycmF5PHtcbiAgICAgIG9yZGVyOiBudW1iZXI7XG4gICAgICBkYXRhOiBVaW50OEFycmF5O1xuICAgICAgbWQ1OiBzdHJpbmc7XG4gICAgfT4oKTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBjaHVua10gb2YgZW51bWVyYXRlKFxuICAgICAgY2h1bmtzKGVuY3J5cHRlZEZpbGUsIE51bWJlcih1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZVBhcnRTaXplKSlcbiAgICApKSB7XG4gICAgICBjaHVua1BhcnRzLnB1c2goe1xuICAgICAgICBvcmRlcjogaW5kZXggKyAxLFxuICAgICAgICBkYXRhOiBjaHVuayxcbiAgICAgICAgbWQ1OiBhd2FpdCBtZDUoY2h1bmspXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9ncmVzc1BhcnRzOiBSZWNvcmQ8bnVtYmVyLCBBeGlvc1Byb2dyZXNzRXZlbnQ+ID0ge307XG4gICAgY29uc3Qgb25Qcm9ncmVzcyA9IChcbiAgICAgIHBhcnQ6IG51bWJlcixcbiAgICAgIHByb2dyZXNzRXZlbnQ6IEF4aW9zUHJvZ3Jlc3NFdmVudFxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgcHJvZ3Jlc3NQYXJ0c1twYXJ0XSA9IHByb2dyZXNzRXZlbnQ7XG4gICAgICBjb25zdCBjdXJyZW50ID0gT2JqZWN0LnZhbHVlcyhwcm9ncmVzc1BhcnRzKS5yZWR1Y2UoXG4gICAgICAgIChwcnYsIGN1cikgPT4gcHJ2ICsgY3VyLmxvYWRlZCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIHVwbG9hZFByb2dyZXNzPy4oe1xuICAgICAgICBwZXJjZW50OiBjdXJyZW50IC8gZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICB0b3RhbDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBjdXJyZW50XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnlQYXJ0ID0gYXN5bmMgKHBhcnQ6IEZpbGVQYXJ0UmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBjb25zdCBjaHVuayA9IGNodW5rUGFydHMuZmluZChwID0+IHAub3JkZXIgPT09IHBhcnQub3JkZXIpO1xuICAgICAgaWYgKCFjaHVuaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJ0LmZpZWxkcykpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICBcImZpbGVcIixcbiAgICAgICAgbmV3IEJsb2IoW2NodW5rLmRhdGFdKSxcbiAgICAgICAgYCR7dXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZH0tJHtjaHVuay5vcmRlcn1gXG4gICAgICApO1xuXG4gICAgICBhd2FpdCBheGlvcy5wb3N0KHBhcnQudXJsLCBmb3JtRGF0YSwge1xuICAgICAgICBvblVwbG9hZFByb2dyZXNzOiBwcm9ncmVzc0V2ZW50ID0+XG4gICAgICAgICAgb25Qcm9ncmVzcyhwYXJ0Lm9yZGVyLCBwcm9ncmVzc0V2ZW50KSxcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdXBsb2FkUGFydEVuZGVkKGNodW5rLm1kNSwgY2h1bmsub3JkZXIpO1xuICAgICAgLy8gaWYgKChlIGFzIGFueSkucmVzcG9uc2Uuc3RhdHVzID09PSAwKSB7XG4gICAgICAvLyAgIC8vIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9reS9pc3N1ZXMvMzA1XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aHJvdyBlO1xuICAgICAgLy8gfVxuICAgIH07XG5cbiAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZUFsbExpbWl0KFxuICAgICAgMyxcbiAgICAgIHVwbG9hZEZpbGUudXBsb2FkRmlsZS5wYXJ0cy5tYXAocCA9PiAoKTogUHJvbWlzZTx2b2lkPiA9PiBieVBhcnQocCkpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVwbG9hZEVuZGVkKCk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEZpbGVJbkNsb3VkKHtcbiAgICBmaWxlLFxuICAgIG5hbWUsXG4gICAgbm9kZUlkLFxuICAgIGVuY3J5cHRQcm9ncmVzcyxcbiAgICB1cGxvYWRQcm9ncmVzcyxcbiAgICBzaWduYWxcbiAgfToge1xuICAgIGZpbGU6IGdsb2JhbFRoaXMuRmlsZSB8IFVpbnQ4QXJyYXk7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG5vZGVJZD86IHN0cmluZztcbiAgICBlbmNyeXB0UHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHVwbG9hZFByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+XG4gICAgfCBFcnJvckFjY2Vzc0RlbmllZFxuICAgIHwgRXJyb3JMaW1pdFxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgRXJyb3JCYXNpY1xuICAgIHwgRXJyb3JOb3RFeGlzdFxuICAgIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBmaWxlSWQgPSBhd2FpdCB0aGlzLnVwbG9hZEZpbGUoe1xuICAgICAgZmlsZSxcbiAgICAgIGVuY3J5cHRQcm9ncmVzcyxcbiAgICAgIHVwbG9hZFByb2dyZXNzLFxuICAgICAgc2lnbmFsXG4gICAgfSk7XG5cbiAgICBpZiAoIWZpbGVJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVJZC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBmaWxlSWQ7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVJZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTGltaXRcIikge1xuICAgICAgcmV0dXJuIGZpbGVJZDtcbiAgICB9XG5cbiAgICBpZiAoZmlsZUlkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gZmlsZUlkO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2F2ZUluQ2xvdWQoe1xuICAgICAgZmlsZUlkOiBmaWxlSWQuZGF0YSxcbiAgICAgIG5hbWUsXG4gICAgICBub2RlSWRcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvckxpbWl0XCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RFeGlzdFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0LmRhdGFcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlZE5vZGVzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVbXT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBkZWxldGVkTm9kZXMgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICBkZWxldGVkTm9kZXM6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gRGVsZXRlZE5vZGVzUmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgZGVsZXRlZE5vZGVzOiBub2RlU2VsZWN0b3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVkTm9kZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVkTm9kZXMuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlZE5vZGVzO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5PE5vZGU+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgZGVsZXRlZE5vZGVzLmRlbGV0ZWROb2Rlcykge1xuICAgICAgbm9kZXMucHVzaChhd2FpdCBncWxOb2RlVG9FeHRlcm5hbChub2RlLCB0aGlzLiNrZXlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBub2Rlc1xuICAgIH07XG4gIH1cblxuICBhc3luYyBzaGFyZWROb2RlcygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxOb2RlW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgc2hhcmVkTm9kZXMgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICBzaGFyZWROb2Rlczoge1xuICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCIuLi5vbiBTaGFyZWROb2Rlc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIHNoYXJlZE5vZGVzOiBub2RlU2VsZWN0b3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFzaGFyZWROb2Rlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlZE5vZGVzLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlZE5vZGVzO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5PE5vZGU+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBzaGFyZWROb2Rlcy5zaGFyZWROb2Rlcykge1xuICAgICAgbm9kZXMucHVzaChhd2FpdCBncWxOb2RlVG9FeHRlcm5hbChmb2xkZXIsIHRoaXMuI2tleXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG5vZGVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG5vZGVzU2hhcmVkV2l0aE1lKFxuICAgIHR5cGU/OiBOb2RlVHlwZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Tm9kZVtdPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbm9kZXNTaGFyZWRXaXRoTWUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICBub2Rlc1NoYXJlZFdpdGhNZTogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBOb2Rlc1NoYXJlZFdpdGhNZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBub2Rlc1NoYXJlZFdpdGhNZTogbm9kZVNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIW5vZGVzU2hhcmVkV2l0aE1lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAobm9kZXNTaGFyZWRXaXRoTWUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZXNTaGFyZWRXaXRoTWU7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXMgPSBuZXcgQXJyYXk8Tm9kZT4oKTtcblxuICAgIGZvciAoY29uc3QgZm9sZGVyIG9mIG5vZGVzU2hhcmVkV2l0aE1lLm5vZGVzU2hhcmVkV2l0aE1lKSB7XG4gICAgICBub2Rlcy5wdXNoKGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsKGZvbGRlciwgdGhpcy4ja2V5cykpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogbm9kZXNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlTm9kZVNoYXJpbmcoe1xuICAgIG5vZGVJZCxcbiAgICB1c2VySWRcbiAgfToge1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU5vZGVTaGFyaW5nIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTm9kZVNoYXJpbmc6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICB1c2VySWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTm9kZVNoYXJpbmdSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlTm9kZVNoYXJpbmc6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlTm9kZVNoYXJpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVOb2RlU2hhcmluZy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVOb2RlU2hhcmluZztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRlbGV0ZU5vZGVTaGFyaW5nLmRlbGV0ZU5vZGVTaGFyaW5nXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGR1cGxpY2F0ZU5vZGUoe1xuICAgIG5vZGVJZCxcbiAgICBmb2xkZXJJZCxcbiAgICBjdXN0b21OYW1lXG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICBmb2xkZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgY3VzdG9tTmFtZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgPiB7XG4gICAgbGV0IG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSAoJHtub2RlSWR9KSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFub2RlLmFjY2Vzcz8ubmFtZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBoYXZlIGFjY2VzcyB0byBub2RlICR7bm9kZUlkfWApO1xuICAgIH1cbiAgICBjdXN0b21OYW1lID0gY3VzdG9tTmFtZVxuICAgICAgPyBhd2FpdCBlbmNyeXB0TmFtZShjdXN0b21OYW1lLCBub2RlLmFjY2Vzcy5uYW1lS2V5KVxuICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgeyBkdXBsaWNhdGVOb2RlIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZHVwbGljYXRlTm9kZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgIGZvbGRlcklkLFxuICAgICAgICAgIGN1c3RvbU5hbWVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEdXBsaWNhdGVOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGR1cGxpY2F0ZU5vZGU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZHVwbGljYXRlTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGR1cGxpY2F0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZHVwbGljYXRlTm9kZTtcbiAgICB9XG5cbiAgICBpZiAoZHVwbGljYXRlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIGR1cGxpY2F0ZU5vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkdXBsaWNhdGVOb2RlLmR1cGxpY2F0ZU5vZGVcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlTm9kZUNsb3VkVHJhc2goe1xuICAgIGlkc1xuICB9OiB7XG4gICAgaWRzOiBBcnJheTxzdHJpbmc+O1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU5vZGVDbG91ZFRyYXNoIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTm9kZUNsb3VkVHJhc2g6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEZWxldGVOb2RlQ2xvdWRUcmFzaFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVOb2RlQ2xvdWRUcmFzaDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVOb2RlQ2xvdWRUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZU5vZGVDbG91ZFRyYXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZU5vZGVDbG91ZFRyYXNoO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlTm9kZUNsb3VkVHJhc2guZGVsZXRlTm9kZUNsb3VkVHJhc2ggPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRm9sZGVyKHtcbiAgICBuYW1lLFxuICAgIHBhcmVudEZvbGRlcklkXG4gIH06IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcGFyZW50Rm9sZGVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEV4aXN0IHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBrZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROYW1lID0gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgc29kaXVtLnRvX2hleChrZXkpKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRLZXkgPSBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAga2V5LFxuICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICApO1xuICAgIGNvbnN0IHsgY3JlYXRlRm9sZGVyIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgY3JlYXRlRm9sZGVyOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBlbmNyeXB0ZWROYW1lLFxuICAgICAgICAgIHBhcmVudEZvbGRlcklkLFxuICAgICAgICAgIGtleTogc29kaXVtLnRvX2hleChlbmNyeXB0ZWRLZXkpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gQ3JlYXRlRm9sZGVyUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZUZvbGRlcjogbm9kZUZ1bGxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuICAgIGlmICghY3JlYXRlRm9sZGVyKSB7XG4gICAgICAvL3Rocm93IG5ldyBFcnJvcihgQ2FuJ3QgY3JlYXRlIGZvbGRlcmApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZUZvbGRlci5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVGb2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZUZvbGRlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWNyZWF0ZUZvbGRlci5jcmVhdGVGb2xkZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsTm9kZUZ1bGwoXG4gICAgICBjcmVhdGVGb2xkZXIuY3JlYXRlRm9sZGVyLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG5cbiAgICBjb25zdCB1c2VycyA9XG4gICAgICBmb2xkZXIucGFyZW50Py51c2Vycz8uZmlsdGVyKFxuICAgICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSAhPT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICAgICkgPz8gW107XG5cbiAgICBpZiAodXNlcnMubGVuZ3RoKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdXNlcnMubWFwKChbdSwgcmlnaHRzXSkgPT5cbiAgICAgICAgICB0aGlzLnNoYXJlTm9kZSh7XG4gICAgICAgICAgICBub2RlSWQ6IGZvbGRlci5pZCxcbiAgICAgICAgICAgIHJpZ2h0cyxcbiAgICAgICAgICAgIHVzZXJJZDogdS5pZFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBmb2xkZXJcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbm9kZSh7XG4gICAgaWQsXG4gICAgZGVsZXRlZFxuICB9OiB7XG4gICAgaWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGRlbGV0ZWQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSA9IHt9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBub2RlIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIikoe1xuICAgICAgbm9kZTogW1xuICAgICAgICB7IGRlbGV0ZWQsIGlkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIE5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbm9kZTogbm9kZUZ1bGxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgaWYgKCFub2RlLm5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsTm9kZUZ1bGwobm9kZS5ub2RlLCB0aGlzLiNrZXlzKTtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmaWxlTWV0YWRhdGEoe1xuICAgIGlkXG4gIH06IHtcbiAgICBpZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8RmlsZU1ldGFkYXRhPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZmlsZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcInF1ZXJ5XCIpKHtcbiAgICAgIGZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEZpbGVRdWVyeVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBmaWxlOiBmaWxlU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChmaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgaWYgKCFmaWxlLmZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGdxbEZpbGVUb0V4dGVybmFsKGZpbGUuZmlsZSwgdGhpcy4ja2V5cyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzaGFyZU5vZGUoe1xuICAgIG5vZGVJZCxcbiAgICB1c2VySWQsXG4gICAgcmlnaHRzXG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICByaWdodHM6IFJpZ2h0cztcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy4jY2xpZW50LnVzZXIoeyB1c2VySWQsIHdpdGhQdWJsaWNLZXk6IHRydWUgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmICh1c2VyLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHNoYXJlTm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIHNoYXJlTm9kZTogW1xuICAgICAgICB7IG5vZGVJZCwgdXNlcklkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gU2hhcmVOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG5vZGVzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNoYXJlTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZU5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlTm9kZTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyZU5vZGVzOiBTaGFyZU5vZGVzSW5wdXQgPSB7XG4gICAgICBub2RlczogW11cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBpZCBvZiBzaGFyZU5vZGUubm9kZXMpIHtcbiAgICAgIGNvbnN0IG5hbWVLZXkgPSBhd2FpdCB0aGlzLnBlck5vZGUoaWQsIHVzZXIuZGF0YS5wdWJsaWNLZXkpO1xuICAgICAgaWYgKG5hbWVLZXkpIHtcbiAgICAgICAgc2hhcmVOb2Rlcy5ub2Rlcy5wdXNoKG5hbWVLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2hhcmVOb2RlRmluaXNoIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgc2hhcmVOb2RlRmluaXNoOiBbXG4gICAgICAgIHtcbiAgICAgICAgICByaWdodHMsXG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHNoYXJlTm9kZXNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBTaGFyZU5vZGVGaW5pc2hSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgc2hhcmVOb2RlRmluaXNoOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNoYXJlTm9kZUZpbmlzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlTm9kZUZpbmlzaC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZU5vZGVGaW5pc2g7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlTm9kZUZpbmlzaC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlTm9kZUZpbmlzaDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHNoYXJlTm9kZUZpbmlzaC5zaGFyZU5vZGVGaW5pc2ggPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlTm9kZSh7XG4gICAgbm9kZUlkLFxuICAgIG5hbWUsXG4gICAgaXNGYXZvcml0ZSxcbiAgICBkZWxldGVkQXRcbiAgfToge1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGlzRmF2b3JpdGU/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBkZWxldGVkQXQ/OiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgbGV0IG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHRocm93IGBDYW4ndCBmaW5kIE5vZGUgJHtub2RlSWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5vZGUuYWNjZXNzPy5uYW1lS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGhhdmUgYWNjZXNzIHRvIG5vZGUgJHtub2RlSWR9YCk7XG4gICAgfVxuXG4gICAgbmFtZSA9IG5hbWVcbiAgICAgID8gbm9kZS5hY2Nlc3M/Lm5hbWVLZXlcbiAgICAgICAgPyBhd2FpdCBlbmNyeXB0TmFtZShuYW1lLCBub2RlLmFjY2Vzcy5uYW1lS2V5KVxuICAgICAgICA6IG5hbWVcbiAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IHsgdXBkYXRlTm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIHVwZGF0ZU5vZGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGlzRmF2b3JpdGUsXG4gICAgICAgICAgZGVsZXRlZEF0XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXBkYXRlTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1cGRhdGVOb2RlOiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVwZGF0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZU5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVOb2RlO1xuICAgIH1cblxuICAgIGlmICghdXBkYXRlTm9kZS51cGRhdGVOb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKFxuICAgICAgdXBkYXRlTm9kZS51cGRhdGVOb2RlLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmaWxlQ29udGVudCh7XG4gICAgZmlsZUlkLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzcyxcbiAgICBwcm9ncmVzc0RlY3J5cHQsXG4gICAgc2lnbmFsXG4gIH06IHtcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3M/OiAocHJvZ3Jlc3M6IERvd25sb2FkUHJvZ3Jlc3MpID0+IHZvaWQ7XG4gICAgcHJvZ3Jlc3NEZWNyeXB0PzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPFVpbnQ4QXJyYXk+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvckJhc2ljIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IGZpbGVDb250ZW50IH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBCeXRlczoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUsIHR5cGVvZiBlKTtcbiAgICAgICAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oWzEsIDIsIDNdKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIFVpbnQ4QXJyYXkpLnRvU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIGZpbGVDb250ZW50OiBbXG4gICAgICAgIHsgZmlsZUlkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZmlsZToge1xuICAgICAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50Q2xvdWRcIjoge1xuICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnRVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBvcmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG1kNTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAga2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHB1YmxpY0tleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50TGl0ZVwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGtleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwdWJsaWNLZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRydWVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCIuLi5vbiBGaWxlQ29udGVudFJlY2VpdmVkTWFpbFwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXliZVBhcnRzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50VXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZDU6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1heWJlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VuZGVyUHVibGljS2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1RW5jcnlwdGVkOiB0cnVlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRTZW50TWFpbFwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXliZVBhcnRzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50VXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZDU6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1heWJlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgdG90YWxTaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDVFbmNyeXB0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFmaWxlQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVDb250ZW50Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGZpbGVDb250ZW50O1xuICAgIH1cblxuICAgIGlmIChmaWxlQ29udGVudC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIGZpbGVDb250ZW50O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGUgPSBmaWxlQ29udGVudC5maWxlO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3Jlc3NQYXJ0czogUmVjb3JkPG51bWJlciwgRG93bmxvYWRQcm9ncmVzcz4gPSB7fTtcbiAgICBjb25zdCBvblByb2dyZXNzID0gKFxuICAgICAgcGFydDogbnVtYmVyLFxuICAgICAgcHJvZ3Jlc3NFdmVudDogRG93bmxvYWRQcm9ncmVzc1xuICAgICk6IHZvaWQgPT4ge1xuICAgICAgcHJvZ3Jlc3NQYXJ0c1twYXJ0XSA9IHByb2dyZXNzRXZlbnQ7XG4gICAgICBjb25zdCB0cmFuc2ZlcnJlZEJ5dGVzID0gT2JqZWN0LnZhbHVlcyhwcm9ncmVzc1BhcnRzKS5yZWR1Y2UoXG4gICAgICAgIChwcnYsIGN1cikgPT4gcHJ2ICsgY3VyLnRyYW5zZmVycmVkQnl0ZXMsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICBjb25zdCB0b3RhbEJ5dGVzID0gTnVtYmVyKGZpbGUudG90YWxTaXplKTtcbiAgICAgIG9uRG93bmxvYWRQcm9ncmVzcz8uKHtcbiAgICAgICAgcGVyY2VudDogdHJhbnNmZXJyZWRCeXRlcyAvIHRvdGFsQnl0ZXMsXG4gICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIHRyYW5zZmVycmVkQnl0ZXNcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRDb250ZW50RnJvbVBhcnRzID0gYXN5bmMgKFxuICAgICAgZmlsZVBhcnRzOiBGaWxlQ29udGVudFBhcnRbXVxuICAgICk6IFByb21pc2U8VWludDhBcnJheT4gPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBuZXcgQXJyYXk8eyBkYXRhOiBVaW50OEFycmF5OyBvcmRlcjogbnVtYmVyIH0+KCk7XG5cbiAgICAgIGNvbnN0IGJ5UGFydCA9IGFzeW5jIChwYXJ0OiBGaWxlQ29udGVudFBhcnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgICAgICAgYXdhaXQga3lcbiAgICAgICAgICAgIC5nZXQocGFydC5jb250ZW50VXJsLCB7XG4gICAgICAgICAgICAgIHRpbWVvdXQ6IGZhbHNlLFxuICAgICAgICAgICAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IHByID0+IG9uUHJvZ3Jlc3MocGFydC5vcmRlciwgcHIpLFxuICAgICAgICAgICAgICBzaWduYWw6IHNpZ25hbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hcnJheUJ1ZmZlcigpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG1kNVBhcnQgPSBhd2FpdCBtZDUoYnVmKTtcbiAgICAgICAgaWYgKG1kNVBhcnQgIT09IHBhcnQubWQ1KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgbWQ1IGZvciBwYXJ0ICR7cGFydC5vcmRlcn0gb2YgZmlsZSAke2ZpbGVJZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICBkYXRhOiBidWYsXG4gICAgICAgICAgb3JkZXI6IHBhcnQub3JkZXJcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBwcm9taXNlQWxsTGltaXQoXG4gICAgICAgIDMsXG4gICAgICAgIGZpbGVQYXJ0cy5tYXAocCA9PiAoKTogUHJvbWlzZTx2b2lkPiA9PiBieVBhcnQocCkpXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gY29uY2F0ZW5hdGUoXG4gICAgICAgIC4uLnBhcnRzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKS5tYXAocCA9PiBwLmRhdGEpXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBmaW5hbGl6ZSA9IGFzeW5jIChcbiAgICAgIGVuY3J5cHRlZENvbnRlbnQ6IFVpbnQ4QXJyYXlcbiAgICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgICAgIC8vIGNvbnN0IG1kNUVuY3J5cHRlZCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1kNShvZihlbmNyeXB0ZWRDb250ZW50KSkpO1xuICAgICAgY29uc3QgbWQ1RW5jcnlwdGVkID0gYXdhaXQgbWQ1KGVuY3J5cHRlZENvbnRlbnQpO1xuXG4gICAgICBpZiAobWQ1RW5jcnlwdGVkICE9PSBmaWxlLm1kNUVuY3J5cHRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVuY3J5cHRlZCBjb250ZW50IGRvZXMgbm90IG1hdGNoYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IGRlY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleChmaWxlLmtleSksXG4gICAgICAgIGZpbGUuX190eXBlbmFtZSA9PT0gXCJGaWxlQ29udGVudFJlY2VpdmVkTWFpbFwiXG4gICAgICAgICAgPyBmaWxlLnNlbmRlclB1YmxpY0tleVxuICAgICAgICAgIDogZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50Q2xvdWRcIlxuICAgICAgICAgID8gZmlsZS5wdWJsaWNLZXlcbiAgICAgICAgICA6IHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNyYyA9IGF3YWl0IGRlY3J5cHQoa2V5LCBlbmNyeXB0ZWRDb250ZW50LCBwcm9ncmVzc0RlY3J5cHQsIHNpZ25hbCk7XG5cbiAgICAgIC8vIGNvbnN0IG1kNUNvbnRlbnQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShtZDUob2Yoc3JjKSkpO1xuICAgICAgY29uc3QgbWQ1Q29udGVudCA9IGF3YWl0IG1kNShzcmMpO1xuXG4gICAgICBpZiAobWQ1Q29udGVudCAhPT0gZmlsZS5tZDUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb250ZW50IGRvZXMgbm90IG1hdGNoYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmNvbXByZXNzKHNyYyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZENvbnRlbnQgPVxuICAgICAgZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50TGl0ZVwiXG4gICAgICAgID8gZmlsZS5jb250ZW50XG4gICAgICAgIDogZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50Q2xvdWRcIlxuICAgICAgICA/IGF3YWl0IGVuY3J5cHRlZENvbnRlbnRGcm9tUGFydHMoZmlsZS5wYXJ0cylcbiAgICAgICAgOiBmaWxlLm1heWJlQ29udGVudFxuICAgICAgICA/IGZpbGUubWF5YmVDb250ZW50XG4gICAgICAgIDogZmlsZS5tYXliZVBhcnRzXG4gICAgICAgID8gYXdhaXQgZW5jcnlwdGVkQ29udGVudEZyb21QYXJ0cyhmaWxlLm1heWJlUGFydHMpXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmICghZW5jcnlwdGVkQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBhd2FpdCBmaW5hbGl6ZShlbmNyeXB0ZWRDb250ZW50KVxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVGaWxlKHtcbiAgICBmaWxlSWQsXG4gICAgbm9kZUlkXG4gIH06IHtcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEV4aXN0IHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IGRlbGV0ZUZpbGUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBkZWxldGVGaWxlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgbm9kZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlRmlsZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVGaWxlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZUZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVGaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZUZpbGU7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZUZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVGaWxlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlRmlsZS5kZWxldGVGaWxlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU5vZGUoe1xuICAgIG5vZGVJZFxuICB9OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZGVsZXRlTm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZU5vZGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBub2RlSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVOb2RlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZU5vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVOb2RlLmRlbGV0ZU5vZGVcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZW1wdHlUcmFzaCgpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IGVtcHR5Q2xvdWRUcmFzaCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGVtcHR5Q2xvdWRUcmFzaDoge1xuICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCIuLi5vbiBFbXB0eUNsb3VkVHJhc2hSZXNwb25zZVwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBlbXB0eUNsb3VkVHJhc2g6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFlbXB0eUNsb3VkVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbXB0eUNsb3VkVHJhc2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZW1wdHlDbG91ZFRyYXNoO1xuICAgIH1cblxuICAgIGlmICghZW1wdHlDbG91ZFRyYXNoLmVtcHR5Q2xvdWRUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBlbXB0eUNsb3VkVHJhc2guZW1wdHlDbG91ZFRyYXNoXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHJlY292ZXJOb2RlKFxuICAgIGlkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgcmVjb3Zlck5vZGUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICByZWNvdmVyTm9kZTogW1xuICAgICAgICB7IGlkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gUmVjb3Zlck5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgcmVjb3Zlck5vZGU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghcmVjb3Zlck5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZWNvdmVyTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZWNvdmVyTm9kZTtcbiAgICB9XG5cbiAgICBpZiAocmVjb3Zlck5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiByZWNvdmVyTm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlY292ZXJOb2RlLnJlY292ZXJOb2RlID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVOb2Rlcyh7XG4gICAgbm9kZUlkcyxcbiAgICBwYXJlbnROb2RlSWRcbiAgfToge1xuICAgIG5vZGVJZHM6IHN0cmluZ1tdO1xuICAgIHBhcmVudE5vZGVJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbW92ZU5vZGVzIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgbW92ZU5vZGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICAgIHBhcmVudE5vZGVJZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBNb3ZlTm9kZXNSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbW92ZU5vZGVzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIW1vdmVOb2Rlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG1vdmVOb2Rlcy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBtb3ZlTm9kZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBtb3ZlTm9kZXMubW92ZU5vZGVzID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVJbkNsb3VkKHtcbiAgICBmaWxlSWQsXG4gICAgbmFtZSxcbiAgICBub2RlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBub2RlSWQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFxuICAgIHwgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTGltaXRcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IEVycm9yTm90RXhpc3RcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgaWYgKG5vZGVJZCAmJiAhbm9kZXNDYWNoZS5oYXMobm9kZUlkKSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIGlmICghbm9kZXNDYWNoZS5oYXMobm9kZUlkKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IFwiRXJyb3JCYXNpY1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgbm9kZSAke25vZGVJZH0gZG9lcyBub3QgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBrZXkgPSBcIlwiO1xuXG4gICAgY29uc3QgZmlsZSA9IGZpbGVzQ2FjaGUuZ2V0KGZpbGVJZCk7XG5cbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU1ldGFkYXRhKHsgaWQ6IGZpbGVJZCB9KTtcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc0NhY2hlLmdldChmaWxlSWQpID8/IG51bGw7XG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRNYWlscyA9IGF3YWl0IHRoaXMuI2NsaWVudC5tYWlsLnJlY2VpdmVkTWFpbHMoKTtcbiAgICAgICAgaWYgKCFyZWNlaXZlZE1haWxzKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY2VpdmVkTWFpbHMuX190eXBlbmFtZSAhPT0gXCJTdWNjZXNzUmVzcG9uc2VcIikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1haWwgPSByZWNlaXZlZE1haWxzLmRhdGEuZmluZChtID0+XG4gICAgICAgICAgbS5maWxlcy5zb21lKGYgPT4gZi5pZCA9PT0gZmlsZUlkKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghbWFpbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiBcIkVycm9yQmFzaWNcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDYW4ndCBmaW5kIG1haWwgd2l0aCB0aGUgZmlsZSAke2ZpbGVJZH1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVNYWlsID0gbWFpbC5maWxlcy5maW5kKGYgPT4gZi5pZCA9PT0gZmlsZUlkKTtcblxuICAgICAgICBpZiAoIWZpbGVNYWlsKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IFwiRXJyb3JCYXNpY1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogYENhbid0IGZpbmQgbWFpbCB3aXRoIHRoZSBmaWxlICR7ZmlsZUlkfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZUtleSA9IGRlY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21faGV4KGZpbGVNYWlsLmtleSksXG4gICAgICAgICAgbWFpbC5zZW5kZXIucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApO1xuXG4gICAgICAgIGtleSA9IHNvZGl1bS50b19oZXgoZmlsZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXkgPSBmaWxlLmtleTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gZmlsZS5rZXk7XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJFcnJvckJhc2ljXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiVW5leHBlY3RlZCBlcnJvciAzXCJcbiAgICAgIH07XG4gICAgfVxuXG4gICAga2V5ID0gc29kaXVtLnRvX2hleChcbiAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWVLZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROYW1lID0gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgc29kaXVtLnRvX2hleChuYW1lS2V5KSk7XG4gICAgY29uc3QgZW5jcnlwdGVkTmFtZUtleSA9IHNvZGl1bS50b19oZXgoXG4gICAgICBlbmNyeXB0Q3J5cHRvQm94KG5hbWVLZXksIHRoaXMuI2tleXMucHVibGljS2V5LCB0aGlzLiNrZXlzLnByaXZhdGVLZXkpXG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2F2ZUluQ2xvdWQgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzYXZlSW5DbG91ZDogW1xuICAgICAgICB7XG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgZmlsZW5hbWU6IGVuY3J5cHRlZE5hbWUsXG4gICAgICAgICAgbmFtZUtleTogZW5jcnlwdGVkTmFtZUtleVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTGltaXRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFNhdmVJbkNsb3VkUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHNhdmVJbkNsb3VkOiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNhdmVJbkNsb3VkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gc2F2ZUluQ2xvdWQ7XG4gICAgfVxuXG4gICAgaWYgKHNhdmVJbkNsb3VkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gc2F2ZUluQ2xvdWQ7XG4gICAgfVxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTGltaXRcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmICghc2F2ZUluQ2xvdWQuc2F2ZUluQ2xvdWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKFxuICAgICAgc2F2ZUluQ2xvdWQuc2F2ZUluQ2xvdWQsXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKTtcblxuICAgIGNvbnN0IG1lID0gbm9kZS5wYXJlbnQ/LnVzZXJzLmZpbmQoXG4gICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSA9PT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICApO1xuXG4gICAgaWYgKG1lICYmIFtcImFkbWluXCIsIFwid3JpdGVcIl0uaW5jbHVkZXMobWVbMV0pKSB7XG4gICAgICBjb25zdCBvdGhlcnMgPVxuICAgICAgICBub2RlLnBhcmVudD8udXNlcnMuZmlsdGVyKFxuICAgICAgICAgIChbdV0pID0+IHUucHVibGljS2V5ICE9PSB0aGlzLiNrZXlzLnB1YmxpY0tleVxuICAgICAgICApID8/IFtdO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3RoZXJzLm1hcCgoW3UsIHJpZ2h0c10pID0+XG4gICAgICAgICAgdGhpcy5zaGFyZU5vZGUoe1xuICAgICAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgICAgcmlnaHRzLFxuICAgICAgICAgICAgdXNlcklkOiB1LmlkXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG5vZGVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwZXJOb2RlID0gYXN5bmMgKFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIHB1YmxpY0tleTogc3RyaW5nXG4gICk6IFByb21pc2U8TmFtZUtleUlucHV0IHwgbnVsbD4gPT4ge1xuICAgIGxldCBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcblxuICAgIGlmICghbm9kZSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZUtleSA9IG5vZGUuYWNjZXNzPy5uYW1lS2V5O1xuXG4gICAgaWYgKCFuYW1lS2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICBuYW1lS2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChuYW1lS2V5KSxcbiAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWxlczpcbiAgICAgICAgXCJoaXN0b3J5XCIgaW4gbm9kZVxuICAgICAgICAgID8gbm9kZS5oaXN0b3J5Lm1hcChmID0+ICh7XG4gICAgICAgICAgICAgIGlkOiBmLmlkLFxuICAgICAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChmLmtleSksXG4gICAgICAgICAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAg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
|
|
1
|
+
import{c as z,d as n,e as K,f as v}from"../chunk-KMTF2BZE.js";var P,l,p;import j from"axios";import O from"ky";import{encryptName as k}from"../index.js";import{nodesCache as R,filesCache as H}from"../cache.js";import{secretstreamKeygen as U}from"../crypto/file.js";import{decryptCryptoBox as $}from"../crypto/index.js";import{encryptCryptoBox as C}from"../crypto/index.js";import{compress as W,uncompress as J}from"../minify/index.js";import{sodium as f}from"../sodium.js";import{enumerate as Q,chunks as G,promiseAllLimit as q,concatenate as V}from"../utils/utils.js";import{md5 as T}from"../worker/md5.js";import{decrypt as X,encrypt as Y}from"../worker/sodium.js";import{gqlFileToExternal as Z}from"./convert/file.js";import{gqlNodeFullToInternalFull as ee,gqlNodeToExternal as L,gqlNodeToExternalNodeFull as I,internalNodeToNode as re}from"./convert/node.js";import{fileSelector as te,nodeFullSelector as x,nodeSelector as M}from"./types/selectors.js";class Ne{constructor(r,t,e){K(this,P,void 0);K(this,l,void 0);K(this,p,void 0);z(this,"perNode",async(r,t)=>{var i;let e=R.get(r);if(!e&&(await this.node({id:r}),e=R.get(r),!e))return null;const o=(i=e.access)==null?void 0:i.nameKey;return o?{id:e.id,nameKey:f.to_hex(C(f.from_hex(o),t,n(this,l).privateKey)),files:"history"in e?e.history.map(s=>({id:s.id,key:f.to_hex(C(f.from_hex(s.key),t,n(this,l).privateKey))})):[]}:null});v(this,P,r),v(this,l,t),v(this,p,e)}async addFileToHistory({fileId:r,nodeId:t}){const{addFileToHistory:e}=await n(this,p).call(this,"mutation")({addFileToHistory:[{fileId:r,nodeId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on AddFileToHistoryResponse":{__typename:!0,addFileToHistory:x}}]});if(!e)return null;if(e.__typename==="ErrorAccessDenied"||e.__typename==="ErrorNotExist")return e;const o=await ee(e.addFileToHistory,n(this,l)),i=o.history.find(c=>c.id===r);if(i){const c=o.users.filter(([m])=>m.publicKey!==n(this,l).publicKey),u={fileId:i.id,users:c.map(([m])=>({id:m.id,key:f.to_hex(C(f.from_hex(i.key),n(this,l).publicKey,n(this,l).privateKey))}))};await n(this,p).call(this,"mutation")({shareFileInHistory:[{input:u,nodeId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on ShareFileInHistoryResponse":{__typename:!0,shareFileInHistory:!0}}]})}const s=re(o);return{__typename:"SuccessResponse",data:s}}async uploadFile({file:r,encryptProgress:t,uploadProgress:e,signal:o}){const i=U(),s=r instanceof File?new Uint8Array(await r.arrayBuffer()):r,c=W(s),{data:u,md5:m,md5Encrypted:h}=await Y(i,c,t,o),A=C(i,n(this,l).publicKey,n(this,l).privateKey),{uploadFile:a}=await n(this,p).call(this,"mutation",{scalars:{Json:{encode:d=>JSON.stringify(d),decode:d=>JSON.parse(d)},DateTime:{decode:d=>new Date(d),encode:d=>d.toISOString()},BigInt:{decode:d=>BigInt(d),encode:d=>d.toString()}}})({uploadFile:[{fileSize:u.byteLength,fileSizeBefore:s.byteLength,fileKey:f.to_hex(A),md5Encrypted:h,md5:m},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorLimit":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on UploadFileResponse":{__typename:!0,uploadFile:{fileId:!0,filePartSize:!0,parts:{fields:!0,order:!0,url:!0}}}}]});if(!a)return null;if(a.__typename==="ErrorAccessDenied"||a.__typename==="ErrorLimit"||a.__typename==="ErrorNotFound")return a;if(!a.uploadFile)return null;if(e==null||e({total:u.byteLength,current:0,percent:0}),a.uploadFile.parts.length===0)return e==null||e({total:u.byteLength,current:u.byteLength,percent:1}),{__typename:"SuccessResponse",data:a.uploadFile.fileId};const g=async(d,N)=>{if(!a.uploadFile)return null;const{uploadFilePartEnd:E}=await n(this,p).call(this,"mutation")({uploadFilePartEnd:[{fileId:a.uploadFile.fileId,md5:d,order:N},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on UploadFilePartEndResponse":{__typename:!0,uploadFilePartEnd:!0}}]});return E?E.__typename==="ErrorAccessDenied"?E:{__typename:"SuccessResponse",data:E.uploadFilePartEnd}:null},w=async()=>{if(!a.uploadFile)return null;const{uploadFileEnd:d}=await n(this,p).call(this,"mutation")({uploadFileEnd:[{fileId:a.uploadFile.fileId},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on UploadFileEndResponse":{__typename:!0,uploadFileEnd:!0}}]});return d?d.__typename==="ErrorAccessDenied"||d.__typename==="ErrorNotFound"?d:d.uploadFileEnd?{__typename:"SuccessResponse",data:d.uploadFileEnd}:null:null},y=new Array;for(const[d,N]of Q(G(u,Number(a.uploadFile.filePartSize))))y.push({order:d+1,data:N,md5:await T(N)});const _={},F=(d,N)=>{_[d]=N;const E=Object.values(_).reduce((b,B)=>b+B.loaded,0);e==null||e({percent:E/u.byteLength,total:u.byteLength,current:E})},S=async d=>{if(!a.uploadFile)return;const N=new FormData,E=y.find(b=>b.order===d.order);if(!!E){for(const[b,B]of Object.entries(d.fields))N.append(b,B);N.append("file",new Blob([E.data]),`${a.uploadFile.fileId}-${E.order}`),await j.post(d.url,N,{onUploadProgress:b=>F(d.order,b),signal:o}),await g(E.md5,E.order)}};if(!a.uploadFile)return null;await q(3,a.uploadFile.parts.map(d=>()=>S(d)));const D=await w();return D?D.__typename==="ErrorAccessDenied"||D.__typename==="ErrorNotFound"?D:{__typename:"SuccessResponse",data:D.data}:null}async uploadFileInCloud({file:r,name:t,nodeId:e,encryptProgress:o,uploadProgress:i,signal:s}){const c=await this.uploadFile({file:r,encryptProgress:o,uploadProgress:i,signal:s});if(!c)return null;if(c.__typename==="ErrorAccessDenied"||c.__typename==="ErrorLimit"||c.__typename==="ErrorNotFound")return c;const u=await this.saveInCloud({fileId:c.data,name:t,nodeId:e});return u?u.__typename==="ErrorAccessDenied"||u.__typename==="ErrorBasic"||u.__typename==="ErrorLimit"||u.__typename==="ErrorNotFound"||u.__typename==="ErrorNotExist"?u:{__typename:"SuccessResponse",data:u.data}:null}async deletedNodes(){const{deletedNodes:r}=await n(this,p).call(this,"query")({deletedNodes:{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on DeletedNodesResponse":{__typename:!0,deletedNodes:M}}});if(!r)return null;if(r.__typename==="ErrorAccessDenied")return r;const t=new Array;for(const e of r.deletedNodes)t.push(await L(e,n(this,l)));return{__typename:"SuccessResponse",data:t}}async sharedNodes(){const{sharedNodes:r}=await n(this,p).call(this,"query")({sharedNodes:{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on SharedNodesResponse":{__typename:!0,sharedNodes:M}}});if(!r)return null;if(r.__typename==="ErrorAccessDenied")return r;const t=new Array;for(const e of r.sharedNodes)t.push(await L(e,n(this,l)));return{__typename:"SuccessResponse",data:t}}async nodesSharedWithMe(r){const{nodesSharedWithMe:t}=await n(this,p).call(this,"query")({nodesSharedWithMe:[{type:r},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on NodesSharedWithMeResponse":{__typename:!0,nodesSharedWithMe:M}}]});if(!t)return null;if(t.__typename==="ErrorAccessDenied")return t;const e=new Array;for(const o of t.nodesSharedWithMe)e.push(await L(o,n(this,l)));return{__typename:"SuccessResponse",data:e}}async deleteNodeSharing({nodeId:r,userId:t}){const{deleteNodeSharing:e}=await n(this,p).call(this,"mutation")({deleteNodeSharing:[{nodeId:r,userId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on DeleteNodeSharingResponse":{__typename:!0,deleteNodeSharing:!0}}]});return e?e.__typename==="ErrorAccessDenied"?e:{__typename:"SuccessResponse",data:e.deleteNodeSharing}:null}async duplicateNode({nodeId:r,folderId:t,customName:e}){var s;let o=R.get(r);if(!o&&(await this.node({id:r}),o=R.get(r),!o))throw new Error(`Node (${r}) does not exists`);if(!((s=o.access)!=null&&s.nameKey))throw new Error(`Can't have access to node ${r}`);e=e?await k(e,o.access.nameKey):null;const{duplicateNode:i}=await n(this,p).call(this,"mutation")({duplicateNode:[{nodeId:r,folderId:t,customName:e},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on DuplicateNodeResponse":{__typename:!0,duplicateNode:!0}}]});return i?i.__typename==="ErrorAccessDenied"||i.__typename==="ErrorNotFound"?i:{__typename:"SuccessResponse",data:i.duplicateNode}:null}async deleteNodeCloudTrash({ids:r}){var e;const{deleteNodeCloudTrash:t}=await n(this,p).call(this,"mutation")({deleteNodeCloudTrash:[{ids:r},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on DeleteNodeCloudTrashResponse":{__typename:!0,deleteNodeCloudTrash:!0}}]});return t?t.__typename==="ErrorAccessDenied"?t:{__typename:"SuccessResponse",data:(e=t.deleteNodeCloudTrash)!=null?e:!1}:null}async createFolder({name:r,parentFolderId:t}){var m,h,A;const e=U(),o=await k(r,f.to_hex(e)),i=C(e,n(this,l).publicKey,n(this,l).privateKey),{createFolder:s}=await n(this,p).call(this,"mutation")({createFolder:[{name:o,parentFolderId:t,key:f.to_hex(i)},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on CreateFolderResponse":{__typename:!0,createFolder:x}}]});if(!s)return null;if(s.__typename==="ErrorAccessDenied"||s.__typename==="ErrorNotExist")return s;if(!s.createFolder)return null;const c=await I(s.createFolder,n(this,l)),u=(A=(h=(m=c.parent)==null?void 0:m.users)==null?void 0:h.filter(([a])=>a.publicKey!==n(this,l).publicKey))!=null?A:[];return u.length&&await Promise.all(u.map(([a,g])=>this.shareNode({nodeId:c.id,rights:g,userId:a.id}))),{__typename:"SuccessResponse",data:c}}async node({id:r,deleted:t}={}){const{node:e}=await n(this,p).call(this,"query")({node:[{deleted:t,id:r},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on NodeResponse":{__typename:!0,node:x}}]});if(!e)return null;if(e.__typename==="ErrorAccessDenied")return e;if(!e.node)return null;const o=await I(e.node,n(this,l));return{__typename:"SuccessResponse",data:o}}async fileMetadata({id:r}){const{file:t}=await n(this,p).call(this,"query")({file:[{id:r},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on FileQueryResponse":{__typename:!0,file:te}}]});if(!t)return null;if(t.__typename==="ErrorAccessDenied")return t;if(!t.file)return null;const e=Z(t.file,n(this,l));return{__typename:"SuccessResponse",data:e}}async shareNode({nodeId:r,userId:t,rights:e}){var u;const o=await n(this,P).user({userId:t,withPublicKey:!0});if(!o||o.__typename==="ErrorNotFound")return o;const{shareNode:i}=await n(this,p).call(this,"mutation")({shareNode:[{nodeId:r,userId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on ShareNodeResponse":{__typename:!0,nodes:!0}}]});if(!i)return null;if(i.__typename==="ErrorAccessDenied"||i.__typename==="ErrorNotFound")return i;const s={nodes:[]};for(const m of i.nodes){const h=await this.perNode(m,o.data.publicKey);h&&s.nodes.push(h)}const{shareNodeFinish:c}=await n(this,p).call(this,"mutation")({shareNodeFinish:[{rights:e,userId:t,shareNodes:s},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on ShareNodeFinishResponse":{__typename:!0,shareNodeFinish:!0}}]});return c?c.__typename==="ErrorAccessDenied"||c.__typename==="ErrorNotFound"?c:{__typename:"SuccessResponse",data:(u=c.shareNodeFinish)!=null?u:!1}:null}async updateNode({nodeId:r,name:t,isFavorite:e,deletedAt:o}){var u,m;let i=R.get(r);if(!i&&(await this.node({id:r}),i=R.get(r),!i))throw`Can't find Node ${r}`;if(!((u=i.access)!=null&&u.nameKey))throw new Error(`Can't have access to node ${r}`);t=t?(m=i.access)!=null&&m.nameKey?await k(t,i.access.nameKey):t:null;const{updateNode:s}=await n(this,p).call(this,"mutation")({updateNode:[{nodeId:r,name:t,isFavorite:e,deletedAt:o},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on UpdateNodeResponse":{__typename:!0,updateNode:x}}]});if(!s)return null;if(s.__typename==="ErrorAccessDenied"||s.__typename==="ErrorNotExist")return s;if(!s.updateNode)return null;const c=await I(s.updateNode,n(this,l));return{__typename:"SuccessResponse",data:c}}async fileContent({fileId:r,onDownloadProgress:t,progressDecrypt:e,signal:o}){const{fileContent:i}=await n(this,p).call(this,"query",{scalars:{Bytes:{decode:a=>(console.log(a,typeof a),Uint8Array.from([1,2,3])),encode:a=>a.toString()}}})({fileContent:[{fileId:r},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorBasic":{__typename:!0,message:!0},"...on FileContentResponse":{__typename:!0,file:{"...on FileContentCloud":{__typename:!0,parts:{contentUrl:!0,order:!0,md5:!0},key:!0,publicKey:!0,totalSize:!0,md5:!0,md5Encrypted:!0},"...on FileContentLite":{__typename:!0,content:!0,id:!0,key:!0,publicKey:!0,md5:!0,md5Encrypted:!0,totalSize:!0},"...on FileContentReceivedMail":{__typename:!0,maybeParts:{contentUrl:!0,order:!0,md5:!0},maybeContent:!0,key:!0,senderPublicKey:!0,totalSize:!0,md5:!0,md5Encrypted:!0},"...on FileContentSentMail":{__typename:!0,maybeParts:{contentUrl:!0,order:!0,md5:!0},maybeContent:!0,key:!0,totalSize:!0,md5:!0,md5Encrypted:!0}}}}]});if(!i)return null;if(i.__typename==="ErrorAccessDenied"||i.__typename==="ErrorBasic")return i;const s=i.file;if(!s)return null;const c={},u=(a,g)=>{c[a]=g;const w=Object.values(c).reduce((_,F)=>_+F.transferredBytes,0),y=Number(s.totalSize);t==null||t({percent:w/y,totalBytes:y,transferredBytes:w})},m=async a=>{const g=new Array,w=async y=>{const _=new Uint8Array(await O.get(y.contentUrl,{timeout:!1,onDownloadProgress:S=>u(y.order,S),signal:o}).arrayBuffer());if(await T(_)!==y.md5)throw new Error(`Invalid md5 for part ${y.order} of file ${r}`);g.push({data:_,order:y.order})};return await q(3,a.map(y=>()=>w(y))),V(...g.sort((y,_)=>y.order-_.order).map(y=>y.data))},h=async a=>{if(await T(a)!==s.md5Encrypted)throw new Error("Encrypted content does not match");const w=$(f.from_hex(s.key),s.__typename==="FileContentReceivedMail"?s.senderPublicKey:s.__typename==="FileContentCloud"?s.publicKey:n(this,l).publicKey,n(this,l).privateKey),y=await X(w,a,e,o);if(await T(y)!==s.md5)throw new Error("Content does not match");return J(y)},A=s.__typename==="FileContentLite"?s.content:s.__typename==="FileContentCloud"?await m(s.parts):s.maybeContent?s.maybeContent:s.maybeParts?await m(s.maybeParts):null;return A?{__typename:"SuccessResponse",data:await h(A)}:null}async deleteFile({fileId:r,nodeId:t}){const{deleteFile:e}=await n(this,p).call(this,"mutation")({deleteFile:[{fileId:r,nodeId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on DeleteFileResponse":{__typename:!0,deleteFile:!0}}]});return e?e.__typename==="ErrorAccessDenied"||e.__typename==="ErrorNotExist"?e:{__typename:"SuccessResponse",data:e.deleteFile}:null}async deleteNode({nodeId:r}){const{deleteNode:t}=await n(this,p).call(this,"mutation")({deleteNode:[{id:r},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on DeleteNodeResponse":{__typename:!0,deleteNode:!0}}]});return t?t.__typename==="ErrorAccessDenied"?t:{__typename:"SuccessResponse",data:t.deleteNode}:null}async emptyTrash(){const{emptyCloudTrash:r}=await n(this,p).call(this,"mutation")({emptyCloudTrash:{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on EmptyCloudTrashResponse":{__typename:!0,emptyCloudTrash:!0}}});return r?r.__typename==="ErrorAccessDenied"?r:r.emptyCloudTrash?{__typename:"SuccessResponse",data:r.emptyCloudTrash}:null:null}async recoverNode(r){var e;const{recoverNode:t}=await n(this,p).call(this,"mutation")({recoverNode:[{id:r},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on RecoverNodeResponse":{__typename:!0,recoverNode:!0}}]});return t?t.__typename==="ErrorAccessDenied"||t.__typename==="ErrorNotExist"?t:{__typename:"SuccessResponse",data:(e=t.recoverNode)!=null?e:!1}:null}async moveNodes({nodeIds:r,parentNodeId:t}){var o;const{moveNodes:e}=await n(this,p).call(this,"mutation")({moveNodes:[{nodeIds:r,parentNodeId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on MoveNodesResponse":{__typename:!0,moveNodes:!0}}]});return e?e.__typename==="ErrorAccessDenied"?e:{__typename:"SuccessResponse",data:(o=e.moveNodes)!=null?o:!1}:null}async saveInCloud({fileId:r,name:t,nodeId:e}){var a,g,w,y;if(e&&!R.has(e)&&(await this.node({id:e}),!R.has(e)))return{__typename:"ErrorBasic",message:`The node ${e} does not exists`};let o="";const i=H.get(r);if(i)o=i.key;else{await this.fileMetadata({id:r});const _=(a=H.get(r))!=null?a:null;if(_)o=_.key;else{const F=await n(this,P).mail.receivedMails();if(!F||F.__typename!=="SuccessResponse")return null;const S=F.data.find(N=>N.files.some(E=>E.id===r));if(!S)return{__typename:"ErrorBasic",message:`Can't find mail with the file ${r}`};const D=S.files.find(N=>N.id===r);if(!D)return{__typename:"ErrorBasic",message:`Can't find mail with the file ${r}`};const d=$(f.from_hex(D.key),S.sender.publicKey,n(this,l).privateKey);o=f.to_hex(d)}}if(o==="")return{__typename:"ErrorBasic",message:"Unexpected error 3"};o=f.to_hex(C(f.from_hex(o),n(this,l).publicKey,n(this,l).privateKey));const s=U(),c=await k(t,f.to_hex(s)),u=f.to_hex(C(s,n(this,l).publicKey,n(this,l).privateKey)),{saveInCloud:m}=await n(this,p).call(this,"mutation")({saveInCloud:[{fileId:r,key:o,nodeId:e,filename:c,nameKey:u},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on ErrorLimit":{__typename:!0,message:!0},"...on ErrorBasic":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on SaveInCloudResponse":{__typename:!0,saveInCloud:x}}]});if(!m)return null;if(m.__typename==="ErrorAccessDenied"||m.__typename==="ErrorNotFound"||m.__typename==="ErrorLimit"||m.__typename==="ErrorBasic"||m.__typename==="ErrorNotExist")return m;if(!m.saveInCloud)return null;const h=await I(m.saveInCloud,n(this,l)),A=(g=h.parent)==null?void 0:g.users.find(([_])=>_.publicKey===n(this,l).publicKey);if(A&&["admin","write"].includes(A[1])){const _=(y=(w=h.parent)==null?void 0:w.users.filter(([F])=>F.publicKey!==n(this,l).publicKey))!=null?y:[];await Promise.all(_.map(([F,S])=>this.shareNode({nodeId:h.id,rights:S,userId:F.id})))}return{__typename:"SuccessResponse",data:h}}}P=new WeakMap,l=new WeakMap,p=new WeakMap;export{Ne as SecrecyCloudClient};
|
|
2
|
+
//# sourceMappingURL=SecrecyCloudClient.js.map
|