@secrecy/lib 1.0.0-dev.63 → 1.0.0-dev.65

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