@secrecy/lib 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE +1 -1
  2. package/dist/BaseClient.d.ts +29 -177
  3. package/dist/BaseClient.js +114 -732
  4. package/dist/PopupTools.d.ts +4 -4
  5. package/dist/PopupTools.js +24 -41
  6. package/dist/ZeusThunder.js +3 -17
  7. package/dist/cache.js +1 -1
  8. package/dist/client/SecrecyAppClient.d.ts +17 -0
  9. package/dist/client/SecrecyAppClient.js +226 -0
  10. package/dist/client/SecrecyCloudClient.d.ts +89 -0
  11. package/dist/client/SecrecyCloudClient.js +1405 -0
  12. package/dist/client/SecrecyDbClient.d.ts +21 -0
  13. package/dist/client/SecrecyDbClient.js +177 -0
  14. package/dist/client/SecrecyMailClient.d.ts +42 -0
  15. package/dist/client/SecrecyMailClient.js +1022 -0
  16. package/dist/client/SecrecyPayClient.d.ts +28 -0
  17. package/dist/client/SecrecyPayClient.js +68 -0
  18. package/dist/client/SecrecyWalletClient.d.ts +30 -0
  19. package/dist/client/SecrecyWalletClient.js +73 -0
  20. package/dist/client/convert/file.js +2 -3
  21. package/dist/client/convert/mail.d.ts +2 -2
  22. package/dist/client/convert/mail.js +7 -11
  23. package/dist/client/convert/node.js +19 -33
  24. package/dist/client/helpers.d.ts +9 -4
  25. package/dist/client/helpers.js +30 -25
  26. package/dist/client/index.d.ts +15 -145
  27. package/dist/client/index.js +16 -3176
  28. package/dist/client/storage.js +4 -4
  29. package/dist/client/types/File.d.ts +3 -3
  30. package/dist/client/types/Inputs.d.ts +4 -4
  31. package/dist/client/types/Node.d.ts +21 -14
  32. package/dist/client/types/Node.js +1 -1
  33. package/dist/client/types/UserAppNotifications.d.ts +1 -1
  34. package/dist/client/types/UserAppSettings.d.ts +2 -3
  35. package/dist/client/types/UserAppSettings.js +1 -1
  36. package/dist/client/types/index.d.ts +23 -51
  37. package/dist/client/types/index.js +1 -1
  38. package/dist/client/types/selectors.d.ts +51 -127
  39. package/dist/client/types/selectors.js +21 -11
  40. package/dist/crypto/file.d.ts +2 -2
  41. package/dist/crypto/file.js +19 -34
  42. package/dist/crypto/index.js +1 -3
  43. package/dist/error.d.ts +5 -2
  44. package/dist/error.js +1 -1
  45. package/dist/index.d.ts +7 -5
  46. package/dist/index.js +4 -4
  47. package/dist/minify/index.js +2 -7
  48. package/dist/minify/lz4.js +79 -167
  49. package/dist/sodium.js +1 -1
  50. package/dist/utils/store-buddy.d.ts +1 -1
  51. package/dist/utils/store-buddy.js +1 -8
  52. package/dist/utils/time.js +1 -3
  53. package/dist/utils/utils.js +1 -11
  54. package/dist/worker/md5.js +1 -2
  55. package/dist/worker/sodium.js +16 -18
  56. package/dist/worker/workerCodes.js +255 -3
  57. package/dist/zeus/const.js +587 -31
  58. package/dist/zeus/index.d.ts +5014 -631
  59. package/dist/zeus/index.js +213 -255
  60. package/package.json +64 -61
  61. package/dist/client/admin/index.d.ts +0 -11
  62. package/dist/client/admin/index.js +0 -110
  63. package/dist/worker/__mock__/sodium.worker.d.ts +0 -19
  64. package/dist/worker/__mock__/sodium.worker.js +0 -49
@@ -1,43 +1,24 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
1
  import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase";
3
2
  import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey";
4
-
5
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
6
-
7
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
8
-
9
3
  /* eslint-disable @typescript-eslint/naming-convention */
10
- import ky from "ky";
11
- import axios from "axios";
12
4
  import { BaseClient } from "../BaseClient.js";
13
- import { nodesCache, filesCache, usersCache } from "../cache.js";
14
- import { secretstreamKeygen, encryptSecretstream } from "../crypto/file.js";
15
- import { compress, uncompress } from "../minify/index.js";
16
- import { gqlNodeToExternal, gqlNodeToExternalNodeFull, gqlNodeToInternal, internalNodeToNode } from "./convert/node.js";
17
- import { gqlFileToExternal } from "./convert/file.js";
5
+ import { encryptSecretstream } from "../crypto/file.js";
18
6
  import { sodium } from "../sodium.js";
19
- import { decryptCryptoBox, encryptCryptoBox } from "../crypto/index.js";
20
- import { generate } from "shortid";
21
- import { md5 } from "../worker/md5.js";
22
- import { encrypt, decrypt } from "../worker/sodium.js";
23
- import { chunks, concatenate, enumerate, promiseAllLimit } from "../utils/utils.js";
24
- import { fileSelector, mailSelector, nodeFullSelector, nodeSelector } from "./types/selectors.js";
25
- import { convertInternalMailToExternal } from "./convert/mail.js";
26
- import { decode } from "jsonwebtoken"; // import { md5 } from "../worker/index.js";
27
- // import { firstValueFrom, of } from "rxjs";
28
-
29
- import { serialize } from "bson";
30
-
31
- const encryptName = async (name, nameKey) => {
7
+ import { SecrecyCloudClient } from "./SecrecyCloudClient.js";
8
+ import { SecrecyMailClient } from "./SecrecyMailClient.js";
9
+ import { SecrecyAppClient } from "./SecrecyAppClient.js";
10
+ import { nodesCache, filesCache } from "../cache.js";
11
+ import { SecrecyDbClient } from "./SecrecyDbClient.js";
12
+ import { SecrecyWalletClient } from "./SecrecyWalletClient.js";
13
+ import { SecrecyPayClient } from "./SecrecyPayClient.js";
14
+ export const encryptName = async (name, nameKey) => {
32
15
  const {
33
16
  data
34
17
  } = await encryptSecretstream(sodium.from_hex(nameKey), sodium.from_string(name));
35
18
  const nameEncrypted = sodium.to_hex(data);
36
19
  return nameEncrypted;
37
20
  };
38
-
39
21
  var _keys = /*#__PURE__*/_classPrivateFieldLooseKey("keys");
40
-
41
22
  export class SecrecyClient extends BaseClient {
42
23
  constructor(uaSession, uaKeys, uaJwt, env) {
43
24
  super(uaSession, env);
@@ -45,3162 +26,21 @@ export class SecrecyClient extends BaseClient {
45
26
  writable: true,
46
27
  value: void 0
47
28
  });
48
-
49
- this.perNode = async (nodeId, publicKey) => {
50
- var _node$access;
51
-
52
- let node = nodesCache.get(nodeId);
53
-
54
- if (!node) {
55
- await this.node({
56
- id: nodeId
57
- });
58
- node = nodesCache.get(nodeId);
59
-
60
- if (!node) {
61
- return null;
62
- }
63
- }
64
-
65
- const nameKey = (_node$access = node.access) == null ? void 0 : _node$access.nameKey;
66
-
67
- if (!nameKey) {
68
- return null;
69
- }
70
-
71
- return {
72
- id: node.id,
73
- nameKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(nameKey), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
74
- files: node.history.map(f => ({
75
- id: f.id,
76
- key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(f.key), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
77
- }))
78
- };
79
- };
80
-
81
- this._eachUser = async (files, subject, body, idOrMail) => {
82
- let u = usersCache.get(idOrMail);
83
-
84
- if (!u || !("publicKey" in u)) {
85
- try {
86
- const req = await this.user({
87
- userId: idOrMail,
88
- withPublicKey: true
89
- });
90
-
91
- if (!req) {
92
- return null;
93
- }
94
-
95
- if (req.__typename !== "SuccessResponse") {
96
- return null;
97
- }
98
-
99
- u = req.data;
100
- } catch {
101
- return null;
102
- }
103
-
104
- if (!u) {
105
- return null;
106
- }
107
- }
108
-
109
- if (!("publicKey" in u)) {
110
- throw new Error("User " + idOrMail + " have no public key");
111
- }
112
-
113
- const recipientsFiles = new Array();
114
-
115
- for (const f of files) {
116
- let fileInHistory = filesCache.get(f.id);
117
-
118
- if (!fileInHistory) {
119
- await this.file({
120
- id: f.id
121
- });
122
- fileInHistory = filesCache.get(f.id);
123
-
124
- if (!fileInHistory) {
125
- throw new Error("File " + f.name + " (" + f.id + ") does not exists");
126
- }
127
- }
128
-
129
- const key = fileInHistory.key;
130
- recipientsFiles.push({
131
- id: f.id,
132
- name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
133
- fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
134
- });
135
- }
136
-
137
- return {
138
- recipientId: u.id,
139
- body: sodium.to_hex(encryptCryptoBox(sodium.from_string(body), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
140
- subject: sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
141
- files: recipientsFiles
142
- };
143
- };
144
-
145
- this.jwt = uaJwt;
146
- this.jwtDecoded = decode(uaJwt);
147
29
  _classPrivateFieldLooseBase(this, _keys)[_keys] = uaKeys;
30
+ this.cloud = new SecrecyCloudClient(this, _classPrivateFieldLooseBase(this, _keys)[_keys], this.thunder);
31
+ this.mail = new SecrecyMailClient(this, _classPrivateFieldLooseBase(this, _keys)[_keys], this.thunder);
32
+ this.app = new SecrecyAppClient(uaJwt, this, _classPrivateFieldLooseBase(this, _keys)[_keys], this.thunder);
33
+ this.db = new SecrecyDbClient(this, _classPrivateFieldLooseBase(this, _keys)[_keys], this.thunder);
34
+ this.wallet = new SecrecyWalletClient(this);
35
+ this.pay = new SecrecyPayClient(this, _classPrivateFieldLooseBase(this, _keys)[_keys], this.thunder);
148
36
  }
149
-
150
37
  get publicKey() {
151
38
  return _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
152
39
  }
153
-
154
- get appUserId() {
155
- var _this$jwtDecoded$sub;
156
-
157
- return (_this$jwtDecoded$sub = this.jwtDecoded.sub) != null ? _this$jwtDecoded$sub : "";
158
- }
159
-
160
- async addFileToHistory(_ref) {
161
- let {
162
- fileId,
163
- nodeId
164
- } = _ref;
165
- const {
166
- addFileToHistory
167
- } = await this.client("mutation")({
168
- addFileToHistory: [{
169
- fileId,
170
- nodeId
171
- }, {
172
- "...on ErrorAccessDenied": {
173
- __typename: true,
174
- message: true
175
- },
176
- "...on ErrorNotExist": {
177
- __typename: true,
178
- message: true
179
- },
180
- "...on AddFileToHistoryResponse": {
181
- __typename: true,
182
- addFileToHistory: nodeSelector
183
- }
184
- }]
185
- });
186
-
187
- if (!addFileToHistory) {
188
- return null;
189
- }
190
-
191
- if (addFileToHistory.__typename === "ErrorAccessDenied") {
192
- return addFileToHistory;
193
- }
194
-
195
- if (addFileToHistory.__typename === "ErrorNotExist") {
196
- return addFileToHistory;
197
- }
198
-
199
- const node = await gqlNodeToInternal(addFileToHistory.addFileToHistory, _classPrivateFieldLooseBase(this, _keys)[_keys]);
200
- const file = node.history.find(f => f.id === fileId);
201
-
202
- if (file) {
203
- const users = node.users.filter(_ref2 => {
204
- let [u] = _ref2;
205
- return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
206
- });
207
- const input = {
208
- fileId: file.id,
209
- users: users.map(_ref3 => {
210
- let [u] = _ref3;
211
- return {
212
- id: u.id,
213
- key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
214
- };
215
- })
216
- };
217
- await this.client("mutation")({
218
- shareFileInHistory: [{
219
- input,
220
- nodeId
221
- }, {
222
- "...on ErrorAccessDenied": {
223
- __typename: true,
224
- message: true
225
- },
226
- "...on ErrorNotFound": {
227
- __typename: true,
228
- message: true
229
- },
230
- "...on ShareFileInHistoryResponse": {
231
- __typename: true,
232
- shareFileInHistory: true
233
- }
234
- }]
235
- });
236
- }
237
-
238
- const result = internalNodeToNode(node);
239
- return {
240
- __typename: "SuccessResponse",
241
- data: result
242
- };
243
- }
244
-
245
- async uploadFile(_ref4) {
246
- let {
247
- file,
248
- encryptProgress,
249
- uploadProgress,
250
- signal
251
- } = _ref4;
252
- const fileKey = secretstreamKeygen();
253
- const fileBuffer = file instanceof File ? new Uint8Array(await file.arrayBuffer()) : file;
254
- const compressed = compress(fileBuffer);
255
- const {
256
- data: encryptedFile,
257
- md5: md5File,
258
- md5Encrypted
259
- } = await encrypt(fileKey, compressed, encryptProgress, signal);
260
- const encryptedFileKey = encryptCryptoBox(fileKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
261
- const {
262
- uploadFile
263
- } = await this.client("mutation", {
264
- scalars: {
265
- Json: {
266
- encode: e => JSON.stringify(e),
267
- decode: e => JSON.parse(e)
268
- },
269
- DateTime: {
270
- decode: e => new Date(e),
271
- encode: e => e.toISOString()
272
- },
273
- BigInt: {
274
- decode: e => BigInt(e),
275
- encode: e => e.toString()
276
- }
277
- }
278
- })({
279
- uploadFile: [{
280
- fileSize: encryptedFile.byteLength,
281
- fileSizeBefore: fileBuffer.byteLength,
282
- fileKey: sodium.to_hex(encryptedFileKey),
283
- md5Encrypted,
284
- md5: md5File
285
- }, {
286
- "...on ErrorAccessDenied": {
287
- __typename: true,
288
- message: true
289
- },
290
- "...on ErrorLimit": {
291
- __typename: true,
292
- message: true
293
- },
294
- "...on ErrorNotFound": {
295
- __typename: true,
296
- message: true
297
- },
298
- "...on UploadFileResponse": {
299
- __typename: true,
300
- uploadFile: {
301
- fileId: true,
302
- filePartSize: true,
303
- parts: {
304
- fields: true,
305
- order: true,
306
- url: true
307
- }
308
- }
309
- }
310
- }]
311
- });
312
-
313
- if (!uploadFile) {
314
- return null;
315
- }
316
-
317
- if (uploadFile.__typename === "ErrorAccessDenied") {
318
- return uploadFile;
319
- }
320
-
321
- if (uploadFile.__typename === "ErrorLimit") {
322
- return uploadFile;
323
- }
324
-
325
- if (uploadFile.__typename === "ErrorNotFound") {
326
- return uploadFile;
327
- }
328
-
329
- if (!uploadFile.uploadFile) {
330
- return null;
331
- }
332
-
333
- uploadProgress == null ? void 0 : uploadProgress({
334
- total: encryptedFile.byteLength,
335
- current: 0,
336
- percent: 0
337
- });
338
-
339
- if (uploadFile.uploadFile.parts.length === 0) {
340
- uploadProgress == null ? void 0 : uploadProgress({
341
- total: encryptedFile.byteLength,
342
- current: encryptedFile.byteLength,
343
- percent: 1
344
- });
345
- return {
346
- __typename: "SuccessResponse",
347
- data: uploadFile.uploadFile.fileId
348
- };
349
- }
350
-
351
- const uploadPartEnded = async (md5, order) => {
352
- if (!uploadFile.uploadFile) {
353
- return null;
354
- }
355
-
356
- const {
357
- uploadFilePartEnd
358
- } = await this.client("mutation")({
359
- uploadFilePartEnd: [{
360
- fileId: uploadFile.uploadFile.fileId,
361
- md5,
362
- order
363
- }, {
364
- "...on ErrorAccessDenied": {
365
- __typename: true,
366
- message: true
367
- },
368
- "...on UploadFilePartEndResponse": {
369
- __typename: true,
370
- uploadFilePartEnd: true
371
- }
372
- }]
373
- });
374
-
375
- if (!uploadFilePartEnd) {
376
- return null;
377
- }
378
-
379
- if (uploadFilePartEnd.__typename === "ErrorAccessDenied") {
380
- return uploadFilePartEnd;
381
- }
382
-
383
- return {
384
- __typename: "SuccessResponse",
385
- data: uploadFilePartEnd.uploadFilePartEnd
386
- };
387
- };
388
-
389
- const uploadEnded = async () => {
390
- if (!uploadFile.uploadFile) {
391
- return null;
392
- }
393
-
394
- const {
395
- uploadFileEnd
396
- } = await this.client("mutation")({
397
- uploadFileEnd: [{
398
- fileId: uploadFile.uploadFile.fileId
399
- }, {
400
- "...on ErrorAccessDenied": {
401
- __typename: true,
402
- message: true
403
- },
404
- "...on ErrorNotFound": {
405
- __typename: true,
406
- message: true
407
- },
408
- "...on UploadFileEndResponse": {
409
- __typename: true,
410
- uploadFileEnd: true
411
- }
412
- }]
413
- });
414
-
415
- if (!uploadFileEnd) {
416
- return null;
417
- }
418
-
419
- if (uploadFileEnd.__typename === "ErrorAccessDenied") {
420
- return uploadFileEnd;
421
- }
422
-
423
- if (uploadFileEnd.__typename === "ErrorNotFound") {
424
- return uploadFileEnd;
425
- }
426
-
427
- if (!uploadFileEnd.uploadFileEnd) {
428
- return null;
429
- }
430
-
431
- return {
432
- __typename: "SuccessResponse",
433
- data: uploadFileEnd.uploadFileEnd
434
- };
435
- };
436
-
437
- const chunkParts = new Array();
438
-
439
- for (const [index, chunk] of enumerate(chunks(encryptedFile, Number(uploadFile.uploadFile.filePartSize)))) {
440
- chunkParts.push({
441
- order: index + 1,
442
- data: chunk,
443
- md5: await md5(chunk)
444
- });
445
- }
446
-
447
- const progressParts = {};
448
-
449
- const onProgress = (part, progressEvent) => {
450
- progressParts[part] = progressEvent;
451
- const current = Object.values(progressParts).reduce((prv, cur) => prv + cur.loaded, 0);
452
- uploadProgress == null ? void 0 : uploadProgress({
453
- percent: current / encryptedFile.byteLength,
454
- total: encryptedFile.byteLength,
455
- current
456
- });
457
- };
458
-
459
- const byPart = async part => {
460
- if (!uploadFile.uploadFile) {
461
- return;
462
- }
463
-
464
- const formData = new FormData();
465
- const chunk = chunkParts.find(p => p.order === part.order);
466
-
467
- if (!chunk) {
468
- return;
469
- }
470
-
471
- for (const [key, value] of Object.entries(part.fields)) {
472
- formData.append(key, value);
473
- }
474
-
475
- formData.append("file", new Blob([chunk.data]), uploadFile.uploadFile.fileId + "-" + chunk.order);
476
- await axios.post(part.url, formData, {
477
- onUploadProgress: progressEvent => onProgress(part.order, progressEvent),
478
- signal
479
- });
480
- await uploadPartEnded(chunk.md5, chunk.order); // if ((e as any).response.status === 0) {
481
- // // TODO https://github.com/sindresorhus/ky/issues/305
482
- // } else {
483
- // throw e;
484
- // }
485
- };
486
-
487
- if (!uploadFile.uploadFile) {
488
- return null;
489
- }
490
-
491
- await promiseAllLimit(3, uploadFile.uploadFile.parts.map(p => () => byPart(p)));
492
- const result = await uploadEnded();
493
-
494
- if (!result) {
495
- return null;
496
- }
497
-
498
- if (result.__typename === "ErrorAccessDenied") {
499
- return result;
500
- }
501
-
502
- if (result.__typename === "ErrorNotFound") {
503
- return result;
504
- }
505
-
506
- return {
507
- __typename: "SuccessResponse",
508
- data: result.data
509
- };
510
- }
511
-
512
- async uploadFileInCloud(_ref5) {
513
- let {
514
- file,
515
- name,
516
- nodeId,
517
- encryptProgress,
518
- uploadProgress,
519
- signal
520
- } = _ref5;
521
- const fileId = await this.uploadFile({
522
- file,
523
- encryptProgress,
524
- uploadProgress,
525
- signal
526
- });
527
-
528
- if (!fileId) {
529
- return null;
530
- }
531
-
532
- if (fileId.__typename === "ErrorAccessDenied") {
533
- return fileId;
534
- }
535
-
536
- if (fileId.__typename === "ErrorLimit") {
537
- return fileId;
538
- }
539
-
540
- if (fileId.__typename === "ErrorNotFound") {
541
- return fileId;
542
- }
543
-
544
- const result = await this.saveInCloud({
545
- fileId: fileId.data,
546
- name,
547
- nodeId
548
- });
549
-
550
- if (!result) {
551
- return null;
552
- }
553
-
554
- if (result.__typename === "ErrorAccessDenied") {
555
- return result;
556
- }
557
-
558
- if (result.__typename === "ErrorBasic") {
559
- return result;
560
- }
561
-
562
- if (result.__typename === "ErrorLimit") {
563
- return result;
564
- }
565
-
566
- if (result.__typename === "ErrorNotFound") {
567
- return result;
568
- }
569
-
570
- if (result.__typename === "ErrorNotExist") {
571
- return result;
572
- }
573
-
574
- return {
575
- __typename: "SuccessResponse",
576
- data: result.data
577
- };
578
- }
579
-
580
40
  async logout(sessionId) {
581
41
  nodesCache.clear();
582
42
  filesCache.clear();
583
43
  await super.logout(sessionId);
584
44
  }
585
-
586
- async createFolder(_ref6) {
587
- var _folder$parent$users$, _folder$parent, _folder$parent$users;
588
-
589
- let {
590
- name,
591
- parentFolderId
592
- } = _ref6;
593
- const key = secretstreamKeygen();
594
- const encryptedName = await encryptName(name, sodium.to_hex(key));
595
- const encryptedKey = encryptCryptoBox(key, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
596
- const {
597
- createFolder
598
- } = await this.client("mutation")({
599
- createFolder: [{
600
- name: encryptedName,
601
- parentFolderId,
602
- key: sodium.to_hex(encryptedKey)
603
- }, {
604
- "...on ErrorAccessDenied": {
605
- __typename: true,
606
- message: true
607
- },
608
- "...on ErrorNotExist": {
609
- __typename: true,
610
- message: true
611
- },
612
- "...on CreateFolderResponse": {
613
- __typename: true,
614
- createFolder: nodeFullSelector
615
- }
616
- }]
617
- });
618
-
619
- if (!createFolder) {
620
- //throw new Error(`Can't create folder`);
621
- return null;
622
- }
623
-
624
- if (createFolder.__typename === "ErrorAccessDenied") {
625
- return createFolder;
626
- }
627
-
628
- if (createFolder.__typename === "ErrorNotExist") {
629
- return createFolder;
630
- }
631
-
632
- if (!createFolder.createFolder) {
633
- return null;
634
- }
635
-
636
- const folder = await gqlNodeToExternalNodeFull(createFolder.createFolder, _classPrivateFieldLooseBase(this, _keys)[_keys]);
637
- const users = (_folder$parent$users$ = (_folder$parent = folder.parent) == null ? void 0 : (_folder$parent$users = _folder$parent.users) == null ? void 0 : _folder$parent$users.filter(_ref7 => {
638
- let [u] = _ref7;
639
- return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
640
- })) != null ? _folder$parent$users$ : [];
641
-
642
- if (users.length) {
643
- await Promise.all(users.map(_ref8 => {
644
- let [u, rights] = _ref8;
645
- return this.shareNode({
646
- nodeId: folder.id,
647
- rights,
648
- userId: u.id
649
- });
650
- }));
651
- }
652
-
653
- return {
654
- __typename: "SuccessResponse",
655
- data: folder
656
- };
657
- }
658
-
659
- async node(_temp) {
660
- let {
661
- id,
662
- deleted
663
- } = _temp === void 0 ? {} : _temp;
664
- const {
665
- node
666
- } = await this.client("query")({
667
- node: [{
668
- deleted,
669
- id
670
- }, {
671
- "...on ErrorAccessDenied": {
672
- __typename: true,
673
- message: true
674
- },
675
- "...on NodeResponse": {
676
- __typename: true,
677
- node: nodeFullSelector
678
- }
679
- }]
680
- });
681
-
682
- if (!node) {
683
- return null;
684
- }
685
-
686
- if (node.__typename === "ErrorAccessDenied") {
687
- return node;
688
- }
689
-
690
- if (!node.node) {
691
- return null;
692
- }
693
-
694
- const result = await gqlNodeToExternalNodeFull(node.node, _classPrivateFieldLooseBase(this, _keys)[_keys]);
695
- return {
696
- __typename: "SuccessResponse",
697
- data: result
698
- };
699
- }
700
-
701
- async file(_ref9) {
702
- let {
703
- id
704
- } = _ref9;
705
- const {
706
- file
707
- } = await this.client("query")({
708
- file: [{
709
- id
710
- }, {
711
- "...on ErrorAccessDenied": {
712
- __typename: true,
713
- message: true
714
- },
715
- "...on FileQueryResponse": {
716
- __typename: true,
717
- file: fileSelector
718
- }
719
- }]
720
- });
721
-
722
- if (!file) {
723
- return null;
724
- }
725
-
726
- if (file.__typename === "ErrorAccessDenied") {
727
- return file;
728
- }
729
-
730
- if (!file.file) {
731
- return null;
732
- }
733
-
734
- const result = gqlFileToExternal(file.file, _classPrivateFieldLooseBase(this, _keys)[_keys]);
735
- return {
736
- __typename: "SuccessResponse",
737
- data: result
738
- };
739
- }
740
-
741
- async mail(_ref10) {
742
- let {
743
- id
744
- } = _ref10;
745
- const {
746
- mail
747
- } = await this.client("query", {
748
- scalars: {
749
- DateTime: {
750
- decode: e => new Date(e),
751
- encode: e => e.toISOString()
752
- }
753
- }
754
- })({
755
- mail: [{
756
- id
757
- }, {
758
- "...on ErrorAccessDenied": {
759
- __typename: true,
760
- message: true
761
- },
762
- "...on QueryMailResponse": {
763
- __typename: true,
764
- mail: mailSelector
765
- }
766
- }]
767
- });
768
-
769
- if (!mail) {
770
- return null;
771
- }
772
-
773
- if (mail.__typename === "ErrorAccessDenied") {
774
- return mail;
775
- }
776
-
777
- if (!mail.mail) {
778
- return null;
779
- }
780
-
781
- const result = convertInternalMailToExternal(mail.mail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
782
-
783
- if (!result) {
784
- return null;
785
- }
786
-
787
- return {
788
- __typename: "SuccessResponse",
789
- data: result
790
- };
791
- }
792
-
793
- async deletedNodes() {
794
- const {
795
- deletedNodes
796
- } = await this.client("query")({
797
- deletedNodes: {
798
- "...on ErrorAccessDenied": {
799
- __typename: true,
800
- message: true
801
- },
802
- "...on DeletedNodesResponse": {
803
- __typename: true,
804
- deletedNodes: nodeSelector
805
- }
806
- }
807
- });
808
-
809
- if (!deletedNodes) {
810
- return null;
811
- }
812
-
813
- if (deletedNodes.__typename === "ErrorAccessDenied") {
814
- return deletedNodes;
815
- }
816
-
817
- const nodes = new Array();
818
-
819
- for (const node of deletedNodes.deletedNodes) {
820
- nodes.push(await gqlNodeToExternal(node, _classPrivateFieldLooseBase(this, _keys)[_keys]));
821
- }
822
-
823
- return {
824
- __typename: "SuccessResponse",
825
- data: nodes
826
- };
827
- }
828
-
829
- async sharedNodes() {
830
- const {
831
- sharedNodes
832
- } = await this.client("query")({
833
- sharedNodes: {
834
- "...on ErrorAccessDenied": {
835
- __typename: true,
836
- message: true
837
- },
838
- "...on SharedNodesResponse": {
839
- __typename: true,
840
- sharedNodes: nodeSelector
841
- }
842
- }
843
- });
844
-
845
- if (!sharedNodes) {
846
- return null;
847
- }
848
-
849
- if (sharedNodes.__typename === "ErrorAccessDenied") {
850
- return sharedNodes;
851
- }
852
-
853
- const nodes = new Array();
854
-
855
- for (const folder of sharedNodes.sharedNodes) {
856
- nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
857
- }
858
-
859
- return {
860
- __typename: "SuccessResponse",
861
- data: nodes
862
- };
863
- }
864
-
865
- async nodesSharedWithMe(type) {
866
- const {
867
- nodesSharedWithMe
868
- } = await this.client("query")({
869
- nodesSharedWithMe: [{
870
- type
871
- }, {
872
- "...on ErrorAccessDenied": {
873
- __typename: true,
874
- message: true
875
- },
876
- "...on NodesSharedWithMeResponse": {
877
- __typename: true,
878
- nodesSharedWithMe: nodeSelector
879
- }
880
- }]
881
- });
882
-
883
- if (!nodesSharedWithMe) {
884
- return null;
885
- }
886
-
887
- if (nodesSharedWithMe.__typename === "ErrorAccessDenied") {
888
- return nodesSharedWithMe;
889
- }
890
-
891
- const nodes = new Array();
892
-
893
- for (const folder of nodesSharedWithMe.nodesSharedWithMe) {
894
- nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
895
- }
896
-
897
- return {
898
- __typename: "SuccessResponse",
899
- data: nodes
900
- };
901
- }
902
-
903
- async deleteNodeSharing(_ref11) {
904
- let {
905
- nodeId,
906
- userId
907
- } = _ref11;
908
- const {
909
- deleteNodeSharing
910
- } = await this.client("mutation")({
911
- deleteNodeSharing: [{
912
- nodeId,
913
- userId
914
- }, {
915
- "...on ErrorAccessDenied": {
916
- __typename: true,
917
- message: true
918
- },
919
- "...on DeleteNodeSharingResponse": {
920
- __typename: true,
921
- deleteNodeSharing: true
922
- }
923
- }]
924
- });
925
-
926
- if (!deleteNodeSharing) {
927
- return null;
928
- }
929
-
930
- if (deleteNodeSharing.__typename === "ErrorAccessDenied") {
931
- return deleteNodeSharing;
932
- }
933
-
934
- return {
935
- __typename: "SuccessResponse",
936
- data: deleteNodeSharing.deleteNodeSharing
937
- };
938
- }
939
-
940
- async duplicateNode(_ref12) {
941
- var _node$access2;
942
-
943
- let {
944
- nodeId,
945
- folderId,
946
- customName
947
- } = _ref12;
948
- let node = nodesCache.get(nodeId);
949
-
950
- if (!node) {
951
- await this.node({
952
- id: nodeId
953
- });
954
- node = nodesCache.get(nodeId);
955
-
956
- if (!node) {
957
- throw new Error("Node (" + nodeId + ") does not exists");
958
- }
959
- }
960
-
961
- if (!((_node$access2 = node.access) != null && _node$access2.nameKey)) {
962
- throw new Error("Can't have access to node " + nodeId);
963
- }
964
-
965
- customName = customName ? await encryptName(customName, node.access.nameKey) : null;
966
- const {
967
- duplicateNode
968
- } = await this.client("mutation")({
969
- duplicateNode: [{
970
- nodeId,
971
- folderId,
972
- customName
973
- }, {
974
- "...on ErrorAccessDenied": {
975
- __typename: true,
976
- message: true
977
- },
978
- "...on ErrorNotFound": {
979
- __typename: true,
980
- message: true
981
- },
982
- "...on DuplicateNodeResponse": {
983
- __typename: true,
984
- duplicateNode: true
985
- }
986
- }]
987
- });
988
-
989
- if (!duplicateNode) {
990
- return null;
991
- }
992
-
993
- if (duplicateNode.__typename === "ErrorAccessDenied") {
994
- return duplicateNode;
995
- }
996
-
997
- if (duplicateNode.__typename === "ErrorNotFound") {
998
- return duplicateNode;
999
- }
1000
-
1001
- return {
1002
- __typename: "SuccessResponse",
1003
- data: duplicateNode.duplicateNode
1004
- };
1005
- }
1006
-
1007
- async deleteNodeCloudTrash(_ref13) {
1008
- var _deleteNodeCloudTrash;
1009
-
1010
- let {
1011
- ids
1012
- } = _ref13;
1013
- const {
1014
- deleteNodeCloudTrash
1015
- } = await this.client("mutation")({
1016
- deleteNodeCloudTrash: [{
1017
- ids
1018
- }, {
1019
- "...on ErrorAccessDenied": {
1020
- __typename: true,
1021
- message: true
1022
- },
1023
- "...on DeleteNodeCloudTrashResponse": {
1024
- __typename: true,
1025
- deleteNodeCloudTrash: true
1026
- }
1027
- }]
1028
- });
1029
-
1030
- if (!deleteNodeCloudTrash) {
1031
- return null;
1032
- }
1033
-
1034
- if (deleteNodeCloudTrash.__typename === "ErrorAccessDenied") {
1035
- return deleteNodeCloudTrash;
1036
- }
1037
-
1038
- return {
1039
- __typename: "SuccessResponse",
1040
- data: (_deleteNodeCloudTrash = deleteNodeCloudTrash.deleteNodeCloudTrash) != null ? _deleteNodeCloudTrash : false
1041
- };
1042
- }
1043
-
1044
- async shareNode(_ref14) {
1045
- var _shareNodeFinish$shar;
1046
-
1047
- let {
1048
- nodeId,
1049
- userId,
1050
- rights
1051
- } = _ref14;
1052
- const user = await this.user({
1053
- userId,
1054
- withPublicKey: true
1055
- });
1056
-
1057
- if (!user) {
1058
- return user;
1059
- }
1060
-
1061
- if (user.__typename === "ErrorNotFound") {
1062
- return user;
1063
- }
1064
-
1065
- const {
1066
- shareNode
1067
- } = await this.client("mutation")({
1068
- shareNode: [{
1069
- nodeId,
1070
- userId
1071
- }, {
1072
- "...on ErrorAccessDenied": {
1073
- __typename: true,
1074
- message: true
1075
- },
1076
- "...on ErrorNotFound": {
1077
- __typename: true,
1078
- message: true
1079
- },
1080
- "...on ShareNodeResponse": {
1081
- __typename: true,
1082
- nodes: true
1083
- }
1084
- }]
1085
- });
1086
-
1087
- if (!shareNode) {
1088
- return null;
1089
- }
1090
-
1091
- if (shareNode.__typename === "ErrorAccessDenied") {
1092
- return shareNode;
1093
- }
1094
-
1095
- if (shareNode.__typename === "ErrorNotFound") {
1096
- return shareNode;
1097
- }
1098
-
1099
- const shareNodes = {
1100
- nodes: []
1101
- };
1102
-
1103
- for (const id of shareNode.nodes) {
1104
- const nameKey = await this.perNode(id, user.data.publicKey);
1105
-
1106
- if (nameKey) {
1107
- shareNodes.nodes.push(nameKey);
1108
- }
1109
- }
1110
-
1111
- const {
1112
- shareNodeFinish
1113
- } = await this.client("mutation")({
1114
- shareNodeFinish: [{
1115
- rights,
1116
- userId,
1117
- shareNodes
1118
- }, {
1119
- "...on ErrorAccessDenied": {
1120
- __typename: true,
1121
- message: true
1122
- },
1123
- "...on ErrorNotFound": {
1124
- __typename: true,
1125
- message: true
1126
- },
1127
- "...on ShareNodeFinishResponse": {
1128
- __typename: true,
1129
- shareNodeFinish: true
1130
- }
1131
- }]
1132
- });
1133
-
1134
- if (!shareNodeFinish) {
1135
- return null;
1136
- }
1137
-
1138
- if (shareNodeFinish.__typename === "ErrorAccessDenied") {
1139
- return shareNodeFinish;
1140
- }
1141
-
1142
- if (shareNodeFinish.__typename === "ErrorNotFound") {
1143
- return shareNodeFinish;
1144
- }
1145
-
1146
- return {
1147
- __typename: "SuccessResponse",
1148
- data: (_shareNodeFinish$shar = shareNodeFinish.shareNodeFinish) != null ? _shareNodeFinish$shar : false
1149
- };
1150
- }
1151
-
1152
- async updateNode(_ref15) {
1153
- var _node$access3, _node$access4;
1154
-
1155
- let {
1156
- nodeId,
1157
- name,
1158
- isFavorite,
1159
- deletedAt
1160
- } = _ref15;
1161
- let node = nodesCache.get(nodeId);
1162
-
1163
- if (!node) {
1164
- await this.node({
1165
- id: nodeId
1166
- });
1167
- node = nodesCache.get(nodeId);
1168
-
1169
- if (!node) {
1170
- throw "Can't find Node " + nodeId;
1171
- }
1172
- }
1173
-
1174
- if (!((_node$access3 = node.access) != null && _node$access3.nameKey)) {
1175
- throw new Error("Can't have access to node " + nodeId);
1176
- }
1177
-
1178
- name = name ? (_node$access4 = node.access) != null && _node$access4.nameKey ? await encryptName(name, node.access.nameKey) : name : null;
1179
- const {
1180
- updateNode
1181
- } = await this.client("mutation")({
1182
- updateNode: [{
1183
- nodeId,
1184
- name,
1185
- isFavorite,
1186
- deletedAt
1187
- }, {
1188
- "...on ErrorAccessDenied": {
1189
- __typename: true,
1190
- message: true
1191
- },
1192
- "...on ErrorNotExist": {
1193
- __typename: true,
1194
- message: true
1195
- },
1196
- "...on UpdateNodeResponse": {
1197
- __typename: true,
1198
- updateNode: nodeFullSelector
1199
- }
1200
- }]
1201
- });
1202
-
1203
- if (!updateNode) {
1204
- return null;
1205
- }
1206
-
1207
- if (updateNode.__typename === "ErrorAccessDenied") {
1208
- return updateNode;
1209
- }
1210
-
1211
- if (updateNode.__typename === "ErrorNotExist") {
1212
- return updateNode;
1213
- }
1214
-
1215
- if (!updateNode.updateNode) {
1216
- return null;
1217
- }
1218
-
1219
- const result = await gqlNodeToExternalNodeFull(updateNode.updateNode, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1220
- return {
1221
- __typename: "SuccessResponse",
1222
- data: result
1223
- };
1224
- }
1225
-
1226
- async deletedMails(_ref16) {
1227
- let {
1228
- mailType
1229
- } = _ref16;
1230
- const {
1231
- deletedMails
1232
- } = await this.client("query", {
1233
- scalars: {
1234
- DateTime: {
1235
- decode: e => new Date(e),
1236
- encode: e => e.toISOString()
1237
- }
1238
- }
1239
- })({
1240
- deletedMails: [{
1241
- mailType
1242
- }, {
1243
- "...on ErrorAccessDenied": {
1244
- __typename: true,
1245
- message: true
1246
- },
1247
- "...on DeletedMailsResponse": {
1248
- __typename: true,
1249
- deletedMails: mailSelector
1250
- }
1251
- }]
1252
- });
1253
-
1254
- if (!deletedMails) {
1255
- return null;
1256
- }
1257
-
1258
- if (deletedMails.__typename === "ErrorAccessDenied") {
1259
- return deletedMails;
1260
- }
1261
-
1262
- const mails = new Array();
1263
-
1264
- for (const m of deletedMails.deletedMails) {
1265
- const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1266
-
1267
- if (mail) {
1268
- mails.push(mail);
1269
- }
1270
- }
1271
-
1272
- return {
1273
- __typename: "SuccessResponse",
1274
- data: mails
1275
- };
1276
- }
1277
-
1278
- async updateAppNotifications(notifications) {
1279
- const {
1280
- updateAppNotifications
1281
- } = await this.client("mutation", {
1282
- scalars: {
1283
- DateTime: {
1284
- decode: e => new Date(e),
1285
- encode: e => e.toISOString()
1286
- }
1287
- }
1288
- })({
1289
- updateAppNotifications: [notifications, {
1290
- "...on ErrorAccessDenied": {
1291
- __typename: true,
1292
- message: true
1293
- },
1294
- "...on UpdateAppNotificationsResponse": {
1295
- __typename: true,
1296
- updateAppNotifications: {
1297
- enableAll: true,
1298
- mail: true,
1299
- cloud: true,
1300
- disableAllUntil: true
1301
- }
1302
- }
1303
- }]
1304
- });
1305
-
1306
- if (!updateAppNotifications) {
1307
- return null;
1308
- }
1309
-
1310
- if (updateAppNotifications.__typename === "ErrorAccessDenied") {
1311
- return updateAppNotifications;
1312
- }
1313
-
1314
- if (!updateAppNotifications.updateAppNotifications) {
1315
- return null;
1316
- }
1317
-
1318
- return {
1319
- __typename: "SuccessResponse",
1320
- data: updateAppNotifications.updateAppNotifications
1321
- };
1322
- }
1323
-
1324
- async appNotifications() {
1325
- const {
1326
- appNotifications
1327
- } = await this.client("query", {
1328
- scalars: {
1329
- DateTime: {
1330
- decode: e => new Date(e),
1331
- encode: e => e.toISOString()
1332
- }
1333
- }
1334
- })({
1335
- appNotifications: {
1336
- "...on ErrorAccessDenied": {
1337
- __typename: true,
1338
- message: true
1339
- },
1340
- "...on ErrorNotFound": {
1341
- __typename: true,
1342
- message: true
1343
- },
1344
- "...on UserAppNotifications": {
1345
- __typename: true,
1346
- enableAll: true,
1347
- mail: true,
1348
- cloud: true,
1349
- disableAllUntil: true
1350
- }
1351
- }
1352
- });
1353
-
1354
- if (!appNotifications) {
1355
- return null;
1356
- }
1357
-
1358
- if (appNotifications.__typename === "ErrorAccessDenied") {
1359
- return appNotifications;
1360
- }
1361
-
1362
- if (appNotifications.__typename === "ErrorNotFound") {
1363
- return appNotifications;
1364
- }
1365
-
1366
- return {
1367
- __typename: "SuccessResponse",
1368
- data: appNotifications
1369
- };
1370
- }
1371
-
1372
- async createMail(data, customMessage) {
1373
- const mail = await this.createDraftMail(data);
1374
-
1375
- if (!mail) {
1376
- return {
1377
- __typename: "SuccessResponse",
1378
- data: false
1379
- };
1380
- }
1381
-
1382
- if (mail.__typename === "ErrorBasic") {
1383
- return mail;
1384
- }
1385
-
1386
- if (mail.__typename === "ErrorAccessDenied") {
1387
- return mail;
1388
- }
1389
-
1390
- const result = await this.sendDraftMail(mail.data.mailIntegrityId, customMessage);
1391
-
1392
- if (!result) {
1393
- return null;
1394
- }
1395
-
1396
- if (result.__typename === "ErrorAccessDenied") {
1397
- return result;
1398
- }
1399
-
1400
- if (result.__typename === "ErrorBasic") {
1401
- return result;
1402
- }
1403
-
1404
- return {
1405
- __typename: "SuccessResponse",
1406
- data: result.data
1407
- };
1408
- }
1409
-
1410
- async waitingReceivedMails() {
1411
- const {
1412
- user
1413
- } = await this.client("query")({
1414
- user: [{}, {
1415
- "...on ErrorNotFound": {
1416
- __typename: true,
1417
- message: true
1418
- },
1419
- "...on UserResponse": {
1420
- __typename: true,
1421
- user: {
1422
- waitingReceivedMails: {
1423
- date: true,
1424
- attachmentsCount: true,
1425
- sender: {
1426
- id: true,
1427
- firstname: true,
1428
- lastname: true,
1429
- email: true,
1430
- publicKey: true
1431
- },
1432
- recipients: {
1433
- id: true,
1434
- firstname: true,
1435
- lastname: true,
1436
- email: true,
1437
- publicKey: true
1438
- },
1439
- temporaryRecipients: {
1440
- email: true
1441
- }
1442
- }
1443
- }
1444
- }
1445
- }]
1446
- });
1447
-
1448
- if (!user) {
1449
- return null;
1450
- }
1451
-
1452
- if (user.__typename === "ErrorNotFound") {
1453
- return user;
1454
- }
1455
-
1456
- if (!user.user) {
1457
- return null;
1458
- }
1459
-
1460
- const result = user.user.waitingReceivedMails.map(m => _objectSpread(_objectSpread({
1461
- id: generate()
1462
- }, m), {}, {
1463
- date: new Date(m.date)
1464
- }));
1465
- return {
1466
- __typename: "SuccessResponse",
1467
- data: result
1468
- };
1469
- }
1470
-
1471
- async updateDraftMail(draftId, _ref17) {
1472
- let {
1473
- body,
1474
- subject,
1475
- files,
1476
- recipientsIds,
1477
- replyTo
1478
- } = _ref17;
1479
- const drafts = await this.draftMails();
1480
-
1481
- if (!drafts) {
1482
- return null;
1483
- }
1484
-
1485
- if (drafts.__typename !== "SuccessResponse") {
1486
- return drafts;
1487
- }
1488
-
1489
- const draft = drafts.data.find(d => d.mailIntegrityId === draftId);
1490
-
1491
- if (!draft) {
1492
- throw new Error("Invalid draft " + draftId);
1493
- }
1494
-
1495
- let hashKey = null;
1496
- let hash = null;
1497
-
1498
- if (body || subject) {
1499
- hashKey = sodium.randombytes_buf(sodium.crypto_generichash_KEYBYTES, "hex");
1500
- hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, JSON.stringify({
1501
- body,
1502
- subject
1503
- }), hashKey, "hex");
1504
- }
1505
-
1506
- const senderFiles = new Array();
1507
-
1508
- if (files) {
1509
- for (const f of files) {
1510
- let file = filesCache.get(f.id);
1511
-
1512
- if (!file) {
1513
- await this.file({
1514
- id: f.id
1515
- });
1516
- file = filesCache.get(f.id);
1517
-
1518
- if (!file) {
1519
- throw new Error("File " + f.name + " (" + f.id + ") does not exists");
1520
- }
1521
- }
1522
-
1523
- senderFiles.push({
1524
- id: file.id,
1525
- fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_string(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
1526
- name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
1527
- });
1528
- }
1529
- }
1530
-
1531
- const {
1532
- updateDraftMail
1533
- } = await this.client("mutation", {
1534
- scalars: {
1535
- Json: {
1536
- encode: e => JSON.stringify(e),
1537
- decode: e => JSON.parse(e)
1538
- },
1539
- DateTime: {
1540
- decode: e => new Date(e),
1541
- encode: e => e.toISOString()
1542
- },
1543
- BigInt: {
1544
- decode: e => BigInt(e),
1545
- encode: e => e.toString()
1546
- }
1547
- }
1548
- })({
1549
- updateDraftMail: [{
1550
- draftId,
1551
- recipients: recipientsIds,
1552
- replyTo,
1553
- body: body ? sodium.to_hex(encryptCryptoBox(sodium.from_string(body), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)) : null,
1554
- subject: subject ? sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)) : null,
1555
- senderFiles,
1556
- hash,
1557
- hashKey
1558
- }, {
1559
- "...on ErrorAccessDenied": {
1560
- __typename: true,
1561
- message: true
1562
- },
1563
- "...on ErrorBasic": {
1564
- __typename: true,
1565
- message: true
1566
- },
1567
- "...on UpdateDraftMailResponse": {
1568
- __typename: true,
1569
- updateDraftMail: mailSelector
1570
- }
1571
- }]
1572
- });
1573
-
1574
- if (!updateDraftMail) {
1575
- return null;
1576
- }
1577
-
1578
- if (updateDraftMail.__typename === "ErrorAccessDenied") {
1579
- return updateDraftMail;
1580
- }
1581
-
1582
- if (updateDraftMail.__typename === "ErrorBasic") {
1583
- return updateDraftMail;
1584
- }
1585
-
1586
- if (!updateDraftMail.updateDraftMail) {
1587
- return null;
1588
- }
1589
-
1590
- const result = convertInternalMailToExternal(updateDraftMail.updateDraftMail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1591
- return {
1592
- __typename: "SuccessResponse",
1593
- data: result
1594
- };
1595
- }
1596
-
1597
- async deleteDraftMail(draftId) {
1598
- var _deleteDraftMail$dele;
1599
-
1600
- const {
1601
- deleteDraftMail
1602
- } = await this.client("mutation")({
1603
- deleteDraftMail: [{
1604
- draftId
1605
- }, {
1606
- "...on ErrorAccessDenied": {
1607
- __typename: true,
1608
- message: true
1609
- },
1610
- "...on DeleteDraftMailResponse": {
1611
- __typename: true,
1612
- deleteDraftMail: true
1613
- }
1614
- }]
1615
- });
1616
-
1617
- if (!deleteDraftMail) {
1618
- return null;
1619
- }
1620
-
1621
- if (deleteDraftMail.__typename === "ErrorAccessDenied") {
1622
- return deleteDraftMail;
1623
- }
1624
-
1625
- if (!deleteDraftMail.deleteDraftMail) {
1626
- return null;
1627
- }
1628
-
1629
- return {
1630
- __typename: "SuccessResponse",
1631
- data: (_deleteDraftMail$dele = deleteDraftMail.deleteDraftMail) != null ? _deleteDraftMail$dele : false
1632
- };
1633
- }
1634
-
1635
- async deleteMailTrash(_ref18) {
1636
- let {
1637
- ids
1638
- } = _ref18;
1639
- const {
1640
- deleteMailTrash
1641
- } = await this.client("mutation")({
1642
- deleteMailTrash: [{
1643
- ids
1644
- }, {
1645
- "...on ErrorAccessDenied": {
1646
- __typename: true,
1647
- message: true
1648
- },
1649
- "...on DeleteMailTrashResponse": {
1650
- __typename: true,
1651
- deleteMailTrash: true
1652
- }
1653
- }]
1654
- });
1655
-
1656
- if (!deleteMailTrash) {
1657
- return null;
1658
- }
1659
-
1660
- if (deleteMailTrash.__typename === "ErrorAccessDenied") {
1661
- return deleteMailTrash;
1662
- }
1663
-
1664
- if (!deleteMailTrash.deleteMailTrash) {
1665
- return null;
1666
- }
1667
-
1668
- return {
1669
- __typename: "SuccessResponse",
1670
- data: deleteMailTrash.deleteMailTrash
1671
- };
1672
- }
1673
-
1674
- async emptyMailTrash() {
1675
- const {
1676
- emptyMailTrash
1677
- } = await this.client("mutation")({
1678
- emptyMailTrash: {
1679
- "...on ErrorAccessDenied": {
1680
- __typename: true,
1681
- message: true
1682
- },
1683
- "...on EmptyMailTrashResponse": {
1684
- __typename: true,
1685
- emptyMailTrash: true
1686
- }
1687
- }
1688
- });
1689
-
1690
- if (!emptyMailTrash) {
1691
- return null;
1692
- }
1693
-
1694
- if (emptyMailTrash.__typename === "ErrorAccessDenied") {
1695
- return emptyMailTrash;
1696
- }
1697
-
1698
- if (!emptyMailTrash.emptyMailTrash) {
1699
- return null;
1700
- }
1701
-
1702
- return {
1703
- __typename: "SuccessResponse",
1704
- data: emptyMailTrash.emptyMailTrash
1705
- };
1706
- }
1707
-
1708
- async emptyCloudTrash() {
1709
- const {
1710
- emptyCloudTrash
1711
- } = await this.client("mutation")({
1712
- emptyCloudTrash: {
1713
- "...on ErrorAccessDenied": {
1714
- __typename: true,
1715
- message: true
1716
- },
1717
- "...on EmptyCloudTrashResponse": {
1718
- __typename: true,
1719
- emptyCloudTrash: true
1720
- }
1721
- }
1722
- });
1723
-
1724
- if (!emptyCloudTrash) {
1725
- return null;
1726
- }
1727
-
1728
- if (emptyCloudTrash.__typename === "ErrorAccessDenied") {
1729
- return emptyCloudTrash;
1730
- }
1731
-
1732
- if (!emptyCloudTrash.emptyCloudTrash) {
1733
- return null;
1734
- }
1735
-
1736
- return {
1737
- __typename: "SuccessResponse",
1738
- data: emptyCloudTrash.emptyCloudTrash
1739
- };
1740
- }
1741
-
1742
- async recoverNode(id) {
1743
- var _recoverNode$recoverN;
1744
-
1745
- const {
1746
- recoverNode
1747
- } = await this.client("mutation")({
1748
- recoverNode: [{
1749
- id
1750
- }, {
1751
- "...on ErrorAccessDenied": {
1752
- __typename: true,
1753
- message: true
1754
- },
1755
- "...on ErrorNotExist": {
1756
- __typename: true,
1757
- message: true
1758
- },
1759
- "...on RecoverNodeResponse": {
1760
- __typename: true,
1761
- recoverNode: true
1762
- }
1763
- }]
1764
- });
1765
-
1766
- if (!recoverNode) {
1767
- return null;
1768
- }
1769
-
1770
- if (recoverNode.__typename === "ErrorAccessDenied") {
1771
- return recoverNode;
1772
- }
1773
-
1774
- if (recoverNode.__typename === "ErrorNotExist") {
1775
- return recoverNode;
1776
- }
1777
-
1778
- return {
1779
- __typename: "SuccessResponse",
1780
- data: (_recoverNode$recoverN = recoverNode.recoverNode) != null ? _recoverNode$recoverN : false
1781
- };
1782
- }
1783
-
1784
- async recoverMail(_ref19) {
1785
- let {
1786
- mailId
1787
- } = _ref19;
1788
- const {
1789
- recoverMail
1790
- } = await this.client("mutation")({
1791
- recoverMail: [{
1792
- mailId
1793
- }, {
1794
- "...on ErrorAccessDenied": {
1795
- __typename: true,
1796
- message: true
1797
- },
1798
- "...on ErrorBasic": {
1799
- __typename: true,
1800
- message: true
1801
- },
1802
- "...on RecoverMailResponse": {
1803
- __typename: true,
1804
- recoverMail: true
1805
- }
1806
- }]
1807
- });
1808
-
1809
- if (!recoverMail) {
1810
- return null;
1811
- }
1812
-
1813
- if (recoverMail.__typename === "ErrorAccessDenied") {
1814
- return recoverMail;
1815
- }
1816
-
1817
- if (recoverMail.__typename === "ErrorBasic") {
1818
- return recoverMail;
1819
- }
1820
-
1821
- return {
1822
- __typename: "SuccessResponse",
1823
- data: recoverMail.recoverMail
1824
- };
1825
- }
1826
-
1827
- async deleteFile(_ref20) {
1828
- let {
1829
- fileId,
1830
- nodeId
1831
- } = _ref20;
1832
- const {
1833
- deleteFile
1834
- } = await this.client("mutation")({
1835
- deleteFile: [{
1836
- fileId,
1837
- nodeId
1838
- }, {
1839
- "...on ErrorAccessDenied": {
1840
- __typename: true,
1841
- message: true
1842
- },
1843
- "...on ErrorNotExist": {
1844
- __typename: true,
1845
- message: true
1846
- },
1847
- "...on DeleteFileResponse": {
1848
- __typename: true,
1849
- deleteFile: true
1850
- }
1851
- }]
1852
- });
1853
-
1854
- if (!deleteFile) {
1855
- return null;
1856
- }
1857
-
1858
- if (deleteFile.__typename === "ErrorAccessDenied") {
1859
- return deleteFile;
1860
- }
1861
-
1862
- if (deleteFile.__typename === "ErrorNotExist") {
1863
- return deleteFile;
1864
- }
1865
-
1866
- return {
1867
- __typename: "SuccessResponse",
1868
- data: deleteFile.deleteFile
1869
- };
1870
- }
1871
-
1872
- async deleteNode(_ref21) {
1873
- let {
1874
- nodeId
1875
- } = _ref21;
1876
- const {
1877
- deleteNode
1878
- } = await this.client("mutation")({
1879
- deleteNode: [{
1880
- id: nodeId
1881
- }, {
1882
- "...on ErrorAccessDenied": {
1883
- __typename: true,
1884
- message: true
1885
- },
1886
- "...on DeleteNodeResponse": {
1887
- __typename: true,
1888
- deleteNode: true
1889
- }
1890
- }]
1891
- });
1892
-
1893
- if (!deleteNode) {
1894
- return null;
1895
- }
1896
-
1897
- if (deleteNode.__typename === "ErrorAccessDenied") {
1898
- return deleteNode;
1899
- }
1900
-
1901
- return {
1902
- __typename: "SuccessResponse",
1903
- data: deleteNode.deleteNode
1904
- };
1905
- }
1906
-
1907
- async moveNodes(_ref22) {
1908
- var _moveNodes$moveNodes;
1909
-
1910
- let {
1911
- nodeIds,
1912
- parentNodeId
1913
- } = _ref22;
1914
- const {
1915
- moveNodes
1916
- } = await this.client("mutation")({
1917
- moveNodes: [{
1918
- nodeIds,
1919
- parentNodeId
1920
- }, {
1921
- "...on ErrorAccessDenied": {
1922
- __typename: true,
1923
- message: true
1924
- },
1925
- "...on MoveNodesResponse": {
1926
- __typename: true,
1927
- moveNodes: true
1928
- }
1929
- }]
1930
- });
1931
-
1932
- if (!moveNodes) {
1933
- return null;
1934
- }
1935
-
1936
- if (moveNodes.__typename === "ErrorAccessDenied") {
1937
- return moveNodes;
1938
- }
1939
-
1940
- return {
1941
- __typename: "SuccessResponse",
1942
- data: (_moveNodes$moveNodes = moveNodes.moveNodes) != null ? _moveNodes$moveNodes : false
1943
- };
1944
- }
1945
-
1946
- async folderSize(_ref23) {
1947
- let {
1948
- folderId
1949
- } = _ref23;
1950
- const {
1951
- folderSize
1952
- } = await this.client("query", {
1953
- scalars: {
1954
- BigInt: {
1955
- decode: e => BigInt(e),
1956
- encode: e => e.toString()
1957
- }
1958
- }
1959
- })({
1960
- folderSize: [{
1961
- folderId
1962
- }, {
1963
- "...on ErrorAccessDenied": {
1964
- __typename: true,
1965
- message: true
1966
- },
1967
- "...on FolderSizeResponse": {
1968
- __typename: true,
1969
- size: true,
1970
- sizeBefore: true
1971
- }
1972
- }]
1973
- });
1974
-
1975
- if (!folderSize) {
1976
- return null;
1977
- }
1978
-
1979
- if (folderSize.__typename === "ErrorAccessDenied") {
1980
- return folderSize;
1981
- }
1982
-
1983
- return {
1984
- __typename: "SuccessResponse",
1985
- data: {
1986
- size: BigInt(folderSize.size),
1987
- sizeBefore: BigInt(folderSize.sizeBefore)
1988
- }
1989
- };
1990
- }
1991
-
1992
- async deleteMail(_ref24) {
1993
- let {
1994
- mailId
1995
- } = _ref24;
1996
- const {
1997
- deleteMail
1998
- } = await this.client("mutation")({
1999
- deleteMail: [{
2000
- mailId
2001
- }, {
2002
- "...on ErrorAccessDenied": {
2003
- __typename: true,
2004
- message: true
2005
- },
2006
- "...on DeleteMailResponse": {
2007
- __typename: true,
2008
- deleteMail: true
2009
- }
2010
- }]
2011
- });
2012
-
2013
- if (!deleteMail) {
2014
- return null;
2015
- }
2016
-
2017
- if (deleteMail.__typename === "ErrorAccessDenied") {
2018
- return deleteMail;
2019
- }
2020
-
2021
- return {
2022
- __typename: "SuccessResponse",
2023
- data: deleteMail.deleteMail
2024
- };
2025
- }
2026
-
2027
- async saveInCloud(_ref25) {
2028
- var _node$parent;
2029
-
2030
- let {
2031
- fileId,
2032
- name,
2033
- nodeId
2034
- } = _ref25;
2035
-
2036
- if (nodeId && !nodesCache.has(nodeId)) {
2037
- await this.node({
2038
- id: nodeId
2039
- });
2040
-
2041
- if (!nodesCache.has(nodeId)) {
2042
- return {
2043
- __typename: "ErrorBasic",
2044
- message: "The node " + nodeId + " does not exists"
2045
- };
2046
- }
2047
- }
2048
-
2049
- let key = "";
2050
- const file = filesCache.get(fileId);
2051
-
2052
- if (!file) {
2053
- var _filesCache$get;
2054
-
2055
- await this.file({
2056
- id: fileId
2057
- });
2058
- const file = (_filesCache$get = filesCache.get(fileId)) != null ? _filesCache$get : null;
2059
-
2060
- if (!file) {
2061
- const receivedMails = await this.receivedMails();
2062
-
2063
- if (!receivedMails) {
2064
- return null;
2065
- }
2066
-
2067
- if (receivedMails.__typename !== "SuccessResponse") {
2068
- return null;
2069
- }
2070
-
2071
- const mail = receivedMails.data.find(m => m.files.some(f => f.id === fileId));
2072
-
2073
- if (!mail) {
2074
- return {
2075
- __typename: "ErrorBasic",
2076
- message: "Can't find mail with the file " + fileId
2077
- };
2078
- }
2079
-
2080
- const fileMail = mail.files.find(f => f.id === fileId);
2081
-
2082
- if (!fileMail) {
2083
- return {
2084
- __typename: "ErrorBasic",
2085
- message: "Can't find mail with the file " + fileId
2086
- };
2087
- }
2088
-
2089
- const fileKey = decryptCryptoBox(sodium.from_hex(fileMail.key), mail.sender.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
2090
- key = sodium.to_hex(fileKey);
2091
- } else {
2092
- key = file.key;
2093
- }
2094
- } else {
2095
- key = file.key;
2096
- }
2097
-
2098
- if (key === "") {
2099
- return {
2100
- __typename: "ErrorBasic",
2101
- message: "Unexpected error 3"
2102
- };
2103
- }
2104
-
2105
- key = sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
2106
- const nameKey = secretstreamKeygen();
2107
- const encryptedName = await encryptName(name, sodium.to_hex(nameKey));
2108
- const encryptedNameKey = sodium.to_hex(encryptCryptoBox(nameKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
2109
- const {
2110
- saveInCloud
2111
- } = await this.client("mutation")({
2112
- saveInCloud: [{
2113
- fileId,
2114
- key,
2115
- nodeId,
2116
- filename: encryptedName,
2117
- nameKey: encryptedNameKey
2118
- }, {
2119
- "...on ErrorAccessDenied": {
2120
- __typename: true,
2121
- message: true
2122
- },
2123
- "...on ErrorNotFound": {
2124
- __typename: true,
2125
- message: true
2126
- },
2127
- "...on ErrorLimit": {
2128
- __typename: true,
2129
- message: true
2130
- },
2131
- "...on ErrorBasic": {
2132
- __typename: true,
2133
- message: true
2134
- },
2135
- "...on ErrorNotExist": {
2136
- __typename: true,
2137
- message: true
2138
- },
2139
- "...on SaveInCloudResponse": {
2140
- __typename: true,
2141
- saveInCloud: nodeFullSelector
2142
- }
2143
- }]
2144
- });
2145
-
2146
- if (!saveInCloud) {
2147
- return null;
2148
- }
2149
-
2150
- if (saveInCloud.__typename === "ErrorAccessDenied") {
2151
- return saveInCloud;
2152
- }
2153
-
2154
- if (saveInCloud.__typename === "ErrorNotFound") {
2155
- return saveInCloud;
2156
- }
2157
-
2158
- if (saveInCloud.__typename === "ErrorLimit") {
2159
- return saveInCloud;
2160
- }
2161
-
2162
- if (saveInCloud.__typename === "ErrorBasic") {
2163
- return saveInCloud;
2164
- }
2165
-
2166
- if (saveInCloud.__typename === "ErrorNotExist") {
2167
- return saveInCloud;
2168
- }
2169
-
2170
- if (!saveInCloud.saveInCloud) {
2171
- return null;
2172
- }
2173
-
2174
- const node = await gqlNodeToExternalNodeFull(saveInCloud.saveInCloud, _classPrivateFieldLooseBase(this, _keys)[_keys]);
2175
- const me = (_node$parent = node.parent) == null ? void 0 : _node$parent.users.find(_ref26 => {
2176
- let [u] = _ref26;
2177
- return u.publicKey === _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
2178
- });
2179
-
2180
- if (me && ["admin", "write"].includes(me[1])) {
2181
- var _node$parent$users$fi, _node$parent2;
2182
-
2183
- const others = (_node$parent$users$fi = (_node$parent2 = node.parent) == null ? void 0 : _node$parent2.users.filter(_ref27 => {
2184
- let [u] = _ref27;
2185
- return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
2186
- })) != null ? _node$parent$users$fi : [];
2187
- await Promise.all(others.map(_ref28 => {
2188
- let [u, rights] = _ref28;
2189
- return this.shareNode({
2190
- nodeId: node.id,
2191
- rights,
2192
- userId: u.id
2193
- });
2194
- }));
2195
- }
2196
-
2197
- return {
2198
- __typename: "SuccessResponse",
2199
- data: node
2200
- };
2201
- }
2202
-
2203
- async dbGet(_ref29) {
2204
- let {
2205
- field,
2206
- userId
2207
- } = _ref29;
2208
- const {
2209
- dbGet
2210
- } = await this.client("query")({
2211
- dbGet: [{
2212
- field,
2213
- userId
2214
- }, {
2215
- "...on ErrorAccessDenied": {
2216
- __typename: true,
2217
- message: true
2218
- },
2219
- "...on ErrorNotExist": {
2220
- __typename: true,
2221
- message: true
2222
- },
2223
- "...on ErrorNotFound": {
2224
- __typename: true,
2225
- message: true
2226
- },
2227
- "...on DbGetResponse": {
2228
- __typename: true,
2229
- json: true
2230
- }
2231
- }]
2232
- });
2233
-
2234
- if (!dbGet) {
2235
- return null;
2236
- }
2237
-
2238
- if (dbGet.__typename === "ErrorAccessDenied") {
2239
- return dbGet;
2240
- }
2241
-
2242
- if (dbGet.__typename === "ErrorNotExist") {
2243
- return dbGet;
2244
- }
2245
-
2246
- if (dbGet.__typename === "ErrorNotFound") {
2247
- return dbGet;
2248
- }
2249
-
2250
- return {
2251
- __typename: "SuccessResponse",
2252
- data: dbGet.json.res
2253
- };
2254
- }
2255
-
2256
- async dbSet(_ref30) {
2257
- let {
2258
- value,
2259
- userId
2260
- } = _ref30;
2261
-
2262
- if (typeof value !== "object") {
2263
- throw new Error("value should be an object including fields you want to update.");
2264
- }
2265
-
2266
- const {
2267
- dbSet
2268
- } = await this.client("mutation")({
2269
- dbSet: [{
2270
- userId,
2271
- value: serialize(value).toString("base64")
2272
- }, {
2273
- "...on ErrorAccessDenied": {
2274
- __typename: true,
2275
- message: true
2276
- },
2277
- "...on ErrorNotFound": {
2278
- __typename: true,
2279
- message: true
2280
- },
2281
- "...on DbSetResponse": {
2282
- __typename: true,
2283
- dbSet: true
2284
- }
2285
- }]
2286
- });
2287
-
2288
- if (!dbSet) {
2289
- return null;
2290
- }
2291
-
2292
- if (dbSet.__typename === "ErrorAccessDenied") {
2293
- return dbSet;
2294
- }
2295
-
2296
- if (dbSet.__typename === "ErrorNotFound") {
2297
- return dbSet;
2298
- }
2299
-
2300
- if (!dbSet.dbSet) {
2301
- return null;
2302
- }
2303
-
2304
- return {
2305
- __typename: "SuccessResponse",
2306
- data: dbSet.dbSet.res
2307
- };
2308
- }
2309
-
2310
- async dbSearch(_ref31) {
2311
- let {
2312
- search,
2313
- field
2314
- } = _ref31;
2315
- const {
2316
- dbSearch
2317
- } = await this.client("query", {
2318
- scalars: {
2319
- Json: {
2320
- encode: e => JSON.stringify(e),
2321
- decode: e => JSON.parse(e)
2322
- },
2323
- DateTime: {
2324
- decode: e => new Date(e),
2325
- encode: e => e.toISOString()
2326
- },
2327
- BigInt: {
2328
- decode: e => BigInt(e),
2329
- encode: e => e.toString()
2330
- }
2331
- }
2332
- })({
2333
- dbSearch: [{
2334
- search,
2335
- field
2336
- }, {
2337
- "...on ErrorAccessDenied": {
2338
- __typename: true,
2339
- message: true
2340
- },
2341
- "...on ErrorBasic": {
2342
- __typename: true,
2343
- message: true
2344
- },
2345
- "...on ErrorNotExist": {
2346
- __typename: true,
2347
- message: true
2348
- },
2349
- "...on DbSearchResponse": {
2350
- __typename: true,
2351
- json: true
2352
- }
2353
- }]
2354
- });
2355
-
2356
- if (!dbSearch) {
2357
- return null;
2358
- }
2359
-
2360
- if (dbSearch.__typename === "ErrorAccessDenied") {
2361
- return dbSearch;
2362
- }
2363
-
2364
- if (dbSearch.__typename === "ErrorBasic") {
2365
- return dbSearch;
2366
- }
2367
-
2368
- if (dbSearch.__typename === "ErrorNotExist") {
2369
- return dbSearch;
2370
- }
2371
-
2372
- return {
2373
- __typename: "SuccessResponse",
2374
- data: dbSearch.json
2375
- };
2376
- }
2377
-
2378
- async sendDraftMail(draftId, customMessage) {
2379
- const drafts = await this.draftMails();
2380
-
2381
- if (!drafts) {
2382
- return {
2383
- __typename: "SuccessResponse",
2384
- data: false
2385
- };
2386
- }
2387
-
2388
- if (drafts.__typename !== "SuccessResponse") {
2389
- return {
2390
- __typename: "SuccessResponse",
2391
- data: false
2392
- };
2393
- }
2394
-
2395
- const draft = drafts.data.find(d => d.mailIntegrityId === draftId);
2396
-
2397
- if (!draft) {
2398
- return {
2399
- __typename: "SuccessResponse",
2400
- data: false
2401
- };
2402
- }
2403
-
2404
- const recipients = new Array();
2405
- const temporaryRecipients = new Array();
2406
-
2407
- for (const {
2408
- email
2409
- } of draft.temporaryRecipients) {
2410
- if (!email) {
2411
- continue;
2412
- }
2413
-
2414
- const input = await this._eachUser(draft.files, draft.subject, draft.body, email);
2415
-
2416
- if (!input) {
2417
- temporaryRecipients.push(email);
2418
- } else {
2419
- recipients.push(input);
2420
- }
2421
- }
2422
-
2423
- for (const {
2424
- id
2425
- } of draft.recipients) {
2426
- const input = await this._eachUser(draft.files, draft.subject, draft.body, id);
2427
-
2428
- if (!input) {
2429
- temporaryRecipients.push(id);
2430
- } else {
2431
- recipients.push(input);
2432
- }
2433
- }
2434
-
2435
- const {
2436
- sendDraftMail
2437
- } = await this.client("mutation")({
2438
- sendDraftMail: [{
2439
- temporaryRecipients,
2440
- recipients,
2441
- draftMailId: draft.mailIntegrityId,
2442
- customMessage
2443
- }, {
2444
- "...on ErrorAccessDenied": {
2445
- __typename: true,
2446
- message: true
2447
- },
2448
- "...on ErrorBasic": {
2449
- __typename: true,
2450
- message: true
2451
- },
2452
- "...on SendDraftMailResponse": {
2453
- __typename: true,
2454
- sendDraftMail: true
2455
- }
2456
- }]
2457
- });
2458
-
2459
- if (!sendDraftMail) {
2460
- return null;
2461
- }
2462
-
2463
- if (sendDraftMail.__typename === "ErrorAccessDenied") {
2464
- return sendDraftMail;
2465
- }
2466
-
2467
- if (sendDraftMail.__typename === "ErrorBasic") {
2468
- return sendDraftMail;
2469
- }
2470
-
2471
- if (!sendDraftMail.sendDraftMail) {
2472
- return null;
2473
- }
2474
-
2475
- return {
2476
- __typename: "SuccessResponse",
2477
- data: sendDraftMail.sendDraftMail
2478
- };
2479
- }
2480
-
2481
- async sendWaitingEmails() {
2482
- // TODO opti this
2483
- const mails = await this.sentMails();
2484
-
2485
- if (!mails) {
2486
- return {
2487
- __typename: "SuccessResponse",
2488
- data: false
2489
- };
2490
- }
2491
-
2492
- if (mails.__typename !== "SuccessResponse") {
2493
- return {
2494
- __typename: "SuccessResponse",
2495
- data: false
2496
- };
2497
- }
2498
-
2499
- const filtered = mails.data.filter(m => m.temporaryRecipients.length > 0);
2500
-
2501
- for (const mail of filtered) {
2502
- for (const {
2503
- email
2504
- } of mail.temporaryRecipients) {
2505
- if (!email) {
2506
- continue;
2507
- }
2508
-
2509
- try {
2510
- const input = await this._eachUser(mail.files, mail.subject, mail.body, email);
2511
-
2512
- if (!input) {
2513
- continue;
2514
- }
2515
-
2516
- await this.client("mutation")({
2517
- sendOneMail: [{
2518
- mailIntegrityId: mail.mailIntegrityId,
2519
- recipient: input
2520
- }, {
2521
- "...on ErrorAccessDenied": {
2522
- __typename: true,
2523
- message: true
2524
- },
2525
- "...on ErrorBasic": {
2526
- __typename: true,
2527
- message: true
2528
- },
2529
- "...on RecoverNodeResponse": {
2530
- __typename: true,
2531
- recoverNode: true
2532
- }
2533
- }]
2534
- });
2535
- } catch {
2536
- continue;
2537
- }
2538
- }
2539
- }
2540
-
2541
- return {
2542
- __typename: "SuccessResponse",
2543
- data: false
2544
- };
2545
- }
2546
-
2547
- async createDraftMail(_ref32) {
2548
- let {
2549
- body,
2550
- subject,
2551
- files,
2552
- recipientsIds,
2553
- replyTo
2554
- } = _ref32;
2555
- const hashKey = sodium.randombytes_buf(sodium.crypto_generichash_KEYBYTES, "hex");
2556
- const hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, JSON.stringify({
2557
- body,
2558
- subject
2559
- }), hashKey, "hex");
2560
- const senderFiles = new Array();
2561
-
2562
- for (const f of files) {
2563
- let file = filesCache.get(f.id);
2564
-
2565
- if (!file) {
2566
- await this.file({
2567
- id: f.id
2568
- });
2569
- file = filesCache.get(f.id);
2570
-
2571
- if (!file) {
2572
- throw new Error("File " + f.name + " (" + f.id + ") does not exists");
2573
- }
2574
- }
2575
-
2576
- senderFiles.push({
2577
- id: file.id,
2578
- fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_string(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
2579
- name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
2580
- });
2581
- }
2582
-
2583
- const {
2584
- createDraftMail
2585
- } = await this.client("mutation", {
2586
- scalars: {
2587
- DateTime: {
2588
- decode: e => new Date(e),
2589
- encode: e => e.toISOString()
2590
- }
2591
- }
2592
- })({
2593
- createDraftMail: [{
2594
- recipients: recipientsIds,
2595
- replyTo,
2596
- body: sodium.to_hex(encryptCryptoBox(sodium.from_string(body), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
2597
- subject: sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
2598
- senderFiles,
2599
- hash,
2600
- hashKey
2601
- }, {
2602
- "...on ErrorAccessDenied": {
2603
- __typename: true,
2604
- message: true
2605
- },
2606
- "...on ErrorBasic": {
2607
- __typename: true,
2608
- message: true
2609
- },
2610
- "...on CreateDraftMailResponse": {
2611
- __typename: true,
2612
- createDraftMail: mailSelector
2613
- }
2614
- }]
2615
- });
2616
-
2617
- if (!createDraftMail) {
2618
- return null;
2619
- }
2620
-
2621
- if (createDraftMail.__typename === "ErrorAccessDenied") {
2622
- return createDraftMail;
2623
- }
2624
-
2625
- if (createDraftMail.__typename === "ErrorBasic") {
2626
- return createDraftMail;
2627
- }
2628
-
2629
- if (!createDraftMail.createDraftMail) {
2630
- return null;
2631
- }
2632
-
2633
- const result = convertInternalMailToExternal(createDraftMail.createDraftMail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
2634
- return {
2635
- __typename: "SuccessResponse",
2636
- data: result
2637
- };
2638
- }
2639
-
2640
- async fileContent(_ref33) {
2641
- let {
2642
- fileId,
2643
- onDownloadProgress,
2644
- progressDecrypt,
2645
- signal
2646
- } = _ref33;
2647
- const {
2648
- fileContent
2649
- } = await this.client("query", {
2650
- scalars: {
2651
- Bytes: {
2652
- decode: e => {
2653
- console.log(e, typeof e);
2654
- return Uint8Array.from([1, 2, 3]);
2655
- },
2656
- encode: e => e.toString()
2657
- }
2658
- }
2659
- })({
2660
- fileContent: [{
2661
- fileId
2662
- }, {
2663
- "...on ErrorAccessDenied": {
2664
- __typename: true,
2665
- message: true
2666
- },
2667
- "...on ErrorBasic": {
2668
- __typename: true,
2669
- message: true
2670
- },
2671
- "...on FileContentResponse": {
2672
- __typename: true,
2673
- file: {
2674
- "...on FileContentCloud": {
2675
- __typename: true,
2676
- parts: {
2677
- contentUrl: true,
2678
- order: true,
2679
- md5: true
2680
- },
2681
- key: true,
2682
- publicKey: true,
2683
- totalSize: true,
2684
- md5: true,
2685
- md5Encrypted: true
2686
- },
2687
- "...on FileContentLite": {
2688
- __typename: true,
2689
- content: true,
2690
- id: true,
2691
- key: true,
2692
- publicKey: true,
2693
- md5: true,
2694
- md5Encrypted: true,
2695
- totalSize: true
2696
- },
2697
- "...on FileContentReceivedMail": {
2698
- __typename: true,
2699
- maybeParts: {
2700
- contentUrl: true,
2701
- order: true,
2702
- md5: true
2703
- },
2704
- maybeContent: true,
2705
- key: true,
2706
- senderPublicKey: true,
2707
- totalSize: true,
2708
- md5: true,
2709
- md5Encrypted: true
2710
- },
2711
- "...on FileContentSentMail": {
2712
- __typename: true,
2713
- maybeParts: {
2714
- contentUrl: true,
2715
- order: true,
2716
- md5: true
2717
- },
2718
- maybeContent: true,
2719
- key: true,
2720
- totalSize: true,
2721
- md5: true,
2722
- md5Encrypted: true
2723
- }
2724
- }
2725
- }
2726
- }]
2727
- });
2728
-
2729
- if (!fileContent) {
2730
- return null;
2731
- }
2732
-
2733
- if (fileContent.__typename === "ErrorAccessDenied") {
2734
- return fileContent;
2735
- }
2736
-
2737
- if (fileContent.__typename === "ErrorBasic") {
2738
- return fileContent;
2739
- }
2740
-
2741
- const file = fileContent.file;
2742
-
2743
- if (!file) {
2744
- return null;
2745
- }
2746
-
2747
- const progressParts = {};
2748
-
2749
- const onProgress = (part, progressEvent) => {
2750
- progressParts[part] = progressEvent;
2751
- const transferredBytes = Object.values(progressParts).reduce((prv, cur) => prv + cur.transferredBytes, 0);
2752
- const totalBytes = Number(file.totalSize);
2753
- onDownloadProgress == null ? void 0 : onDownloadProgress({
2754
- percent: transferredBytes / totalBytes,
2755
- totalBytes,
2756
- transferredBytes
2757
- });
2758
- };
2759
-
2760
- const encryptedContentFromParts = async fileParts => {
2761
- const parts = new Array();
2762
-
2763
- const byPart = async part => {
2764
- const buf = new Uint8Array(await ky.get(part.contentUrl, {
2765
- timeout: false,
2766
- onDownloadProgress: pr => onProgress(part.order, pr),
2767
- signal: signal
2768
- }).arrayBuffer());
2769
- const md5Part = await md5(buf);
2770
-
2771
- if (md5Part !== part.md5) {
2772
- throw new Error("Invalid md5 for part " + part.order + " of file " + fileId);
2773
- }
2774
-
2775
- parts.push({
2776
- data: buf,
2777
- order: part.order
2778
- });
2779
- };
2780
-
2781
- await promiseAllLimit(3, fileParts.map(p => () => byPart(p)));
2782
- return concatenate(...parts.sort((a, b) => a.order - b.order).map(p => p.data));
2783
- };
2784
-
2785
- const finalize = async encryptedContent => {
2786
- // const md5Encrypted = await firstValueFrom(md5(of(encryptedContent)));
2787
- const md5Encrypted = await md5(encryptedContent);
2788
-
2789
- if (md5Encrypted !== file.md5Encrypted) {
2790
- throw new Error("Encrypted content does not match");
2791
- }
2792
-
2793
- 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);
2794
- const src = await decrypt(key, encryptedContent, progressDecrypt, signal); // const md5Content = await firstValueFrom(md5(of(src)));
2795
-
2796
- const md5Content = await md5(src);
2797
-
2798
- if (md5Content !== file.md5) {
2799
- throw new Error("Content does not match");
2800
- }
2801
-
2802
- return uncompress(src);
2803
- };
2804
-
2805
- 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;
2806
-
2807
- if (!encryptedContent) {
2808
- return null;
2809
- }
2810
-
2811
- return {
2812
- __typename: "SuccessResponse",
2813
- data: await finalize(encryptedContent)
2814
- };
2815
- }
2816
-
2817
- async readMail(_ref34) {
2818
- let {
2819
- mailId
2820
- } = _ref34;
2821
- const {
2822
- readMail
2823
- } = await this.client("mutation")({
2824
- readMail: [{
2825
- mailId
2826
- }, {
2827
- "...on ErrorAccessDenied": {
2828
- __typename: true,
2829
- message: true
2830
- },
2831
- "...on ErrorBasic": {
2832
- __typename: true,
2833
- message: true
2834
- },
2835
- "...on ErrorNotFound": {
2836
- __typename: true,
2837
- message: true
2838
- },
2839
- "...on ReadMailResponse": {
2840
- __typename: true,
2841
- readMail: true
2842
- }
2843
- }]
2844
- });
2845
-
2846
- if (!readMail) {
2847
- return null;
2848
- }
2849
-
2850
- if (readMail.__typename === "ErrorAccessDenied") {
2851
- return readMail;
2852
- }
2853
-
2854
- if (readMail.__typename === "ErrorBasic") {
2855
- return readMail;
2856
- }
2857
-
2858
- if (readMail.__typename === "ErrorNotFound") {
2859
- return readMail;
2860
- }
2861
-
2862
- if (!readMail.readMail) {
2863
- return null;
2864
- }
2865
-
2866
- return {
2867
- __typename: "SuccessResponse",
2868
- data: readMail.readMail
2869
- };
2870
- }
2871
-
2872
- async unreadMail(_ref35) {
2873
- let {
2874
- mailId
2875
- } = _ref35;
2876
- const {
2877
- unreadMail
2878
- } = await this.client("mutation")({
2879
- unreadMail: [{
2880
- mailId
2881
- }, {
2882
- "...on ErrorAccessDenied": {
2883
- __typename: true,
2884
- message: true
2885
- },
2886
- "...on ErrorBasic": {
2887
- __typename: true,
2888
- message: true
2889
- },
2890
- "...on ErrorNotFound": {
2891
- __typename: true,
2892
- message: true
2893
- },
2894
- "...on UnreadMailResponse": {
2895
- __typename: true,
2896
- unreadMail: true
2897
- }
2898
- }]
2899
- });
2900
-
2901
- if (!unreadMail) {
2902
- return null;
2903
- }
2904
-
2905
- if (unreadMail.__typename === "ErrorAccessDenied") {
2906
- return unreadMail;
2907
- }
2908
-
2909
- if (unreadMail.__typename === "ErrorBasic") {
2910
- return unreadMail;
2911
- }
2912
-
2913
- if (unreadMail.__typename === "ErrorNotFound") {
2914
- return unreadMail;
2915
- }
2916
-
2917
- if (!unreadMail.unreadMail) {
2918
- return null;
2919
- }
2920
-
2921
- return {
2922
- __typename: "SuccessResponse",
2923
- data: unreadMail.unreadMail
2924
- };
2925
- }
2926
-
2927
- async appSettings() {
2928
- var _user$user;
2929
-
2930
- const {
2931
- user
2932
- } = await this.client("query")({
2933
- user: [{}, {
2934
- "...on ErrorNotFound": {
2935
- __typename: true,
2936
- message: true
2937
- },
2938
- "...on UserResponse": {
2939
- __typename: true,
2940
- user: {
2941
- appSettings: {
2942
- cloudFileDaysForDelete: true,
2943
- cloudFolderDaysForDelete: true,
2944
- historyFileDaysForDelete: true,
2945
- historyMaxFileCount: true
2946
- }
2947
- }
2948
- }
2949
- }]
2950
- });
2951
-
2952
- if (!user) {
2953
- return null;
2954
- }
2955
-
2956
- if (user.__typename === "ErrorNotFound") {
2957
- return user;
2958
- }
2959
-
2960
- if (!((_user$user = user.user) != null && _user$user.appSettings)) {
2961
- return null;
2962
- }
2963
-
2964
- return {
2965
- __typename: "SuccessResponse",
2966
- data: user.user.appSettings
2967
- };
2968
- }
2969
-
2970
- async updateAppSettings(settings) {
2971
- const {
2972
- updateAppSettings
2973
- } = await this.client("mutation")({
2974
- updateAppSettings: [settings, {
2975
- "...on ErrorAccessDenied": {
2976
- __typename: true,
2977
- message: true
2978
- },
2979
- "...on ErrorBasic": {
2980
- __typename: true,
2981
- message: true
2982
- },
2983
- "...on UpdateAppSettingsResponse": {
2984
- __typename: true,
2985
- updateAppSettings: {
2986
- cloudFileDaysForDelete: true,
2987
- cloudFolderDaysForDelete: true,
2988
- historyFileDaysForDelete: true,
2989
- historyMaxFileCount: true
2990
- }
2991
- }
2992
- }]
2993
- });
2994
-
2995
- if (!updateAppSettings) {
2996
- return null;
2997
- }
2998
-
2999
- if (updateAppSettings.__typename === "ErrorAccessDenied") {
3000
- return updateAppSettings;
3001
- }
3002
-
3003
- if (updateAppSettings.__typename === "ErrorBasic") {
3004
- return updateAppSettings;
3005
- }
3006
-
3007
- return {
3008
- __typename: "SuccessResponse",
3009
- data: updateAppSettings.updateAppSettings
3010
- };
3011
- }
3012
-
3013
- async receivedMails() {
3014
- const {
3015
- user
3016
- } = await this.client("query", {
3017
- scalars: {
3018
- DateTime: {
3019
- decode: e => new Date(e),
3020
- encode: e => e.toISOString()
3021
- }
3022
- }
3023
- })({
3024
- user: [{}, {
3025
- "...on ErrorNotFound": {
3026
- __typename: true,
3027
- message: true
3028
- },
3029
- "...on UserResponse": {
3030
- __typename: true,
3031
- user: {
3032
- receivedMails: mailSelector
3033
- }
3034
- }
3035
- }]
3036
- });
3037
-
3038
- if (!user) {
3039
- return null;
3040
- }
3041
-
3042
- if (user.__typename === "ErrorNotFound") {
3043
- return user;
3044
- }
3045
-
3046
- if (!user.user) {
3047
- return null;
3048
- } // TODO get actual mails on this app only
3049
-
3050
-
3051
- const receivedMails = new Array();
3052
-
3053
- for (const m of user.user.receivedMails) {
3054
- const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
3055
-
3056
- if (mail) {
3057
- receivedMails.push(mail);
3058
- }
3059
- }
3060
-
3061
- return {
3062
- __typename: "SuccessResponse",
3063
- data: receivedMails
3064
- };
3065
- }
3066
-
3067
- async sentMails() {
3068
- const {
3069
- user
3070
- } = await this.client("query", {
3071
- scalars: {
3072
- DateTime: {
3073
- decode: e => new Date(e),
3074
- encode: e => e.toISOString()
3075
- }
3076
- }
3077
- })({
3078
- user: [{}, {
3079
- "...on ErrorNotFound": {
3080
- __typename: true,
3081
- message: true
3082
- },
3083
- "...on UserResponse": {
3084
- __typename: true,
3085
- user: {
3086
- sentMails: mailSelector
3087
- }
3088
- }
3089
- }]
3090
- });
3091
-
3092
- if (!user) {
3093
- return null;
3094
- }
3095
-
3096
- if (user.__typename === "ErrorNotFound") {
3097
- return user;
3098
- }
3099
-
3100
- if (!user.user) {
3101
- return null;
3102
- } // TODO get actual mails on this app only
3103
-
3104
-
3105
- const sentMails = new Array();
3106
-
3107
- for (const m of user.user.sentMails) {
3108
- const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
3109
-
3110
- if (mail) {
3111
- sentMails.push(mail);
3112
- }
3113
- }
3114
-
3115
- return {
3116
- __typename: "SuccessResponse",
3117
- data: sentMails
3118
- };
3119
- }
3120
-
3121
- async draftMails() {
3122
- const {
3123
- user
3124
- } = await this.client("query", {
3125
- scalars: {
3126
- DateTime: {
3127
- decode: e => new Date(e),
3128
- encode: e => e.toISOString()
3129
- }
3130
- }
3131
- })({
3132
- user: [{}, {
3133
- "...on ErrorNotFound": {
3134
- __typename: true,
3135
- message: true
3136
- },
3137
- "...on UserResponse": {
3138
- __typename: true,
3139
- user: {
3140
- draftMails: mailSelector
3141
- }
3142
- }
3143
- }]
3144
- });
3145
-
3146
- if (!user) {
3147
- return null;
3148
- }
3149
-
3150
- if (user.__typename === "ErrorNotFound") {
3151
- return user;
3152
- }
3153
-
3154
- if (!user.user) {
3155
- return null;
3156
- } // TODO get actual mails on this app only
3157
-
3158
-
3159
- const draftMails = new Array();
3160
-
3161
- for (const m of user.user.draftMails) {
3162
- const draft = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
3163
-
3164
- if (draft) {
3165
- draftMails.push(draft);
3166
- }
3167
- }
3168
-
3169
- return {
3170
- __typename: "SuccessResponse",
3171
- data: draftMails
3172
- };
3173
- }
3174
-
3175
- async unreadReceivedMailsCount() {
3176
- const {
3177
- unreadReceivedMailsCount
3178
- } = await this.client("query")({
3179
- unreadReceivedMailsCount: {
3180
- "...on ErrorAccessDenied": {
3181
- __typename: true,
3182
- message: true
3183
- },
3184
- "...on UnreadReceivedMailsCountResponse": {
3185
- __typename: true,
3186
- count: true
3187
- }
3188
- }
3189
- });
3190
-
3191
- if (!unreadReceivedMailsCount) {
3192
- return null;
3193
- }
3194
-
3195
- if (unreadReceivedMailsCount.__typename === "ErrorAccessDenied") {
3196
- return unreadReceivedMailsCount;
3197
- }
3198
-
3199
- return {
3200
- __typename: "SuccessResponse",
3201
- data: unreadReceivedMailsCount.count
3202
- };
3203
- }
3204
-
3205
45
  }
3206
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJreSIsImF4aW9zIiwiQmFzZUNsaWVudCIsIm5vZGVzQ2FjaGUiLCJmaWxlc0NhY2hlIiwidXNlcnNDYWNoZSIsInNlY3JldHN0cmVhbUtleWdlbiIsImVuY3J5cHRTZWNyZXRzdHJlYW0iLCJjb21wcmVzcyIsInVuY29tcHJlc3MiLCJncWxOb2RlVG9FeHRlcm5hbCIsImdxbE5vZGVUb0V4dGVybmFsTm9kZUZ1bGwiLCJncWxOb2RlVG9JbnRlcm5hbCIsImludGVybmFsTm9kZVRvTm9kZSIsImdxbEZpbGVUb0V4dGVybmFsIiwic29kaXVtIiwiZGVjcnlwdENyeXB0b0JveCIsImVuY3J5cHRDcnlwdG9Cb3giLCJnZW5lcmF0ZSIsIm1kNSIsImVuY3J5cHQiLCJkZWNyeXB0IiwiY2h1bmtzIiwiY29uY2F0ZW5hdGUiLCJlbnVtZXJhdGUiLCJwcm9taXNlQWxsTGltaXQiLCJmaWxlU2VsZWN0b3IiLCJtYWlsU2VsZWN0b3IiLCJub2RlRnVsbFNlbGVjdG9yIiwibm9kZVNlbGVjdG9yIiwiY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwiLCJkZWNvZGUiLCJzZXJpYWxpemUiLCJlbmNyeXB0TmFtZSIsIm5hbWUiLCJuYW1lS2V5IiwiZGF0YSIsImZyb21faGV4IiwiZnJvbV9zdHJpbmciLCJuYW1lRW5jcnlwdGVkIiwidG9faGV4IiwiU2VjcmVjeUNsaWVudCIsImNvbnN0cnVjdG9yIiwidWFTZXNzaW9uIiwidWFLZXlzIiwidWFKd3QiLCJlbnYiLCJwZXJOb2RlIiwibm9kZUlkIiwicHVibGljS2V5Iiwibm9kZSIsImdldCIsImlkIiwiYWNjZXNzIiwicHJpdmF0ZUtleSIsImZpbGVzIiwiaGlzdG9yeSIsIm1hcCIsImYiLCJrZXkiLCJfZWFjaFVzZXIiLCJzdWJqZWN0IiwiYm9keSIsImlkT3JNYWlsIiwidSIsInJlcSIsInVzZXIiLCJ1c2VySWQiLCJ3aXRoUHVibGljS2V5IiwiX190eXBlbmFtZSIsIkVycm9yIiwicmVjaXBpZW50c0ZpbGVzIiwiQXJyYXkiLCJmaWxlSW5IaXN0b3J5IiwiZmlsZSIsInB1c2giLCJmaWxlS2V5IiwicmVjaXBpZW50SWQiLCJqd3QiLCJqd3REZWNvZGVkIiwiYXBwVXNlcklkIiwic3ViIiwiYWRkRmlsZVRvSGlzdG9yeSIsImZpbGVJZCIsImNsaWVudCIsIm1lc3NhZ2UiLCJmaW5kIiwidXNlcnMiLCJmaWx0ZXIiLCJpbnB1dCIsInNoYXJlRmlsZUluSGlzdG9yeSIsInJlc3VsdCIsInVwbG9hZEZpbGUiLCJlbmNyeXB0UHJvZ3Jlc3MiLCJ1cGxvYWRQcm9ncmVzcyIsInNpZ25hbCIsImZpbGVCdWZmZXIiLCJGaWxlIiwiVWludDhBcnJheSIsImFycmF5QnVmZmVyIiwiY29tcHJlc3NlZCIsImVuY3J5cHRlZEZpbGUiLCJtZDVGaWxlIiwibWQ1RW5jcnlwdGVkIiwiZW5jcnlwdGVkRmlsZUtleSIsInNjYWxhcnMiLCJKc29uIiwiZW5jb2RlIiwiZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwYXJzZSIsIkRhdGVUaW1lIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiQmlnSW50IiwidG9TdHJpbmciLCJmaWxlU2l6ZSIsImJ5dGVMZW5ndGgiLCJmaWxlU2l6ZUJlZm9yZSIsImZpbGVQYXJ0U2l6ZSIsInBhcnRzIiwiZmllbGRzIiwib3JkZXIiLCJ1cmwiLCJ0b3RhbCIsImN1cnJlbnQiLCJwZXJjZW50IiwibGVuZ3RoIiwidXBsb2FkUGFydEVuZGVkIiwidXBsb2FkRmlsZVBhcnRFbmQiLCJ1cGxvYWRFbmRlZCIsInVwbG9hZEZpbGVFbmQiLCJjaHVua1BhcnRzIiwiaW5kZXgiLCJjaHVuayIsIk51bWJlciIsInByb2dyZXNzUGFydHMiLCJvblByb2dyZXNzIiwicGFydCIsInByb2dyZXNzRXZlbnQiLCJPYmplY3QiLCJ2YWx1ZXMiLCJyZWR1Y2UiLCJwcnYiLCJjdXIiLCJsb2FkZWQiLCJieVBhcnQiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwicCIsInZhbHVlIiwiZW50cmllcyIsImFwcGVuZCIsIkJsb2IiLCJwb3N0Iiwib25VcGxvYWRQcm9ncmVzcyIsInVwbG9hZEZpbGVJbkNsb3VkIiwic2F2ZUluQ2xvdWQiLCJsb2dvdXQiLCJzZXNzaW9uSWQiLCJjbGVhciIsImNyZWF0ZUZvbGRlciIsInBhcmVudEZvbGRlcklkIiwiZW5jcnlwdGVkTmFtZSIsImVuY3J5cHRlZEtleSIsImZvbGRlciIsInBhcmVudCIsIlByb21pc2UiLCJhbGwiLCJyaWdodHMiLCJzaGFyZU5vZGUiLCJkZWxldGVkIiwibWFpbCIsImRlbGV0ZWROb2RlcyIsIm5vZGVzIiwic2hhcmVkTm9kZXMiLCJub2Rlc1NoYXJlZFdpdGhNZSIsInR5cGUiLCJkZWxldGVOb2RlU2hhcmluZyIsImR1cGxpY2F0ZU5vZGUiLCJmb2xkZXJJZCIsImN1c3RvbU5hbWUiLCJkZWxldGVOb2RlQ2xvdWRUcmFzaCIsImlkcyIsInNoYXJlTm9kZXMiLCJzaGFyZU5vZGVGaW5pc2giLCJ1cGRhdGVOb2RlIiwiaXNGYXZvcml0ZSIsImRlbGV0ZWRBdCIsImRlbGV0ZWRNYWlscyIsIm1haWxUeXBlIiwibWFpbHMiLCJtIiwidXBkYXRlQXBwTm90aWZpY2F0aW9ucyIsIm5vdGlmaWNhdGlvbnMiLCJlbmFibGVBbGwiLCJjbG91ZCIsImRpc2FibGVBbGxVbnRpbCIsImFwcE5vdGlmaWNhdGlvbnMiLCJjcmVhdGVNYWlsIiwiY3VzdG9tTWVzc2FnZSIsImNyZWF0ZURyYWZ0TWFpbCIsInNlbmREcmFmdE1haWwiLCJtYWlsSW50ZWdyaXR5SWQiLCJ3YWl0aW5nUmVjZWl2ZWRNYWlscyIsImRhdGUiLCJhdHRhY2htZW50c0NvdW50Iiwic2VuZGVyIiwiZmlyc3RuYW1lIiwibGFzdG5hbWUiLCJlbWFpbCIsInJlY2lwaWVudHMiLCJ0ZW1wb3JhcnlSZWNpcGllbnRzIiwidXBkYXRlRHJhZnRNYWlsIiwiZHJhZnRJZCIsInJlY2lwaWVudHNJZHMiLCJyZXBseVRvIiwiZHJhZnRzIiwiZHJhZnRNYWlscyIsImRyYWZ0IiwiZCIsImhhc2hLZXkiLCJoYXNoIiwicmFuZG9tYnl0ZXNfYnVmIiwiY3J5cHRvX2dlbmVyaWNoYXNoX0tFWUJZVEVTIiwiY3J5cHRvX2dlbmVyaWNoYXNoIiwiY3J5cHRvX2dlbmVyaWNoYXNoX0JZVEVTIiwic2VuZGVyRmlsZXMiLCJkZWxldGVEcmFmdE1haWwiLCJkZWxldGVNYWlsVHJhc2giLCJlbXB0eU1haWxUcmFzaCIsImVtcHR5Q2xvdWRUcmFzaCIsInJlY292ZXJOb2RlIiwicmVjb3Zlck1haWwiLCJtYWlsSWQiLCJkZWxldGVGaWxlIiwiZGVsZXRlTm9kZSIsIm1vdmVOb2RlcyIsIm5vZGVJZHMiLCJwYXJlbnROb2RlSWQiLCJmb2xkZXJTaXplIiwic2l6ZSIsInNpemVCZWZvcmUiLCJkZWxldGVNYWlsIiwiaGFzIiwicmVjZWl2ZWRNYWlscyIsInNvbWUiLCJmaWxlTWFpbCIsImVuY3J5cHRlZE5hbWVLZXkiLCJmaWxlbmFtZSIsIm1lIiwiaW5jbHVkZXMiLCJvdGhlcnMiLCJkYkdldCIsImZpZWxkIiwianNvbiIsInJlcyIsImRiU2V0IiwiZGJTZWFyY2giLCJzZWFyY2giLCJkcmFmdE1haWxJZCIsInNlbmRXYWl0aW5nRW1haWxzIiwic2VudE1haWxzIiwiZmlsdGVyZWQiLCJzZW5kT25lTWFpbCIsInJlY2lwaWVudCIsImZpbGVDb250ZW50Iiwib25Eb3dubG9hZFByb2dyZXNzIiwicHJvZ3Jlc3NEZWNyeXB0IiwiQnl0ZXMiLCJjb25zb2xlIiwibG9nIiwiZnJvbSIsImNvbnRlbnRVcmwiLCJ0b3RhbFNpemUiLCJjb250ZW50IiwibWF5YmVQYXJ0cyIsIm1heWJlQ29udGVudCIsInNlbmRlclB1YmxpY0tleSIsInRyYW5zZmVycmVkQnl0ZXMiLCJ0b3RhbEJ5dGVzIiwiZW5jcnlwdGVkQ29udGVudEZyb21QYXJ0cyIsImZpbGVQYXJ0cyIsImJ1ZiIsInRpbWVvdXQiLCJwciIsIm1kNVBhcnQiLCJzb3J0IiwiYSIsImIiLCJmaW5hbGl6ZSIsImVuY3J5cHRlZENvbnRlbnQiLCJzcmMiLCJtZDVDb250ZW50IiwicmVhZE1haWwiLCJ1bnJlYWRNYWlsIiwiYXBwU2V0dGluZ3MiLCJjbG91ZEZpbGVEYXlzRm9yRGVsZXRlIiwiY2xvdWRGb2xkZXJEYXlzRm9yRGVsZXRlIiwiaGlzdG9yeUZpbGVEYXlzRm9yRGVsZXRlIiwiaGlzdG9yeU1heEZpbGVDb3VudCIsInVwZGF0ZUFwcFNldHRpbmdzIiwic2V0dGluZ3MiLCJ1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQiLCJjb3VudCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXG5pbXBvcnQgdHlwZSB7IE1haWxUeXBlLCBOb2RlVHlwZSB9IGZyb20gXCIuLy4uL3pldXMvaW5kZXhcIjtcbmltcG9ydCB0eXBlIHsgRG93bmxvYWRQcm9ncmVzcyB9IGZyb20gXCJreVwiO1xuaW1wb3J0IGt5IGZyb20gXCJreVwiO1xuaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHR5cGUgeyBGb2xkZXJTaXplLCBTdWNjZXNzUmVzcG9uc2UsIFVzZXJEYXRhIH0gZnJvbSBcIi4uL0Jhc2VDbGllbnQuanNcIjtcbmltcG9ydCB7IEJhc2VDbGllbnQgfSBmcm9tIFwiLi4vQmFzZUNsaWVudC5qc1wiO1xuaW1wb3J0IHsgbm9kZXNDYWNoZSwgZmlsZXNDYWNoZSwgdXNlcnNDYWNoZSB9IGZyb20gXCIuLi9jYWNoZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9ncmVzcyB9IGZyb20gXCIuLi9jcnlwdG8vZmlsZS5qc1wiO1xuaW1wb3J0IHsgc2VjcmV0c3RyZWFtS2V5Z2VuLCBlbmNyeXB0U2VjcmV0c3RyZWFtIH0gZnJvbSBcIi4uL2NyeXB0by9maWxlLmpzXCI7XG5pbXBvcnQgeyBjb21wcmVzcywgdW5jb21wcmVzcyB9IGZyb20gXCIuLi9taW5pZnkvaW5kZXguanNcIjtcbmltcG9ydCB7XG4gIGdxbE5vZGVUb0V4dGVybmFsLFxuICBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsLFxuICBncWxOb2RlVG9JbnRlcm5hbCxcbiAgaW50ZXJuYWxOb2RlVG9Ob2RlXG59IGZyb20gXCIuL2NvbnZlcnQvbm9kZS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBNYWlsRmlsZUlucHV0LFxuICBSZWNlaXZlZE1haWwsXG4gIFNlbnRNYWlsLFxuICBOb2RlLFxuICBOb2RlRnVsbCxcbiAgVXNlckFwcFNldHRpbmdzLFxuICBVc2VyQXBwTm90aWZpY2F0aW9ucyxcbiAgRmlsZU1ldGFkYXRhIGFzIFNlY3JlY3lGaWxlLFxuICBXYWl0aW5nUmVjZWl2ZWRNYWlsLFxuICBEcmFmdE1haWwsXG4gIE1haWxSZWNpcGllbnRJbnB1dCxcbiAgU2hhcmVOb2Rlc0lucHV0LFxuICBOYW1lS2V5SW5wdXQsXG4gIE1haWwsXG4gIFNoYXJlRmlsZUluSGlzdG9yeUlucHV0LFxuICBGaWxlUGFydFJlc3BvbnNlLFxuICBGaWxlQ29udGVudFBhcnRcbn0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IGdxbEZpbGVUb0V4dGVybmFsIH0gZnJvbSBcIi4vY29udmVydC9maWxlLmpzXCI7XG5pbXBvcnQgeyBzb2RpdW0gfSBmcm9tIFwiLi4vc29kaXVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleVBhaXIgfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkZWNyeXB0Q3J5cHRvQm94LCBlbmNyeXB0Q3J5cHRvQm94IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZWNyZWN5RW52IH0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2hvcnRpZFwiO1xuaW1wb3J0IHsgbWQ1IH0gZnJvbSBcIi4uL3dvcmtlci9tZDUuanNcIjtcbmltcG9ydCB7IGVuY3J5cHQsIGRlY3J5cHQgfSBmcm9tIFwiLi4vd29ya2VyL3NvZGl1bS5qc1wiO1xuaW1wb3J0IHtcbiAgY2h1bmtzLFxuICBjb25jYXRlbmF0ZSxcbiAgZW51bWVyYXRlLFxuICBwcm9taXNlQWxsTGltaXRcbn0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBmaWxlU2VsZWN0b3IsXG4gIG1haWxTZWxlY3RvcixcbiAgbm9kZUZ1bGxTZWxlY3RvcixcbiAgbm9kZVNlbGVjdG9yXG59IGZyb20gXCIuL3R5cGVzL3NlbGVjdG9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSaWdodHMgfSBmcm9tIFwiLi4vemV1cy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwgfSBmcm9tIFwiLi9jb252ZXJ0L21haWwuanNcIjtcbmltcG9ydCB0eXBlIHsgSnd0UGF5bG9hZCB9IGZyb20gXCJqc29ud2VidG9rZW5cIjtcbmltcG9ydCB7IGRlY29kZSB9IGZyb20gXCJqc29ud2VidG9rZW5cIjtcbi8vIGltcG9ydCB7IG1kNSB9IGZyb20gXCIuLi93b3JrZXIvaW5kZXguanNcIjtcbi8vIGltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgRXJyb3JBY2Nlc3NEZW5pZWQsXG4gIEVycm9yTm90Rm91bmQsXG4gIEVycm9yQmFzaWMsXG4gIEVycm9yTm90RXhpc3QsXG4gIEVycm9yTGltaXRcbn0gZnJvbSBcIi4uL2Vycm9yLmpzXCI7XG5pbXBvcnQgeyBzZXJpYWxpemUgfSBmcm9tIFwiYnNvblwiO1xuXG5leHBvcnQgdHlwZSBOZXdNYWlsID0ge1xuICBib2R5OiBzdHJpbmc7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgZmlsZXM6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXTtcbiAgcmVjaXBpZW50c0lkczogc3RyaW5nW107XG4gIHJlcGx5VG8/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xufTtcbmV4cG9ydCB0eXBlIFByb2dyZXNzQ2FsbGJhY2sgPSAocHJvZ3Jlc3M6IFByb2dyZXNzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5jb25zdCBlbmNyeXB0TmFtZSA9IGFzeW5jIChuYW1lOiBzdHJpbmcsIG5hbWVLZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgZW5jcnlwdFNlY3JldHN0cmVhbShcbiAgICBzb2RpdW0uZnJvbV9oZXgobmFtZUtleSksXG4gICAgc29kaXVtLmZyb21fc3RyaW5nKG5hbWUpXG4gICk7XG4gIGNvbnN0IG5hbWVFbmNyeXB0ZWQgPSBzb2RpdW0udG9faGV4KGRhdGEpO1xuICByZXR1cm4gbmFtZUVuY3J5cHRlZDtcbn07XG5cbmV4cG9ydCBjbGFzcyBTZWNyZWN5Q2xpZW50IGV4dGVuZHMgQmFzZUNsaWVudCB7XG4gIGp3dDogc3RyaW5nO1xuXG4gIGp3dERlY29kZWQ6IEp3dFBheWxvYWQ7XG5cbiAgI2tleXM6IEtleVBhaXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdWFTZXNzaW9uOiBzdHJpbmcsXG4gICAgdWFLZXlzOiBLZXlQYWlyLFxuICAgIHVhSnd0OiBzdHJpbmcsXG4gICAgZW52OiBTZWNyZWN5RW52XG4gICkge1xuICAgIHN1cGVyKHVhU2Vzc2lvbiwgZW52KTtcbiAgICB0aGlzLmp3dCA9IHVhSnd0O1xuICAgIHRoaXMuand0RGVjb2RlZCA9IGRlY29kZSh1YUp3dCkgYXMgSnd0UGF5bG9hZDtcbiAgICB0aGlzLiNrZXlzID0gdWFLZXlzO1xuICB9XG5cbiAgZ2V0IHB1YmxpY0tleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNrZXlzLnB1YmxpY0tleTtcbiAgfVxuXG4gIGdldCBhcHBVc2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5qd3REZWNvZGVkLnN1YiA/PyBcIlwiO1xuICB9XG5cbiAgYXN5bmMgYWRkRmlsZVRvSGlzdG9yeSh7XG4gICAgZmlsZUlkLFxuICAgIG5vZGVJZFxuICB9OiB7XG4gICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxOb2RlPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBhZGRGaWxlVG9IaXN0b3J5IH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIGFkZEZpbGVUb0hpc3Rvcnk6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBBZGRGaWxlVG9IaXN0b3J5UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGFkZEZpbGVUb0hpc3Rvcnk6IG5vZGVTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFhZGRGaWxlVG9IaXN0b3J5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYWRkRmlsZVRvSGlzdG9yeS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBhZGRGaWxlVG9IaXN0b3J5O1xuICAgIH1cblxuICAgIGlmIChhZGRGaWxlVG9IaXN0b3J5Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RFeGlzdFwiKSB7XG4gICAgICByZXR1cm4gYWRkRmlsZVRvSGlzdG9yeTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gYXdhaXQgZ3FsTm9kZVRvSW50ZXJuYWwoXG4gICAgICBhZGRGaWxlVG9IaXN0b3J5LmFkZEZpbGVUb0hpc3RvcnksXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKTtcbiAgICBjb25zdCBmaWxlID0gbm9kZS5oaXN0b3J5LmZpbmQoZiA9PiBmLmlkID09PSBmaWxlSWQpO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICBjb25zdCB1c2VycyA9IG5vZGUudXNlcnMuZmlsdGVyKFxuICAgICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSAhPT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBpbnB1dDogU2hhcmVGaWxlSW5IaXN0b3J5SW5wdXQgPSB7XG4gICAgICAgIGZpbGVJZDogZmlsZS5pZCxcbiAgICAgICAgdXNlcnM6IHVzZXJzLm1hcCgoW3VdKSA9PiAoe1xuICAgICAgICAgIGlkOiB1LmlkLFxuICAgICAgICAgIGtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChmaWxlLmtleSksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH0pKVxuICAgICAgfTtcblxuICAgICAgYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICAgIHNoYXJlRmlsZUluSGlzdG9yeTogW1xuICAgICAgICAgIHsgaW5wdXQsIG5vZGVJZCB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gU2hhcmVGaWxlSW5IaXN0b3J5UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBzaGFyZUZpbGVJbkhpc3Rvcnk6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBpbnRlcm5hbE5vZGVUb05vZGUobm9kZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdXBsb2FkRmlsZSh7XG4gICAgZmlsZSxcbiAgICBlbmNyeXB0UHJvZ3Jlc3MsXG4gICAgdXBsb2FkUHJvZ3Jlc3MsXG4gICAgc2lnbmFsXG4gIH06IHtcbiAgICBmaWxlOiBnbG9iYWxUaGlzLkZpbGUgfCBVaW50OEFycmF5O1xuICAgIGVuY3J5cHRQcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgdXBsb2FkUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxzdHJpbmc+XG4gICAgfCBFcnJvckFjY2Vzc0RlbmllZFxuICAgIHwgRXJyb3JMaW1pdFxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBmaWxlS2V5ID0gc2VjcmV0c3RyZWFtS2V5Z2VuKCk7XG4gICAgY29uc3QgZmlsZUJ1ZmZlciA9XG4gICAgICBmaWxlIGluc3RhbmNlb2YgRmlsZSA/IG5ldyBVaW50OEFycmF5KGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKSkgOiBmaWxlO1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBjb21wcmVzcyhmaWxlQnVmZmVyKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGRhdGE6IGVuY3J5cHRlZEZpbGUsXG4gICAgICBtZDU6IG1kNUZpbGUsXG4gICAgICBtZDVFbmNyeXB0ZWRcbiAgICB9ID0gYXdhaXQgZW5jcnlwdChmaWxlS2V5LCBjb21wcmVzc2VkLCBlbmNyeXB0UHJvZ3Jlc3MsIHNpZ25hbCk7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRGaWxlS2V5ID0gZW5jcnlwdENyeXB0b0JveChcbiAgICAgIGZpbGVLZXksXG4gICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICk7XG5cbiAgICBjb25zdCB7IHVwbG9hZEZpbGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBKc29uOiB7XG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gSlNPTi5zdHJpbmdpZnkoZSksXG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gSlNPTi5wYXJzZShlIGFzIHN0cmluZylcbiAgICAgICAgfSxcbiAgICAgICAgRGF0ZVRpbWU6IHtcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBuZXcgRGF0ZShlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKVxuICAgICAgICB9LFxuICAgICAgICBCaWdJbnQ6IHtcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBCaWdJbnQoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIGJpZ2ludCkudG9TdHJpbmcoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgdXBsb2FkRmlsZTogW1xuICAgICAgICB7XG4gICAgICAgICAgZmlsZVNpemU6IGVuY3J5cHRlZEZpbGUuYnl0ZUxlbmd0aCxcbiAgICAgICAgICBmaWxlU2l6ZUJlZm9yZTogZmlsZUJ1ZmZlci5ieXRlTGVuZ3RoLFxuICAgICAgICAgIGZpbGVLZXk6IHNvZGl1bS50b19oZXgoZW5jcnlwdGVkRmlsZUtleSksXG4gICAgICAgICAgbWQ1RW5jcnlwdGVkLFxuICAgICAgICAgIG1kNTogbWQ1RmlsZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckxpbWl0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXBsb2FkRmlsZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1cGxvYWRGaWxlOiB7XG4gICAgICAgICAgICAgIGZpbGVJZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZmlsZVBhcnRTaXplOiB0cnVlLFxuICAgICAgICAgICAgICBwYXJ0czoge1xuICAgICAgICAgICAgICAgIGZpZWxkczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvcmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB1cmw6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1cGxvYWRGaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXBsb2FkRmlsZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiB1cGxvYWRGaWxlO1xuICAgIH1cblxuICAgIGlmICh1cGxvYWRGaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JMaW1pdFwiKSB7XG4gICAgICByZXR1cm4gdXBsb2FkRmlsZTtcbiAgICB9XG5cbiAgICBpZiAodXBsb2FkRmlsZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVwbG9hZEZpbGU7XG4gICAgfVxuXG4gICAgaWYgKCF1cGxvYWRGaWxlLnVwbG9hZEZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHVwbG9hZFByb2dyZXNzPy4oe1xuICAgICAgdG90YWw6IGVuY3J5cHRlZEZpbGUuYnl0ZUxlbmd0aCxcbiAgICAgIGN1cnJlbnQ6IDAsXG4gICAgICBwZXJjZW50OiAwXG4gICAgfSk7XG5cbiAgICBpZiAodXBsb2FkRmlsZS51cGxvYWRGaWxlLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdXBsb2FkUHJvZ3Jlc3M/Lih7XG4gICAgICAgIHRvdGFsOiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgIGN1cnJlbnQ6IGVuY3J5cHRlZEZpbGUuYnl0ZUxlbmd0aCxcbiAgICAgICAgcGVyY2VudDogMVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IHVwbG9hZEZpbGUudXBsb2FkRmlsZS5maWxlSWRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdXBsb2FkUGFydEVuZGVkID0gYXN5bmMgKFxuICAgICAgbWQ1OiBzdHJpbmcsXG4gICAgICBvcmRlcjogbnVtYmVyXG4gICAgKTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+ID0+IHtcbiAgICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB1cGxvYWRGaWxlUGFydEVuZCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICAgIHVwbG9hZEZpbGVQYXJ0RW5kOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZUlkLFxuICAgICAgICAgICAgbWQ1LFxuICAgICAgICAgICAgb3JkZXJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBVcGxvYWRGaWxlUGFydEVuZFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgdXBsb2FkRmlsZVBhcnRFbmQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXVwbG9hZEZpbGVQYXJ0RW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodXBsb2FkRmlsZVBhcnRFbmQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICAgIHJldHVybiB1cGxvYWRGaWxlUGFydEVuZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogdXBsb2FkRmlsZVBhcnRFbmQudXBsb2FkRmlsZVBhcnRFbmRcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IHVwbG9hZEVuZGVkID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgICBTdWNjZXNzUmVzcG9uc2U8c3RyaW5nPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgICA+ID0+IHtcbiAgICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB1cGxvYWRGaWxlRW5kIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgICAgdXBsb2FkRmlsZUVuZDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBVcGxvYWRGaWxlRW5kUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICB1cGxvYWRGaWxlRW5kOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF1cGxvYWRGaWxlRW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodXBsb2FkRmlsZUVuZC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgICAgcmV0dXJuIHVwbG9hZEZpbGVFbmQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGxvYWRGaWxlRW5kLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICAgIHJldHVybiB1cGxvYWRGaWxlRW5kO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVwbG9hZEZpbGVFbmQudXBsb2FkRmlsZUVuZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogdXBsb2FkRmlsZUVuZC51cGxvYWRGaWxlRW5kXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBjaHVua1BhcnRzID0gbmV3IEFycmF5PHtcbiAgICAgIG9yZGVyOiBudW1iZXI7XG4gICAgICBkYXRhOiBVaW50OEFycmF5O1xuICAgICAgbWQ1OiBzdHJpbmc7XG4gICAgfT4oKTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBjaHVua10gb2YgZW51bWVyYXRlKFxuICAgICAgY2h1bmtzKGVuY3J5cHRlZEZpbGUsIE51bWJlcih1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZVBhcnRTaXplKSlcbiAgICApKSB7XG4gICAgICBjaHVua1BhcnRzLnB1c2goe1xuICAgICAgICBvcmRlcjogaW5kZXggKyAxLFxuICAgICAgICBkYXRhOiBjaHVuayxcbiAgICAgICAgbWQ1OiBhd2FpdCBtZDUoY2h1bmspXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9ncmVzc1BhcnRzOiBSZWNvcmQ8bnVtYmVyLCBQcm9ncmVzc0V2ZW50PiA9IHt9O1xuICAgIGNvbnN0IG9uUHJvZ3Jlc3MgPSAocGFydDogbnVtYmVyLCBwcm9ncmVzc0V2ZW50OiBQcm9ncmVzc0V2ZW50KTogdm9pZCA9PiB7XG4gICAgICBwcm9ncmVzc1BhcnRzW3BhcnRdID0gcHJvZ3Jlc3NFdmVudDtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBPYmplY3QudmFsdWVzKHByb2dyZXNzUGFydHMpLnJlZHVjZShcbiAgICAgICAgKHBydiwgY3VyKSA9PiBwcnYgKyBjdXIubG9hZGVkLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgdXBsb2FkUHJvZ3Jlc3M/Lih7XG4gICAgICAgIHBlcmNlbnQ6IGN1cnJlbnQgLyBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgIHRvdGFsOiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgIGN1cnJlbnRcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBieVBhcnQgPSBhc3luYyAocGFydDogRmlsZVBhcnRSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKCF1cGxvYWRGaWxlLnVwbG9hZEZpbGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtQYXJ0cy5maW5kKHAgPT4gcC5vcmRlciA9PT0gcGFydC5vcmRlcik7XG4gICAgICBpZiAoIWNodW5rKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnQuZmllbGRzKSkge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAgIFwiZmlsZVwiLFxuICAgICAgICBuZXcgQmxvYihbY2h1bmsuZGF0YV0pLFxuICAgICAgICBgJHt1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZUlkfS0ke2NodW5rLm9yZGVyfWBcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGF4aW9zLnBvc3QocGFydC51cmwsIGZvcm1EYXRhLCB7XG4gICAgICAgIG9uVXBsb2FkUHJvZ3Jlc3M6IHByb2dyZXNzRXZlbnQgPT5cbiAgICAgICAgICBvblByb2dyZXNzKHBhcnQub3JkZXIsIHByb2dyZXNzRXZlbnQpLFxuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB1cGxvYWRQYXJ0RW5kZWQoY2h1bmsubWQ1LCBjaHVuay5vcmRlcik7XG4gICAgICAvLyBpZiAoKGUgYXMgYW55KS5yZXNwb25zZS5zdGF0dXMgPT09IDApIHtcbiAgICAgIC8vICAgLy8gVE9ETyBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2t5L2lzc3Vlcy8zMDVcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIHRocm93IGU7XG4gICAgICAvLyB9XG4gICAgfTtcblxuICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlQWxsTGltaXQoXG4gICAgICAzLFxuICAgICAgdXBsb2FkRmlsZS51cGxvYWRGaWxlLnBhcnRzLm1hcChwID0+ICgpOiBQcm9taXNlPHZvaWQ+ID0+IGJ5UGFydChwKSlcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXBsb2FkRW5kZWQoKTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0LmRhdGFcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdXBsb2FkRmlsZUluQ2xvdWQoe1xuICAgIGZpbGUsXG4gICAgbmFtZSxcbiAgICBub2RlSWQsXG4gICAgZW5jcnlwdFByb2dyZXNzLFxuICAgIHVwbG9hZFByb2dyZXNzLFxuICAgIHNpZ25hbFxuICB9OiB7XG4gICAgZmlsZTogZ2xvYmFsVGhpcy5GaWxlIHwgVWludDhBcnJheTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbm9kZUlkPzogc3RyaW5nO1xuICAgIGVuY3J5cHRQcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgdXBsb2FkUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxOb2RlRnVsbD5cbiAgICB8IEVycm9yQWNjZXNzRGVuaWVkXG4gICAgfCBFcnJvckxpbWl0XG4gICAgfCBFcnJvck5vdEZvdW5kXG4gICAgfCBFcnJvckJhc2ljXG4gICAgfCBFcnJvck5vdEV4aXN0XG4gICAgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IGZpbGVJZCA9IGF3YWl0IHRoaXMudXBsb2FkRmlsZSh7XG4gICAgICBmaWxlLFxuICAgICAgZW5jcnlwdFByb2dyZXNzLFxuICAgICAgdXBsb2FkUHJvZ3Jlc3MsXG4gICAgICBzaWduYWxcbiAgICB9KTtcblxuICAgIGlmICghZmlsZUlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZmlsZUlkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGZpbGVJZDtcbiAgICB9XG5cbiAgICBpZiAoZmlsZUlkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JMaW1pdFwiKSB7XG4gICAgICByZXR1cm4gZmlsZUlkO1xuICAgIH1cblxuICAgIGlmIChmaWxlSWQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiBmaWxlSWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zYXZlSW5DbG91ZCh7XG4gICAgICBmaWxlSWQ6IGZpbGVJZC5kYXRhLFxuICAgICAgbmFtZSxcbiAgICAgIG5vZGVJZFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yTGltaXRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHQuZGF0YVxuICAgIH07XG4gIH1cblxuICBhc3luYyBsb2dvdXQoc2Vzc2lvbklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIG5vZGVzQ2FjaGUuY2xlYXIoKTtcbiAgICBmaWxlc0NhY2hlLmNsZWFyKCk7XG4gICAgYXdhaXQgc3VwZXIubG9nb3V0KHNlc3Npb25JZCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVGb2xkZXIoe1xuICAgIG5hbWUsXG4gICAgcGFyZW50Rm9sZGVySWRcbiAgfToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBwYXJlbnRGb2xkZXJJZD86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxOb2RlRnVsbD4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IGtleSA9IHNlY3JldHN0cmVhbUtleWdlbigpO1xuICAgIGNvbnN0IGVuY3J5cHRlZE5hbWUgPSBhd2FpdCBlbmNyeXB0TmFtZShuYW1lLCBzb2RpdW0udG9faGV4KGtleSkpO1xuICAgIGNvbnN0IGVuY3J5cHRlZEtleSA9IGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICBrZXksXG4gICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICk7XG4gICAgY29uc3QgeyBjcmVhdGVGb2xkZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgY3JlYXRlRm9sZGVyOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBlbmNyeXB0ZWROYW1lLFxuICAgICAgICAgIHBhcmVudEZvbGRlcklkLFxuICAgICAgICAgIGtleTogc29kaXVtLnRvX2hleChlbmNyeXB0ZWRLZXkpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gQ3JlYXRlRm9sZGVyUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZUZvbGRlcjogbm9kZUZ1bGxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuICAgIGlmICghY3JlYXRlRm9sZGVyKSB7XG4gICAgICAvL3Rocm93IG5ldyBFcnJvcihgQ2FuJ3QgY3JlYXRlIGZvbGRlcmApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZUZvbGRlci5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVGb2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZUZvbGRlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWNyZWF0ZUZvbGRlci5jcmVhdGVGb2xkZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsTm9kZUZ1bGwoXG4gICAgICBjcmVhdGVGb2xkZXIuY3JlYXRlRm9sZGVyLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG5cbiAgICBjb25zdCB1c2VycyA9XG4gICAgICBmb2xkZXIucGFyZW50Py51c2Vycz8uZmlsdGVyKFxuICAgICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSAhPT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICAgICkgPz8gW107XG5cbiAgICBpZiAodXNlcnMubGVuZ3RoKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdXNlcnMubWFwKChbdSwgcmlnaHRzXSkgPT5cbiAgICAgICAgICB0aGlzLnNoYXJlTm9kZSh7XG4gICAgICAgICAgICBub2RlSWQ6IGZvbGRlci5pZCxcbiAgICAgICAgICAgIHJpZ2h0cyxcbiAgICAgICAgICAgIHVzZXJJZDogdS5pZFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBmb2xkZXJcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbm9kZSh7XG4gICAgaWQsXG4gICAgZGVsZXRlZFxuICB9OiB7XG4gICAgaWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGRlbGV0ZWQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSA9IHt9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBub2RlIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcInF1ZXJ5XCIpKHtcbiAgICAgIG5vZGU6IFtcbiAgICAgICAgeyBkZWxldGVkLCBpZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG5vZGU6IG5vZGVGdWxsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChub2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGlmICghbm9kZS5ub2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKG5vZGUubm9kZSwgdGhpcy4ja2V5cyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmlsZSh7XG4gICAgaWRcbiAgfToge1xuICAgIGlkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxTZWNyZWN5RmlsZT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGZpbGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgZmlsZTogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRmlsZVF1ZXJ5UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGZpbGU6IGZpbGVTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICBpZiAoIWZpbGUuZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gZ3FsRmlsZVRvRXh0ZXJuYWwoZmlsZS5maWxlLCB0aGlzLiNrZXlzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG1haWwoe1xuICAgIGlkXG4gIH06IHtcbiAgICBpZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8TWFpbD4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IG1haWwgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICBtYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBRdWVyeU1haWxSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWFpbDogbWFpbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIW1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChtYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG1haWw7XG4gICAgfVxuXG4gICAgaWYgKCFtYWlsLm1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKG1haWwubWFpbCwgdGhpcy4ja2V5cyk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlZE5vZGVzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVbXT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBkZWxldGVkTm9kZXMgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgZGVsZXRlZE5vZGVzOiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIERlbGV0ZWROb2Rlc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIGRlbGV0ZWROb2Rlczogbm9kZVNlbGVjdG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlZE5vZGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlZE5vZGVzLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZWROb2RlcztcbiAgICB9XG5cbiAgICBjb25zdCBub2RlcyA9IG5ldyBBcnJheTxOb2RlPigpO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIGRlbGV0ZWROb2Rlcy5kZWxldGVkTm9kZXMpIHtcbiAgICAgIG5vZGVzLnB1c2goYXdhaXQgZ3FsTm9kZVRvRXh0ZXJuYWwobm9kZSwgdGhpcy4ja2V5cykpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogbm9kZXNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2hhcmVkTm9kZXMoKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZVtdPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHNoYXJlZE5vZGVzIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcInF1ZXJ5XCIpKHtcbiAgICAgIHNoYXJlZE5vZGVzOiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIFNoYXJlZE5vZGVzUmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgc2hhcmVkTm9kZXM6IG5vZGVTZWxlY3RvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIXNoYXJlZE5vZGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmVkTm9kZXMuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gc2hhcmVkTm9kZXM7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXMgPSBuZXcgQXJyYXk8Tm9kZT4oKTtcblxuICAgIGZvciAoY29uc3QgZm9sZGVyIG9mIHNoYXJlZE5vZGVzLnNoYXJlZE5vZGVzKSB7XG4gICAgICBub2Rlcy5wdXNoKGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsKGZvbGRlciwgdGhpcy4ja2V5cykpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogbm9kZXNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbm9kZXNTaGFyZWRXaXRoTWUoXG4gICAgdHlwZT86IE5vZGVUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxOb2RlW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBub2Rlc1NoYXJlZFdpdGhNZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiKSh7XG4gICAgICBub2Rlc1NoYXJlZFdpdGhNZTogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBOb2Rlc1NoYXJlZFdpdGhNZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBub2Rlc1NoYXJlZFdpdGhNZTogbm9kZVNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIW5vZGVzU2hhcmVkV2l0aE1lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAobm9kZXNTaGFyZWRXaXRoTWUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZXNTaGFyZWRXaXRoTWU7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXMgPSBuZXcgQXJyYXk8Tm9kZT4oKTtcblxuICAgIGZvciAoY29uc3QgZm9sZGVyIG9mIG5vZGVzU2hhcmVkV2l0aE1lLm5vZGVzU2hhcmVkV2l0aE1lKSB7XG4gICAgICBub2Rlcy5wdXNoKGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsKGZvbGRlciwgdGhpcy4ja2V5cykpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogbm9kZXNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlTm9kZVNoYXJpbmcoe1xuICAgIG5vZGVJZCxcbiAgICB1c2VySWRcbiAgfToge1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU5vZGVTaGFyaW5nIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZU5vZGVTaGFyaW5nOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgdXNlcklkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZU5vZGVTaGFyaW5nUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZU5vZGVTaGFyaW5nOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZU5vZGVTaGFyaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlTm9kZVNoYXJpbmcuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlTm9kZVNoYXJpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVOb2RlU2hhcmluZy5kZWxldGVOb2RlU2hhcmluZ1xuICAgIH07XG4gIH1cblxuICBhc3luYyBkdXBsaWNhdGVOb2RlKHtcbiAgICBub2RlSWQsXG4gICAgZm9sZGVySWQsXG4gICAgY3VzdG9tTmFtZVxuICB9OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgZm9sZGVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGN1c3RvbU5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90Rm91bmQgfCBudWxsXG4gID4ge1xuICAgIGxldCBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubm9kZSh7IGlkOiBub2RlSWQgfSk7XG4gICAgICBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgKCR7bm9kZUlkfSkgZG9lcyBub3QgZXhpc3RzYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghbm9kZS5hY2Nlc3M/Lm5hbWVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgaGF2ZSBhY2Nlc3MgdG8gbm9kZSAke25vZGVJZH1gKTtcbiAgICB9XG4gICAgY3VzdG9tTmFtZSA9IGN1c3RvbU5hbWVcbiAgICAgID8gYXdhaXQgZW5jcnlwdE5hbWUoY3VzdG9tTmFtZSwgbm9kZS5hY2Nlc3MubmFtZUtleSlcbiAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IHsgZHVwbGljYXRlTm9kZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBkdXBsaWNhdGVOb2RlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgZm9sZGVySWQsXG4gICAgICAgICAgY3VzdG9tTmFtZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIER1cGxpY2F0ZU5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZHVwbGljYXRlTm9kZTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkdXBsaWNhdGVOb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZHVwbGljYXRlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkdXBsaWNhdGVOb2RlO1xuICAgIH1cblxuICAgIGlmIChkdXBsaWNhdGVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gZHVwbGljYXRlTm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGR1cGxpY2F0ZU5vZGUuZHVwbGljYXRlTm9kZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVOb2RlQ2xvdWRUcmFzaCh7XG4gICAgaWRzXG4gIH06IHtcbiAgICBpZHM6IEFycmF5PHN0cmluZz47XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZGVsZXRlTm9kZUNsb3VkVHJhc2ggfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTm9kZUNsb3VkVHJhc2g6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEZWxldGVOb2RlQ2xvdWRUcmFzaFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVOb2RlQ2xvdWRUcmFzaDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVOb2RlQ2xvdWRUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZU5vZGVDbG91ZFRyYXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZU5vZGVDbG91ZFRyYXNoO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlTm9kZUNsb3VkVHJhc2guZGVsZXRlTm9kZUNsb3VkVHJhc2ggPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2hhcmVOb2RlKHtcbiAgICBub2RlSWQsXG4gICAgdXNlcklkLFxuICAgIHJpZ2h0c1xuICB9OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgcmlnaHRzOiBSaWdodHM7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMudXNlcih7IHVzZXJJZCwgd2l0aFB1YmxpY0tleTogdHJ1ZSB9KTtcblxuICAgIGlmICghdXNlcikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKHVzZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc2hhcmVOb2RlIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIHNoYXJlTm9kZTogW1xuICAgICAgICB7IG5vZGVJZCwgdXNlcklkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gU2hhcmVOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG5vZGVzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNoYXJlTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZU5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlTm9kZTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyZU5vZGVzOiBTaGFyZU5vZGVzSW5wdXQgPSB7XG4gICAgICBub2RlczogW11cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBpZCBvZiBzaGFyZU5vZGUubm9kZXMpIHtcbiAgICAgIGNvbnN0IG5hbWVLZXkgPSBhd2FpdCB0aGlzLnBlck5vZGUoaWQsIHVzZXIuZGF0YS5wdWJsaWNLZXkpO1xuICAgICAgaWYgKG5hbWVLZXkpIHtcbiAgICAgICAgc2hhcmVOb2Rlcy5ub2Rlcy5wdXNoKG5hbWVLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2hhcmVOb2RlRmluaXNoIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIHNoYXJlTm9kZUZpbmlzaDogW1xuICAgICAgICB7XG4gICAgICAgICAgcmlnaHRzLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzaGFyZU5vZGVzXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gU2hhcmVOb2RlRmluaXNoUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHNoYXJlTm9kZUZpbmlzaDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFzaGFyZU5vZGVGaW5pc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzaGFyZU5vZGVGaW5pc2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gc2hhcmVOb2RlRmluaXNoO1xuICAgIH1cblxuICAgIGlmIChzaGFyZU5vZGVGaW5pc2guX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZU5vZGVGaW5pc2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBzaGFyZU5vZGVGaW5pc2guc2hhcmVOb2RlRmluaXNoID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU5vZGUoe1xuICAgIG5vZGVJZCxcbiAgICBuYW1lLFxuICAgIGlzRmF2b3JpdGUsXG4gICAgZGVsZXRlZEF0XG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBpc0Zhdm9yaXRlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgZGVsZXRlZEF0PzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxOb2RlRnVsbD4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGxldCBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubm9kZSh7IGlkOiBub2RlSWQgfSk7XG4gICAgICBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICB0aHJvdyBgQ2FuJ3QgZmluZCBOb2RlICR7bm9kZUlkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLmFjY2Vzcz8ubmFtZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBoYXZlIGFjY2VzcyB0byBub2RlICR7bm9kZUlkfWApO1xuICAgIH1cblxuICAgIG5hbWUgPSBuYW1lXG4gICAgICA/IG5vZGUuYWNjZXNzPy5uYW1lS2V5XG4gICAgICAgID8gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgbm9kZS5hY2Nlc3MubmFtZUtleSlcbiAgICAgICAgOiBuYW1lXG4gICAgICA6IG51bGw7XG5cbiAgICBjb25zdCB7IHVwZGF0ZU5vZGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgdXBkYXRlTm9kZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaXNGYXZvcml0ZSxcbiAgICAgICAgICBkZWxldGVkQXRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVcGRhdGVOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVwZGF0ZU5vZGU6IG5vZGVGdWxsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXBkYXRlTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gdXBkYXRlTm9kZTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZU5vZGU7XG4gICAgfVxuXG4gICAgaWYgKCF1cGRhdGVOb2RlLnVwZGF0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsTm9kZUZ1bGwoXG4gICAgICB1cGRhdGVOb2RlLnVwZGF0ZU5vZGUsXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZWRNYWlscyh7XG4gICAgbWFpbFR5cGVcbiAgfToge1xuICAgIG1haWxUeXBlOiBNYWlsVHlwZTtcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPE1haWxbXT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZWRNYWlscyB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIGRlbGV0ZWRNYWlsczogW1xuICAgICAgICB7IG1haWxUeXBlIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZWRNYWlsc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVkTWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVkTWFpbHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVkTWFpbHMuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlZE1haWxzO1xuICAgIH1cblxuICAgIGNvbnN0IG1haWxzID0gbmV3IEFycmF5PE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgZGVsZXRlZE1haWxzLmRlbGV0ZWRNYWlscykge1xuICAgICAgY29uc3QgbWFpbCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKG0sIHRoaXMuI2tleXMpO1xuICAgICAgaWYgKG1haWwpIHtcbiAgICAgICAgbWFpbHMucHVzaChtYWlsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG1haWxzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUFwcE5vdGlmaWNhdGlvbnMoXG4gICAgbm90aWZpY2F0aW9uczogUGFydGlhbDxVc2VyQXBwTm90aWZpY2F0aW9ucz5cbiAgKTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8VXNlckFwcE5vdGlmaWNhdGlvbnM+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyB1cGRhdGVBcHBOb3RpZmljYXRpb25zIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgRGF0ZVRpbWU6IHtcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBuZXcgRGF0ZShlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgdXBkYXRlQXBwTm90aWZpY2F0aW9uczogW1xuICAgICAgICBub3RpZmljYXRpb25zLFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVcGRhdGVBcHBOb3RpZmljYXRpb25zUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVwZGF0ZUFwcE5vdGlmaWNhdGlvbnM6IHtcbiAgICAgICAgICAgICAgZW5hYmxlQWxsOiB0cnVlLFxuICAgICAgICAgICAgICBtYWlsOiB0cnVlLFxuICAgICAgICAgICAgICBjbG91ZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZGlzYWJsZUFsbFVudGlsOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVwZGF0ZUFwcE5vdGlmaWNhdGlvbnMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVBcHBOb3RpZmljYXRpb25zLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZUFwcE5vdGlmaWNhdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKCF1cGRhdGVBcHBOb3RpZmljYXRpb25zLnVwZGF0ZUFwcE5vdGlmaWNhdGlvbnMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogdXBkYXRlQXBwTm90aWZpY2F0aW9ucy51cGRhdGVBcHBOb3RpZmljYXRpb25zXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGFwcE5vdGlmaWNhdGlvbnMoKTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxVc2VyQXBwTm90aWZpY2F0aW9ucz5cbiAgICB8IEVycm9yQWNjZXNzRGVuaWVkXG4gICAgfCBFcnJvck5vdEZvdW5kXG4gICAgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgYXBwTm90aWZpY2F0aW9ucyB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIGFwcE5vdGlmaWNhdGlvbnM6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gVXNlckFwcE5vdGlmaWNhdGlvbnNcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgZW5hYmxlQWxsOiB0cnVlLFxuICAgICAgICAgIG1haWw6IHRydWUsXG4gICAgICAgICAgY2xvdWQ6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZUFsbFVudGlsOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghYXBwTm90aWZpY2F0aW9ucykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGFwcE5vdGlmaWNhdGlvbnMuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gYXBwTm90aWZpY2F0aW9ucztcbiAgICB9XG5cbiAgICBpZiAoYXBwTm90aWZpY2F0aW9ucy5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIGFwcE5vdGlmaWNhdGlvbnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBhcHBOb3RpZmljYXRpb25zXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU1haWwoXG4gICAgZGF0YTogTmV3TWFpbCxcbiAgICBjdXN0b21NZXNzYWdlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQmFzaWMgfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCBtYWlsID0gYXdhaXQgdGhpcy5jcmVhdGVEcmFmdE1haWwoZGF0YSk7XG4gICAgaWYgKCFtYWlsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIG1haWw7XG4gICAgfVxuXG4gICAgaWYgKG1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gbWFpbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmREcmFmdE1haWwoXG4gICAgICBtYWlsLmRhdGEubWFpbEludGVncml0eUlkLFxuICAgICAgY3VzdG9tTWVzc2FnZVxuICAgICk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRpbmdSZWNlaXZlZE1haWxzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPFdhaXRpbmdSZWNlaXZlZE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgdXNlcjogW1xuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVc2VyUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgd2FpdGluZ1JlY2VpdmVkTWFpbHM6IHtcbiAgICAgICAgICAgICAgICBkYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzQ291bnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VuZGVyOiB7XG4gICAgICAgICAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGZpcnN0bmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGxhc3RuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgZW1haWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBwdWJsaWNLZXk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlY2lwaWVudHM6IHtcbiAgICAgICAgICAgICAgICAgIGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgZmlyc3RuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgbGFzdG5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBlbWFpbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHB1YmxpY0tleTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGVtcG9yYXJ5UmVjaXBpZW50czoge1xuICAgICAgICAgICAgICAgICAgZW1haWw6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVzZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmICghdXNlci51c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB1c2VyLnVzZXIud2FpdGluZ1JlY2VpdmVkTWFpbHMubWFwKG0gPT4gKHtcbiAgICAgIGlkOiBnZW5lcmF0ZSgpLFxuICAgICAgLi4ubSxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKG0uZGF0ZSBhcyBzdHJpbmcpXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRHJhZnRNYWlsKFxuICAgIGRyYWZ0SWQ6IHN0cmluZyxcbiAgICB7IGJvZHksIHN1YmplY3QsIGZpbGVzLCByZWNpcGllbnRzSWRzLCByZXBseVRvIH06IFBhcnRpYWw8TmV3TWFpbD5cbiAgKTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxEcmFmdE1haWw+XG4gICAgfCBFcnJvck5vdEZvdW5kXG4gICAgfCBFcnJvckFjY2Vzc0RlbmllZFxuICAgIHwgRXJyb3JCYXNpY1xuICAgIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBkcmFmdHMgPSBhd2FpdCB0aGlzLmRyYWZ0TWFpbHMoKTtcbiAgICBpZiAoIWRyYWZ0cykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRyYWZ0cy5fX3R5cGVuYW1lICE9PSBcIlN1Y2Nlc3NSZXNwb25zZVwiKSB7XG4gICAgICByZXR1cm4gZHJhZnRzO1xuICAgIH1cbiAgICBjb25zdCBkcmFmdCA9IGRyYWZ0cy5kYXRhLmZpbmQoZCA9PiBkLm1haWxJbnRlZ3JpdHlJZCA9PT0gZHJhZnRJZCk7XG4gICAgaWYgKCFkcmFmdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRyYWZ0ICR7ZHJhZnRJZH1gKTtcbiAgICB9XG4gICAgbGV0IGhhc2hLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoYm9keSB8fCBzdWJqZWN0KSB7XG4gICAgICBoYXNoS2V5ID0gc29kaXVtLnJhbmRvbWJ5dGVzX2J1ZihcbiAgICAgICAgc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaF9LRVlCWVRFUyxcbiAgICAgICAgXCJoZXhcIlxuICAgICAgKTtcbiAgICAgIGhhc2ggPSBzb2RpdW0uY3J5cHRvX2dlbmVyaWNoYXNoKFxuICAgICAgICBzb2RpdW0uY3J5cHRvX2dlbmVyaWNoYXNoX0JZVEVTLFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7IGJvZHksIHN1YmplY3QgfSksXG4gICAgICAgIGhhc2hLZXksXG4gICAgICAgIFwiaGV4XCJcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlbmRlckZpbGVzID0gbmV3IEFycmF5PE1haWxGaWxlSW5wdXQ+KCk7XG4gICAgaWYgKGZpbGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHtcbiAgICAgICAgbGV0IGZpbGUgPSBmaWxlc0NhY2hlLmdldChmLmlkKTtcbiAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5maWxlKHsgaWQ6IGYuaWQgfSk7XG4gICAgICAgICAgZmlsZSA9IGZpbGVzQ2FjaGUuZ2V0KGYuaWQpO1xuICAgICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlICR7Zi5uYW1lfSAoJHtmLmlkfSkgZG9lcyBub3QgZXhpc3RzYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNlbmRlckZpbGVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmaWxlLmlkLFxuICAgICAgICAgIGZpbGVLZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoZmlsZS5rZXkpLFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuYW1lOiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGYubmFtZSksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgdXBkYXRlRHJhZnRNYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgSnNvbjoge1xuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IEpTT04uc3RyaW5naWZ5KGUpLFxuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEpTT04ucGFyc2UoZSBhcyBzdHJpbmcpXG4gICAgICAgIH0sXG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfSxcbiAgICAgICAgQmlnSW50OiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gQmlnSW50KGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBiaWdpbnQpLnRvU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVwZGF0ZURyYWZ0TWFpbDogW1xuICAgICAgICB7XG4gICAgICAgICAgZHJhZnRJZCxcbiAgICAgICAgICByZWNpcGllbnRzOiByZWNpcGllbnRzSWRzLFxuICAgICAgICAgIHJlcGx5VG8sXG4gICAgICAgICAgYm9keTogYm9keVxuICAgICAgICAgICAgPyBzb2RpdW0udG9faGV4KFxuICAgICAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoYm9keSksXG4gICAgICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHN1YmplY3Q6IHN1YmplY3RcbiAgICAgICAgICAgID8gc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKHN1YmplY3QpLFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzZW5kZXJGaWxlcyxcbiAgICAgICAgICBoYXNoLFxuICAgICAgICAgIGhhc2hLZXlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVcGRhdGVEcmFmdE1haWxSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXBkYXRlRHJhZnRNYWlsOiBtYWlsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXBkYXRlRHJhZnRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlRHJhZnRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZURyYWZ0TWFpbDtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlRHJhZnRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gdXBkYXRlRHJhZnRNYWlsO1xuICAgIH1cblxuICAgIGlmICghdXBkYXRlRHJhZnRNYWlsLnVwZGF0ZURyYWZ0TWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwoXG4gICAgICB1cGRhdGVEcmFmdE1haWwudXBkYXRlRHJhZnRNYWlsLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICkgYXMgRHJhZnRNYWlsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRHJhZnRNYWlsKFxuICAgIGRyYWZ0SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZGVsZXRlRHJhZnRNYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZURyYWZ0TWFpbDogW1xuICAgICAgICB7XG4gICAgICAgICAgZHJhZnRJZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEZWxldGVEcmFmdE1haWxSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlRHJhZnRNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZURyYWZ0TWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVEcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKCFkZWxldGVEcmFmdE1haWwuZGVsZXRlRHJhZnRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRlbGV0ZURyYWZ0TWFpbC5kZWxldGVEcmFmdE1haWwgPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlTWFpbFRyYXNoKHtcbiAgICBpZHNcbiAgfToge1xuICAgIGlkczogQXJyYXk8c3RyaW5nPjtcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVNYWlsVHJhc2ggfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTWFpbFRyYXNoOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZHNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTWFpbFRyYXNoUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZU1haWxUcmFzaDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVNYWlsVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVNYWlsVHJhc2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlTWFpbFRyYXNoO1xuICAgIH1cblxuICAgIGlmICghZGVsZXRlTWFpbFRyYXNoLmRlbGV0ZU1haWxUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVNYWlsVHJhc2guZGVsZXRlTWFpbFRyYXNoXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGVtcHR5TWFpbFRyYXNoKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZW1wdHlNYWlsVHJhc2ggfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgZW1wdHlNYWlsVHJhc2g6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gRW1wdHlNYWlsVHJhc2hSZXNwb25zZVwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBlbXB0eU1haWxUcmFzaDogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWVtcHR5TWFpbFRyYXNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZW1wdHlNYWlsVHJhc2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZW1wdHlNYWlsVHJhc2g7XG4gICAgfVxuXG4gICAgaWYgKCFlbXB0eU1haWxUcmFzaC5lbXB0eU1haWxUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBlbXB0eU1haWxUcmFzaC5lbXB0eU1haWxUcmFzaFxuICAgIH07XG4gIH1cblxuICBhc3luYyBlbXB0eUNsb3VkVHJhc2goKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBlbXB0eUNsb3VkVHJhc2ggfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgZW1wdHlDbG91ZFRyYXNoOiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIEVtcHR5Q2xvdWRUcmFzaFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIGVtcHR5Q2xvdWRUcmFzaDogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWVtcHR5Q2xvdWRUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVtcHR5Q2xvdWRUcmFzaC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBlbXB0eUNsb3VkVHJhc2g7XG4gICAgfVxuXG4gICAgaWYgKCFlbXB0eUNsb3VkVHJhc2guZW1wdHlDbG91ZFRyYXNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGVtcHR5Q2xvdWRUcmFzaC5lbXB0eUNsb3VkVHJhc2hcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVjb3Zlck5vZGUoXG4gICAgaWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyByZWNvdmVyTm9kZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICByZWNvdmVyTm9kZTogW1xuICAgICAgICB7IGlkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gUmVjb3Zlck5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgcmVjb3Zlck5vZGU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghcmVjb3Zlck5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZWNvdmVyTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZWNvdmVyTm9kZTtcbiAgICB9XG5cbiAgICBpZiAocmVjb3Zlck5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiByZWNvdmVyTm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlY292ZXJOb2RlLnJlY292ZXJOb2RlID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHJlY292ZXJNYWlsKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yQmFzaWMgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgcmVjb3Zlck1haWwgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgcmVjb3Zlck1haWw6IFtcbiAgICAgICAgeyBtYWlsSWQgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBSZWNvdmVyTWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICByZWNvdmVyTWFpbDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFyZWNvdmVyTWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlY292ZXJNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHJlY292ZXJNYWlsO1xuICAgIH1cblxuICAgIGlmIChyZWNvdmVyTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHJlY292ZXJNYWlsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVjb3Zlck1haWwucmVjb3Zlck1haWxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRmlsZSh7XG4gICAgZmlsZUlkLFxuICAgIG5vZGVJZFxuICB9OiB7XG4gICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBkZWxldGVGaWxlIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZUZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEZWxldGVGaWxlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZUZpbGU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZUZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlRmlsZTtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlRmlsZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZUZpbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVGaWxlLmRlbGV0ZUZpbGVcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlTm9kZSh7XG4gICAgbm9kZUlkXG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVOb2RlIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZU5vZGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBub2RlSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVOb2RlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZU5vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVOb2RlLmRlbGV0ZU5vZGVcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbW92ZU5vZGVzKHtcbiAgICBub2RlSWRzLFxuICAgIHBhcmVudE5vZGVJZFxuICB9OiB7XG4gICAgbm9kZUlkczogc3RyaW5nW107XG4gICAgcGFyZW50Tm9kZUlkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBtb3ZlTm9kZXMgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgbW92ZU5vZGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICAgIHBhcmVudE5vZGVJZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBNb3ZlTm9kZXNSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbW92ZU5vZGVzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIW1vdmVOb2Rlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG1vdmVOb2Rlcy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBtb3ZlTm9kZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBtb3ZlTm9kZXMubW92ZU5vZGVzID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZvbGRlclNpemUoe1xuICAgIGZvbGRlcklkXG4gIH06IHtcbiAgICBmb2xkZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxGb2xkZXJTaXplPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZm9sZGVyU2l6ZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIEJpZ0ludDoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEJpZ0ludChlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgYmlnaW50KS50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICBmb2xkZXJTaXplOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmb2xkZXJJZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBGb2xkZXJTaXplUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHNpemU6IHRydWUsXG4gICAgICAgICAgICBzaXplQmVmb3JlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWZvbGRlclNpemUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChmb2xkZXJTaXplLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGZvbGRlclNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHNpemU6IEJpZ0ludChmb2xkZXJTaXplLnNpemUpLFxuICAgICAgICBzaXplQmVmb3JlOiBCaWdJbnQoZm9sZGVyU2l6ZS5zaXplQmVmb3JlKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVNYWlsKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU1haWwgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTWFpbDogW1xuICAgICAgICB7XG4gICAgICAgICAgbWFpbElkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZU1haWxSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlTWFpbDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVNYWlsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlTWFpbC5kZWxldGVNYWlsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVJbkNsb3VkKHtcbiAgICBmaWxlSWQsXG4gICAgbmFtZSxcbiAgICBub2RlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBub2RlSWQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFxuICAgIHwgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTGltaXRcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IEVycm9yTm90RXhpc3RcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgaWYgKG5vZGVJZCAmJiAhbm9kZXNDYWNoZS5oYXMobm9kZUlkKSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIGlmICghbm9kZXNDYWNoZS5oYXMobm9kZUlkKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IFwiRXJyb3JCYXNpY1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgbm9kZSAke25vZGVJZH0gZG9lcyBub3QgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBrZXkgPSBcIlwiO1xuXG4gICAgY29uc3QgZmlsZSA9IGZpbGVzQ2FjaGUuZ2V0KGZpbGVJZCk7XG5cbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZSh7IGlkOiBmaWxlSWQgfSk7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZmlsZUlkKSA/PyBudWxsO1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkTWFpbHMgPSBhd2FpdCB0aGlzLnJlY2VpdmVkTWFpbHMoKTtcbiAgICAgICAgaWYgKCFyZWNlaXZlZE1haWxzKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY2VpdmVkTWFpbHMuX190eXBlbmFtZSAhPT0gXCJTdWNjZXNzUmVzcG9uc2VcIikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1haWwgPSByZWNlaXZlZE1haWxzLmRhdGEuZmluZChtID0+XG4gICAgICAgICAgbS5maWxlcy5zb21lKGYgPT4gZi5pZCA9PT0gZmlsZUlkKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghbWFpbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiBcIkVycm9yQmFzaWNcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDYW4ndCBmaW5kIG1haWwgd2l0aCB0aGUgZmlsZSAke2ZpbGVJZH1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVNYWlsID0gbWFpbC5maWxlcy5maW5kKGYgPT4gZi5pZCA9PT0gZmlsZUlkKTtcblxuICAgICAgICBpZiAoIWZpbGVNYWlsKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IFwiRXJyb3JCYXNpY1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogYENhbid0IGZpbmQgbWFpbCB3aXRoIHRoZSBmaWxlICR7ZmlsZUlkfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZUtleSA9IGRlY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21faGV4KGZpbGVNYWlsLmtleSksXG4gICAgICAgICAgbWFpbC5zZW5kZXIucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApO1xuXG4gICAgICAgIGtleSA9IHNvZGl1bS50b19oZXgoZmlsZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXkgPSBmaWxlLmtleTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gZmlsZS5rZXk7XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJFcnJvckJhc2ljXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiVW5leHBlY3RlZCBlcnJvciAzXCJcbiAgICAgIH07XG4gICAgfVxuXG4gICAga2V5ID0gc29kaXVtLnRvX2hleChcbiAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWVLZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROYW1lID0gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgc29kaXVtLnRvX2hleChuYW1lS2V5KSk7XG4gICAgY29uc3QgZW5jcnlwdGVkTmFtZUtleSA9IHNvZGl1bS50b19oZXgoXG4gICAgICBlbmNyeXB0Q3J5cHRvQm94KG5hbWVLZXksIHRoaXMuI2tleXMucHVibGljS2V5LCB0aGlzLiNrZXlzLnByaXZhdGVLZXkpXG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2F2ZUluQ2xvdWQgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgc2F2ZUluQ2xvdWQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgIGZpbGVuYW1lOiBlbmNyeXB0ZWROYW1lLFxuICAgICAgICAgIG5hbWVLZXk6IGVuY3J5cHRlZE5hbWVLZXlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckxpbWl0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBTYXZlSW5DbG91ZFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBzYXZlSW5DbG91ZDogbm9kZUZ1bGxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFzYXZlSW5DbG91ZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNhdmVJbkNsb3VkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckxpbWl0XCIpIHtcbiAgICAgIHJldHVybiBzYXZlSW5DbG91ZDtcbiAgICB9XG5cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBzYXZlSW5DbG91ZDtcbiAgICB9XG5cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBzYXZlSW5DbG91ZDtcbiAgICB9XG5cbiAgICBpZiAoIXNhdmVJbkNsb3VkLnNhdmVJbkNsb3VkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gYXdhaXQgZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbChcbiAgICAgIHNhdmVJbkNsb3VkLnNhdmVJbkNsb3VkLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG5cbiAgICBjb25zdCBtZSA9IG5vZGUucGFyZW50Py51c2Vycy5maW5kKFxuICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgPT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgKTtcblxuICAgIGlmIChtZSAmJiBbXCJhZG1pblwiLCBcIndyaXRlXCJdLmluY2x1ZGVzKG1lWzFdKSkge1xuICAgICAgY29uc3Qgb3RoZXJzID1cbiAgICAgICAgbm9kZS5wYXJlbnQ/LnVzZXJzLmZpbHRlcihcbiAgICAgICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSAhPT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICAgICAgKSA/PyBbXTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG90aGVycy5tYXAoKFt1LCByaWdodHNdKSA9PlxuICAgICAgICAgIHRoaXMuc2hhcmVOb2RlKHtcbiAgICAgICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICAgIHJpZ2h0cyxcbiAgICAgICAgICAgIHVzZXJJZDogdS5pZFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBub2RlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRiR2V0PFU+KHtcbiAgICBmaWVsZCxcbiAgICB1c2VySWRcbiAgfToge1xuICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgdXNlcklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8VT5cbiAgICB8IEVycm9yQWNjZXNzRGVuaWVkXG4gICAgfCBFcnJvck5vdEV4aXN0XG4gICAgfCBFcnJvck5vdEZvdW5kXG4gICAgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZGJHZXQgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgZGJHZXQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIHVzZXJJZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGJHZXRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAganNvbjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkYkdldCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRiR2V0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRiR2V0O1xuICAgIH1cblxuICAgIGlmIChkYkdldC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIGRiR2V0O1xuICAgIH1cblxuICAgIGlmIChkYkdldC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIGRiR2V0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogKGRiR2V0Lmpzb24gYXMgeyByZXM6IFUgfSkucmVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRiU2V0PFQgZXh0ZW5kcyBVc2VyRGF0YSwgVSBleHRlbmRzIERvY3VtZW50Pih7XG4gICAgdmFsdWUsXG4gICAgdXNlcklkXG4gIH06IHtcbiAgICB2YWx1ZTogVTtcbiAgICB1c2VySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8VD4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90Rm91bmQgfCBudWxsPiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmFsdWUgc2hvdWxkIGJlIGFuIG9iamVjdCBpbmNsdWRpbmcgZmllbGRzIHlvdSB3YW50IHRvIHVwZGF0ZS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZGJTZXQgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgZGJTZXQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICB2YWx1ZTogc2VyaWFsaXplKHZhbHVlKS50b1N0cmluZyhcImJhc2U2NFwiKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERiU2V0UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRiU2V0OiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRiU2V0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGJTZXQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGJTZXQ7XG4gICAgfVxuXG4gICAgaWYgKGRiU2V0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gZGJTZXQ7XG4gICAgfVxuXG4gICAgaWYgKCFkYlNldC5kYlNldCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiAoZGJTZXQuZGJTZXQgYXMgeyByZXM6IFQgfSkucmVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRiU2VhcmNoPFQ+KHtcbiAgICBzZWFyY2gsXG4gICAgZmllbGRcbiAgfToge1xuICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxUW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvckJhc2ljIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBkYlNlYXJjaCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIEpzb246IHtcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnN0cmluZ2lmeShlKSxcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnBhcnNlKGUgYXMgc3RyaW5nKVxuICAgICAgICB9LFxuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH0sXG4gICAgICAgIEJpZ0ludDoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEJpZ0ludChlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgYmlnaW50KS50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICBkYlNlYXJjaDogW1xuICAgICAgICB7XG4gICAgICAgICAgc2VhcmNoLFxuICAgICAgICAgIGZpZWxkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEYlNlYXJjaFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBqc29uOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRiU2VhcmNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGJTZWFyY2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGJTZWFyY2g7XG4gICAgfVxuXG4gICAgaWYgKGRiU2VhcmNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gZGJTZWFyY2g7XG4gICAgfVxuXG4gICAgaWYgKGRiU2VhcmNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RFeGlzdFwiKSB7XG4gICAgICByZXR1cm4gZGJTZWFyY2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkYlNlYXJjaC5qc29uIGFzIHVua25vd24gYXMgVFtdXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNlbmREcmFmdE1haWwoXG4gICAgZHJhZnRJZDogc3RyaW5nLFxuICAgIGN1c3RvbU1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvckJhc2ljIHwgbnVsbD4ge1xuICAgIGNvbnN0IGRyYWZ0cyA9IGF3YWl0IHRoaXMuZHJhZnRNYWlscygpO1xuXG4gICAgaWYgKCFkcmFmdHMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoZHJhZnRzLl9fdHlwZW5hbWUgIT09IFwiU3VjY2Vzc1Jlc3BvbnNlXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRyYWZ0ID0gZHJhZnRzLmRhdGEuZmluZChkID0+IGQubWFpbEludGVncml0eUlkID09PSBkcmFmdElkKTtcbiAgICBpZiAoIWRyYWZ0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IG5ldyBBcnJheTxNYWlsUmVjaXBpZW50SW5wdXQ+KCk7XG5cbiAgICBjb25zdCB0ZW1wb3JhcnlSZWNpcGllbnRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgeyBlbWFpbCB9IG9mIGRyYWZ0LnRlbXBvcmFyeVJlY2lwaWVudHMpIHtcbiAgICAgIGlmICghZW1haWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMuX2VhY2hVc2VyKFxuICAgICAgICBkcmFmdC5maWxlcyxcbiAgICAgICAgZHJhZnQuc3ViamVjdCxcbiAgICAgICAgZHJhZnQuYm9keSxcbiAgICAgICAgZW1haWxcbiAgICAgICk7XG5cbiAgICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgdGVtcG9yYXJ5UmVjaXBpZW50cy5wdXNoKGVtYWlsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY2lwaWVudHMucHVzaChpbnB1dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7IGlkIH0gb2YgZHJhZnQucmVjaXBpZW50cykge1xuICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLl9lYWNoVXNlcihcbiAgICAgICAgZHJhZnQuZmlsZXMsXG4gICAgICAgIGRyYWZ0LnN1YmplY3QsXG4gICAgICAgIGRyYWZ0LmJvZHksXG4gICAgICAgIGlkXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIHRlbXBvcmFyeVJlY2lwaWVudHMucHVzaChpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNpcGllbnRzLnB1c2goaW5wdXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2VuZERyYWZ0TWFpbCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzZW5kRHJhZnRNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZW1wb3JhcnlSZWNpcGllbnRzLFxuICAgICAgICAgIHJlY2lwaWVudHMsXG4gICAgICAgICAgZHJhZnRNYWlsSWQ6IGRyYWZ0Lm1haWxJbnRlZ3JpdHlJZCxcbiAgICAgICAgICBjdXN0b21NZXNzYWdlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gU2VuZERyYWZ0TWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBzZW5kRHJhZnRNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNlbmREcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzZW5kRHJhZnRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNlbmREcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHNlbmREcmFmdE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBzZW5kRHJhZnRNYWlsO1xuICAgIH1cblxuICAgIGlmICghc2VuZERyYWZ0TWFpbC5zZW5kRHJhZnRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHNlbmREcmFmdE1haWwuc2VuZERyYWZ0TWFpbFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzZW5kV2FpdGluZ0VtYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JCYXNpYyB8IG51bGxcbiAgPiB7XG4gICAgLy8gVE9ETyBvcHRpIHRoaXNcbiAgICBjb25zdCBtYWlscyA9IGF3YWl0IHRoaXMuc2VudE1haWxzKCk7XG5cbiAgICBpZiAoIW1haWxzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1haWxzLl9fdHlwZW5hbWUgIT09IFwiU3VjY2Vzc1Jlc3BvbnNlXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJlZCA9IG1haWxzLmRhdGEuZmlsdGVyKG0gPT4gbS50ZW1wb3JhcnlSZWNpcGllbnRzLmxlbmd0aCA+IDApO1xuXG4gICAgZm9yIChjb25zdCBtYWlsIG9mIGZpbHRlcmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgZW1haWwgfSBvZiBtYWlsLnRlbXBvcmFyeVJlY2lwaWVudHMpIHtcbiAgICAgICAgaWYgKCFlbWFpbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLl9lYWNoVXNlcihcbiAgICAgICAgICAgIG1haWwuZmlsZXMsXG4gICAgICAgICAgICBtYWlsLnN1YmplY3QsXG4gICAgICAgICAgICBtYWlsLmJvZHksXG4gICAgICAgICAgICBlbWFpbFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICAgICAgICBzZW5kT25lTWFpbDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFpbEludGVncml0eUlkOiBtYWlsLm1haWxJbnRlZ3JpdHlJZCxcbiAgICAgICAgICAgICAgICByZWNpcGllbnQ6IGlucHV0XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiLi4ub24gUmVjb3Zlck5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgcmVjb3Zlck5vZGU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVEcmFmdE1haWwoe1xuICAgIGJvZHksXG4gICAgc3ViamVjdCxcbiAgICBmaWxlcyxcbiAgICByZWNpcGllbnRzSWRzLFxuICAgIHJlcGx5VG9cbiAgfTogTmV3TWFpbCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPERyYWZ0TWFpbD4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yQmFzaWMgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IGhhc2hLZXkgPSBzb2RpdW0ucmFuZG9tYnl0ZXNfYnVmKFxuICAgICAgc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaF9LRVlCWVRFUyxcbiAgICAgIFwiaGV4XCJcbiAgICApO1xuICAgIGNvbnN0IGhhc2ggPSBzb2RpdW0uY3J5cHRvX2dlbmVyaWNoYXNoKFxuICAgICAgc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaF9CWVRFUyxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHsgYm9keSwgc3ViamVjdCB9KSxcbiAgICAgIGhhc2hLZXksXG4gICAgICBcImhleFwiXG4gICAgKTtcbiAgICBjb25zdCBzZW5kZXJGaWxlcyA9IG5ldyBBcnJheTxNYWlsRmlsZUlucHV0PigpO1xuICAgIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgICAgbGV0IGZpbGUgPSBmaWxlc0NhY2hlLmdldChmLmlkKTtcbiAgICAgIGlmICghZmlsZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGUoeyBpZDogZi5pZCB9KTtcbiAgICAgICAgZmlsZSA9IGZpbGVzQ2FjaGUuZ2V0KGYuaWQpO1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmLm5hbWV9ICgke2YuaWR9KSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2VuZGVyRmlsZXMucHVzaCh7XG4gICAgICAgIGlkOiBmaWxlLmlkLFxuICAgICAgICBmaWxlS2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoZmlsZS5rZXkpLFxuICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIG5hbWU6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmLm5hbWUpLFxuICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY3JlYXRlRHJhZnRNYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgRGF0ZVRpbWU6IHtcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBuZXcgRGF0ZShlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgY3JlYXRlRHJhZnRNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICByZWNpcGllbnRzOiByZWNpcGllbnRzSWRzLFxuICAgICAgICAgIHJlcGx5VG8sXG4gICAgICAgICAgYm9keTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhib2R5KSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgc3ViamVjdDogc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhzdWJqZWN0KSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgc2VuZGVyRmlsZXMsXG4gICAgICAgICAgaGFzaCxcbiAgICAgICAgICBoYXNoS2V5XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gQ3JlYXRlRHJhZnRNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZURyYWZ0TWFpbDogbWFpbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWNyZWF0ZURyYWZ0TWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVEcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIGNyZWF0ZURyYWZ0TWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIWNyZWF0ZURyYWZ0TWFpbC5jcmVhdGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKFxuICAgICAgY3JlYXRlRHJhZnRNYWlsLmNyZWF0ZURyYWZ0TWFpbCxcbiAgICAgIHRoaXMuI2tleXNcbiAgICApIGFzIERyYWZ0TWFpbDtcblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZpbGVDb250ZW50KHtcbiAgICBmaWxlSWQsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgIHByb2dyZXNzRGVjcnlwdCxcbiAgICBzaWduYWxcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG9uRG93bmxvYWRQcm9ncmVzcz86IChwcm9ncmVzczogRG93bmxvYWRQcm9ncmVzcykgPT4gdm9pZDtcbiAgICBwcm9ncmVzc0RlY3J5cHQ/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8VWludDhBcnJheT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yQmFzaWMgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZmlsZUNvbnRlbnQgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBCeXRlczoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUsIHR5cGVvZiBlKTtcbiAgICAgICAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oWzEsIDIsIDNdKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIFVpbnQ4QXJyYXkpLnRvU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIGZpbGVDb250ZW50OiBbXG4gICAgICAgIHsgZmlsZUlkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZmlsZToge1xuICAgICAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50Q2xvdWRcIjoge1xuICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnRVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBvcmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG1kNTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAga2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHB1YmxpY0tleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50TGl0ZVwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGtleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwdWJsaWNLZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRydWVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCIuLi5vbiBGaWxlQ29udGVudFJlY2VpdmVkTWFpbFwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXliZVBhcnRzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50VXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZDU6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1heWJlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VuZGVyUHVibGljS2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1RW5jcnlwdGVkOiB0cnVlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRTZW50TWFpbFwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXliZVBhcnRzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50VXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZDU6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1heWJlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgdG90YWxTaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDVFbmNyeXB0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFmaWxlQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVDb250ZW50Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGZpbGVDb250ZW50O1xuICAgIH1cblxuICAgIGlmIChmaWxlQ29udGVudC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIGZpbGVDb250ZW50O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGUgPSBmaWxlQ29udGVudC5maWxlO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3Jlc3NQYXJ0czogUmVjb3JkPG51bWJlciwgRG93bmxvYWRQcm9ncmVzcz4gPSB7fTtcbiAgICBjb25zdCBvblByb2dyZXNzID0gKFxuICAgICAgcGFydDogbnVtYmVyLFxuICAgICAgcHJvZ3Jlc3NFdmVudDogRG93bmxvYWRQcm9ncmVzc1xuICAgICk6IHZvaWQgPT4ge1xuICAgICAgcHJvZ3Jlc3NQYXJ0c1twYXJ0XSA9IHByb2dyZXNzRXZlbnQ7XG4gICAgICBjb25zdCB0cmFuc2ZlcnJlZEJ5dGVzID0gT2JqZWN0LnZhbHVlcyhwcm9ncmVzc1BhcnRzKS5yZWR1Y2UoXG4gICAgICAgIChwcnYsIGN1cikgPT4gcHJ2ICsgY3VyLnRyYW5zZmVycmVkQnl0ZXMsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICBjb25zdCB0b3RhbEJ5dGVzID0gTnVtYmVyKGZpbGUudG90YWxTaXplKTtcbiAgICAgIG9uRG93bmxvYWRQcm9ncmVzcz8uKHtcbiAgICAgICAgcGVyY2VudDogdHJhbnNmZXJyZWRCeXRlcyAvIHRvdGFsQnl0ZXMsXG4gICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIHRyYW5zZmVycmVkQnl0ZXNcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRDb250ZW50RnJvbVBhcnRzID0gYXN5bmMgKFxuICAgICAgZmlsZVBhcnRzOiBGaWxlQ29udGVudFBhcnRbXVxuICAgICk6IFByb21pc2U8VWludDhBcnJheT4gPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBuZXcgQXJyYXk8eyBkYXRhOiBVaW50OEFycmF5OyBvcmRlcjogbnVtYmVyIH0+KCk7XG5cbiAgICAgIGNvbnN0IGJ5UGFydCA9IGFzeW5jIChwYXJ0OiBGaWxlQ29udGVudFBhcnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgICAgICAgYXdhaXQga3lcbiAgICAgICAgICAgIC5nZXQocGFydC5jb250ZW50VXJsLCB7XG4gICAgICAgICAgICAgIHRpbWVvdXQ6IGZhbHNlLFxuICAgICAgICAgICAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IHByID0+IG9uUHJvZ3Jlc3MocGFydC5vcmRlciwgcHIpLFxuICAgICAgICAgICAgICBzaWduYWw6IHNpZ25hbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hcnJheUJ1ZmZlcigpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG1kNVBhcnQgPSBhd2FpdCBtZDUoYnVmKTtcbiAgICAgICAgaWYgKG1kNVBhcnQgIT09IHBhcnQubWQ1KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgbWQ1IGZvciBwYXJ0ICR7cGFydC5vcmRlcn0gb2YgZmlsZSAke2ZpbGVJZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICBkYXRhOiBidWYsXG4gICAgICAgICAgb3JkZXI6IHBhcnQub3JkZXJcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBwcm9taXNlQWxsTGltaXQoXG4gICAgICAgIDMsXG4gICAgICAgIGZpbGVQYXJ0cy5tYXAocCA9PiAoKTogUHJvbWlzZTx2b2lkPiA9PiBieVBhcnQocCkpXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gY29uY2F0ZW5hdGUoXG4gICAgICAgIC4uLnBhcnRzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKS5tYXAocCA9PiBwLmRhdGEpXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBmaW5hbGl6ZSA9IGFzeW5jIChcbiAgICAgIGVuY3J5cHRlZENvbnRlbnQ6IFVpbnQ4QXJyYXlcbiAgICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgICAgIC8vIGNvbnN0IG1kNUVuY3J5cHRlZCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1kNShvZihlbmNyeXB0ZWRDb250ZW50KSkpO1xuICAgICAgY29uc3QgbWQ1RW5jcnlwdGVkID0gYXdhaXQgbWQ1KGVuY3J5cHRlZENvbnRlbnQpO1xuXG4gICAgICBpZiAobWQ1RW5jcnlwdGVkICE9PSBmaWxlLm1kNUVuY3J5cHRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVuY3J5cHRlZCBjb250ZW50IGRvZXMgbm90IG1hdGNoYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IGRlY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleChmaWxlLmtleSksXG4gICAgICAgIGZpbGUuX190eXBlbmFtZSA9PT0gXCJGaWxlQ29udGVudFJlY2VpdmVkTWFpbFwiXG4gICAgICAgICAgPyBmaWxlLnNlbmRlclB1YmxpY0tleVxuICAgICAgICAgIDogZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50Q2xvdWRcIlxuICAgICAgICAgID8gZmlsZS5wdWJsaWNLZXlcbiAgICAgICAgICA6IHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNyYyA9IGF3YWl0IGRlY3J5cHQoa2V5LCBlbmNyeXB0ZWRDb250ZW50LCBwcm9ncmVzc0RlY3J5cHQsIHNpZ25hbCk7XG5cbiAgICAgIC8vIGNvbnN0IG1kNUNvbnRlbnQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShtZDUob2Yoc3JjKSkpO1xuICAgICAgY29uc3QgbWQ1Q29udGVudCA9IGF3YWl0IG1kNShzcmMpO1xuXG4gICAgICBpZiAobWQ1Q29udGVudCAhPT0gZmlsZS5tZDUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb250ZW50IGRvZXMgbm90IG1hdGNoYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmNvbXByZXNzKHNyYyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZENvbnRlbnQgPVxuICAgICAgZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50TGl0ZVwiXG4gICAgICAgID8gZmlsZS5jb250ZW50XG4gICAgICAgIDogZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50Q2xvdWRcIlxuICAgICAgICA/IGF3YWl0IGVuY3J5cHRlZENvbnRlbnRGcm9tUGFydHMoZmlsZS5wYXJ0cylcbiAgICAgICAgOiBmaWxlLm1heWJlQ29udGVudFxuICAgICAgICA/IGZpbGUubWF5YmVDb250ZW50XG4gICAgICAgIDogZmlsZS5tYXliZVBhcnRzXG4gICAgICAgID8gYXdhaXQgZW5jcnlwdGVkQ29udGVudEZyb21QYXJ0cyhmaWxlLm1heWJlUGFydHMpXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmICghZW5jcnlwdGVkQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBhd2FpdCBmaW5hbGl6ZShlbmNyeXB0ZWRDb250ZW50KVxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWFkTWFpbCh7XG4gICAgbWFpbElkXG4gIH06IHtcbiAgICBtYWlsSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj5cbiAgICB8IEVycm9yQWNjZXNzRGVuaWVkXG4gICAgfCBFcnJvckJhc2ljXG4gICAgfCBFcnJvck5vdEZvdW5kXG4gICAgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgcmVhZE1haWwgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgcmVhZE1haWw6IFtcbiAgICAgICAgeyBtYWlsSWQgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFJlYWRNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlYWRNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlYWRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVhZE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gcmVhZE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gcmVhZE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gcmVhZE1haWw7XG4gICAgfVxuXG4gICAgaWYgKCFyZWFkTWFpbC5yZWFkTWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZWFkTWFpbC5yZWFkTWFpbFxuICAgIH07XG4gIH1cblxuICBhc3luYyB1bnJlYWRNYWlsKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1bnJlYWRNYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIHVucmVhZE1haWw6IFtcbiAgICAgICAgeyBtYWlsSWQgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVucmVhZE1haWxSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdW5yZWFkTWFpbDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1bnJlYWRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodW5yZWFkTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiB1bnJlYWRNYWlsO1xuICAgIH1cblxuICAgIGlmICh1bnJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gdW5yZWFkTWFpbDtcbiAgICB9XG5cbiAgICBpZiAodW5yZWFkTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVucmVhZE1haWw7XG4gICAgfVxuXG4gICAgaWYgKCF1bnJlYWRNYWlsLnVucmVhZE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogdW5yZWFkTWFpbC51bnJlYWRNYWlsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGFwcFNldHRpbmdzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPFVzZXJBcHBTZXR0aW5ncz4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgdXNlcjogW1xuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVc2VyUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgYXBwU2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgICBjbG91ZEZpbGVEYXlzRm9yRGVsZXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNsb3VkRm9sZGVyRGF5c0ZvckRlbGV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBoaXN0b3J5RmlsZURheXNGb3JEZWxldGU6IHRydWUsXG4gICAgICAgICAgICAgICAgaGlzdG9yeU1heEZpbGVDb3VudDogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1c2VyLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZiAoIXVzZXIudXNlcj8uYXBwU2V0dGluZ3MpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogdXNlci51c2VyLmFwcFNldHRpbmdzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUFwcFNldHRpbmdzKFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFVzZXJBcHBTZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8VXNlckFwcFNldHRpbmdzPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JCYXNpYyB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1cGRhdGVBcHBTZXR0aW5ncyB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICB1cGRhdGVBcHBTZXR0aW5nczogW1xuICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVcGRhdGVBcHBTZXR0aW5nc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1cGRhdGVBcHBTZXR0aW5nczoge1xuICAgICAgICAgICAgICBjbG91ZEZpbGVEYXlzRm9yRGVsZXRlOiB0cnVlLFxuICAgICAgICAgICAgICBjbG91ZEZvbGRlckRheXNGb3JEZWxldGU6IHRydWUsXG4gICAgICAgICAgICAgIGhpc3RvcnlGaWxlRGF5c0ZvckRlbGV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgaGlzdG9yeU1heEZpbGVDb3VudDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1cGRhdGVBcHBTZXR0aW5ncykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZUFwcFNldHRpbmdzLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZUFwcFNldHRpbmdzO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVBcHBTZXR0aW5ncy5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZUFwcFNldHRpbmdzO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogdXBkYXRlQXBwU2V0dGluZ3MudXBkYXRlQXBwU2V0dGluZ3NcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVjZWl2ZWRNYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxSZWNlaXZlZE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVzZXJSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICByZWNlaXZlZE1haWxzOiBtYWlsU2VsZWN0b3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVzZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmICghdXNlci51c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUT0RPIGdldCBhY3R1YWwgbWFpbHMgb24gdGhpcyBhcHAgb25seVxuXG4gICAgY29uc3QgcmVjZWl2ZWRNYWlscyA9IG5ldyBBcnJheTxSZWNlaXZlZE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgdXNlci51c2VyLnJlY2VpdmVkTWFpbHMpIHtcbiAgICAgIGNvbnN0IG1haWwgPSBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChtLCB0aGlzLiNrZXlzKTtcbiAgICAgIGlmIChtYWlsKSB7XG4gICAgICAgIHJlY2VpdmVkTWFpbHMucHVzaChtYWlsIGFzIFJlY2VpdmVkTWFpbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZWNlaXZlZE1haWxzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNlbnRNYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxTZW50TWFpbFtdPiB8IEVycm9yTm90Rm91bmQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgdXNlciB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVzZXI6IFtcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXNlclJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIHNlbnRNYWlsczogbWFpbFNlbGVjdG9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1c2VyLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZiAoIXVzZXIudXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVE9ETyBnZXQgYWN0dWFsIG1haWxzIG9uIHRoaXMgYXBwIG9ubHlcblxuICAgIGNvbnN0IHNlbnRNYWlscyA9IG5ldyBBcnJheTxTZW50TWFpbD4oKTtcblxuICAgIGZvciAoY29uc3QgbSBvZiB1c2VyLnVzZXIuc2VudE1haWxzKSB7XG4gICAgICBjb25zdCBtYWlsID0gY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwobSwgdGhpcy4ja2V5cyk7XG4gICAgICBpZiAobWFpbCkge1xuICAgICAgICBzZW50TWFpbHMucHVzaChtYWlsIGFzIFNlbnRNYWlsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHNlbnRNYWlsc1xuICAgIH07XG4gIH1cblxuICBhc3luYyBkcmFmdE1haWxzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPERyYWZ0TWFpbFtdPiB8IEVycm9yTm90Rm91bmQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgdXNlciB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVzZXI6IFtcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXNlclJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIGRyYWZ0TWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE8gZ2V0IGFjdHVhbCBtYWlscyBvbiB0aGlzIGFwcCBvbmx5XG5cbiAgICBjb25zdCBkcmFmdE1haWxzID0gbmV3IEFycmF5PERyYWZ0TWFpbD4oKTtcblxuICAgIGZvciAoY29uc3QgbSBvZiB1c2VyLnVzZXIuZHJhZnRNYWlscykge1xuICAgICAgY29uc3QgZHJhZnQgPSBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChtLCB0aGlzLiNrZXlzKSBhcyBEcmFmdE1haWw7XG4gICAgICBpZiAoZHJhZnQpIHtcbiAgICAgICAgZHJhZnRNYWlscy5wdXNoKGRyYWZ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRyYWZ0TWFpbHNcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwZXJOb2RlID0gYXN5bmMgKFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIHB1YmxpY0tleTogc3RyaW5nXG4gICk6IFByb21pc2U8TmFtZUtleUlucHV0IHwgbnVsbD4gPT4ge1xuICAgIGxldCBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcblxuICAgIGlmICghbm9kZSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZUtleSA9IG5vZGUuYWNjZXNzPy5uYW1lS2V5O1xuXG4gICAgaWYgKCFuYW1lS2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICBuYW1lS2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChuYW1lS2V5KSxcbiAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWxlczogbm9kZS5oaXN0b3J5Lm1hcChmID0+ICh7XG4gICAgICAgIGlkOiBmLmlkLFxuICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChmLmtleSksXG4gICAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0pKVxuICAgIH07XG4gIH07XG5cbiAgYXN5bmMgdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50KCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPG51bWJlcj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50OiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIFVucmVhZFJlY2VpdmVkTWFpbHNDb3VudFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIGNvdW50OiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVucmVhZFJlY2VpdmVkTWFpbHNDb3VudDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHVucmVhZFJlY2VpdmVkTWFpbHNDb3VudC5jb3VudFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9lYWNoVXNlciA9IGFzeW5jIChcbiAgICBmaWxlczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdLFxuICAgIHN1YmplY3Q6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaWRPck1haWw6IHN0cmluZ1xuICApOiBQcm9taXNlPE1haWxSZWNpcGllbnRJbnB1dCB8IG51bGw+ID0+IHtcbiAgICBsZXQgdSA9IHVzZXJzQ2FjaGUuZ2V0KGlkT3JNYWlsKTtcblxuICAgIGlmICghdSB8fCAhKFwicHVibGljS2V5XCIgaW4gdSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IGF3YWl0IHRoaXMudXNlcih7XG4gICAgICAgICAgdXNlcklkOiBpZE9yTWFpbCxcbiAgICAgICAgICB3aXRoUHVibGljS2V5OiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlcSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXEuX190eXBlbmFtZSAhPT0gXCJTdWNjZXNzUmVzcG9uc2VcIikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHUgPSByZXEuZGF0YTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghKFwicHVibGljS2V5XCIgaW4gdSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVXNlciAke2lkT3JNYWlsfSBoYXZlIG5vIHB1YmxpYyBrZXlgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNpcGllbnRzRmlsZXMgPSBuZXcgQXJyYXk8TWFpbEZpbGVJbnB1dD4oKTtcblxuICAgIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgICAgbGV0IGZpbGVJbkhpc3RvcnkgPSBmaWxlc0NhY2hlLmdldChmLmlkKTtcbiAgICAgIGlmICghZmlsZUluSGlzdG9yeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGUoeyBpZDogZi5pZCB9KTtcbiAgICAgICAgZmlsZUluSGlzdG9yeSA9IGZpbGVzQ2FjaGUuZ2V0KGYuaWQpO1xuICAgICAgICBpZiAoIWZpbGVJbkhpc3RvcnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmLm5hbWV9ICgke2YuaWR9KSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gZmlsZUluSGlzdG9yeS5rZXk7XG4gICAgICByZWNpcGllbnRzRmlsZXMucHVzaCh7XG4gICAgICAgIGlkOiBmLmlkLFxuICAgICAgICBuYW1lOiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoZi5uYW1lKSxcbiAgICAgICAgICAgIHUucHVibGljS2V5LFxuICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBmaWxlS2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoa2V5KSxcbiAgICAgICAgICAgIHUucHVibGljS2V5LFxuICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjaXBpZW50SWQ6IHUuaWQsXG4gICAgICBib2R5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhib2R5KSxcbiAgICAgICAgICB1LnB1YmxpY0tleSxcbiAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIHN1YmplY3Q6IHNvZGl1bS50b19oZXgoXG4gICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKHN1YmplY3QpLFxuICAgICAgICAgIHUucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgZmlsZXM6IHJlY2lwaWVudHNGaWxlc1xuICAgIH07XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFHQSxPQUFPQSxFQUFQLE1BQWUsSUFBZjtBQUNBLE9BQU9DLEtBQVAsTUFBa0Is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
46
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCYXNlQ2xpZW50IiwiZW5jcnlwdFNlY3JldHN0cmVhbSIsInNvZGl1bSIsIlNlY3JlY3lDbG91ZENsaWVudCIsIlNlY3JlY3lNYWlsQ2xpZW50IiwiU2VjcmVjeUFwcENsaWVudCIsIm5vZGVzQ2FjaGUiLCJmaWxlc0NhY2hlIiwiU2VjcmVjeURiQ2xpZW50IiwiU2VjcmVjeVdhbGxldENsaWVudCIsIlNlY3JlY3lQYXlDbGllbnQiLCJlbmNyeXB0TmFtZSIsIm5hbWUiLCJuYW1lS2V5IiwiZGF0YSIsImZyb21faGV4IiwiZnJvbV9zdHJpbmciLCJuYW1lRW5jcnlwdGVkIiwidG9faGV4IiwiU2VjcmVjeUNsaWVudCIsImNvbnN0cnVjdG9yIiwidWFTZXNzaW9uIiwidWFLZXlzIiwidWFKd3QiLCJlbnYiLCJjbG91ZCIsInRodW5kZXIiLCJtYWlsIiwiYXBwIiwiZGIiLCJ3YWxsZXQiLCJwYXkiLCJwdWJsaWNLZXkiLCJsb2dvdXQiLCJzZXNzaW9uSWQiLCJjbGVhciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXG5pbXBvcnQgeyBCYXNlQ2xpZW50IH0gZnJvbSBcIi4uL0Jhc2VDbGllbnQuanNcIjtcbmltcG9ydCB0eXBlIHsgUHJvZ3Jlc3MgfSBmcm9tIFwiLi4vY3J5cHRvL2ZpbGUuanNcIjtcbmltcG9ydCB7IGVuY3J5cHRTZWNyZXRzdHJlYW0gfSBmcm9tIFwiLi4vY3J5cHRvL2ZpbGUuanNcIjtcbmltcG9ydCB7IHNvZGl1bSB9IGZyb20gXCIuLi9zb2RpdW0uanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5UGFpciB9IGZyb20gXCIuLi9jcnlwdG8vaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgU2VjcmVjeUVudiB9IGZyb20gXCIuL2hlbHBlcnMuanNcIjtcbmltcG9ydCB7IFNlY3JlY3lDbG91ZENsaWVudCB9IGZyb20gXCIuL1NlY3JlY3lDbG91ZENsaWVudC5qc1wiO1xuaW1wb3J0IHsgU2VjcmVjeU1haWxDbGllbnQgfSBmcm9tIFwiLi9TZWNyZWN5TWFpbENsaWVudC5qc1wiO1xuaW1wb3J0IHsgU2VjcmVjeUFwcENsaWVudCB9IGZyb20gXCIuL1NlY3JlY3lBcHBDbGllbnQuanNcIjtcbmltcG9ydCB7IG5vZGVzQ2FjaGUsIGZpbGVzQ2FjaGUgfSBmcm9tIFwiLi4vY2FjaGUuanNcIjtcbmltcG9ydCB7IFNlY3JlY3lEYkNsaWVudCB9IGZyb20gXCIuL1NlY3JlY3lEYkNsaWVudC5qc1wiO1xuaW1wb3J0IHsgU2VjcmVjeVdhbGxldENsaWVudCB9IGZyb20gXCIuL1NlY3JlY3lXYWxsZXRDbGllbnQuanNcIjtcbmltcG9ydCB7IFNlY3JlY3lQYXlDbGllbnQgfSBmcm9tIFwiLi9TZWNyZWN5UGF5Q2xpZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIE5ld01haWwgPSB7XG4gIGJvZHk6IHN0cmluZztcbiAgc3ViamVjdDogc3RyaW5nO1xuICBmaWxlczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdO1xuICByZWNpcGllbnRzSWRzOiBzdHJpbmdbXTtcbiAgcmVwbHlUbz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG59O1xuZXhwb3J0IHR5cGUgUHJvZ3Jlc3NDYWxsYmFjayA9IChwcm9ncmVzczogUHJvZ3Jlc3MpID0+IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBjb25zdCBlbmNyeXB0TmFtZSA9IGFzeW5jIChcbiAgbmFtZTogc3RyaW5nLFxuICBuYW1lS2V5OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgZW5jcnlwdFNlY3JldHN0cmVhbShcbiAgICBzb2RpdW0uZnJvbV9oZXgobmFtZUtleSksXG4gICAgc29kaXVtLmZyb21fc3RyaW5nKG5hbWUpXG4gICk7XG4gIGNvbnN0IG5hbWVFbmNyeXB0ZWQgPSBzb2RpdW0udG9faGV4KGRhdGEpO1xuICByZXR1cm4gbmFtZUVuY3J5cHRlZDtcbn07XG5cbmV4cG9ydCBjbGFzcyBTZWNyZWN5Q2xpZW50IGV4dGVuZHMgQmFzZUNsaWVudCB7XG4gICNrZXlzOiBLZXlQYWlyO1xuXG4gIGNsb3VkOiBTZWNyZWN5Q2xvdWRDbGllbnQ7XG5cbiAgbWFpbDogU2VjcmVjeU1haWxDbGllbnQ7XG5cbiAgYXBwOiBTZWNyZWN5QXBwQ2xpZW50O1xuXG4gIGRiOiBTZWNyZWN5RGJDbGllbnQ7XG5cbiAgd2FsbGV0OiBTZWNyZWN5V2FsbGV0Q2xpZW50O1xuXG4gIHBheTogU2VjcmVjeVBheUNsaWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB1YVNlc3Npb246IHN0cmluZyxcbiAgICB1YUtleXM6IEtleVBhaXIsXG4gICAgdWFKd3Q6IHN0cmluZyxcbiAgICBlbnY6IFNlY3JlY3lFbnZcbiAgKSB7XG4gICAgc3VwZXIodWFTZXNzaW9uLCBlbnYpO1xuICAgIHRoaXMuI2tleXMgPSB1YUtleXM7XG4gICAgdGhpcy5jbG91ZCA9IG5ldyBTZWNyZWN5Q2xvdWRDbGllbnQodGhpcywgdGhpcy4ja2V5cywgdGhpcy50aHVuZGVyKTtcbiAgICB0aGlzLm1haWwgPSBuZXcgU2VjcmVjeU1haWxDbGllbnQodGhpcywgdGhpcy4ja2V5cywgdGhpcy50aHVuZGVyKTtcbiAgICB0aGlzLmFwcCA9IG5ldyBTZWNyZWN5QXBwQ2xpZW50KHVhSnd0LCB0aGlzLCB0aGlzLiNrZXlzLCB0aGlzLnRodW5kZXIpO1xuICAgIHRoaXMuZGIgPSBuZXcgU2VjcmVjeURiQ2xpZW50KHRoaXMsIHRoaXMuI2tleXMsIHRoaXMudGh1bmRlcik7XG4gICAgdGhpcy53YWxsZXQgPSBuZXcgU2VjcmVjeVdhbGxldENsaWVudCh0aGlzKTtcbiAgICB0aGlzLnBheSA9IG5ldyBTZWNyZWN5UGF5Q2xpZW50KHRoaXMsIHRoaXMuI2tleXMsIHRoaXMudGh1bmRlcik7XG4gIH1cblxuICBnZXQgcHVibGljS2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuI2tleXMucHVibGljS2V5O1xuICB9XG5cbiAgYXN5bmMgbG9nb3V0KHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBub2Rlc0NhY2hlLmNsZWFyKCk7XG4gICAgZmlsZXNDYWNoZS5jbGVhcigpO1xuICAgIGF3YWl0IHN1cGVyLmxvZ291dChzZXNzaW9uSWQpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQSxTQUFTQSxVQUFVLFFBQVEsa0JBQWtCO0FBRTdDLFNBQVNDLG1CQUFtQixRQUFRLG1CQUFtQjtBQUN2RCxTQUFTQyxNQUFNLFFBQVEsY0FBYztBQUdyQyxTQUFTQyxrQkFBa0IsUUFBUSx5QkFBeUI7QUFDNUQsU0FBU0MsaUJBQWlCLFFBQVEsd0JBQXdCO0FBQzFELFNBQVNDLGdCQUFnQixRQUFRLHVCQUF1QjtBQUN4RCxTQUFTQyxVQUFVLEVBQUVDLFVBQVUsUUFBUSxhQUFhO0FBQ3BELFNBQVNDLGVBQWUsUUFBUSxzQkFBc0I7QUFDdEQsU0FBU0MsbUJBQW1CLFFBQVEsMEJBQTBCO0FBQzlELFNBQVNDLGdCQUFnQixRQUFRLHVCQUF1QjtBQVd4RCxPQUFPLE1BQU1DLFdBQVcsR0FBRyxPQUN6QkMsSUFBWSxFQUNaQyxPQUFlLEtBQ0s7RUFDcEIsTUFBTTtJQUFFQztFQUFLLENBQUMsR0FBRyxNQUFNYixtQkFBbUIsQ0FDeENDLE1BQU0sQ0FBQ2EsUUFBUSxDQUFDRixPQUFPLENBQUMsRUFDeEJYLE1BQU0sQ0FBQ2MsV0FBVyxDQUFDSixJQUFJLENBQUMsQ0FDekI7RUFDRCxNQUFNSyxhQUFhLEdBQUdmLE1BQU0sQ0FBQ2dCLE1BQU0sQ0FBQ0osSUFBSSxDQUFDO0VBQ3pDLE9BQU9HLGFBQWE7QUFDdEIsQ0FBQztBQUFDO0FBRUYsT0FBTyxNQUFNRSxhQUFhLFNBQVNuQixVQUFVLENBQUM7RUFlNUNvQixXQUFXLENBQ1RDLFNBQWlCLEVBQ2pCQyxNQUFlLEVBQ2ZDLEtBQWEsRUFDYkMsR0FBZSxFQUNmO0lBQ0EsS0FBSyxDQUFDSCxTQUFTLEVBQUVHLEdBQUcsQ0FBQztJQUFDO01BQUE7TUFBQTtJQUFBO0lBQ3RCLGdDQUFJLGtCQUFTRixNQUFNO0lBQ25CLElBQUksQ0FBQ0csS0FBSyxHQUFHLElBQUl0QixrQkFBa0IsQ0FBQyxJQUFJLDhCQUFFLElBQUksaUJBQVEsSUFBSSxDQUFDdUIsT0FBTyxDQUFDO0lBQ25FLElBQUksQ0FBQ0MsSUFBSSxHQUFHLElBQUl2QixpQkFBaUIsQ0FBQyxJQUFJLDhCQUFFLElBQUksaUJBQVEsSUFBSSxDQUFDc0IsT0FBTyxDQUFDO0lBQ2pFLElBQUksQ0FBQ0UsR0FBRyxHQUFHLElBQUl2QixnQkFBZ0IsQ0FBQ2tCLEtBQUssRUFBRSxJQUFJLDhCQUFFLElBQUksaUJBQVEsSUFBSSxDQUFDRyxPQUFPLENBQUM7SUFDdEUsSUFBSSxDQUFDRyxFQUFFLEdBQUcsSUFBSXJCLGVBQWUsQ0FBQyxJQUFJLDhCQUFFLElBQUksaUJBQVEsSUFBSSxDQUFDa0IsT0FBTyxDQUFDO0lBQzdELElBQUksQ0FBQ0ksTUFBTSxHQUFHLElBQUlyQixtQkFBbUIsQ0FBQyxJQUFJLENBQUM7SUFDM0MsSUFBSSxDQUFDc0IsR0FBRyxHQUFHLElBQUlyQixnQkFBZ0IsQ0FBQyxJQUFJLDhCQUFFLElBQUksaUJBQVEsSUFBSSxDQUFDZ0IsT0FBTyxDQUFDO0VBQ2pFO0VBRUEsSUFBSU0sU0FBUyxHQUFXO0lBQ3RCLE9BQU8sZ0NBQUksZ0JBQU9BLFNBQVM7RUFDN0I7RUFFQSxNQUFNQyxNQUFNLENBQUNDLFNBQXFDLEVBQWlCO0lBQ2pFNUIsVUFBVSxDQUFDNkIsS0FBSyxFQUFFO0lBQ2xCNUIsVUFBVSxDQUFDNEIsS0FBSyxFQUFFO0lBQ2xCLE1BQU0sS0FBSyxDQUFDRixNQUFNLENBQUNDLFNBQVMsQ0FBQztFQUMvQjtBQUNGIn0=