@nlabs/reaktor 0.5.4 → 0.8.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 (135) hide show
  1. package/README.md +7 -7
  2. package/lib/actions/conversations.js +68 -69
  3. package/lib/actions/dynamodb.js +22 -33
  4. package/lib/actions/email.js +32 -30
  5. package/lib/actions/files.js +39 -58
  6. package/lib/actions/groups.js +33 -28
  7. package/lib/actions/images.js +71 -82
  8. package/lib/actions/index.js +54 -37
  9. package/lib/actions/ios.js +21 -40
  10. package/lib/actions/locations.js +25 -22
  11. package/lib/actions/messages.js +31 -45
  12. package/lib/actions/notifications.js +13 -20
  13. package/lib/actions/payments.js +40 -52
  14. package/lib/actions/posts.js +68 -48
  15. package/lib/actions/reactions.js +29 -52
  16. package/lib/actions/s3.js +21 -18
  17. package/lib/actions/search.js +26 -40
  18. package/lib/actions/sms.js +24 -21
  19. package/lib/actions/statistics.js +14 -21
  20. package/lib/actions/subscription.js +27 -24
  21. package/lib/actions/tags.js +49 -56
  22. package/lib/actions/users.js +92 -106
  23. package/lib/actions/websockets.js +28 -41
  24. package/lib/config.js +21 -18
  25. package/lib/index.js +24 -22
  26. package/lib/lambdas/actions/websockets.js +21 -45
  27. package/lib/lambdas/authorizer.js +16 -24
  28. package/lib/lambdas/connection.js +18 -43
  29. package/lib/lambdas/utils/message.js +20 -17
  30. package/lib/lambdas/utils/websocket.js +33 -25
  31. package/lib/templates/email/layout.js +16 -9
  32. package/lib/templates/email/passwordForgot.js +16 -9
  33. package/lib/templates/email/passwordRecovery.js +16 -9
  34. package/lib/templates/email/verifyEmail.js +16 -9
  35. package/lib/templates/email/welcome.js +16 -9
  36. package/lib/templates/sms/passwordForgot.js +16 -9
  37. package/lib/templates/sms/passwordRecovery.js +16 -9
  38. package/lib/templates/sms/verifyEmail.js +16 -9
  39. package/lib/templates/sms/verifyPhone.js +16 -9
  40. package/lib/templates/sms/welcome.js +16 -9
  41. package/lib/types/apps.js +14 -5
  42. package/lib/types/arangodb.js +14 -5
  43. package/lib/types/auth.js +14 -5
  44. package/lib/types/connections.js +14 -5
  45. package/lib/types/conversations.js +14 -5
  46. package/lib/types/email.js +14 -5
  47. package/lib/types/files.js +14 -5
  48. package/lib/types/google.js +14 -5
  49. package/lib/types/groups.js +14 -5
  50. package/lib/types/images.js +14 -5
  51. package/lib/types/index.js +50 -35
  52. package/lib/types/locations.js +14 -5
  53. package/lib/types/messages.js +14 -5
  54. package/lib/types/notifications.js +14 -5
  55. package/lib/types/payments.js +14 -5
  56. package/lib/types/posts.js +14 -5
  57. package/lib/types/statistics.js +14 -5
  58. package/lib/types/tags.js +14 -5
  59. package/lib/types/users.js +14 -5
  60. package/lib/types/websocket.js +14 -5
  61. package/lib/utils/analytics.js +24 -44
  62. package/lib/utils/arangodb.js +15 -22
  63. package/lib/utils/auth.js +22 -36
  64. package/lib/utils/graphql.js +20 -17
  65. package/lib/utils/index.js +26 -23
  66. package/lib/utils/objects.js +22 -19
  67. package/lib/utils/session.js +20 -17
  68. package/package.json +31 -33
  69. package/.eslintrc +0 -18
  70. package/lib/actions/conversations.d.ts +0 -14
  71. package/lib/actions/dynamodb.d.ts +0 -8
  72. package/lib/actions/email.d.ts +0 -7
  73. package/lib/actions/files.d.ts +0 -16
  74. package/lib/actions/groups.d.ts +0 -14
  75. package/lib/actions/images.d.ts +0 -22
  76. package/lib/actions/index.d.ts +0 -20
  77. package/lib/actions/ios.d.ts +0 -7
  78. package/lib/actions/locations.d.ts +0 -3
  79. package/lib/actions/messages.d.ts +0 -13
  80. package/lib/actions/notifications.d.ts +0 -5
  81. package/lib/actions/payments.d.ts +0 -10
  82. package/lib/actions/posts.d.ts +0 -19
  83. package/lib/actions/reactions.d.ts +0 -30
  84. package/lib/actions/s3.d.ts +0 -7
  85. package/lib/actions/search.d.ts +0 -3
  86. package/lib/actions/sms.d.ts +0 -3
  87. package/lib/actions/statistics.d.ts +0 -2
  88. package/lib/actions/subscription.d.ts +0 -7
  89. package/lib/actions/tags.d.ts +0 -26
  90. package/lib/actions/users.d.ts +0 -44
  91. package/lib/actions/websockets.d.ts +0 -6
  92. package/lib/config.d.ts +0 -20
  93. package/lib/index.d.ts +0 -5
  94. package/lib/lambdas/actions/websockets.d.ts +0 -6
  95. package/lib/lambdas/authorizer.d.ts +0 -20
  96. package/lib/lambdas/connection.d.ts +0 -12
  97. package/lib/lambdas/utils/message.d.ts +0 -1
  98. package/lib/lambdas/utils/websocket.d.ts +0 -7
  99. package/lib/templates/email/layout.d.ts +0 -2
  100. package/lib/templates/email/passwordForgot.d.ts +0 -2
  101. package/lib/templates/email/passwordRecovery.d.ts +0 -2
  102. package/lib/templates/email/verifyEmail.d.ts +0 -2
  103. package/lib/templates/email/welcome.d.ts +0 -2
  104. package/lib/templates/sms/passwordForgot.d.ts +0 -2
  105. package/lib/templates/sms/passwordRecovery.d.ts +0 -2
  106. package/lib/templates/sms/verifyEmail.d.ts +0 -2
  107. package/lib/templates/sms/verifyPhone.d.ts +0 -2
  108. package/lib/templates/sms/welcome.d.ts +0 -2
  109. package/lib/types/apps.d.ts +0 -44
  110. package/lib/types/arangodb.d.ts +0 -17
  111. package/lib/types/auth.d.ts +0 -7
  112. package/lib/types/connections.d.ts +0 -8
  113. package/lib/types/conversations.d.ts +0 -11
  114. package/lib/types/email.d.ts +0 -12
  115. package/lib/types/files.d.ts +0 -26
  116. package/lib/types/google.d.ts +0 -27
  117. package/lib/types/groups.d.ts +0 -22
  118. package/lib/types/images.d.ts +0 -42
  119. package/lib/types/index.d.ts +0 -18
  120. package/lib/types/locations.d.ts +0 -20
  121. package/lib/types/messages.d.ts +0 -27
  122. package/lib/types/notifications.d.ts +0 -19
  123. package/lib/types/payments.d.ts +0 -115
  124. package/lib/types/posts.d.ts +0 -47
  125. package/lib/types/statistics.d.ts +0 -3
  126. package/lib/types/tags.d.ts +0 -15
  127. package/lib/types/users.d.ts +0 -80
  128. package/lib/types/websocket.d.ts +0 -14
  129. package/lib/utils/analytics.d.ts +0 -14
  130. package/lib/utils/arangodb.d.ts +0 -9
  131. package/lib/utils/auth.d.ts +0 -5
  132. package/lib/utils/graphql.d.ts +0 -1
  133. package/lib/utils/index.d.ts +0 -6
  134. package/lib/utils/objects.d.ts +0 -3
  135. package/lib/utils/session.d.ts +0 -18
@@ -1,47 +1,32 @@
1
1
  var __create = Object.create;
2
2
  var __defProp = Object.defineProperty;
3
- var __defProps = Object.defineProperties;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
5
  var __getProtoOf = Object.getPrototypeOf;
9
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
10
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
- var __spreadValues = (a, b) => {
13
- for (var prop in b || (b = {}))
14
- if (__hasOwnProp.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- if (__getOwnPropSymbols)
17
- for (var prop of __getOwnPropSymbols(b)) {
18
- if (__propIsEnum.call(b, prop))
19
- __defNormalProp(a, prop, b[prop]);
20
- }
21
- return a;
22
- };
23
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
- var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
25
- var __require = typeof require !== "undefined" ? require : (x) => {
26
- throw new Error('Dynamic require of "' + x + '" is not supported');
27
- };
28
7
  var __export = (target, all) => {
29
- __markAsModule(target);
30
8
  for (var name in all)
31
9
  __defProp(target, name, { get: all[name], enumerable: true });
32
10
  };
33
- var __reExport = (target, module2, desc) => {
34
- if (module2 && typeof module2 === "object" || typeof module2 === "function") {
35
- for (let key of __getOwnPropNames(module2))
36
- if (!__hasOwnProp.call(target, key) && key !== "default")
37
- __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
38
16
  }
39
- return target;
17
+ return to;
40
18
  };
41
- var __toModule = (module2) => {
42
- return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
43
- };
44
- __export(exports, {
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var images_exports = {};
29
+ __export(images_exports, {
45
30
  addImage: () => addImage,
46
31
  addImageEdge: () => addImageEdge,
47
32
  deleteImage: () => deleteImage,
@@ -49,28 +34,28 @@ __export(exports, {
49
34
  getImage: () => getImage,
50
35
  getImageCountByItem: () => getImageCountByItem,
51
36
  getImageOptional: () => getImageOptional,
37
+ getImageUrl: () => getImageUrl,
52
38
  getImagesByGroup: () => getImagesByGroup,
53
39
  getImagesByItem: () => getImagesByItem,
54
40
  getImagesByReactions: () => getImagesByReactions,
55
41
  getImagesByUser: () => getImagesByUser,
56
42
  getPathUserImages: () => getPathUserImages,
57
- getUserImageUrl: () => getUserImageUrl,
58
43
  parseImageOptions: () => parseImageOptions,
59
44
  resizeSaveImage: () => resizeSaveImage,
60
45
  updateImage: () => updateImage
61
46
  });
62
- var import_rip_hunter = __toModule(require("@nlabs/rip-hunter"));
63
- var import_utils = __toModule(require("@nlabs/utils"));
64
- var import_arangojs = __toModule(require("arangojs"));
65
- var import_file_type = __toModule(require("file-type"));
66
- var import_gm = __toModule(require("gm"));
67
- var import_cloneDeep = __toModule(require("lodash/cloneDeep"));
68
- var import_isEmpty = __toModule(require("lodash/isEmpty"));
69
- var import_luxon = __toModule(require("luxon"));
70
- var import_config = __toModule(require("../config"));
71
- var import_utils2 = __toModule(require("../utils"));
72
- var import_groups = __toModule(require("./groups"));
73
- var import_s32 = __toModule(require("./s3"));
47
+ module.exports = __toCommonJS(images_exports);
48
+ var import_rip_hunter = require("@nlabs/rip-hunter");
49
+ var import_utils = require("@nlabs/utils");
50
+ var import_arangojs = require("arangojs");
51
+ var import_file_type = __toESM(require("file-type"));
52
+ var import_gm = __toESM(require("gm"));
53
+ var import_cloneDeep = __toESM(require("lodash/cloneDeep"));
54
+ var import_luxon = require("luxon");
55
+ var import_config = require("../config");
56
+ var import_utils2 = require("../utils");
57
+ var import_groups = require("./groups");
58
+ var import_s32 = require("./s3");
74
59
  const eventCategory = "images";
75
60
  const parseImageOptions = (options = {}) => {
76
61
  const {
@@ -146,7 +131,7 @@ const getImageCountByItem = (context, itemId) => {
146
131
  const action = "getImageCountByItem";
147
132
  const { database } = context;
148
133
  const formatItemId = (0, import_utils.parseArangoId)(itemId);
149
- const aqlQry = import_arangojs.aql`FOR i IN hasImages
134
+ const aqlQry = import_arangojs.aql`FOR i IN hasImage
150
135
  FILTER i._to == ${formatItemId}
151
136
  RETURN {count: COUNT(i)}`;
152
137
  return database.query(aqlQry).then((cursor) => cursor.next()).then(({ count } = { count: 0 }) => count).catch((error) => (0, import_utils2.logError)({
@@ -161,7 +146,7 @@ const getImagesByItem = async (context, itemId, options = {}) => {
161
146
  const formatItemId = (0, import_utils.parseArangoId)(itemId);
162
147
  const { limit } = parseImageOptions(options);
163
148
  const { objects: selectObjects, queries: selectQueries } = getImageOptional(fields);
164
- const aqlQry = `FOR i, l IN 1..1 OUTBOUND "${formatItemId}" hasImages
149
+ const aqlQry = `FOR i, l IN 1..1 OUTBOUND "${formatItemId}" hasImage
165
150
  FILTER NOT IS_NULL(i)
166
151
  ${selectQueries.join("\n")}
167
152
  SORT i.added
@@ -201,7 +186,7 @@ const getImagesByGroup = (context, params) => {
201
186
  FOR p IN posts
202
187
  FILTER ${filterStr}
203
188
  LET images = (
204
- FOR i, e IN INBOUND p._id hasImages
189
+ FOR i, e IN INBOUND p._id hasImage
205
190
  RETURN i
206
191
  )
207
192
  SORT p.added DESC
@@ -248,7 +233,7 @@ const getImagesByReactions = (context, reactions = [], options) => {
248
233
  'r.type == "images"',
249
234
  `POSITION(${JSON.stringify(formatReactions)}, LOWER(r.name))`
250
235
  ];
251
- const aqlQry = `FOR i, r IN OUTBOUND "${formatSessionId}" hasReactions
236
+ const aqlQry = `FOR i, r IN OUTBOUND "${formatSessionId}" hasReaction
252
237
  OPTIONS {vertexCollections: "images"}
253
238
  ${selectQueries.join("\n")}
254
239
  FILTER ${filterBy.join(" && ")}
@@ -304,11 +289,11 @@ const getAppImageUrl = (data) => {
304
289
  }
305
290
  return "";
306
291
  };
307
- const getUserImageUrl = (data) => {
308
- const { bucket, imageId, isThumb = false, userId } = data;
292
+ const getImageUrl = (data) => {
293
+ const { bucket, imageId, isThumb = false, type, typeId } = data;
309
294
  const imgDir = isThumb ? "thumbs" : "images";
310
295
  if (imageId) {
311
- const imageKey = `users/${userId}/${imgDir}/${imageId}.jpg`;
296
+ const imageKey = `${type}/${typeId}/${imgDir}/${imageId}.jpg`;
312
297
  return (0, import_s32.s3GetSignedUrl)({ Bucket: bucket, Key: imageKey, Expires: 900 });
313
298
  }
314
299
  return "";
@@ -335,11 +320,12 @@ const resizeSaveImage = (context, imageId, buffer, type = "image/jpeg", s3Option
335
320
  } else {
336
321
  const formatVals = (0, import_utils2.lowerCaseKeys)(val);
337
322
  const { make: cameraMake, model: cameraModel, datetimeoriginal: taken } = formatVals;
338
- photo = __spreadProps(__spreadValues({}, (0, import_cloneDeep.default)(photo)), {
323
+ photo = {
324
+ ...(0, import_cloneDeep.default)(photo),
339
325
  make: cameraMake,
340
326
  model: cameraModel,
341
327
  taken: taken ? import_luxon.DateTime.fromMillis(taken).millisecond : null
342
- });
328
+ };
343
329
  const stats = formatVals["channel statistics"];
344
330
  if (stats) {
345
331
  let { red, green, blue, mean } = stats;
@@ -382,21 +368,21 @@ const resizeSaveImage = (context, imageId, buffer, type = "image/jpeg", s3Option
382
368
  });
383
369
  stdout.on("end", () => {
384
370
  photo.fileSize = imageBuffer.length;
385
- const imageObj = __spreadProps(__spreadValues({
371
+ const imageObj = {
386
372
  ACL: "authenticated-read",
387
373
  Body: imageBuffer,
388
374
  Bucket: null,
389
- ContentType: type
390
- }, s3Options || {}), {
375
+ ContentType: type,
376
+ ...s3Options || {},
391
377
  Key: getPathUserImages(sessionId, imageId, type, "images")
392
- });
378
+ };
393
379
  (0, import_s32.s3Put)(imageObj).then(() => {
394
380
  const thmW = import_config.Config.get("image.thmSize");
395
381
  const thmQ = import_config.Config.get("image.thmQuality");
396
382
  (0, import_gm.default)(imageBuffer, "img").setFormat("jpeg").size((thumbError, resizeVal) => {
397
383
  if (!thumbError) {
398
384
  const { height, width } = resizeVal;
399
- photo = __spreadProps(__spreadValues({}, (0, import_cloneDeep.default)(photo)), { height, width });
385
+ photo = { ...(0, import_cloneDeep.default)(photo), height, width };
400
386
  }
401
387
  }).gravity("Center").resize(thmW, thmW, "^").extent(thmW, thmW).quality(thmQ).stream((streamError, thumbStdout) => {
402
388
  if (streamError) {
@@ -414,14 +400,14 @@ const resizeSaveImage = (context, imageId, buffer, type = "image/jpeg", s3Option
414
400
  thumbBuffer = Buffer.concat([thumbBuffer, data]);
415
401
  });
416
402
  thumbStdout.on("end", () => {
417
- const thumbObj = __spreadProps(__spreadValues({
403
+ const thumbObj = {
418
404
  ACL: "authenticated-read",
419
405
  Body: thumbBuffer,
420
406
  Bucket: null,
421
- ContentType: type
422
- }, s3Options || {}), {
407
+ ContentType: type,
408
+ ...s3Options || {},
423
409
  Key: getPathUserImages(sessionId, imageId, type, "thumbs")
424
- });
410
+ };
425
411
  (0, import_s32.s3Put)(thumbObj).then(() => {
426
412
  resolve(photo);
427
413
  }).catch((s3PutError) => (0, import_utils2.logError)({
@@ -453,14 +439,15 @@ const addImage = (context, image, s3Options) => {
453
439
  const { imageId, description, buffer, fileType } = image;
454
440
  const now = Date.now();
455
441
  return resizeSaveImage(context, imageId, buffer, fileType, s3Options).then((resizedImage) => {
456
- const insert = __spreadProps(__spreadValues({}, resizedImage), {
442
+ const insert = {
443
+ ...resizedImage,
457
444
  _key: imageId,
458
445
  added: now,
459
446
  description,
460
447
  fileType,
461
448
  modified: now,
462
449
  userId: sessionId
463
- });
450
+ };
464
451
  const aqlQry = import_arangojs.aql`INSERT ${insert} IN images RETURN NEW`;
465
452
  return database.query(aqlQry).then((cursor) => cursor.next()).then(import_utils2.defaultObject).catch((error) => (0, import_utils2.logError)({
466
453
  action,
@@ -480,13 +467,13 @@ const addImageEdge = async (context, imageEdge) => {
480
467
  const { database, session: { userId: sessionId } } = context;
481
468
  const { imageId, itemId, itemType } = imageEdge;
482
469
  const now = Date.now();
483
- const edgeCollection = database.collection("hasImages");
484
- const edgeId = (0, import_utils.createHash)(`hasImages-${imageId}-${itemId}-${sessionId}`);
470
+ const edgeCollection = database.collection("hasImage");
471
+ const edgeId = (0, import_utils.createHash)(`hasImage-${imageId}-${itemId}-${sessionId}`);
485
472
  const formatItemType = (0, import_utils.parseChar)(itemType).toLowerCase();
486
473
  const formatItemId = (0, import_utils.parseId)(itemId);
487
474
  let itemDocId;
488
- const formatImgId = (0, import_utils.parseId)(imageId);
489
- const fileDocId = `images/${formatImgId}`;
475
+ const formatImageId = (0, import_utils.parseId)(imageId);
476
+ const fileDocId = `images/${formatImageId}`;
490
477
  switch (formatItemType) {
491
478
  case "groups":
492
479
  itemDocId = `groups/${formatItemId}`;
@@ -509,7 +496,7 @@ const addImageEdge = async (context, imageEdge) => {
509
496
  added: now,
510
497
  type: itemType
511
498
  };
512
- if (!(0, import_isEmpty.default)(itemDocId)) {
499
+ if (itemDocId) {
513
500
  return edgeCollection.save(edge, { returnNew: true }).then((fileEdge) => edgeCollection.document(fileEdge)).catch((error) => (0, import_utils2.logError)({
514
501
  action,
515
502
  category: eventCategory,
@@ -549,22 +536,23 @@ const updateImage = async (context, image, s3Options) => {
549
536
  imageId: formatImageId,
550
537
  userId: sessionId
551
538
  };
552
- if (!(0, import_isEmpty.default)(base64) || imageBuffer) {
539
+ if (base64 || imageBuffer) {
553
540
  let buffer = imageBuffer;
554
- if (!(0, import_isEmpty.default)(base64)) {
541
+ if (base64) {
555
542
  const formatBase64 = base64.substr(base64.indexOf(",") + 1);
556
543
  buffer = Buffer.from(formatBase64, "base64");
557
544
  }
558
545
  let updatedFileType = fileType;
559
546
  if (!fileType) {
560
- const fileMime = await import_file_type.default.fromBuffer(buffer);
547
+ const fileMime = await import_file_type.default.fileTypeFromBuffer(buffer);
561
548
  const { mime } = fileMime;
562
549
  updatedFileType = mime;
563
550
  }
564
- const imgParams = __spreadProps(__spreadValues({}, customParams), {
551
+ const imgParams = {
552
+ ...customParams,
565
553
  buffer,
566
554
  fileType: updatedFileType
567
- });
555
+ };
568
556
  return addImage(context, imgParams, s3Options).then((image2) => {
569
557
  if (formatItemId && formatItemType) {
570
558
  const imageEdge = {
@@ -594,10 +582,11 @@ const updateImage = async (context, image, s3Options) => {
594
582
  contentType = res.headers.get("content-type");
595
583
  return res;
596
584
  }).then((res) => res.buffer()).then((buffer) => {
597
- const imgParams = __spreadProps(__spreadValues({}, customParams), {
585
+ const imgParams = {
586
+ ...customParams,
598
587
  buffer,
599
588
  fileType: contentType
600
- });
589
+ };
601
590
  return addImage(context, imgParams, s3Options).then((image2) => {
602
591
  if (formatItemId && formatItemType) {
603
592
  const imageEdge = { imageId: formatImageId, itemId: formatItemId, itemType: formatItemType };
@@ -633,9 +622,9 @@ const deleteImage = async (context, imageId) => {
633
622
  const action = "delete";
634
623
  const { database, session: { userId: sessionId } } = context;
635
624
  const formatImageId = (0, import_utils.parseId)(imageId);
636
- const removeEdgeQuery = import_arangojs.aql`FOR hi IN hasImages
625
+ const removeEdgeQuery = import_arangojs.aql`FOR hi IN hasImage
637
626
  FILTER hi._from == ${formatImageId}
638
- REMOVE hi IN hasImages
627
+ REMOVE hi IN hasImage
639
628
  RETURN OLD`;
640
629
  await database.query(removeEdgeQuery);
641
630
  const aqlQuery = import_arangojs.aql`FOR i IN images
@@ -647,7 +636,7 @@ const deleteImage = async (context, imageId) => {
647
636
  category: eventCategory,
648
637
  label: "db_error"
649
638
  }, error, context).then(() => null));
650
- if (!(0, import_isEmpty.default)(image)) {
639
+ if (image) {
651
640
  const { _key: imageKey } = image;
652
641
  const params = {
653
642
  Bucket: null,
@@ -672,14 +661,14 @@ const deleteImage = async (context, imageId) => {
672
661
  getImage,
673
662
  getImageCountByItem,
674
663
  getImageOptional,
664
+ getImageUrl,
675
665
  getImagesByGroup,
676
666
  getImagesByItem,
677
667
  getImagesByReactions,
678
668
  getImagesByUser,
679
669
  getPathUserImages,
680
- getUserImageUrl,
681
670
  parseImageOptions,
682
671
  resizeSaveImage,
683
672
  updateImage
684
673
  });
685
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvaW1hZ2VzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtnZXQgYXMgaHR0cEdldH0gZnJvbSAnQG5sYWJzL3JpcC1odW50ZXInO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlTnVtfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5pbXBvcnQge0RlbGV0ZU9iamVjdHNSZXF1ZXN0LCBQdXRPYmplY3RSZXF1ZXN0fSBmcm9tICdhd3Mtc2RrL2NsaWVudHMvczMnO1xuaW1wb3J0IEZpbGVUeXBlLCB7RmlsZVR5cGVSZXN1bHR9IGZyb20gJ2ZpbGUtdHlwZSc7XG5pbXBvcnQgZ20gZnJvbSAnZ20nO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9pc0VtcHR5JztcbmltcG9ydCB7RGF0ZVRpbWV9IGZyb20gJ2x1eG9uJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge1xuICBBcGlDb250ZXh0LFxuICBBcmFuZ29EQkxpbWl0LFxuICBHcm91cFR5cGUsXG4gIEdyb3VwVXNlcixcbiAgSW1hZ2VFZGdlVHlwZSxcbiAgSW1hZ2VJZGVudGlmeVR5cGUsXG4gIEltYWdlT3B0aW9ucyxcbiAgSW1hZ2VUeXBlLFxuICBJbWFnZVVybERhdGEsXG4gIFF1ZXJ5RmlsdGVyXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7ZGVmYXVsdE9iamVjdCwgZ2V0TGltaXQsIGxvZ0Vycm9yLCBsb2dFeGNlcHRpb24sIGxvd2VyQ2FzZUtleXMsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGV9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7Z2V0R3JvdXBEZXRhaWxzLCBpc0dyb3VwZWR9IGZyb20gJy4vZ3JvdXBzJztcbmltcG9ydCB7czNEZWxldGVMaXN0LCBzM0dldFNpZ25lZFVybCwgczNQdXR9IGZyb20gJy4vczMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAnaW1hZ2VzJztcblxuZXhwb3J0IGNvbnN0IHBhcnNlSW1hZ2VPcHRpb25zID0gKG9wdGlvbnM6IEltYWdlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmcm9tID0gMCxcbiAgICB0byA9IDMwLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIHtcbiAgICBsaW1pdDogZ2V0TGltaXQoZnJvbSwgdG8pLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZU9wdGlvbmFsID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSkgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0czogYW55LCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgaWYoZmllbGQuaW5jbHVkZXMoJ0NvdW50JykpIHtcbiAgICAgIHJldHVybiBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlKCdpbWFnZXMnLCAnaScsIGZpZWxkLCBzZWxlY3RzKTtcbiAgICB9XG5cbiAgICBzd2l0Y2goZmllbGQpIHtcbiAgICAgIGNhc2UgJ3JlYWN0aW9ucyc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgRk9SIGltYWdlLCByIElOIElOQk9VTkQgaS5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdzJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHRhZ3MgPSAoXG4gICAgICAgICAgRk9SIHQsIHBsIElOIElOQk9VTkQgaS5faWQgaXNUYWdnZWRcbiAgICAgICAgICBSRVRVUk4gdFxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd1c2VyJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBpLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndXNlcjp1c2VyJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlc0J5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGZyb206IG51bWJlcixcbiAgdG86IG51bWJlclxuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRJbWFnZXNCeVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGxpbWl0OiBBcmFuZ29EQkxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgaSBJTiBpbWFnZXNcbiAgICAgIEZJTFRFUiBpLnVzZXJJZCA9PSBcIiR7Zm9ybWF0VXNlcklkfVwiXG4gICAgICBMRVQgdXNlciA9IEZJUlNUKFxuICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICBGSUxURVIgdS5fa2V5ID09IGkudXNlcklkXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVcbiAgICAgIClcbiAgICAgICR7bGltaXQuYXFsfVxuICAgICAgU09SVCBpLmFkZGVkXG4gICAgICBSRVRVUk4gTUVSR0UoaSwge3VzZXI6dXNlcn0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VDb3VudEJ5SXRlbSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEltYWdlQ291bnRCeUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1JZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGkgSU4gaGFzSW1hZ2VzXG4gICAgICBGSUxURVIgaS5fdG8gPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICBSRVRVUk4ge2NvdW50OiBDT1VOVChpKX1gO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHtjb3VudH0gPSB7Y291bnQ6IDB9KSA9PiBjb3VudClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IDApKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZXNCeUl0ZW0gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGl0ZW1JZDogc3RyaW5nLFxuICBvcHRpb25zOiBJbWFnZU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRJbWFnZXNCeUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcyA9IFtdfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VJbWFnZU9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldEltYWdlT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIGksIGwgSU4gMS4uMSBPVVRCT1VORCBcIiR7Zm9ybWF0SXRlbUlkfVwiIGhhc0ltYWdlc1xuICAgIEZJTFRFUiBOT1QgSVNfTlVMTChpKVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBTT1JUIGkuYWRkZWRcbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gTUVSR0UoaSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VzQnlHcm91cCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwYXJhbXMpOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEltYWdlc0J5R3JvdXAnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2ZpbHRlcnMgPSBbXSwgZ3JvdXBJZCwgZnJvbSwgdG99ID0gcGFyYW1zO1xuICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBsaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcblxuICBmaWx0ZXJzXG4gICAgLm1hcCgoZmlsdGVyOiBRdWVyeUZpbHRlcikgPT4ge1xuICAgICAgY29uc3Qge2NvbmRpdGlvbmFsLCBuYW1lLCB2YWx1ZX0gPSBmaWx0ZXI7XG4gICAgICBsZXQgZm9ybWF0Q29uZDogc3RyaW5nID0gY29uZGl0aW9uYWw7XG5cbiAgICAgIGlmKGNvbmRpdGlvbmFsICE9PSAnPj0nICYmIGNvbmRpdGlvbmFsICE9PSAnPD0nICYmIGNvbmRpdGlvbmFsICE9PSAnPicgJiYgY29uZGl0aW9uYWwgIT09ICc8Jykge1xuICAgICAgICBmb3JtYXRDb25kID0gJz09JztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKG5hbWUpIHtcbiAgICAgICAgY2FzZSAnYWRkZWQnOlxuICAgICAgICAgIHJldHVybiBgcC5hZGRlZCAke2Zvcm1hdENvbmR9ICR7cGFyc2VOdW0odmFsdWUpfWA7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHJldHVybiBnZXRHcm91cERldGFpbHMoY29udGV4dCwgZm9ybWF0R3JvdXBJZClcbiAgICAudGhlbigoZ3JvdXA6IEdyb3VwVHlwZSkgPT4ge1xuICAgICAgaWYoZ3JvdXAucHJpdmFjeSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgZmlsdGVycy5wdXNoKGBwLmdyb3VwSWQgPT0gXCIke2dyb3VwSWR9XCJgKTtcbiAgICAgICAgY29uc3QgZmlsdGVyU3RyID0gZmlsdGVycy5qb2luKCcgJiYgJyk7XG4gICAgICAgIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBpIElOXG4gICAgICAgICAgRkxBVFRFTihcbiAgICAgICAgICAgIEZPUiBwIElOIHBvc3RzXG4gICAgICAgICAgICBGSUxURVIgJHtmaWx0ZXJTdHJ9XG4gICAgICAgICAgICBMRVQgaW1hZ2VzID0gKFxuICAgICAgICAgICAgICBGT1IgaSwgZSBJTiBJTkJPVU5EIHAuX2lkIGhhc0ltYWdlc1xuICAgICAgICAgICAgICBSRVRVUk4gaVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgU09SVCBwLmFkZGVkIERFU0NcbiAgICAgICAgICAgIFJFVFVSTiBpbWFnZXNcbiAgICAgICAgICApXG4gICAgICAgICAgU09SVCBpLmFkZGVkIERFU0NcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gaWA7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzR3JvdXBlZChkYXRhYmFzZSwgc2Vzc2lvbklkLCBncm91cElkKVxuICAgICAgICAudGhlbigoZ3JvdXBlZDogR3JvdXBVc2VyKSA9PiB7XG4gICAgICAgICAgaWYoZ3JvdXBlZC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2goYHAuZ3JvdXBJZCA9PSBcIiR7Z3JvdXBlZC5ncm91cElkfVwiYCk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJMaXN0OiBzdHJpbmcgPSBmaWx0ZXJzLmpvaW4oJyAmJiAnKTtcbiAgICAgICAgICAgIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RcbiAgICAgICAgICAgICAgICBGSUxURVIgJHtmaWx0ZXJMaXN0fVxuICAgICAgICAgICAgICAgIEZPUiBmIElOIHAuZmlsZXNcbiAgICAgICAgICAgICAgICBGSUxURVIgZi50eXBlID09IFwiaW1hZ2UvanBlZ1wiIHx8IGYudHlwZSA9PSBcImltYWdlL3BuZ1wiXG4gICAgICAgICAgICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICAgICAgICAgICAgU09SVCBwLmFkZGVkIERFU0NcbiAgICAgICAgICAgICAgICBSRVRVUk4gZmA7XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZXNCeVJlYWN0aW9ucyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcmVhY3Rpb25zOiBzdHJpbmdbXSA9IFtdLFxuICBvcHRpb25zPzogSW1hZ2VPcHRpb25zXG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFVzZXJzQnlJbWFnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzID0gW10sIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlSW1hZ2VPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRJbWFnZU9wdGlvbmFsKGZpZWxkcyk7XG5cbiAgY29uc3QgZm9ybWF0U2Vzc2lvbklkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25zOiBzdHJpbmdbXSA9IHJlYWN0aW9ucy5tYXAoKHJlYWN0aW9uTmFtZSkgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICdyLnR5cGUgPT0gXCJpbWFnZXNcIicsXG4gICAgYFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0UmVhY3Rpb25zKX0sIExPV0VSKHIubmFtZSkpYF07XG5cbiAgLy8gR2V0IGRhdGEgZnJvbSBkYXRhYmFzZVxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgaSwgciBJTiBPVVRCT1VORCBcIiR7Zm9ybWF0U2Vzc2lvbklkfVwiIGhhc1JlYWN0aW9uc1xuICAgIE9QVElPTlMge3ZlcnRleENvbGxlY3Rpb25zOiBcImltYWdlc1wifVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJCeS5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIE1FUkdFKGksIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gW10pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpZDogc3RyaW5nKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gcGFyc2VJZChpZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGkgSU4gaW1hZ2VzXG4gICAgRklMVEVSIGkuX2tleT09JHtmb3JtYXRJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIGlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGltYWdlOiBJbWFnZVR5cGUgPSB7fSkgPT4gaW1hZ2UpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UGF0aFVzZXJJbWFnZXMgPSAodXNlcklkOiBzdHJpbmcsIGltYWdlSWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBkaXI6IHN0cmluZyA9ICdpbWFnZXMnKTogc3RyaW5nID0+IHtcbiAgbGV0IGZpbGVuYW1lOiBzdHJpbmcgPSBpbWFnZUlkO1xuXG4gIHN3aXRjaCh0eXBlKSB7XG4gICAgY2FzZSAnaW1hZ2UvcG5nJzpcbiAgICAgIGZpbGVuYW1lID0gYCR7aW1hZ2VJZH0ucG5nYDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBmaWxlbmFtZSA9IGAke2ltYWdlSWR9LmpwZ2A7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBgdXNlcnMvJHt1c2VySWR9LyR7ZGlyfS8ke2ZpbGVuYW1lfWA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwSW1hZ2VVcmwgPSAoZGF0YTogSW1hZ2VVcmxEYXRhKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge2ltYWdlSWQsIGRpcmVjdG9yeSA9ICdpbWFnZXMnLCBpbWFnZVR5cGUgPSAncHJvZmlsZScsIGlzVGh1bWIsIHR5cGUsIHR5cGVJZH0gPSBkYXRhO1xuICBjb25zdCBob3N0OiBzdHJpbmcgPSBDb25maWcuZ2V0KCdlbnZpcm9ubWVudCcpID09PSAncHJvZCdcbiAgICA/IGBodHRwczovL2JveC4ke0NvbmZpZy5nZXQoJ2FwcC51cmwnKX1gXG4gICAgOiBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2Rldi4ke0NvbmZpZy5nZXQoJ2FwcC51cmwnKX1gO1xuICBjb25zdCBzdWZmaXg6IHN0cmluZyA9IGlzVGh1bWIgPyAnLXRoJyA6ICcnO1xuXG4gIGlmKGltYWdlSWQpIHtcbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgY2FzZSAnYXBwcyc6XG4gICAgICAgIC8vIGh0dHBzOi8vYm94LnJlYWt0b3IuaW8vbXlBcHAvYXBwL2ltYWdlcy8xMjMuanBnXG4gICAgICAgIHJldHVybiBgJHtob3N0fS8ke3R5cGV9LyR7ZGlyZWN0b3J5fS8ke2ltYWdlSWR9JHtzdWZmaXh9LmpwZ2A7XG4gICAgICBjYXNlICd1c2Vycyc6XG4gICAgICAgIC8vIGh0dHBzOi8vYm94LnJlYWt0b3IuaW8vbXlBcHAvdXNlcnMvZGVtb1VzZXIvaW1hZ2VzLzEyMy5qcGdcbiAgICAgICAgcmV0dXJuIGAke2hvc3R9LyR7dHlwZX0vJHt0eXBlSWR9LyR7ZGlyZWN0b3J5fS8ke2ltYWdlSWR9JHtzdWZmaXh9LmpwZ2A7XG4gICAgfVxuXG4gICAgaWYoaW1hZ2VUeXBlID09PSAncHJvZmlsZScpIHtcbiAgICAgIHJldHVybiBgJHtob3N0fS9kZWZhdWx0cy8ke3R5cGV9X2JrJHtzdWZmaXh9LmpwZ2A7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2hvc3R9L2RlZmF1bHRzLyR7dHlwZX1fd2gke3N1ZmZpeH0uanBnYDtcbiAgfVxuXG4gIHJldHVybiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VySW1hZ2VVcmwgPSAoZGF0YTogSW1hZ2VVcmxEYXRhKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge2J1Y2tldCwgaW1hZ2VJZCwgaXNUaHVtYiA9IGZhbHNlLCB1c2VySWR9ID0gZGF0YTtcbiAgY29uc3QgaW1nRGlyOiBzdHJpbmcgPSBpc1RodW1iID8gJ3RodW1icycgOiAnaW1hZ2VzJztcblxuICBpZihpbWFnZUlkKSB7XG4gICAgY29uc3QgaW1hZ2VLZXk6IHN0cmluZyA9IGB1c2Vycy8ke3VzZXJJZH0vJHtpbWdEaXJ9LyR7aW1hZ2VJZH0uanBnYDtcbiAgICByZXR1cm4gczNHZXRTaWduZWRVcmwoe0J1Y2tldDogYnVja2V0LCBLZXk6IGltYWdlS2V5LCBFeHBpcmVzOiA5MDB9KTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCByZXNpemVTYXZlSW1hZ2UgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGltYWdlSWQ6IHN0cmluZyxcbiAgYnVmZmVyOiBCdWZmZXIsXG4gIHR5cGU6IHN0cmluZyA9ICdpbWFnZS9qcGVnJywgczNPcHRpb25zPzogUHV0T2JqZWN0UmVxdWVzdCk6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3Jlc2l6ZVNhdmVJbWFnZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGltZ1c6IG51bWJlciA9IENvbmZpZy5nZXQoJ2ltYWdlLmltZ1NpemUnKTtcbiAgY29uc3QgaW1nUTogbnVtYmVyID0gQ29uZmlnLmdldCgnaW1hZ2UuaW1nUXVhbGl0eScpO1xuICBsZXQgcGhvdG86IEltYWdlVHlwZSA9IHt9O1xuICBjb25zdCBmb3JtYXQ6IHN0cmluZyA9ICh0eXBlLnNwbGl0KCcvJykpWzFdO1xuXG4gIGNvbnNvbGUubG9nKHtidWZmZXIsIGZvcm1hdCwgaW1nVywgaW1nUX0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBnbShidWZmZXIsICdpbWcnKVxuICAgICAgLnNldEZvcm1hdChmb3JtYXQpXG4gICAgICAucXVhbGl0eShpbWdRKVxuICAgICAgLmF1dG9PcmllbnQoKVxuICAgICAgLnJlc2l6ZShpbWdXLCBpbWdXLCAnPicpXG4gICAgICAuaWRlbnRpZnkoe2J1ZmZlclN0cmVhbTogdHJ1ZX0sIChlcnJvcjogRXJyb3IsIHZhbDogSW1hZ2VJZGVudGlmeVR5cGUgPSB7fSk6IGFueSA9PiB7XG4gICAgICAgIGlmKGVycm9yKSB7XG4gICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICBsYWJlbDogJ2ltYWdlX3NhdmUnLFxuICAgICAgICAgICAgdmFsdWU6ICdnbV9pbWFnZV9pZGVudGlmeSdcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmb3JtYXRWYWxzID0gbG93ZXJDYXNlS2V5cyh2YWwpO1xuICAgICAgICAgIGNvbnN0IHttYWtlOiBjYW1lcmFNYWtlLCBtb2RlbDogY2FtZXJhTW9kZWwsIGRhdGV0aW1lb3JpZ2luYWw6IHRha2VufTogSW1hZ2VJZGVudGlmeVR5cGUgPSBmb3JtYXRWYWxzO1xuICAgICAgICAgIHBob3RvID0ge1xuICAgICAgICAgICAgLi4uY2xvbmVEZWVwKHBob3RvKSxcbiAgICAgICAgICAgIG1ha2U6IGNhbWVyYU1ha2UsXG4gICAgICAgICAgICBtb2RlbDogY2FtZXJhTW9kZWwsXG4gICAgICAgICAgICB0YWtlbjogdGFrZW4gPyBEYXRlVGltZS5mcm9tTWlsbGlzKHRha2VuKS5taWxsaXNlY29uZCA6IG51bGxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gSWYgbm8gYmFja2dyb3VuZCBjb2xvciwgZ2V0IHRoZSBtZWFuIGNvbG9yIHZhbHVlXG4gICAgICAgICAgY29uc3Qgc3RhdHMgPSBmb3JtYXRWYWxzWydjaGFubmVsIHN0YXRpc3RpY3MnXTtcblxuICAgICAgICAgIGlmKHN0YXRzKSB7XG4gICAgICAgICAgICBsZXQge3JlZCwgZ3JlZW4sIGJsdWUsIG1lYW59ID0gc3RhdHM7XG5cbiAgICAgICAgICAgIGlmKHJlZCkge1xuICAgICAgICAgICAgICBtZWFuID0gcmVkWydzdGFuZGFyZCBkZXZpYXRpb24nXSB8fCByZWQubWVhbjtcbiAgICAgICAgICAgICAgcmVkID0gbWVhbiA/ICsoKG1lYW4uc3BsaXQoJyAnKVswXSkuc3Vic3RyaW5nKDAsIDMpKSA6IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWQgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihncmVlbikge1xuICAgICAgICAgICAgICBtZWFuID0gZ3JlZW5bJ3N0YW5kYXJkIGRldmlhdGlvbiddIHx8IGdyZWVuLm1lYW47XG4gICAgICAgICAgICAgIGdyZWVuID0gbWVhbiA/ICsoKG1lYW4uc3BsaXQoJyAnKVswXSkuc3Vic3RyaW5nKDAsIDMpKSA6IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBncmVlbiA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKGJsdWUpIHtcbiAgICAgICAgICAgICAgbWVhbiA9IGJsdWVbJ3N0YW5kYXJkIGRldmlhdGlvbiddIHx8IGJsdWUubWVhbjtcbiAgICAgICAgICAgICAgYmx1ZSA9IG1lYW4gPyArKChtZWFuLnNwbGl0KCcgJylbMF0pLnN1YnN0cmluZygwLCAzKSkgOiAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYmx1ZSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IGJsdWUgfCAoZ3JlZW4gPDwgOCkgfCAocmVkIDw8IDE2KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gcmdiLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIHBob3RvLmNvbG9yID0gY29sb3IgPT09ICcwJyA/ICcwMDAwMDAnIDogY29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnN0cmVhbSgoZXJyb3I6IEVycm9yLCBzdGRvdXQpOiBhbnkgPT4ge1xuICAgICAgICBpZihlcnJvcikge1xuICAgICAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgaXNJbnRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgIGxhYmVsOiAnaW1hZ2Vfc2F2ZScsXG4gICAgICAgICAgICB2YWx1ZTogJ2dtX2ltYWdlX3N0cmVhbSdcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgaW1hZ2VCdWZmZXI6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKCcnKTtcblxuICAgICAgICAgIHN0ZG91dC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpbWFnZUJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW2ltYWdlQnVmZmVyLCBkYXRhXSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzdGRvdXQub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgIC8vIEdldCBmaWxlIHNpemVcbiAgICAgICAgICAgIHBob3RvLmZpbGVTaXplID0gaW1hZ2VCdWZmZXIubGVuZ3RoO1xuXG4gICAgICAgICAgICAvLyBVcGxvYWQgZGF0YVxuICAgICAgICAgICAgY29uc3QgaW1hZ2VPYmo6IFB1dE9iamVjdFJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgIEFDTDogJ2F1dGhlbnRpY2F0ZWQtcmVhZCcsXG4gICAgICAgICAgICAgIEJvZHk6IGltYWdlQnVmZmVyLFxuICAgICAgICAgICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICAgICAgICAgIENvbnRlbnRUeXBlOiB0eXBlLFxuICAgICAgICAgICAgICAuLi5zM09wdGlvbnMgfHwge30sXG4gICAgICAgICAgICAgIEtleTogZ2V0UGF0aFVzZXJJbWFnZXMoc2Vzc2lvbklkLCBpbWFnZUlkLCB0eXBlLCAnaW1hZ2VzJylcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHMzUHV0KGltYWdlT2JqKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGhtVyA9IENvbmZpZy5nZXQoJ2ltYWdlLnRobVNpemUnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aG1RID0gQ29uZmlnLmdldCgnaW1hZ2UudGhtUXVhbGl0eScpO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBsb2FkIHRodW1ibmFpbFxuICAgICAgICAgICAgICAgIGdtKGltYWdlQnVmZmVyLCAnaW1nJylcbiAgICAgICAgICAgICAgICAgIC5zZXRGb3JtYXQoJ2pwZWcnKVxuICAgICAgICAgICAgICAgICAgLnNpemUoKHRodW1iRXJyb3I6IEVycm9yLCByZXNpemVWYWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIXRodW1iRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdXBkYXRlZCByZXNpemUgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gcmVzaXplVmFsO1xuICAgICAgICAgICAgICAgICAgICAgIHBob3RvID0gey4uLmNsb25lRGVlcChwaG90byksIGhlaWdodCwgd2lkdGh9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgLmdyYXZpdHkoJ0NlbnRlcicpXG4gICAgICAgICAgICAgICAgICAucmVzaXplKHRobVcsIHRobVcsICdeJylcbiAgICAgICAgICAgICAgICAgIC5leHRlbnQodGhtVywgdGhtVylcbiAgICAgICAgICAgICAgICAgIC5xdWFsaXR5KHRobVEpXG4gICAgICAgICAgICAgICAgICAuc3RyZWFtKChzdHJlYW1FcnJvcjogRXJyb3IsIHRodW1iU3Rkb3V0KTogYW55ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnaW1hZ2Vfc2F2ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ2dtX3RodW1ibmFpbF9zdGVhbSdcbiAgICAgICAgICAgICAgICAgICAgICB9LCBzdHJlYW1FcnJvciwgY29udGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgdGh1bWJCdWZmZXI6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKCcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHRodW1iU3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRodW1iQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbdGh1bWJCdWZmZXIsIGRhdGFdKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIHRodW1iU3Rkb3V0Lm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGxvYWQgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGh1bWJPYmo6IFB1dE9iamVjdFJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEFDTDogJ2F1dGhlbnRpY2F0ZWQtcmVhZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHk6IHRodW1iQnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zM09wdGlvbnMgfHwge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEtleTogZ2V0UGF0aFVzZXJJbWFnZXMoc2Vzc2lvbklkLCBpbWFnZUlkLCB0eXBlLCAndGh1bWJzJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHMzUHV0KHRodW1iT2JqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwaG90byk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoczNQdXRFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ2ltYWdlX3NhdmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnczNfcHV0X2ltYWdlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzM1B1dEVycm9yLCBjb250ZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoczNFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICBpc0ludGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnaW1hZ2Vfc2F2ZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdzM19pbWFnZV9zYXZlJ1xuICAgICAgICAgICAgICB9LCBzM0Vycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEltYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGltYWdlOiBJbWFnZVR5cGUsIHMzT3B0aW9ucz86IFB1dE9iamVjdFJlcXVlc3QpOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRJbWFnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7aW1hZ2VJZCwgZGVzY3JpcHRpb24sIGJ1ZmZlciwgZmlsZVR5cGV9ID0gaW1hZ2U7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICByZXR1cm4gcmVzaXplU2F2ZUltYWdlKGNvbnRleHQsIGltYWdlSWQsIGJ1ZmZlciwgZmlsZVR5cGUsIHMzT3B0aW9ucylcbiAgICAudGhlbigocmVzaXplZEltYWdlOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGluc2VydDogSW1hZ2VUeXBlID0ge1xuICAgICAgICAuLi5yZXNpemVkSW1hZ2UsXG4gICAgICAgIF9rZXk6IGltYWdlSWQsXG4gICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBpbWFnZXMgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbihkZWZhdWx0T2JqZWN0KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICBpc0ludGVybmFsOiB0cnVlLFxuICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGlzSW50ZXJuYWw6IHRydWUsXG4gICAgICBsYWJlbDogJ2ltYWdlX3Jlc2l6ZSdcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkSW1hZ2VFZGdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSk6IFByb21pc2U8b2JqZWN0PiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZEltYWdlRWRnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7aW1hZ2VJZCwgaXRlbUlkLCBpdGVtVHlwZX0gPSBpbWFnZUVkZ2U7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaGFzSW1hZ2VzJyk7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgaGFzSW1hZ2VzLSR7aW1hZ2VJZH0tJHtpdGVtSWR9LSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBmb3JtYXRJdGVtVHlwZTogc3RyaW5nID0gcGFyc2VDaGFyKGl0ZW1UeXBlKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaXRlbUlkKTtcbiAgbGV0IGl0ZW1Eb2NJZDogc3RyaW5nO1xuICBjb25zdCBmb3JtYXRJbWdJZDogc3RyaW5nID0gcGFyc2VJZChpbWFnZUlkKTtcbiAgY29uc3QgZmlsZURvY0lkOiBzdHJpbmcgPSBgaW1hZ2VzLyR7Zm9ybWF0SW1nSWR9YDtcblxuICBzd2l0Y2goZm9ybWF0SXRlbVR5cGUpIHtcbiAgICBjYXNlICdncm91cHMnOlxuICAgICAgaXRlbURvY0lkID0gYGdyb3Vwcy8ke2Zvcm1hdEl0ZW1JZH1gO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncG9zdHMnOlxuICAgICAgaXRlbURvY0lkID0gYHBvc3RzLyR7Zm9ybWF0SXRlbUlkfWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1c2Vycyc6XG4gICAgY2FzZSAncHJvZmlsZSc6XG4gICAgICBpdGVtRG9jSWQgPSBgdXNlcnMvJHtmb3JtYXRJdGVtSWR9YDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpdGVtRG9jSWQgPSAnJztcbiAgICAgIGJyZWFrO1xuICB9XG4gIGNvbnN0IGVkZ2U6IGFueSA9IHtcbiAgICBfZnJvbTogaXRlbURvY0lkLFxuICAgIF9rZXk6IGVkZ2VJZCxcbiAgICBfdG86IGZpbGVEb2NJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIHR5cGU6IGl0ZW1UeXBlXG4gIH07XG5cbiAgaWYoIWlzRW1wdHkoaXRlbURvY0lkKSkge1xuICAgIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KVxuICAgICAgLnRoZW4oKGZpbGVFZGdlKSA9PiBlZGdlQ29sbGVjdGlvbi5kb2N1bWVudChmaWxlRWRnZSkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBpc0ludGVybmFsOiB0cnVlLFxuICAgICAgICBsYWJlbDogJ2RiX2Vycm9yJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZWRnZSxcbiAgICAgICAgICBmaWxlRG9jSWQsXG4gICAgICAgICAgaW1hZ2VJZCxcbiAgICAgICAgICBpdGVtRG9jSWQsXG4gICAgICAgICAgaXRlbUlkLFxuICAgICAgICAgIGl0ZW1UeXBlXG4gICAgICAgIH1cbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgfVxuXG4gIHJldHVybiB7fTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVJbWFnZSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW1hZ2U6IEltYWdlVHlwZSxcbiAgczNPcHRpb25zPzogUHV0T2JqZWN0UmVxdWVzdFxuKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAndXBkYXRlSW1hZ2UnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcblxuICAvLyBJdGVtIHByb3BzXG4gIGNvbnN0IHtcbiAgICBiYXNlNjQgPSAnJyxcbiAgICBidWZmZXI6IGltYWdlQnVmZmVyLFxuICAgIGRlc2NyaXB0aW9uID0gJycsXG4gICAgaW1hZ2VJZCxcbiAgICBpdGVtSWQsXG4gICAgaXRlbVR5cGUsXG4gICAgZmlsZVR5cGUsXG4gICAgdXJsID0gJydcbiAgfSA9IGltYWdlO1xuXG4gIC8vIFNhdmUgQmFzZTY0IGRhdGFcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBmb3JtYXRJbWFnZUlkOiBzdHJpbmcgPSBpbWFnZUlkIHx8IGNyZWF0ZUhhc2goYGltYWdlLSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaXRlbUlkKTtcbiAgY29uc3QgZm9ybWF0SXRlbVR5cGU6IHN0cmluZyA9IHBhcnNlQ2hhcihpdGVtVHlwZSwgMTYpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGN1c3RvbVBhcmFtczogSW1hZ2VUeXBlID0ge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIGltYWdlSWQ6IGZvcm1hdEltYWdlSWQsXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcblxuICBpZighaXNFbXB0eShiYXNlNjQpIHx8IGltYWdlQnVmZmVyKSB7XG4gICAgbGV0IGJ1ZmZlcjogQnVmZmVyID0gaW1hZ2VCdWZmZXI7XG5cbiAgICAvLyBQYXJzZSBCYXNlNjQgZGF0YVxuICAgIGlmKCFpc0VtcHR5KGJhc2U2NCkpIHtcbiAgICAgIGNvbnN0IGZvcm1hdEJhc2U2NDogc3RyaW5nID0gYmFzZTY0LnN1YnN0cihiYXNlNjQuaW5kZXhPZignLCcpICsgMSk7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuZnJvbShmb3JtYXRCYXNlNjQsICdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICBsZXQgdXBkYXRlZEZpbGVUeXBlID0gZmlsZVR5cGU7XG5cbiAgICBpZighZmlsZVR5cGUpIHtcbiAgICAgIGNvbnN0IGZpbGVNaW1lOiBGaWxlVHlwZVJlc3VsdCA9IGF3YWl0IEZpbGVUeXBlLmZyb21CdWZmZXIoYnVmZmVyKTtcbiAgICAgIGNvbnN0IHttaW1lfSA9IGZpbGVNaW1lO1xuICAgICAgdXBkYXRlZEZpbGVUeXBlID0gbWltZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbWdQYXJhbXM6IEltYWdlVHlwZSA9IHtcbiAgICAgIC4uLmN1c3RvbVBhcmFtcyxcbiAgICAgIGJ1ZmZlcixcbiAgICAgIGZpbGVUeXBlOiB1cGRhdGVkRmlsZVR5cGVcbiAgICB9O1xuXG4gICAgcmV0dXJuIGFkZEltYWdlKGNvbnRleHQsIGltZ1BhcmFtcywgczNPcHRpb25zKVxuICAgICAgLnRoZW4oKGltYWdlOiBJbWFnZVR5cGUpID0+IHtcbiAgICAgICAgaWYoZm9ybWF0SXRlbUlkICYmIGZvcm1hdEl0ZW1UeXBlKSB7XG4gICAgICAgICAgY29uc3QgaW1hZ2VFZGdlOiBJbWFnZUVkZ2VUeXBlID0ge1xuICAgICAgICAgICAgaW1hZ2VJZDogZm9ybWF0SW1hZ2VJZCxcbiAgICAgICAgICAgIGl0ZW1JZDogZm9ybWF0SXRlbUlkLFxuICAgICAgICAgICAgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYWRkSW1hZ2VFZGdlKGNvbnRleHQsIGltYWdlRWRnZSkudGhlbigoKSA9PiBpbWFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogJ2ltYWdlX3NhdmVfZXJyb3InXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gIH0gZWxzZSBpZih1cmwgIT09ICcnKSB7XG4gICAgLy8gRG93bmxvYWQgaW1hZ2UgZnJvbSB0aGUgd2ViXG4gICAgbGV0IGNvbnRlbnRUeXBlOiBzdHJpbmc7XG5cbiAgICByZXR1cm4gaHR0cEdldCh1cmwpXG4gICAgICAudGhlbigocmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgbGFiZWw6ICdmZXRjaF9pbWFnZV91cmwnLFxuICAgICAgICAgICAgdmFsdWU6IHJlcy5zdGF0dXNUZXh0XG4gICAgICAgICAgfSwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5idWZmZXIoKSlcbiAgICAgIC50aGVuKChidWZmZXI6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBjb25zdCBpbWdQYXJhbXM6IEltYWdlVHlwZSA9IHtcbiAgICAgICAgICAuLi5jdXN0b21QYXJhbXMsXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGZpbGVUeXBlOiBjb250ZW50VHlwZVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBhZGRJbWFnZShjb250ZXh0LCBpbWdQYXJhbXMsIHMzT3B0aW9ucykudGhlbigoaW1hZ2U6IEltYWdlVHlwZSkgPT4ge1xuICAgICAgICAgIGlmKGZvcm1hdEl0ZW1JZCAmJiBmb3JtYXRJdGVtVHlwZSkge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VFZGdlOiBJbWFnZUVkZ2VUeXBlID0ge2ltYWdlSWQ6IGZvcm1hdEltYWdlSWQsIGl0ZW1JZDogZm9ybWF0SXRlbUlkLCBpdGVtVHlwZTogZm9ybWF0SXRlbVR5cGV9O1xuICAgICAgICAgICAgcmV0dXJuIGFkZEltYWdlRWRnZShjb250ZXh0LCBpbWFnZUVkZ2UpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpbWFnZTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6ICdmZXRjaF9lcnJvcidcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgfSBlbHNlIGlmKGltYWdlSWQgIT09ICcnKSB7XG4gICAgLy8gVXBkYXRlIG1ldGFkYXRhXG4gICAgY29uc3QgdXBkYXRlOiBhbnkgPSB7XG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIG1vZGlmaWVkOiBub3dcbiAgICB9O1xuICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFIHtfa2V5OiAke2Zvcm1hdEltYWdlSWR9fSBXSVRIICR7dXBkYXRlfSBJTiBpbWFnZXMgUkVUVVJOIE5FV2A7XG5cbiAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogJ2RiX2Vycm9yJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgYXFsUXJ5LFxuICAgICAgICAgIGZvcm1hdEltYWdlSWQsXG4gICAgICAgICAgdXBkYXRlXG4gICAgICAgIH1cbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUltYWdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGltYWdlSWQ6IHN0cmluZyk6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJbWFnZUlkID0gcGFyc2VJZChpbWFnZUlkKTtcblxuICBjb25zdCByZW1vdmVFZGdlUXVlcnkgPSBhcWxgRk9SIGhpIElOIGhhc0ltYWdlc1xuICAgIEZJTFRFUiBoaS5fZnJvbSA9PSAke2Zvcm1hdEltYWdlSWR9XG4gICAgUkVNT1ZFIGhpIElOIGhhc0ltYWdlc1xuICAgIFJFVFVSTiBPTERgO1xuXG4gIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KHJlbW92ZUVkZ2VRdWVyeSk7XG5cbiAgY29uc3QgYXFsUXVlcnkgPSBhcWxgRk9SIGkgSU4gaW1hZ2VzXG4gICAgRklMVEVSIGkuX2tleSA9PSAke2Zvcm1hdEltYWdlSWR9ICYmIGkudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgIFJFTU9WRSBpIElOIGltYWdlc1xuICAgIFJFVFVSTiBPTERgO1xuXG4gIGNvbnN0IGltYWdlID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG5cbiAgaWYoIWlzRW1wdHkoaW1hZ2UpKSB7XG4gICAgY29uc3Qge19rZXk6IGltYWdlS2V5fSA9IGltYWdlO1xuICAgIGNvbnN0IHBhcmFtczogRGVsZXRlT2JqZWN0c1JlcXVlc3QgPSB7XG4gICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICBEZWxldGU6IHtcbiAgICAgICAgT2JqZWN0czogW1xuICAgICAgICAgIHtLZXk6IGB1c2Vycy8ke3Nlc3Npb25JZH0vaW1hZ2VzLyR7aW1hZ2VLZXl9LmpwZ2B9LFxuICAgICAgICAgIHtLZXk6IGB1c2Vycy8ke3Nlc3Npb25JZH0vdGh1bWJzLyR7aW1hZ2VLZXl9LmpwZ2B9XG4gICAgICAgIF0sXG4gICAgICAgIFF1aWV0OiB0cnVlXG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBzM0RlbGV0ZUxpc3QocGFyYW1zKS50aGVuKCgpID0+IGltYWdlKTtcbiAgfVxuXG4gIHJldHVybiB7fTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUEsd0JBQTZCO0FBQzdCLG1CQUFzRTtBQUN0RSxzQkFBa0I7QUFLbEIsdUJBQXVDO0FBQ3ZDLGdCQUFlO0FBQ2YsdUJBQXNCO0FBQ3RCLHFCQUFvQjtBQUNwQixtQkFBdUI7QUFFdkIs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
674
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvaW1hZ2VzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtnZXQgYXMgaHR0cEdldH0gZnJvbSAnQG5sYWJzL3JpcC1odW50ZXInO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlTnVtfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5pbXBvcnQge0RlbGV0ZU9iamVjdHNSZXF1ZXN0LCBQdXRPYmplY3RSZXF1ZXN0fSBmcm9tICdhd3Mtc2RrL2NsaWVudHMvczMnO1xuaW1wb3J0IEZpbGVUeXBlLCB7RmlsZVR5cGVSZXN1bHR9IGZyb20gJ2ZpbGUtdHlwZSc7XG5pbXBvcnQgZ20gZnJvbSAnZ20nO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcbmltcG9ydCB7RGF0ZVRpbWV9IGZyb20gJ2x1eG9uJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge1xuICBBcGlDb250ZXh0LFxuICBBcmFuZ29EQkxpbWl0LFxuICBHcm91cFR5cGUsXG4gIEdyb3VwVXNlcixcbiAgSW1hZ2VFZGdlVHlwZSxcbiAgSW1hZ2VJZGVudGlmeVR5cGUsXG4gIEltYWdlT3B0aW9ucyxcbiAgSW1hZ2VUeXBlLFxuICBJbWFnZVVybERhdGEsXG4gIFF1ZXJ5RmlsdGVyXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7ZGVmYXVsdE9iamVjdCwgZ2V0TGltaXQsIGxvZ0Vycm9yLCBsb2dFeGNlcHRpb24sIGxvd2VyQ2FzZUtleXMsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGV9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7Z2V0R3JvdXBEZXRhaWxzLCBpc0dyb3VwZWR9IGZyb20gJy4vZ3JvdXBzJztcbmltcG9ydCB7czNEZWxldGVMaXN0LCBzM0dldFNpZ25lZFVybCwgczNQdXR9IGZyb20gJy4vczMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAnaW1hZ2VzJztcblxuZXhwb3J0IGNvbnN0IHBhcnNlSW1hZ2VPcHRpb25zID0gKG9wdGlvbnM6IEltYWdlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmcm9tID0gMCxcbiAgICB0byA9IDMwLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIHtcbiAgICBsaW1pdDogZ2V0TGltaXQoZnJvbSwgdG8pLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZU9wdGlvbmFsID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSkgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0czogYW55LCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgaWYoZmllbGQuaW5jbHVkZXMoJ0NvdW50JykpIHtcbiAgICAgIHJldHVybiBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlKCdpbWFnZXMnLCAnaScsIGZpZWxkLCBzZWxlY3RzKTtcbiAgICB9XG5cbiAgICBzd2l0Y2goZmllbGQpIHtcbiAgICAgIGNhc2UgJ3JlYWN0aW9ucyc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgRk9SIGltYWdlLCByIElOIElOQk9VTkQgaS5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdzJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHRhZ3MgPSAoXG4gICAgICAgICAgRk9SIHQsIHBsIElOIElOQk9VTkQgaS5faWQgaXNUYWdnZWRcbiAgICAgICAgICBSRVRVUk4gdFxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd1c2VyJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBpLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndXNlcjp1c2VyJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlc0J5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGZyb206IG51bWJlcixcbiAgdG86IG51bWJlclxuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRJbWFnZXNCeVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGxpbWl0OiBBcmFuZ29EQkxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgaSBJTiBpbWFnZXNcbiAgICAgIEZJTFRFUiBpLnVzZXJJZCA9PSBcIiR7Zm9ybWF0VXNlcklkfVwiXG4gICAgICBMRVQgdXNlciA9IEZJUlNUKFxuICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICBGSUxURVIgdS5fa2V5ID09IGkudXNlcklkXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVcbiAgICAgIClcbiAgICAgICR7bGltaXQuYXFsfVxuICAgICAgU09SVCBpLmFkZGVkXG4gICAgICBSRVRVUk4gTUVSR0UoaSwge3VzZXI6dXNlcn0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VDb3VudEJ5SXRlbSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEltYWdlQ291bnRCeUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1JZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGkgSU4gaGFzSW1hZ2VcbiAgICAgIEZJTFRFUiBpLl90byA9PSAke2Zvcm1hdEl0ZW1JZH1cbiAgICAgIFJFVFVSTiB7Y291bnQ6IENPVU5UKGkpfWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoe2NvdW50fSA9IHtjb3VudDogMH0pID0+IGNvdW50KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gMCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlc0J5SXRlbSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEltYWdlT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEltYWdlc0J5SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzID0gW119ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1JZCk7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZUltYWdlT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0SW1hZ2VPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgaSwgbCBJTiAxLi4xIE9VVEJPVU5EIFwiJHtmb3JtYXRJdGVtSWR9XCIgaGFzSW1hZ2VcbiAgICBGSUxURVIgTk9UIElTX05VTEwoaSlcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgU09SVCBpLmFkZGVkXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIE1FUkdFKGksIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlc0J5R3JvdXAgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcGFyYW1zKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRJbWFnZXNCeUdyb3VwJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtmaWx0ZXJzID0gW10sIGdyb3VwSWQsIGZyb20sIHRvfSA9IHBhcmFtcztcbiAgY29uc3QgZm9ybWF0R3JvdXBJZDogc3RyaW5nID0gcGFyc2VJZChncm91cElkKTtcbiAgY29uc3QgbGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG5cbiAgZmlsdGVyc1xuICAgIC5tYXAoKGZpbHRlcjogUXVlcnlGaWx0ZXIpID0+IHtcbiAgICAgIGNvbnN0IHtjb25kaXRpb25hbCwgbmFtZSwgdmFsdWV9ID0gZmlsdGVyO1xuICAgICAgbGV0IGZvcm1hdENvbmQ6IHN0cmluZyA9IGNvbmRpdGlvbmFsO1xuXG4gICAgICBpZihjb25kaXRpb25hbCAhPT0gJz49JyAmJiBjb25kaXRpb25hbCAhPT0gJzw9JyAmJiBjb25kaXRpb25hbCAhPT0gJz4nICYmIGNvbmRpdGlvbmFsICE9PSAnPCcpIHtcbiAgICAgICAgZm9ybWF0Q29uZCA9ICc9PSc7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaChuYW1lKSB7XG4gICAgICAgIGNhc2UgJ2FkZGVkJzpcbiAgICAgICAgICByZXR1cm4gYHAuYWRkZWQgJHtmb3JtYXRDb25kfSAke3BhcnNlTnVtKHZhbHVlKX1gO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9KTtcblxuICByZXR1cm4gZ2V0R3JvdXBEZXRhaWxzKGNvbnRleHQsIGZvcm1hdEdyb3VwSWQpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUpID0+IHtcbiAgICAgIGlmKGdyb3VwLnByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIGZpbHRlcnMucHVzaChgcC5ncm91cElkID09IFwiJHtncm91cElkfVwiYCk7XG4gICAgICAgIGNvbnN0IGZpbHRlclN0ciA9IGZpbHRlcnMuam9pbignICYmICcpO1xuICAgICAgICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgaSBJTlxuICAgICAgICAgIEZMQVRURU4oXG4gICAgICAgICAgICBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgICAgRklMVEVSICR7ZmlsdGVyU3RyfVxuICAgICAgICAgICAgTEVUIGltYWdlcyA9IChcbiAgICAgICAgICAgICAgRk9SIGksIGUgSU4gSU5CT1VORCBwLl9pZCBoYXNJbWFnZVxuICAgICAgICAgICAgICBSRVRVUk4gaVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgU09SVCBwLmFkZGVkIERFU0NcbiAgICAgICAgICAgIFJFVFVSTiBpbWFnZXNcbiAgICAgICAgICApXG4gICAgICAgICAgU09SVCBpLmFkZGVkIERFU0NcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gaWA7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzR3JvdXBlZChkYXRhYmFzZSwgc2Vzc2lvbklkLCBncm91cElkKVxuICAgICAgICAudGhlbigoZ3JvdXBlZDogR3JvdXBVc2VyKSA9PiB7XG4gICAgICAgICAgaWYoZ3JvdXBlZC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2goYHAuZ3JvdXBJZCA9PSBcIiR7Z3JvdXBlZC5ncm91cElkfVwiYCk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJMaXN0OiBzdHJpbmcgPSBmaWx0ZXJzLmpvaW4oJyAmJiAnKTtcbiAgICAgICAgICAgIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RcbiAgICAgICAgICAgICAgICBGSUxURVIgJHtmaWx0ZXJMaXN0fVxuICAgICAgICAgICAgICAgIEZPUiBmIElOIHAuZmlsZXNcbiAgICAgICAgICAgICAgICBGSUxURVIgZi50eXBlID09IFwiaW1hZ2UvanBlZ1wiIHx8IGYudHlwZSA9PSBcImltYWdlL3BuZ1wiXG4gICAgICAgICAgICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICAgICAgICAgICAgU09SVCBwLmFkZGVkIERFU0NcbiAgICAgICAgICAgICAgICBSRVRVUk4gZmA7XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZXNCeVJlYWN0aW9ucyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcmVhY3Rpb25zOiBzdHJpbmdbXSA9IFtdLFxuICBvcHRpb25zPzogSW1hZ2VPcHRpb25zXG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFVzZXJzQnlJbWFnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzID0gW10sIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlSW1hZ2VPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRJbWFnZU9wdGlvbmFsKGZpZWxkcyk7XG5cbiAgY29uc3QgZm9ybWF0U2Vzc2lvbklkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25zOiBzdHJpbmdbXSA9IHJlYWN0aW9ucy5tYXAoKHJlYWN0aW9uTmFtZSkgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICdyLnR5cGUgPT0gXCJpbWFnZXNcIicsXG4gICAgYFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0UmVhY3Rpb25zKX0sIExPV0VSKHIubmFtZSkpYF07XG5cbiAgLy8gR2V0IGRhdGEgZnJvbSBkYXRhYmFzZVxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgaSwgciBJTiBPVVRCT1VORCBcIiR7Zm9ybWF0U2Vzc2lvbklkfVwiIGhhc1JlYWN0aW9uXG4gICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwiaW1hZ2VzXCJ9XG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gTUVSR0UoaSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBbXSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGlkOiBzdHJpbmcpOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdElkOiBzdHJpbmcgPSBwYXJzZUlkKGlkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaSBJTiBpbWFnZXNcbiAgICBGSUxURVIgaS5fa2V5PT0ke2Zvcm1hdElkfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gaWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoaW1hZ2U6IEltYWdlVHlwZSA9IHt9KSA9PiBpbWFnZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQYXRoVXNlckltYWdlcyA9ICh1c2VySWQ6IHN0cmluZywgaW1hZ2VJZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGRpcjogc3RyaW5nID0gJ2ltYWdlcycpOiBzdHJpbmcgPT4ge1xuICBsZXQgZmlsZW5hbWU6IHN0cmluZyA9IGltYWdlSWQ7XG5cbiAgc3dpdGNoKHR5cGUpIHtcbiAgICBjYXNlICdpbWFnZS9wbmcnOlxuICAgICAgZmlsZW5hbWUgPSBgJHtpbWFnZUlkfS5wbmdgO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGZpbGVuYW1lID0gYCR7aW1hZ2VJZH0uanBnYDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGB1c2Vycy8ke3VzZXJJZH0vJHtkaXJ9LyR7ZmlsZW5hbWV9YDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHBJbWFnZVVybCA9IChkYXRhOiBJbWFnZVVybERhdGEpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7aW1hZ2VJZCwgZGlyZWN0b3J5ID0gJ2ltYWdlcycsIGltYWdlVHlwZSA9ICdwcm9maWxlJywgaXNUaHVtYiwgdHlwZSwgdHlwZUlkfSA9IGRhdGE7XG4gIGNvbnN0IGhvc3Q6IHN0cmluZyA9IENvbmZpZy5nZXQoJ2Vudmlyb25tZW50JykgPT09ICdwcm9kJ1xuICAgID8gYGh0dHBzOi8vYm94LiR7Q29uZmlnLmdldCgnYXBwLnVybCcpfWBcbiAgICA6IGBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vZGV2LiR7Q29uZmlnLmdldCgnYXBwLnVybCcpfWA7XG4gIGNvbnN0IHN1ZmZpeDogc3RyaW5nID0gaXNUaHVtYiA/ICctdGgnIDogJyc7XG5cbiAgaWYoaW1hZ2VJZCkge1xuICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICBjYXNlICdhcHBzJzpcbiAgICAgICAgLy8gaHR0cHM6Ly9ib3gucmVha3Rvci5pby9teUFwcC9hcHAvaW1hZ2VzLzEyMy5qcGdcbiAgICAgICAgcmV0dXJuIGAke2hvc3R9LyR7dHlwZX0vJHtkaXJlY3Rvcnl9LyR7aW1hZ2VJZH0ke3N1ZmZpeH0uanBnYDtcbiAgICAgIGNhc2UgJ3VzZXJzJzpcbiAgICAgICAgLy8gaHR0cHM6Ly9ib3gucmVha3Rvci5pby9teUFwcC91c2Vycy9kZW1vVXNlci9pbWFnZXMvMTIzLmpwZ1xuICAgICAgICByZXR1cm4gYCR7aG9zdH0vJHt0eXBlfS8ke3R5cGVJZH0vJHtkaXJlY3Rvcnl9LyR7aW1hZ2VJZH0ke3N1ZmZpeH0uanBnYDtcbiAgICB9XG5cbiAgICBpZihpbWFnZVR5cGUgPT09ICdwcm9maWxlJykge1xuICAgICAgcmV0dXJuIGAke2hvc3R9L2RlZmF1bHRzLyR7dHlwZX1fYmske3N1ZmZpeH0uanBnYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7aG9zdH0vZGVmYXVsdHMvJHt0eXBlfV93aCR7c3VmZml4fS5qcGdgO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlVXJsID0gKGRhdGE6IEltYWdlVXJsRGF0YSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHtidWNrZXQsIGltYWdlSWQsIGlzVGh1bWIgPSBmYWxzZSwgdHlwZSwgdHlwZUlkfSA9IGRhdGE7XG4gIGNvbnN0IGltZ0Rpcjogc3RyaW5nID0gaXNUaHVtYiA/ICd0aHVtYnMnIDogJ2ltYWdlcyc7XG5cbiAgaWYoaW1hZ2VJZCkge1xuICAgIGNvbnN0IGltYWdlS2V5OiBzdHJpbmcgPSBgJHt0eXBlfS8ke3R5cGVJZH0vJHtpbWdEaXJ9LyR7aW1hZ2VJZH0uanBnYDtcbiAgICByZXR1cm4gczNHZXRTaWduZWRVcmwoe0J1Y2tldDogYnVja2V0LCBLZXk6IGltYWdlS2V5LCBFeHBpcmVzOiA5MDB9KTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCByZXNpemVTYXZlSW1hZ2UgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGltYWdlSWQ6IHN0cmluZyxcbiAgYnVmZmVyOiBCdWZmZXIsXG4gIHR5cGU6IHN0cmluZyA9ICdpbWFnZS9qcGVnJywgczNPcHRpb25zPzogUHV0T2JqZWN0UmVxdWVzdCk6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3Jlc2l6ZVNhdmVJbWFnZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGltZ1c6IG51bWJlciA9IENvbmZpZy5nZXQoJ2ltYWdlLmltZ1NpemUnKTtcbiAgY29uc3QgaW1nUTogbnVtYmVyID0gQ29uZmlnLmdldCgnaW1hZ2UuaW1nUXVhbGl0eScpO1xuICBsZXQgcGhvdG86IEltYWdlVHlwZSA9IHt9O1xuICBjb25zdCBmb3JtYXQ6IHN0cmluZyA9ICh0eXBlLnNwbGl0KCcvJykpWzFdO1xuXG4gIGNvbnNvbGUubG9nKHtidWZmZXIsIGZvcm1hdCwgaW1nVywgaW1nUX0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBnbShidWZmZXIsICdpbWcnKVxuICAgICAgLnNldEZvcm1hdChmb3JtYXQpXG4gICAgICAucXVhbGl0eShpbWdRKVxuICAgICAgLmF1dG9PcmllbnQoKVxuICAgICAgLnJlc2l6ZShpbWdXLCBpbWdXLCAnPicpXG4gICAgICAuaWRlbnRpZnkoe2J1ZmZlclN0cmVhbTogdHJ1ZX0sIChlcnJvcjogRXJyb3IsIHZhbDogSW1hZ2VJZGVudGlmeVR5cGUgPSB7fSk6IGFueSA9PiB7XG4gICAgICAgIGlmKGVycm9yKSB7XG4gICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICBsYWJlbDogJ2ltYWdlX3NhdmUnLFxuICAgICAgICAgICAgdmFsdWU6ICdnbV9pbWFnZV9pZGVudGlmeSdcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmb3JtYXRWYWxzID0gbG93ZXJDYXNlS2V5cyh2YWwpO1xuICAgICAgICAgIGNvbnN0IHttYWtlOiBjYW1lcmFNYWtlLCBtb2RlbDogY2FtZXJhTW9kZWwsIGRhdGV0aW1lb3JpZ2luYWw6IHRha2VufTogSW1hZ2VJZGVudGlmeVR5cGUgPSBmb3JtYXRWYWxzO1xuICAgICAgICAgIHBob3RvID0ge1xuICAgICAgICAgICAgLi4uY2xvbmVEZWVwKHBob3RvKSxcbiAgICAgICAgICAgIG1ha2U6IGNhbWVyYU1ha2UsXG4gICAgICAgICAgICBtb2RlbDogY2FtZXJhTW9kZWwsXG4gICAgICAgICAgICB0YWtlbjogdGFrZW4gPyBEYXRlVGltZS5mcm9tTWlsbGlzKHRha2VuKS5taWxsaXNlY29uZCA6IG51bGxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gSWYgbm8gYmFja2dyb3VuZCBjb2xvciwgZ2V0IHRoZSBtZWFuIGNvbG9yIHZhbHVlXG4gICAgICAgICAgY29uc3Qgc3RhdHMgPSBmb3JtYXRWYWxzWydjaGFubmVsIHN0YXRpc3RpY3MnXTtcblxuICAgICAgICAgIGlmKHN0YXRzKSB7XG4gICAgICAgICAgICBsZXQge3JlZCwgZ3JlZW4sIGJsdWUsIG1lYW59ID0gc3RhdHM7XG5cbiAgICAgICAgICAgIGlmKHJlZCkge1xuICAgICAgICAgICAgICBtZWFuID0gcmVkWydzdGFuZGFyZCBkZXZpYXRpb24nXSB8fCByZWQubWVhbjtcbiAgICAgICAgICAgICAgcmVkID0gbWVhbiA/ICsoKG1lYW4uc3BsaXQoJyAnKVswXSkuc3Vic3RyaW5nKDAsIDMpKSA6IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWQgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihncmVlbikge1xuICAgICAgICAgICAgICBtZWFuID0gZ3JlZW5bJ3N0YW5kYXJkIGRldmlhdGlvbiddIHx8IGdyZWVuLm1lYW47XG4gICAgICAgICAgICAgIGdyZWVuID0gbWVhbiA/ICsoKG1lYW4uc3BsaXQoJyAnKVswXSkuc3Vic3RyaW5nKDAsIDMpKSA6IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBncmVlbiA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKGJsdWUpIHtcbiAgICAgICAgICAgICAgbWVhbiA9IGJsdWVbJ3N0YW5kYXJkIGRldmlhdGlvbiddIHx8IGJsdWUubWVhbjtcbiAgICAgICAgICAgICAgYmx1ZSA9IG1lYW4gPyArKChtZWFuLnNwbGl0KCcgJylbMF0pLnN1YnN0cmluZygwLCAzKSkgOiAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYmx1ZSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IGJsdWUgfCAoZ3JlZW4gPDwgOCkgfCAocmVkIDw8IDE2KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gcmdiLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIHBob3RvLmNvbG9yID0gY29sb3IgPT09ICcwJyA/ICcwMDAwMDAnIDogY29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnN0cmVhbSgoZXJyb3I6IEVycm9yLCBzdGRvdXQpOiBhbnkgPT4ge1xuICAgICAgICBpZihlcnJvcikge1xuICAgICAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgaXNJbnRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgIGxhYmVsOiAnaW1hZ2Vfc2F2ZScsXG4gICAgICAgICAgICB2YWx1ZTogJ2dtX2ltYWdlX3N0cmVhbSdcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgaW1hZ2VCdWZmZXI6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKCcnKTtcblxuICAgICAgICAgIHN0ZG91dC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpbWFnZUJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW2ltYWdlQnVmZmVyLCBkYXRhXSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzdGRvdXQub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgIC8vIEdldCBmaWxlIHNpemVcbiAgICAgICAgICAgIHBob3RvLmZpbGVTaXplID0gaW1hZ2VCdWZmZXIubGVuZ3RoO1xuXG4gICAgICAgICAgICAvLyBVcGxvYWQgZGF0YVxuICAgICAgICAgICAgY29uc3QgaW1hZ2VPYmo6IFB1dE9iamVjdFJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgIEFDTDogJ2F1dGhlbnRpY2F0ZWQtcmVhZCcsXG4gICAgICAgICAgICAgIEJvZHk6IGltYWdlQnVmZmVyLFxuICAgICAgICAgICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICAgICAgICAgIENvbnRlbnRUeXBlOiB0eXBlLFxuICAgICAgICAgICAgICAuLi5zM09wdGlvbnMgfHwge30sXG4gICAgICAgICAgICAgIEtleTogZ2V0UGF0aFVzZXJJbWFnZXMoc2Vzc2lvbklkLCBpbWFnZUlkLCB0eXBlLCAnaW1hZ2VzJylcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHMzUHV0KGltYWdlT2JqKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGhtVyA9IENvbmZpZy5nZXQoJ2ltYWdlLnRobVNpemUnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aG1RID0gQ29uZmlnLmdldCgnaW1hZ2UudGhtUXVhbGl0eScpO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBsb2FkIHRodW1ibmFpbFxuICAgICAgICAgICAgICAgIGdtKGltYWdlQnVmZmVyLCAnaW1nJylcbiAgICAgICAgICAgICAgICAgIC5zZXRGb3JtYXQoJ2pwZWcnKVxuICAgICAgICAgICAgICAgICAgLnNpemUoKHRodW1iRXJyb3I6IEVycm9yLCByZXNpemVWYWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIXRodW1iRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdXBkYXRlZCByZXNpemUgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gcmVzaXplVmFsO1xuICAgICAgICAgICAgICAgICAgICAgIHBob3RvID0gey4uLmNsb25lRGVlcChwaG90byksIGhlaWdodCwgd2lkdGh9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgLmdyYXZpdHkoJ0NlbnRlcicpXG4gICAgICAgICAgICAgICAgICAucmVzaXplKHRobVcsIHRobVcsICdeJylcbiAgICAgICAgICAgICAgICAgIC5leHRlbnQodGhtVywgdGhtVylcbiAgICAgICAgICAgICAgICAgIC5xdWFsaXR5KHRobVEpXG4gICAgICAgICAgICAgICAgICAuc3RyZWFtKChzdHJlYW1FcnJvcjogRXJyb3IsIHRodW1iU3Rkb3V0KTogYW55ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnaW1hZ2Vfc2F2ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ2dtX3RodW1ibmFpbF9zdGVhbSdcbiAgICAgICAgICAgICAgICAgICAgICB9LCBzdHJlYW1FcnJvciwgY29udGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgdGh1bWJCdWZmZXI6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKCcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHRodW1iU3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRodW1iQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbdGh1bWJCdWZmZXIsIGRhdGFdKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIHRodW1iU3Rkb3V0Lm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGxvYWQgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGh1bWJPYmo6IFB1dE9iamVjdFJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEFDTDogJ2F1dGhlbnRpY2F0ZWQtcmVhZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHk6IHRodW1iQnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zM09wdGlvbnMgfHwge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEtleTogZ2V0UGF0aFVzZXJJbWFnZXMoc2Vzc2lvbklkLCBpbWFnZUlkLCB0eXBlLCAndGh1bWJzJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHMzUHV0KHRodW1iT2JqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwaG90byk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoczNQdXRFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ2ltYWdlX3NhdmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnczNfcHV0X2ltYWdlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzM1B1dEVycm9yLCBjb250ZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoczNFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICBpc0ludGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnaW1hZ2Vfc2F2ZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdzM19pbWFnZV9zYXZlJ1xuICAgICAgICAgICAgICB9LCBzM0Vycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEltYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGltYWdlOiBJbWFnZVR5cGUsIHMzT3B0aW9ucz86IFB1dE9iamVjdFJlcXVlc3QpOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRJbWFnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7aW1hZ2VJZCwgZGVzY3JpcHRpb24sIGJ1ZmZlciwgZmlsZVR5cGV9ID0gaW1hZ2U7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICByZXR1cm4gcmVzaXplU2F2ZUltYWdlKGNvbnRleHQsIGltYWdlSWQsIGJ1ZmZlciwgZmlsZVR5cGUsIHMzT3B0aW9ucylcbiAgICAudGhlbigocmVzaXplZEltYWdlOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGluc2VydDogSW1hZ2VUeXBlID0ge1xuICAgICAgICAuLi5yZXNpemVkSW1hZ2UsXG4gICAgICAgIF9rZXk6IGltYWdlSWQsXG4gICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBpbWFnZXMgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbihkZWZhdWx0T2JqZWN0KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICBpc0ludGVybmFsOiB0cnVlLFxuICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGlzSW50ZXJuYWw6IHRydWUsXG4gICAgICBsYWJlbDogJ2ltYWdlX3Jlc2l6ZSdcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkSW1hZ2VFZGdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSk6IFByb21pc2U8b2JqZWN0PiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZEltYWdlRWRnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7aW1hZ2VJZCwgaXRlbUlkLCBpdGVtVHlwZX0gPSBpbWFnZUVkZ2U7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaGFzSW1hZ2UnKTtcbiAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGBoYXNJbWFnZS0ke2ltYWdlSWR9LSR7aXRlbUlkfS0ke3Nlc3Npb25JZH1gKTtcbiAgY29uc3QgZm9ybWF0SXRlbVR5cGU6IHN0cmluZyA9IHBhcnNlQ2hhcihpdGVtVHlwZSkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGxldCBpdGVtRG9jSWQ6IHN0cmluZztcbiAgY29uc3QgZm9ybWF0SW1hZ2VJZDogc3RyaW5nID0gcGFyc2VJZChpbWFnZUlkKTtcbiAgY29uc3QgZmlsZURvY0lkOiBzdHJpbmcgPSBgaW1hZ2VzLyR7Zm9ybWF0SW1hZ2VJZH1gO1xuXG4gIHN3aXRjaChmb3JtYXRJdGVtVHlwZSkge1xuICAgIGNhc2UgJ2dyb3Vwcyc6XG4gICAgICBpdGVtRG9jSWQgPSBgZ3JvdXBzLyR7Zm9ybWF0SXRlbUlkfWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwb3N0cyc6XG4gICAgICBpdGVtRG9jSWQgPSBgcG9zdHMvJHtmb3JtYXRJdGVtSWR9YDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VzZXJzJzpcbiAgICBjYXNlICdwcm9maWxlJzpcbiAgICAgIGl0ZW1Eb2NJZCA9IGB1c2Vycy8ke2Zvcm1hdEl0ZW1JZH1gO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGl0ZW1Eb2NJZCA9ICcnO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgY29uc3QgZWRnZTogYW55ID0ge1xuICAgIF9mcm9tOiBpdGVtRG9jSWQsXG4gICAgX2tleTogZWRnZUlkLFxuICAgIF90bzogZmlsZURvY0lkLFxuICAgIGFkZGVkOiBub3csXG4gICAgdHlwZTogaXRlbVR5cGVcbiAgfTtcblxuICBpZihpdGVtRG9jSWQpIHtcbiAgICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSlcbiAgICAgIC50aGVuKChmaWxlRWRnZSkgPT4gZWRnZUNvbGxlY3Rpb24uZG9jdW1lbnQoZmlsZUVkZ2UpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgaXNJbnRlcm5hbDogdHJ1ZSxcbiAgICAgICAgbGFiZWw6ICdkYl9lcnJvcicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGVkZ2UsXG4gICAgICAgICAgZmlsZURvY0lkLFxuICAgICAgICAgIGltYWdlSWQsXG4gICAgICAgICAgaXRlbURvY0lkLFxuICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICBpdGVtVHlwZVxuICAgICAgICB9XG4gICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gIH1cblxuICByZXR1cm4ge307XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlSW1hZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGltYWdlOiBJbWFnZVR5cGUsXG4gIHMzT3B0aW9ucz86IFB1dE9iamVjdFJlcXVlc3Rcbik6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZUltYWdlJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgLy8gSXRlbSBwcm9wc1xuICBjb25zdCB7XG4gICAgYmFzZTY0ID0gJycsXG4gICAgYnVmZmVyOiBpbWFnZUJ1ZmZlcixcbiAgICBkZXNjcmlwdGlvbiA9ICcnLFxuICAgIGltYWdlSWQsXG4gICAgaXRlbUlkLFxuICAgIGl0ZW1UeXBlLFxuICAgIGZpbGVUeXBlLFxuICAgIHVybCA9ICcnXG4gIH0gPSBpbWFnZTtcblxuICAvLyBTYXZlIEJhc2U2NCBkYXRhXG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZm9ybWF0SW1hZ2VJZDogc3RyaW5nID0gaW1hZ2VJZCB8fCBjcmVhdGVIYXNoKGBpbWFnZS0ke3Nlc3Npb25JZH1gKTtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlOiBzdHJpbmcgPSBwYXJzZUNoYXIoaXRlbVR5cGUsIDE2KS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBjdXN0b21QYXJhbXM6IEltYWdlVHlwZSA9IHtcbiAgICBkZXNjcmlwdGlvbixcbiAgICBpbWFnZUlkOiBmb3JtYXRJbWFnZUlkLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG5cbiAgaWYoYmFzZTY0IHx8IGltYWdlQnVmZmVyKSB7XG4gICAgbGV0IGJ1ZmZlcjogQnVmZmVyID0gaW1hZ2VCdWZmZXI7XG5cbiAgICAvLyBQYXJzZSBCYXNlNjQgZGF0YVxuICAgIGlmKGJhc2U2NCkge1xuICAgICAgY29uc3QgZm9ybWF0QmFzZTY0OiBzdHJpbmcgPSBiYXNlNjQuc3Vic3RyKGJhc2U2NC5pbmRleE9mKCcsJykgKyAxKTtcbiAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGZvcm1hdEJhc2U2NCwgJ2Jhc2U2NCcpO1xuICAgIH1cblxuICAgIGxldCB1cGRhdGVkRmlsZVR5cGUgPSBmaWxlVHlwZTtcblxuICAgIGlmKCFmaWxlVHlwZSkge1xuICAgICAgY29uc3QgZmlsZU1pbWU6IEZpbGVUeXBlUmVzdWx0ID0gYXdhaXQgRmlsZVR5cGUuZmlsZVR5cGVGcm9tQnVmZmVyKGJ1ZmZlcik7XG4gICAgICBjb25zdCB7bWltZX0gPSBmaWxlTWltZTtcbiAgICAgIHVwZGF0ZWRGaWxlVHlwZSA9IG1pbWU7XG4gICAgfVxuXG4gICAgY29uc3QgaW1nUGFyYW1zOiBJbWFnZVR5cGUgPSB7XG4gICAgICAuLi5jdXN0b21QYXJhbXMsXG4gICAgICBidWZmZXIsXG4gICAgICBmaWxlVHlwZTogdXBkYXRlZEZpbGVUeXBlXG4gICAgfTtcblxuICAgIHJldHVybiBhZGRJbWFnZShjb250ZXh0LCBpbWdQYXJhbXMsIHMzT3B0aW9ucylcbiAgICAgIC50aGVuKChpbWFnZTogSW1hZ2VUeXBlKSA9PiB7XG4gICAgICAgIGlmKGZvcm1hdEl0ZW1JZCAmJiBmb3JtYXRJdGVtVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSA9IHtcbiAgICAgICAgICAgIGltYWdlSWQ6IGZvcm1hdEltYWdlSWQsXG4gICAgICAgICAgICBpdGVtSWQ6IGZvcm1hdEl0ZW1JZCxcbiAgICAgICAgICAgIGl0ZW1UeXBlOiBmb3JtYXRJdGVtVHlwZVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFkZEltYWdlRWRnZShjb250ZXh0LCBpbWFnZUVkZ2UpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6ICdpbWFnZV9zYXZlX2Vycm9yJ1xuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICB9IGVsc2UgaWYodXJsICE9PSAnJykge1xuICAgIC8vIERvd25sb2FkIGltYWdlIGZyb20gdGhlIHdlYlxuICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nO1xuXG4gICAgcmV0dXJuIGh0dHBHZXQodXJsKVxuICAgICAgLnRoZW4oKHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiAnZmV0Y2hfaW1hZ2VfdXJsJyxcbiAgICAgICAgICAgIHZhbHVlOiByZXMuc3RhdHVzVGV4dFxuICAgICAgICAgIH0sIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZW50VHlwZSA9IHJlcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuYnVmZmVyKCkpXG4gICAgICAudGhlbigoYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgICAgICAgY29uc3QgaW1nUGFyYW1zOiBJbWFnZVR5cGUgPSB7XG4gICAgICAgICAgLi4uY3VzdG9tUGFyYW1zLFxuICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICBmaWxlVHlwZTogY29udGVudFR5cGVcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gYWRkSW1hZ2UoY29udGV4dCwgaW1nUGFyYW1zLCBzM09wdGlvbnMpLnRoZW4oKGltYWdlOiBJbWFnZVR5cGUpID0+IHtcbiAgICAgICAgICBpZihmb3JtYXRJdGVtSWQgJiYgZm9ybWF0SXRlbVR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSA9IHtpbWFnZUlkOiBmb3JtYXRJbWFnZUlkLCBpdGVtSWQ6IGZvcm1hdEl0ZW1JZCwgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlfTtcbiAgICAgICAgICAgIHJldHVybiBhZGRJbWFnZUVkZ2UoY29udGV4dCwgaW1hZ2VFZGdlKS50aGVuKCgpID0+IGltYWdlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiAnZmV0Y2hfZXJyb3InXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gIH0gZWxzZSBpZihpbWFnZUlkICE9PSAnJykge1xuICAgIC8vIFVwZGF0ZSBtZXRhZGF0YVxuICAgIGNvbnN0IHVwZGF0ZTogYW55ID0ge1xuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBtb2RpZmllZDogbm93XG4gICAgfTtcbiAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSB7X2tleTogJHtmb3JtYXRJbWFnZUlkfX0gV0lUSCAke3VwZGF0ZX0gSU4gaW1hZ2VzIFJFVFVSTiBORVdgO1xuXG4gICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6ICdkYl9lcnJvcicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGFxbFFyeSxcbiAgICAgICAgICBmb3JtYXRJbWFnZUlkLFxuICAgICAgICAgIHVwZGF0ZVxuICAgICAgICB9XG4gICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVJbWFnZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBpbWFnZUlkOiBzdHJpbmcpOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGUnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SW1hZ2VJZCA9IHBhcnNlSWQoaW1hZ2VJZCk7XG5cbiAgY29uc3QgcmVtb3ZlRWRnZVF1ZXJ5ID0gYXFsYEZPUiBoaSBJTiBoYXNJbWFnZVxuICAgIEZJTFRFUiBoaS5fZnJvbSA9PSAke2Zvcm1hdEltYWdlSWR9XG4gICAgUkVNT1ZFIGhpIElOIGhhc0ltYWdlXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgYXdhaXQgZGF0YWJhc2UucXVlcnkocmVtb3ZlRWRnZVF1ZXJ5KTtcblxuICBjb25zdCBhcWxRdWVyeSA9IGFxbGBGT1IgaSBJTiBpbWFnZXNcbiAgICBGSUxURVIgaS5fa2V5ID09ICR7Zm9ybWF0SW1hZ2VJZH0gJiYgaS51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgUkVNT1ZFIGkgSU4gaW1hZ2VzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgY29uc3QgaW1hZ2UgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcblxuICBpZihpbWFnZSkge1xuICAgIGNvbnN0IHtfa2V5OiBpbWFnZUtleX0gPSBpbWFnZTtcbiAgICBjb25zdCBwYXJhbXM6IERlbGV0ZU9iamVjdHNSZXF1ZXN0ID0ge1xuICAgICAgQnVja2V0OiBudWxsLFxuICAgICAgRGVsZXRlOiB7XG4gICAgICAgIE9iamVjdHM6IFtcbiAgICAgICAgICB7S2V5OiBgdXNlcnMvJHtzZXNzaW9uSWR9L2ltYWdlcy8ke2ltYWdlS2V5fS5qcGdgfSxcbiAgICAgICAgICB7S2V5OiBgdXNlcnMvJHtzZXNzaW9uSWR9L3RodW1icy8ke2ltYWdlS2V5fS5qcGdgfVxuICAgICAgICBdLFxuICAgICAgICBRdWlldDogdHJ1ZVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gczNEZWxldGVMaXN0KHBhcmFtcykudGhlbigoKSA9PiBpbWFnZSk7XG4gIH1cblxuICByZXR1cm4ge307XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBLHdCQUE2QjtBQUM3QixtQkFBc0U7QUFDdEUsc0JBQWtCO0FBS2xCLHVCQUF1QztBQUN2QyxnQkFBZTtBQUNmLHVCQUFzQjtBQUN0QixtQkFBdUI7QUFFdkIsb0JBQXFCO0FBYXJCLElBQUFBLGdCQUF3RztBQUN4RyxvQkFBeUM7QUFDekMsSUFBQUMsYUFBa0Q7QUFFbEQsTUFBTSxnQkFBd0I7QUFFdkIsTUFBTSxvQkFB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SyxDQUFDLFdBQXdCLE9BQU8sS0FBSyxDQUFDLEVBQzNDLE1BQU0sQ0FBQyxjQUFpQix3QkFBUztBQUFBLElBQ2hDO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixPQUFPO0FBQUEsRUFDVCxHQUFHLE9BQU8sT0FBTyxFQUFFLEtBQUssTUFBTSxJQUFJLENBQUM7QUFFckMsTUFBRyxPQUFPO0FBQ1IsVUFBTSxFQUFDLE1BQU0sU0FBUSxJQUFJO0FBQ3pCLFVBQU0sU0FBK0I7QUFBQSxNQUNuQyxRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUEsUUFDTixTQUFTO0FBQUEsVUFDUCxFQUFDLEtBQUssU0FBUyxTQUFTLFdBQVcsUUFBUSxPQUFNO0FBQUEsVUFDakQsRUFBQyxLQUFLLFNBQVMsU0FBUyxXQUFXLFFBQVEsT0FBTTtBQUFBLFFBQ25EO0FBQUEsUUFDQSxPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFFQSxlQUFPLHlCQUFhLE1BQU0sRUFBRSxLQUFLLE1BQU0sS0FBSztBQUFBLEVBQzlDO0FBRUEsU0FBTyxDQUFDO0FBQ1Y7IiwKICAibmFtZXMiOiBbImltcG9ydF91dGlscyIsICJpbXBvcnRfczMiLCAiZ20iLCAiZXJyb3IiLCAiY2xvbmVEZWVwIiwgIkZpbGVUeXBlIiwgImltYWdlIiwgImh0dHBHZXQiXQp9Cg==