@nlabs/reaktor 0.6.0 → 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 (84) hide show
  1. package/lib/actions/conversations.js +34 -24
  2. package/lib/actions/email.js +2 -3
  3. package/lib/actions/files.js +4 -15
  4. package/lib/actions/images.js +20 -21
  5. package/lib/actions/messages.js +5 -6
  6. package/lib/actions/payments.js +5 -6
  7. package/lib/actions/posts.js +50 -7
  8. package/lib/actions/reactions.js +13 -13
  9. package/lib/actions/tags.js +3 -3
  10. package/lib/actions/users.js +13 -14
  11. package/lib/actions/websockets.js +3 -3
  12. package/lib/lambdas/actions/websockets.js +4 -15
  13. package/lib/lambdas/authorizer.js +5 -16
  14. package/lib/lambdas/connection.js +2 -13
  15. package/lib/types/conversations.js +1 -1
  16. package/lib/types/users.js +1 -1
  17. package/lib/utils/arangodb.js +2 -2
  18. package/package.json +12 -12
  19. package/lib/actions/conversations.d.ts +0 -14
  20. package/lib/actions/dynamodb.d.ts +0 -8
  21. package/lib/actions/email.d.ts +0 -7
  22. package/lib/actions/files.d.ts +0 -16
  23. package/lib/actions/groups.d.ts +0 -14
  24. package/lib/actions/images.d.ts +0 -22
  25. package/lib/actions/index.d.ts +0 -20
  26. package/lib/actions/ios.d.ts +0 -7
  27. package/lib/actions/locations.d.ts +0 -3
  28. package/lib/actions/messages.d.ts +0 -13
  29. package/lib/actions/notifications.d.ts +0 -5
  30. package/lib/actions/payments.d.ts +0 -10
  31. package/lib/actions/posts.d.ts +0 -19
  32. package/lib/actions/reactions.d.ts +0 -30
  33. package/lib/actions/s3.d.ts +0 -7
  34. package/lib/actions/search.d.ts +0 -3
  35. package/lib/actions/sms.d.ts +0 -3
  36. package/lib/actions/statistics.d.ts +0 -2
  37. package/lib/actions/subscription.d.ts +0 -7
  38. package/lib/actions/tags.d.ts +0 -26
  39. package/lib/actions/users.d.ts +0 -44
  40. package/lib/actions/websockets.d.ts +0 -6
  41. package/lib/config.d.ts +0 -20
  42. package/lib/index.d.ts +0 -5
  43. package/lib/lambdas/actions/websockets.d.ts +0 -6
  44. package/lib/lambdas/authorizer.d.ts +0 -20
  45. package/lib/lambdas/connection.d.ts +0 -12
  46. package/lib/lambdas/utils/message.d.ts +0 -1
  47. package/lib/lambdas/utils/websocket.d.ts +0 -7
  48. package/lib/templates/email/layout.d.ts +0 -2
  49. package/lib/templates/email/passwordForgot.d.ts +0 -2
  50. package/lib/templates/email/passwordRecovery.d.ts +0 -2
  51. package/lib/templates/email/verifyEmail.d.ts +0 -2
  52. package/lib/templates/email/welcome.d.ts +0 -2
  53. package/lib/templates/sms/passwordForgot.d.ts +0 -2
  54. package/lib/templates/sms/passwordRecovery.d.ts +0 -2
  55. package/lib/templates/sms/verifyEmail.d.ts +0 -2
  56. package/lib/templates/sms/verifyPhone.d.ts +0 -2
  57. package/lib/templates/sms/welcome.d.ts +0 -2
  58. package/lib/types/apps.d.ts +0 -44
  59. package/lib/types/arangodb.d.ts +0 -17
  60. package/lib/types/auth.d.ts +0 -7
  61. package/lib/types/connections.d.ts +0 -8
  62. package/lib/types/conversations.d.ts +0 -11
  63. package/lib/types/email.d.ts +0 -12
  64. package/lib/types/files.d.ts +0 -26
  65. package/lib/types/google.d.ts +0 -27
  66. package/lib/types/groups.d.ts +0 -22
  67. package/lib/types/images.d.ts +0 -42
  68. package/lib/types/index.d.ts +0 -18
  69. package/lib/types/locations.d.ts +0 -20
  70. package/lib/types/messages.d.ts +0 -27
  71. package/lib/types/notifications.d.ts +0 -19
  72. package/lib/types/payments.d.ts +0 -115
  73. package/lib/types/posts.d.ts +0 -47
  74. package/lib/types/statistics.d.ts +0 -3
  75. package/lib/types/tags.d.ts +0 -15
  76. package/lib/types/users.d.ts +0 -80
  77. package/lib/types/websocket.d.ts +0 -14
  78. package/lib/utils/analytics.d.ts +0 -14
  79. package/lib/utils/arangodb.d.ts +0 -9
  80. package/lib/utils/auth.d.ts +0 -5
  81. package/lib/utils/graphql.d.ts +0 -1
  82. package/lib/utils/index.d.ts +0 -6
  83. package/lib/utils/objects.d.ts +0 -3
  84. package/lib/utils/session.d.ts +0 -18
@@ -40,7 +40,6 @@ __export(payments_exports, {
40
40
  module.exports = __toCommonJS(payments_exports);
41
41
  var import_utils = require("@nlabs/utils");
42
42
  var import_arangojs = require("arangojs");
43
- var import_isEmpty = __toESM(require("lodash/isEmpty"));
44
43
  var import_stripe = __toESM(require("stripe"));
45
44
  var import_config = require("../config");
46
45
  var import_analytics = require("../utils/analytics");
@@ -63,7 +62,7 @@ const addCustomerAccount = (context) => {
63
62
  stripeCustomerId: customer.id
64
63
  };
65
64
  const aqlQry = import_arangojs.aql`UPDATE ${sessionId} WITH ${update} IN users LIMIT 1 RETURN NEW`;
66
- return database.query(aqlQry).then((cursor) => cursor.next()).then((updatedUser = {}) => !(0, import_isEmpty.default)(updatedUser)).catch((error) => (0, import_analytics.logError)({
65
+ return database.query(aqlQry).then((cursor) => cursor.next()).then((updatedUser = {}) => !!updatedUser).catch((error) => (0, import_analytics.logError)({
67
66
  action,
68
67
  category: eventCategory,
69
68
  label: "db_error"
@@ -222,7 +221,7 @@ const addCreditCard = (context, card) => {
222
221
  };
223
222
  const insertAqlQry = import_arangojs.aql`INSERT ${insert} IN creditCards RETURN NEW`;
224
223
  return database.query(insertAqlQry).then((cursor) => cursor.next()).then((newCard = {}) => {
225
- if (!(0, import_isEmpty.default)(newCard)) {
224
+ if (newCard) {
226
225
  const { _id: cardId, _key: cardKey } = card;
227
226
  const edgeCollection = database.collection("hasPayment");
228
227
  const edgeId = (0, import_utils.createHash)(`payment-${cardKey}`);
@@ -311,7 +310,7 @@ const updateCreditCard = (context, card) => {
311
310
  return database.query(aqlQry).then((cursor) => cursor.next()).then((results = { card: {}, user: {} }) => {
312
311
  const updatedCard = results.card;
313
312
  const { user } = results;
314
- if ((0, import_isEmpty.default)(updatedCard)) {
313
+ if (!updatedCard) {
315
314
  throw new import_analytics.UserError("not_found");
316
315
  }
317
316
  const { stripeCustomerId } = user;
@@ -364,7 +363,7 @@ const deleteCreditCard = (context, cardId) => {
364
363
  )
365
364
  RETURN {user: user, card: card}`;
366
365
  return database.query(aqlQry).then((cursor) => cursor.next()).then((result = { card: {}, user: {} }) => {
367
- if ((0, import_isEmpty.default)(result)) {
366
+ if (!result) {
368
367
  return false;
369
368
  }
370
369
  const { card, user } = result;
@@ -479,4 +478,4 @@ const createPaymentHold = (context, payment) => {
479
478
  getCreditCards,
480
479
  updateCreditCard
481
480
  });
482
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcGF5bWVudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtBcnJheUN1cnNvcn0gZnJvbSAnYXJhbmdvanMvY3Vyc29yJztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9pc0VtcHR5JztcbmltcG9ydCBTdHJpcGUgZnJvbSAnc3RyaXBlJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge0FwaUNvbnRleHQsIFBheW1lbnRCYW5rQWNjb3VudCwgUGF5bWVudENhcmRUeXBlLCBQYXltZW50Q2hhcmdlLCBQYXltZW50VHJhbnNmZXIsIFVzZXJ9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7bG9nRXJyb3IsIFVzZXJFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzJztcbmltcG9ydCB7Z2V0VXNlcn0gZnJvbSAnLi91c2Vycyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICdwYXltZW50cyc7XG5jb25zdCBhcGlWZXJzaW9uOiBhbnkgPSAnMjAyMC0wMy0wMic7XG5cbmV4cG9ydCBjb25zdCBhZGRDdXN0b21lckFjY291bnQgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRDdXN0b21lckFjY291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9fSA9IGNvbnRleHQ7XG5cbiAgLy8gU3RyaXBlXG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG5cbiAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAuY3JlYXRlKHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkLFxuICAgICAgICB1c2VybmFtZVxuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4oKGN1c3RvbWVyKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgc2Vzc2lvblxuICAgICAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdXBkYXRlOiBVc2VyID0ge1xuICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICBzdHJpcGVDdXN0b21lcklkOiBjdXN0b21lci5pZFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigodXBkYXRlZFVzZXI6IFVzZXIgPSB7fSkgPT4gIWlzRW1wdHkodXBkYXRlZFVzZXIpKVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkQmFua0FjY291bnQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgYmFua0FjY291bnQ6IFBheW1lbnRCYW5rQWNjb3VudCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRQYXltZW50QWNjb3VudEJhbmsnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcblxuICAvLyBQYXJhbXNcbiAgY29uc3Qge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgZnVsbE5hbWUsXG4gICAgcm91dGluZ1xuICB9ID0gYmFua0FjY291bnQ7XG5cbiAgY29uc3QgZm9ybWF0QWNjb3VudDogc3RyaW5nID0gcGFyc2VTdHJpbmcoYWNjb3VudE51bWJlciwgMzIpO1xuXG4gIGlmKGZvcm1hdEFjY291bnQgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfYWNjb3VudF9udW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoZnVsbE5hbWUsIDEyOCk7XG5cbiAgaWYoZm9ybWF0RnVsbE5hbWUgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfZnVsbF9uYW1lJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRSb3V0aW5nOiBzdHJpbmcgPSBwYXJzZVN0cmluZyhyb3V0aW5nLCAzMik7XG5cbiAgaWYoZm9ybWF0Um91dGluZyA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9yb3V0aW5nX251bWJlcicpO1xuICB9XG5cbiAgcmV0dXJuIGdldFVzZXIoY29udGV4dCwgc2Vzc2lvbklkKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyKSA9PiB7XG4gICAgICBjb25zdCB7c3RyaXBlQWNjb3VudElkfTogVXNlciA9IHVzZXI7XG5cbiAgICAgIC8vIFN0cmlwZVxuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcbiAgICAgIGNvbnN0IHNvdXJjZTogYW55ID0ge1xuICAgICAgICBhY2NvdW50X2hvbGRlcl9uYW1lOiBmb3JtYXRGdWxsTmFtZSxcbiAgICAgICAgYWNjb3VudF9ob2xkZXJfdHlwZTogJ2luZGl2aWR1YWwnLFxuICAgICAgICBhY2NvdW50X251bWJlcjogZm9ybWF0QWNjb3VudCxcbiAgICAgICAgY291bnRyeTogJ1VTJyxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBvYmplY3Q6ICdiYW5rX2FjY291bnQnLFxuICAgICAgICByb3V0aW5nX251bWJlcjogZm9ybWF0Um91dGluZ1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAgICAgLmNyZWF0ZVNvdXJjZShzdHJpcGVBY2NvdW50SWQsIHtzb3VyY2V9KVxuICAgICAgICAudGhlbigoYWNjb3VudDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3Qge2lkOiBiYW5rSWQsIGxhc3Q0OiBiYW5rQWNjb3VudCwgcm91dGluZ19udW1iZXI6IGJhbmtSb3V0aW5nfSA9IGFjY291bnQ7XG4gICAgICAgICAgY29uc3QgdXBkYXRlOiBhbnkgPSB7XG4gICAgICAgICAgICBiYW5rQWNjb3VudCxcbiAgICAgICAgICAgIGJhbmtGdWxsTmFtZTogZm9ybWF0RnVsbE5hbWUsXG4gICAgICAgICAgICBiYW5rSWQsXG4gICAgICAgICAgICBiYW5rUm91dGluZyxcbiAgICAgICAgICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7c2Vzc2lvbklkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gICAgICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKHVwZGF0ZWRVc2VyOiBVc2VyID0ge30pID0+IHVwZGF0ZWRVc2VyKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBlcnJvci5tZXNzYWdlO1xuXG4gICAgICAgICAgaWYobXNnID09PSAnQSBiYW5rIGFjY291bnQgd2l0aCB0aGF0IHJvdXRpbmcgbnVtYmVyIGFuZCBhY2NvdW50IG51bWJlciAnICtcbiAgICAgICAgICAgICdhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBjdXN0b21lci4nKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBsYWJlbDogJ2JhbmtfYWNjb3VudF9leGlzdHMnXG4gICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRDcmVkaXRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmQ6IFBheW1lbnRDYXJkVHlwZSk6IFByb21pc2U8VXNlcj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRDcmVkaXRDYXJkJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgcmV0dXJuIGdldFVzZXIoY29udGV4dCwgc2Vzc2lvbklkKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyKSA9PiB7XG4gICAgICAvLyBVc2VyXG4gICAgICBjb25zdCB7c3RyaXBlQWNjb3VudElkfTogVXNlciA9IHVzZXI7XG5cbiAgICAgIC8vIENhcmRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWNjb3VudE51bWJlcixcbiAgICAgICAgY2l0eSxcbiAgICAgICAgY291bnRyeSxcbiAgICAgICAgY3ZjLFxuICAgICAgICBleHBNb250aCxcbiAgICAgICAgZXhwWWVhcixcbiAgICAgICAgZnVsbE5hbWUsXG4gICAgICAgIHN0cmVldDEsXG4gICAgICAgIHN0cmVldDIsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICB6aXBcbiAgICAgIH06IFBheW1lbnRDYXJkVHlwZSA9IGNhcmQ7XG5cbiAgICAgIGNvbnN0IGZvcm1hdE51bWJlcjogbnVtYmVyID0gcGFyc2VOdW0oYWNjb3VudE51bWJlciwgMTYpO1xuXG4gICAgICBpZighZm9ybWF0TnVtYmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX251bWJlcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRFeHBNb250aDogbnVtYmVyID0gcGFyc2VOdW0oZXhwTW9udGgsIDIpO1xuXG4gICAgICBpZighZm9ybWF0RXhwTW9udGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfZXhwX21vbnRoJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdEV4cFllYXI6IG51bWJlciA9IHBhcnNlTnVtKGV4cFllYXIsIDIpO1xuXG4gICAgICBpZighZm9ybWF0RXhwWWVhcikge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9leHBfeWVhcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRDdmM6IG51bWJlciA9IHBhcnNlTnVtKGN2YywgMyk7XG5cbiAgICAgIC8vIEFkZHJlc3NcbiAgICAgIGNvbnN0IHBheW1lbnRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSB7fTtcbiAgICAgIGNvbnN0IGZvcm1hdENpdHk6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihjaXR5LCAzMik7XG5cbiAgICAgIGlmKGZvcm1hdENpdHkpIHtcbiAgICAgICAgcGF5bWVudENhcmQuY2l0eSA9IGZvcm1hdENpdHk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdENvdW50cnk6IHN0cmluZyA9IHBhcnNlQ2hhcihjb3VudHJ5LCAyKTtcblxuICAgICAgaWYoZm9ybWF0Q291bnRyeSkge1xuICAgICAgICBwYXltZW50Q2FyZC5jb3VudHJ5ID0gZm9ybWF0Q291bnRyeTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0RnVsbE5hbWU6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihmdWxsTmFtZSwgMzIpO1xuXG4gICAgICBpZihmb3JtYXRGdWxsTmFtZSkge1xuICAgICAgICBwYXltZW50Q2FyZC5mdWxsTmFtZSA9IGZvcm1hdEZ1bGxOYW1lO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRTdHJlZXQxOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoc3RyZWV0MSwgMzIpO1xuXG4gICAgICBpZihmb3JtYXRTdHJlZXQxKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnN0cmVldDEgPSBmb3JtYXRTdHJlZXQxO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRTdHJlZXQyOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoc3RyZWV0MiwgMzIpO1xuXG4gICAgICBpZihmb3JtYXRTdHJlZXQyKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnN0cmVldDIgPSBmb3JtYXRTdHJlZXQyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRTdGF0ZTogc3RyaW5nID0gcGFyc2VDaGFyKHN0YXRlLCAyKTtcblxuICAgICAgaWYoZm9ybWF0U3RhdGUpIHtcbiAgICAgICAgcGF5bWVudENhcmQuc3RhdGUgPSBmb3JtYXRTdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0WmlwOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoemlwLCAxMCk7XG5cbiAgICAgIGlmKGZvcm1hdFppcCkge1xuICAgICAgICBwYXltZW50Q2FyZC56aXAgPSBmb3JtYXRaaXA7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0cmlwZVxuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcbiAgICAgIGNvbnN0IHNvdXJjZTogYW55ID0ge1xuICAgICAgICBhZGRyZXNzX2NpdHk6IGZvcm1hdENpdHksXG4gICAgICAgIGFkZHJlc3NfY291bnRyeTogZm9ybWF0Q291bnRyeSxcbiAgICAgICAgYWRkcmVzc19saW5lMTogZm9ybWF0U3RyZWV0MSxcbiAgICAgICAgYWRkcmVzc19saW5lMjogZm9ybWF0U3RyZWV0MixcbiAgICAgICAgYWRkcmVzc19zdGF0ZTogZm9ybWF0U3RhdGUsXG4gICAgICAgIGFkZHJlc3NfemlwOiBmb3JtYXRaaXAsXG4gICAgICAgIGN2YzogZm9ybWF0Q3ZjLFxuICAgICAgICBleHBfbW9udGg6IGZvcm1hdEV4cE1vbnRoLFxuICAgICAgICBleHBfeWVhcjogZm9ybWF0RXhwWWVhcixcbiAgICAgICAgbmFtZTogZnVsbE5hbWUsXG4gICAgICAgIG51bWJlcjogZm9ybWF0TnVtYmVyLFxuICAgICAgICBvYmplY3Q6ICdjYXJkJ1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAgICAgLmNyZWF0ZVNvdXJjZShzdHJpcGVBY2NvdW50SWQsIHtzb3VyY2V9KVxuICAgICAgICAudGhlbigobmV3U291cmNlOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB7YnJhbmQsIGN2Y19jaGVjazogY3ZjQ2hlY2ssIGxhc3Q0fSA9IG5ld1NvdXJjZTtcblxuICAgICAgICAgIC8vIENyZWF0ZSBzZXNzaW9uXG4gICAgICAgICAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IGluc2VydCA9IHtcbiAgICAgICAgICAgIC4uLnBheW1lbnRDYXJkLFxuICAgICAgICAgICAgX2tleTogY3JlYXRlSGFzaChgdXNlci1wYXltZW50LSR7c2Vzc2lvbklkfWApLFxuICAgICAgICAgICAgYWNjb3VudE51bWJlcjogbGFzdDQsXG4gICAgICAgICAgICBhZGRlZDogbm93LFxuICAgICAgICAgICAgYnJhbmQsXG4gICAgICAgICAgICBjdmNDaGVjayxcbiAgICAgICAgICAgIGV4cE1vbnRoLFxuICAgICAgICAgICAgZXhwWWVhcixcbiAgICAgICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgaW5zZXJ0QXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIGNyZWRpdENhcmRzIFJFVFVSTiBORVdgO1xuXG4gICAgICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGluc2VydEFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKG5ld0NhcmQ6IFBheW1lbnRDYXJkVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgIGlmKCFpc0VtcHR5KG5ld0NhcmQpKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGxpbmtlZCBlZGdlXG4gICAgICAgICAgICAgICAgY29uc3Qge19pZDogY2FyZElkLCBfa2V5OiBjYXJkS2V5fSA9IGNhcmQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaGFzUGF5bWVudCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYHBheW1lbnQtJHtjYXJkS2V5fWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2U6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgIF9mcm9tOiBgdXNlcnMvJHtzZXNzaW9uSWR9YCxcbiAgICAgICAgICAgICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgICAgICAgICAgIF90bzogY2FyZElkXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KS50aGVuKCgpID0+IGNhcmQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NhcmQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVDcmVkaXRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmQ6IFBheW1lbnRDYXJkVHlwZSk6IFByb21pc2U8UGF5bWVudENhcmRUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHtcbiAgICBjaXR5LFxuICAgIGNvdW50cnksXG4gICAgZXhwTW9udGgsXG4gICAgZXhwWWVhcixcbiAgICBmdWxsTmFtZSxcbiAgICBpZCxcbiAgICBzdHJlZXQxLFxuICAgIHN0YXRlLFxuICAgIHppcFxuICB9OiBQYXltZW50Q2FyZFR5cGUgPSBjYXJkO1xuXG4gIGNvbnN0IGZvcm1hdElkOiBzdHJpbmcgPSBwYXJzZUlkKGlkKTtcblxuICBpZihmb3JtYXRJZCkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX2lkJyk7XG4gIH1cblxuICBjb25zdCBwYXltZW50Q2FyZDogUGF5bWVudENhcmRUeXBlID0ge307XG4gIGNvbnN0IGZvcm1hdEV4cE1vbnRoOiBudW1iZXIgPSBwYXJzZU51bShleHBNb250aCwgMik7XG4gIGNvbnN0IGZvcm1hdEV4cFllYXI6IG51bWJlciA9IHBhcnNlTnVtKGV4cFllYXIsIDIpO1xuICBjb25zdCBmb3JtYXRDaXR5OiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoY2l0eSwgMzIpO1xuICBjb25zdCBmb3JtYXRDb3VudHJ5OiBzdHJpbmcgPSBwYXJzZUNoYXIoY291bnRyeSwgMik7XG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoZnVsbE5hbWUsIDMyKTtcbiAgY29uc3QgZm9ybWF0U3RyZWV0MTogc3RyaW5nID0gcGFyc2VTdHJpbmcoc3RyZWV0MSwgMzIpO1xuICBjb25zdCBmb3JtYXRTdGF0ZTogc3RyaW5nID0gcGFyc2VDaGFyKHN0YXRlLCAyKTtcbiAgY29uc3QgZm9ybWF0WmlwOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoemlwLCAxMCk7XG5cbiAgaWYoZm9ybWF0RXhwTW9udGgpIHtcbiAgICBwYXltZW50Q2FyZC5leHBNb250aCA9IGZvcm1hdEV4cE1vbnRoO1xuICB9XG5cbiAgaWYoZm9ybWF0RXhwWWVhcikge1xuICAgIHBheW1lbnRDYXJkLmV4cFllYXIgPSBmb3JtYXRFeHBZZWFyO1xuICB9XG5cbiAgaWYoZm9ybWF0Q2l0eSkge1xuICAgIHBheW1lbnRDYXJkLmNpdHkgPSBmb3JtYXRDaXR5O1xuICB9XG5cbiAgaWYoZm9ybWF0Q291bnRyeSkge1xuICAgIHBheW1lbnRDYXJkLmNvdW50cnkgPSBmb3JtYXRDb3VudHJ5O1xuICB9XG5cbiAgaWYoZm9ybWF0RnVsbE5hbWUpIHtcbiAgICBwYXltZW50Q2FyZC5mdWxsTmFtZSA9IGZvcm1hdEZ1bGxOYW1lO1xuICB9XG5cbiAgaWYoZm9ybWF0U3RyZWV0MSkge1xuICAgIHBheW1lbnRDYXJkLnN0cmVldDEgPSBmb3JtYXRTdHJlZXQxO1xuICB9XG5cbiAgaWYoZm9ybWF0U3RhdGUpIHtcbiAgICBwYXltZW50Q2FyZC5zdGF0ZSA9IGZvcm1hdFN0YXRlO1xuICB9XG5cbiAgaWYoZm9ybWF0WmlwKSB7XG4gICAgcGF5bWVudENhcmQuemlwID0gZm9ybWF0WmlwO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlOiBhbnkgPSBwYXltZW50Q2FyZDtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICAgIExFVCB1cGRhdGVkQ2FyZCA9IEZJUlNUKFxuICAgICAgICBGT1IgYyBJTiBjcmVkaXRDYXJkc1xuICAgICAgICBGSUxURVIgYy5fa2V5ID09ICR7Zm9ybWF0SWR9ICYmIGMudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgICAgICBVUERBVEUgYyBXSVRIICR7dXBkYXRlfSBJTiBjcmVkaXRDYXJkc1xuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFJFVFVSTiBORVdcbiAgICAgIClcbiAgICAgIExFVCB1c2VyID0gRklSU1QoXG4gICAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVcbiAgICAgIClcbiAgICAgIFJFVFVSTiB7dXNlcjogdXNlciwgY2FyZDogdXBkYXRlZENhcmR9YDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChyZXN1bHRzID0ge2NhcmQ6IHt9LCB1c2VyOiB7fX0pID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSByZXN1bHRzLmNhcmQ7XG4gICAgICBjb25zdCB7dXNlcn0gPSByZXN1bHRzO1xuXG4gICAgICBpZihpc0VtcHR5KHVwZGF0ZWRDYXJkKSkge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdub3RfZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge3N0cmlwZUN1c3RvbWVySWR9ID0gdXNlcjtcbiAgICAgIGNvbnN0IHtzdHJpcGVJZH0gPSBjYXJkO1xuXG4gICAgICAvLyBTdHJpcGVcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG4gICAgICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICAgICAgYWRkcmVzc19jaXR5OiBmb3JtYXRDaXR5LFxuICAgICAgICBhZGRyZXNzX2NvdW50cnk6IGZvcm1hdENvdW50cnksXG4gICAgICAgIGFkZHJlc3NfbGluZTE6IGZvcm1hdFN0cmVldDEsXG4gICAgICAgIGFkZHJlc3Nfc3RhdGU6IGZvcm1hdFN0YXRlLFxuICAgICAgICBhZGRyZXNzX3ppcDogZm9ybWF0WmlwLFxuICAgICAgICBleHBfbW9udGg6IGZvcm1hdEV4cE1vbnRoLFxuICAgICAgICBleHBfeWVhcjogZm9ybWF0RXhwWWVhcixcbiAgICAgICAgbmFtZTogZm9ybWF0RnVsbE5hbWVcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgICAgIC51cGRhdGVTb3VyY2Uoc3RyaXBlQ3VzdG9tZXJJZCwgc3RyaXBlSWQsIHVwZGF0ZSlcbiAgICAgICAgLnRoZW4oKCkgPT4gY2FyZClcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygncGF5bWVudHM6OnVwZGF0ZUNhcmQ6OmVycm9yJywgZXJyb3IpO1xuICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JlZGl0Q2FyZHMgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8UGF5bWVudENhcmRUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0Q3JlZGl0Q2FyZHMnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgYyBJTiBjcmVkaXRDYXJkc1xuICAgIEZJTFRFUiBjLnVzZXJJZCA9PSAke3Nlc3Npb25JZH1cbiAgICBSRVRVUk4gY2A7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKChsaXN0OiBQYXltZW50Q2FyZFR5cGVbXSA9IFtdKSA9PiBsaXN0KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUNyZWRpdENhcmQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgY2FyZElkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdENhcmRJZDogc3RyaW5nID0gcGFyc2VJZChjYXJkSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIExFVCBjYXJkID0gRklSU1QoXG4gICAgICBGT1IgYyBJTiBjcmVkaXRDYXJkc1xuICAgICAgRklMVEVSIGMuX2tleSA9PSAke2Zvcm1hdENhcmRJZH0gJiYgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgYyBJTiBjcmVkaXRDYXJkc1xuICAgICAgUkVUVVJOIE9MRFxuICAgIClcbiAgICBMRVQgdXNlciA9IEZJUlNUKFxuICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4gdVxuICAgIClcbiAgICBSRVRVUk4ge3VzZXI6IHVzZXIsIGNhcmQ6IGNhcmR9YDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChyZXN1bHQgPSB7Y2FyZDoge30sIHVzZXI6IHt9fSkgPT4ge1xuICAgICAgaWYoaXNFbXB0eShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge2NhcmQsIHVzZXJ9ID0gcmVzdWx0O1xuICAgICAgY29uc3Qge19rZXk6IGNhcmRLZXl9ID0gY2FyZDtcblxuICAgICAgLy8gUmVtb3ZlIGxpbmtlZCBlZGdlc1xuICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSBkYXRhYmFzZS5jb2xsZWN0aW9uKCdoYXNQYXltZW50Jyk7XG5cbiAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvbi5vdXRFZGdlcyhjYXJkS2V5LCB7fSlcbiAgICAgICAgLnRoZW4oKGVkZ2VzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZihlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgZWRnZXMubWFwKChlZGdlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge19rZXk6IGVkZ2VLZXl9ID0gZWRnZTtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFJFTU9WRSB7X2tleToke2VkZ2VLZXl9fSBJTiBoYXNQYXltZW50YDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkocmVtb3ZlQXFsUXJ5KTtcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTdHJpcGVcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAgICAgICAgICAgICAgIC5kZWxldGVTb3VyY2UodXNlci5zdHJpcGVDdXN0b21lcklkLCBjYXJkLnN0cmlwZUlkKVxuICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXltZW50czo6ZGVsZXRlQ2FyZDo6ZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUJhbmtBY2NvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGJhbmtJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIC8vIENsZWFuIGRiXG4gIGNvbnN0IHVwZGF0ZTogVXNlciA9IHtcbiAgICBiYW5rQWNjb3VudDogJycsXG4gICAgYmFua0Z1bGxOYW1lOiAnJyxcbiAgICBiYW5rSWQ6ICcnLFxuICAgIGJhbmtSb3V0aW5nOiAnJyxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKVxuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9ID0gdXNlcjtcblxuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAuZGVsZXRlU291cmNlKHN0cmlwZUFjY291bnRJZCwgYmFua0lkKVxuICAgICAgICAudGhlbigocmVzcG9uc2U6IGFueSA9IHtkZWxldGVkOiBmYWxzZX0pID0+IHJlc3BvbnNlLmRlbGV0ZWQpXG4gICAgICAgIC5jYXRjaCgoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXltZW50VHJhbnNmZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdHJhbnNmZXI6IFBheW1lbnRUcmFuc2Zlcik6IFByb21pc2U8UGF5bWVudFRyYW5zZmVyPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7YW1vdW50LCBjdXJyZW5jeX0gPSB0cmFuc2ZlcjtcbiAgY29uc3QgZm9ybWF0QW1vdW50OiBudW1iZXIgPSBwYXJzZU51bShhbW91bnQpO1xuICBjb25zdCBmb3JtYXRDdXJyZW5jeTogc3RyaW5nID0gcGFyc2VDaGFyKGN1cnJlbmN5LCAzLCAnVVNEJykudG9VcHBlckNhc2UoKTtcblxuICByZXR1cm4gZ2V0VXNlcihjb250ZXh0LCBzZXNzaW9uSWQpXG4gICAgLnRoZW4oKHVzZXI6IFVzZXIpID0+IHtcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9ID0gdXNlcjtcblxuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LnRyYW5zZmVyc1xuICAgICAgICAuY3JlYXRlKHtcbiAgICAgICAgICBhbW91bnQ6IGZvcm1hdEFtb3VudCxcbiAgICAgICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICAgICAgZGVzdGluYXRpb246IHN0cmlwZUFjY291bnRJZFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoc3RyaXBlVHJhbnNmZXIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhzdHJpcGVUcmFuc2Zlcik7XG4gICAgICAgICAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IGluc2VydDogUGF5bWVudFRyYW5zZmVyID0ge1xuICAgICAgICAgICAgYWRkZWQ6IG5vdyxcbiAgICAgICAgICAgIGFtb3VudDogZm9ybWF0QW1vdW50LFxuICAgICAgICAgICAgY3VycmVuY3k6IGZvcm1hdEN1cnJlbmN5LFxuICAgICAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gdHJhbnNmZXJzIFJFVFVSTiBORVdgO1xuXG4gICAgICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKG5ld1RyYW5zZmVyOiBQYXltZW50VHJhbnNmZXIpID0+IG5ld1RyYW5zZmVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUGF5bWVudEhvbGQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcGF5bWVudDogUGF5bWVudENoYXJnZSk6IFByb21pc2U8UGF5bWVudENoYXJnZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2Ftb3VudCwgY2FwdHVyZSwgY2FyZElkLCBjdXJyZW5jeSwgZGVzY3JpcHRpb259ID0gcGF5bWVudDtcbiAgY29uc3QgZm9ybWF0Q3VycmVuY3kgPSBwYXJzZUNoYXIoY3VycmVuY3ksIDMsICdVU0QnKS50b1VwcGVyQ2FzZSgpO1xuXG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG5cbiAgcmV0dXJuIHN0cmlwZUNsaWVudC5jaGFyZ2VzXG4gICAgLmNyZWF0ZSh7XG4gICAgICBhbW91bnQsXG4gICAgICBjYXB0dXJlLFxuICAgICAgY3VycmVuY3k6IGZvcm1hdEN1cnJlbmN5LFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBzb3VyY2U6IGNhcmRJZFxuICAgIH0pXG4gICAgLnRoZW4oKHN0cmlwZUNoYXJnZSkgPT4ge1xuICAgICAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgaW5zZXJ0OiBQYXltZW50Q2hhcmdlID0ge1xuICAgICAgICBhZGRlZDogbm93LFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIGNhcHR1cmUsXG4gICAgICAgIGNhcmRJZCxcbiAgICAgICAgY2hhcmdlRmFpbENvZGU6IHN0cmlwZUNoYXJnZS5mYWlsdXJlX2NvZGUsXG4gICAgICAgIGNoYXJnZUZhaWxNc2c6IHN0cmlwZUNoYXJnZS5mYWlsdXJlX21lc3NhZ2UsXG4gICAgICAgIGNoYXJnZUlkOiBzdHJpcGVDaGFyZ2UuaWQsXG4gICAgICAgIGNoYXJnZVN0YXR1czogc3RyaXBlQ2hhcmdlLnN0YXR1cyxcbiAgICAgICAgY3VycmVuY3k6IGZvcm1hdEN1cnJlbmN5LFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH07XG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcGF5bWVudHMgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigobmV3UGF5bWVudDogUGF5bWVudENoYXJnZSkgPT4gbmV3UGF5bWVudCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3BheW1lbnRzOjpjcmVhdGVIb2xkOjplcnJvcicsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgICB9KTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBLG1CQUFrRjtBQUNsRixzQkFBa0I7QUFJbEIscUJBQW9CO0FBQ3BCLG9CQUFtQjtBQUVuQixvQkFBcUI7QUFFckIsdUJBQWtDO0FBQ2xDLG1CQUFzQjtBQUV0QixNQUFNLGdCQUF3QjtBQUM5QixNQUFNLGFBQWtCO0FBRWpCLE1BQU0scUJBQXFCLENBQUMsWUFBMEM7QUFDM0UsUUFBTSxTQUFpQjtBQUN2QixRQUFNLEVBQUMsVUFBVSxTQUFTLEVBQUMsUUFBUSxXQUFXLFNBQVEsRUFBQyxJQUFJO0FBRzNELFFBQU0sZUFBZSxJQUFJLGNBQUFBLFFBQU8scUJBQU8sSUFBSSxjQUFjLEdBQUcsRUFBQyxZQUFZLFlBQVksS0FBSSxDQUFDO0FBRTFGLFNBQU8sYUFBYSxVQUNqQixPQUFPO0FBQUEsSUFDTixV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
481
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcGF5bWVudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtBcnJheUN1cnNvcn0gZnJvbSAnYXJhbmdvanMvY3Vyc29yJztcbmltcG9ydCBTdHJpcGUgZnJvbSAnc3RyaXBlJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge0FwaUNvbnRleHQsIFBheW1lbnRCYW5rQWNjb3VudCwgUGF5bWVudENhcmRUeXBlLCBQYXltZW50Q2hhcmdlLCBQYXltZW50VHJhbnNmZXIsIFVzZXJ9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7bG9nRXJyb3IsIFVzZXJFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzJztcbmltcG9ydCB7Z2V0VXNlcn0gZnJvbSAnLi91c2Vycyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICdwYXltZW50cyc7XG5jb25zdCBhcGlWZXJzaW9uOiBhbnkgPSAnMjAyMC0wMy0wMic7XG5cbmV4cG9ydCBjb25zdCBhZGRDdXN0b21lckFjY291bnQgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRDdXN0b21lckFjY291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9fSA9IGNvbnRleHQ7XG5cbiAgLy8gU3RyaXBlXG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG5cbiAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAuY3JlYXRlKHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkLFxuICAgICAgICB1c2VybmFtZVxuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4oKGN1c3RvbWVyKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgc2Vzc2lvblxuICAgICAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdXBkYXRlOiBVc2VyID0ge1xuICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICBzdHJpcGVDdXN0b21lcklkOiBjdXN0b21lci5pZFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigodXBkYXRlZFVzZXI6IFVzZXIgPSB7fSkgPT4gISF1cGRhdGVkVXNlcilcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEJhbmtBY2NvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGJhbmtBY2NvdW50OiBQYXltZW50QmFua0FjY291bnQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkUGF5bWVudEFjY291bnRCYW5rJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgLy8gUGFyYW1zXG4gIGNvbnN0IHtcbiAgICBhY2NvdW50TnVtYmVyLFxuICAgIGZ1bGxOYW1lLFxuICAgIHJvdXRpbmdcbiAgfSA9IGJhbmtBY2NvdW50O1xuXG4gIGNvbnN0IGZvcm1hdEFjY291bnQ6IHN0cmluZyA9IHBhcnNlU3RyaW5nKGFjY291bnROdW1iZXIsIDMyKTtcblxuICBpZihmb3JtYXRBY2NvdW50ID09PSAnJykge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2FjY291bnRfbnVtYmVyJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRGdWxsTmFtZTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKGZ1bGxOYW1lLCAxMjgpO1xuXG4gIGlmKGZvcm1hdEZ1bGxOYW1lID09PSAnJykge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2Z1bGxfbmFtZScpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0Um91dGluZzogc3RyaW5nID0gcGFyc2VTdHJpbmcocm91dGluZywgMzIpO1xuXG4gIGlmKGZvcm1hdFJvdXRpbmcgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfcm91dGluZ19udW1iZXInKTtcbiAgfVxuXG4gIHJldHVybiBnZXRVc2VyKGNvbnRleHQsIHNlc3Npb25JZClcbiAgICAudGhlbigodXNlcjogVXNlcikgPT4ge1xuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH06IFVzZXIgPSB1c2VyO1xuXG4gICAgICAvLyBTdHJpcGVcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG4gICAgICBjb25zdCBzb3VyY2U6IGFueSA9IHtcbiAgICAgICAgYWNjb3VudF9ob2xkZXJfbmFtZTogZm9ybWF0RnVsbE5hbWUsXG4gICAgICAgIGFjY291bnRfaG9sZGVyX3R5cGU6ICdpbmRpdmlkdWFsJyxcbiAgICAgICAgYWNjb3VudF9udW1iZXI6IGZvcm1hdEFjY291bnQsXG4gICAgICAgIGNvdW50cnk6ICdVUycsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgb2JqZWN0OiAnYmFua19hY2NvdW50JyxcbiAgICAgICAgcm91dGluZ19udW1iZXI6IGZvcm1hdFJvdXRpbmdcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgICAgIC5jcmVhdGVTb3VyY2Uoc3RyaXBlQWNjb3VudElkLCB7c291cmNlfSlcbiAgICAgICAgLnRoZW4oKGFjY291bnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHtpZDogYmFua0lkLCBsYXN0NDogYmFua0FjY291bnQsIHJvdXRpbmdfbnVtYmVyOiBiYW5rUm91dGluZ30gPSBhY2NvdW50O1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZTogYW55ID0ge1xuICAgICAgICAgICAgYmFua0FjY291bnQsXG4gICAgICAgICAgICBiYW5rRnVsbE5hbWU6IGZvcm1hdEZ1bGxOYW1lLFxuICAgICAgICAgICAgYmFua0lkLFxuICAgICAgICAgICAgYmFua1JvdXRpbmcsXG4gICAgICAgICAgICBtb2RpZmllZDogRGF0ZS5ub3coKVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICAgICAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgICAgIC50aGVuKCh1cGRhdGVkVXNlcjogVXNlciA9IHt9KSA9PiB1cGRhdGVkVXNlcik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc3QgbXNnID0gZXJyb3IubWVzc2FnZTtcblxuICAgICAgICAgIGlmKG1zZyA9PT0gJ0EgYmFuayBhY2NvdW50IHdpdGggdGhhdCByb3V0aW5nIG51bWJlciBhbmQgYWNjb3VudCBudW1iZXIgJyArXG4gICAgICAgICAgICAnYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgY3VzdG9tZXIuJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdiYW5rX2FjY291bnRfZXhpc3RzJ1xuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiAncGF5bWVudF9lcnJvcidcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkQ3JlZGl0Q2FyZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkOiBQYXltZW50Q2FyZFR5cGUpOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkQ3JlZGl0Q2FyZCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIHJldHVybiBnZXRVc2VyKGNvbnRleHQsIHNlc3Npb25JZClcbiAgICAudGhlbigodXNlcjogVXNlcikgPT4ge1xuICAgICAgLy8gVXNlclxuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH06IFVzZXIgPSB1c2VyO1xuXG4gICAgICAvLyBDYXJkXG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjY291bnROdW1iZXIsXG4gICAgICAgIGNpdHksXG4gICAgICAgIGNvdW50cnksXG4gICAgICAgIGN2YyxcbiAgICAgICAgZXhwTW9udGgsXG4gICAgICAgIGV4cFllYXIsXG4gICAgICAgIGZ1bGxOYW1lLFxuICAgICAgICBzdHJlZXQxLFxuICAgICAgICBzdHJlZXQyLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgemlwXG4gICAgICB9OiBQYXltZW50Q2FyZFR5cGUgPSBjYXJkO1xuXG4gICAgICBjb25zdCBmb3JtYXROdW1iZXI6IG51bWJlciA9IHBhcnNlTnVtKGFjY291bnROdW1iZXIsIDE2KTtcblxuICAgICAgaWYoIWZvcm1hdE51bWJlcikge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9udW1iZXInKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0RXhwTW9udGg6IG51bWJlciA9IHBhcnNlTnVtKGV4cE1vbnRoLCAyKTtcblxuICAgICAgaWYoIWZvcm1hdEV4cE1vbnRoKSB7XG4gICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX2V4cF9tb250aCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRFeHBZZWFyOiBudW1iZXIgPSBwYXJzZU51bShleHBZZWFyLCAyKTtcblxuICAgICAgaWYoIWZvcm1hdEV4cFllYXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfZXhwX3llYXInKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0Q3ZjOiBudW1iZXIgPSBwYXJzZU51bShjdmMsIDMpO1xuXG4gICAgICAvLyBBZGRyZXNzXG4gICAgICBjb25zdCBwYXltZW50Q2FyZDogUGF5bWVudENhcmRUeXBlID0ge307XG4gICAgICBjb25zdCBmb3JtYXRDaXR5OiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoY2l0eSwgMzIpO1xuXG4gICAgICBpZihmb3JtYXRDaXR5KSB7XG4gICAgICAgIHBheW1lbnRDYXJkLmNpdHkgPSBmb3JtYXRDaXR5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRDb3VudHJ5OiBzdHJpbmcgPSBwYXJzZUNoYXIoY291bnRyeSwgMik7XG5cbiAgICAgIGlmKGZvcm1hdENvdW50cnkpIHtcbiAgICAgICAgcGF5bWVudENhcmQuY291bnRyeSA9IGZvcm1hdENvdW50cnk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdEZ1bGxOYW1lOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoZnVsbE5hbWUsIDMyKTtcblxuICAgICAgaWYoZm9ybWF0RnVsbE5hbWUpIHtcbiAgICAgICAgcGF5bWVudENhcmQuZnVsbE5hbWUgPSBmb3JtYXRGdWxsTmFtZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0U3RyZWV0MTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKHN0cmVldDEsIDMyKTtcblxuICAgICAgaWYoZm9ybWF0U3RyZWV0MSkge1xuICAgICAgICBwYXltZW50Q2FyZC5zdHJlZXQxID0gZm9ybWF0U3RyZWV0MTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0U3RyZWV0Mjogc3RyaW5nID0gcGFyc2VWYXJDaGFyKHN0cmVldDIsIDMyKTtcblxuICAgICAgaWYoZm9ybWF0U3RyZWV0Mikge1xuICAgICAgICBwYXltZW50Q2FyZC5zdHJlZXQyID0gZm9ybWF0U3RyZWV0MjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0U3RhdGU6IHN0cmluZyA9IHBhcnNlQ2hhcihzdGF0ZSwgMik7XG5cbiAgICAgIGlmKGZvcm1hdFN0YXRlKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnN0YXRlID0gZm9ybWF0U3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFppcDogc3RyaW5nID0gcGFyc2VWYXJDaGFyKHppcCwgMTApO1xuXG4gICAgICBpZihmb3JtYXRaaXApIHtcbiAgICAgICAgcGF5bWVudENhcmQuemlwID0gZm9ybWF0WmlwO1xuICAgICAgfVxuXG4gICAgICAvLyBTdHJpcGVcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG4gICAgICBjb25zdCBzb3VyY2U6IGFueSA9IHtcbiAgICAgICAgYWRkcmVzc19jaXR5OiBmb3JtYXRDaXR5LFxuICAgICAgICBhZGRyZXNzX2NvdW50cnk6IGZvcm1hdENvdW50cnksXG4gICAgICAgIGFkZHJlc3NfbGluZTE6IGZvcm1hdFN0cmVldDEsXG4gICAgICAgIGFkZHJlc3NfbGluZTI6IGZvcm1hdFN0cmVldDIsXG4gICAgICAgIGFkZHJlc3Nfc3RhdGU6IGZvcm1hdFN0YXRlLFxuICAgICAgICBhZGRyZXNzX3ppcDogZm9ybWF0WmlwLFxuICAgICAgICBjdmM6IGZvcm1hdEN2YyxcbiAgICAgICAgZXhwX21vbnRoOiBmb3JtYXRFeHBNb250aCxcbiAgICAgICAgZXhwX3llYXI6IGZvcm1hdEV4cFllYXIsXG4gICAgICAgIG5hbWU6IGZ1bGxOYW1lLFxuICAgICAgICBudW1iZXI6IGZvcm1hdE51bWJlcixcbiAgICAgICAgb2JqZWN0OiAnY2FyZCdcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgICAgIC5jcmVhdGVTb3VyY2Uoc3RyaXBlQWNjb3VudElkLCB7c291cmNlfSlcbiAgICAgICAgLnRoZW4oKG5ld1NvdXJjZTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3Qge2JyYW5kLCBjdmNfY2hlY2s6IGN2Y0NoZWNrLCBsYXN0NH0gPSBuZXdTb3VyY2U7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgc2Vzc2lvblxuICAgICAgICAgIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBpbnNlcnQgPSB7XG4gICAgICAgICAgICAuLi5wYXltZW50Q2FyZCxcbiAgICAgICAgICAgIF9rZXk6IGNyZWF0ZUhhc2goYHVzZXItcGF5bWVudC0ke3Nlc3Npb25JZH1gKSxcbiAgICAgICAgICAgIGFjY291bnROdW1iZXI6IGxhc3Q0LFxuICAgICAgICAgICAgYWRkZWQ6IG5vdyxcbiAgICAgICAgICAgIGJyYW5kLFxuICAgICAgICAgICAgY3ZjQ2hlY2ssXG4gICAgICAgICAgICBleHBNb250aCxcbiAgICAgICAgICAgIGV4cFllYXIsXG4gICAgICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGluc2VydEFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBjcmVkaXRDYXJkcyBSRVRVUk4gTkVXYDtcblxuICAgICAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShpbnNlcnRBcWxRcnkpXG4gICAgICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgICAgIC50aGVuKChuZXdDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSB7fSkgPT4ge1xuICAgICAgICAgICAgICBpZihuZXdDYXJkKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGxpbmtlZCBlZGdlXG4gICAgICAgICAgICAgICAgY29uc3Qge19pZDogY2FyZElkLCBfa2V5OiBjYXJkS2V5fSA9IGNhcmQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaGFzUGF5bWVudCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYHBheW1lbnQtJHtjYXJkS2V5fWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2U6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgIF9mcm9tOiBgdXNlcnMvJHtzZXNzaW9uSWR9YCxcbiAgICAgICAgICAgICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgICAgICAgICAgIF90bzogY2FyZElkXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KS50aGVuKCgpID0+IGNhcmQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NhcmQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVDcmVkaXRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmQ6IFBheW1lbnRDYXJkVHlwZSk6IFByb21pc2U8UGF5bWVudENhcmRUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHtcbiAgICBjaXR5LFxuICAgIGNvdW50cnksXG4gICAgZXhwTW9udGgsXG4gICAgZXhwWWVhcixcbiAgICBmdWxsTmFtZSxcbiAgICBpZCxcbiAgICBzdHJlZXQxLFxuICAgIHN0YXRlLFxuICAgIHppcFxuICB9OiBQYXltZW50Q2FyZFR5cGUgPSBjYXJkO1xuXG4gIGNvbnN0IGZvcm1hdElkOiBzdHJpbmcgPSBwYXJzZUlkKGlkKTtcblxuICBpZihmb3JtYXRJZCkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX2lkJyk7XG4gIH1cblxuICBjb25zdCBwYXltZW50Q2FyZDogUGF5bWVudENhcmRUeXBlID0ge307XG4gIGNvbnN0IGZvcm1hdEV4cE1vbnRoOiBudW1iZXIgPSBwYXJzZU51bShleHBNb250aCwgMik7XG4gIGNvbnN0IGZvcm1hdEV4cFllYXI6IG51bWJlciA9IHBhcnNlTnVtKGV4cFllYXIsIDIpO1xuICBjb25zdCBmb3JtYXRDaXR5OiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoY2l0eSwgMzIpO1xuICBjb25zdCBmb3JtYXRDb3VudHJ5OiBzdHJpbmcgPSBwYXJzZUNoYXIoY291bnRyeSwgMik7XG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoZnVsbE5hbWUsIDMyKTtcbiAgY29uc3QgZm9ybWF0U3RyZWV0MTogc3RyaW5nID0gcGFyc2VTdHJpbmcoc3RyZWV0MSwgMzIpO1xuICBjb25zdCBmb3JtYXRTdGF0ZTogc3RyaW5nID0gcGFyc2VDaGFyKHN0YXRlLCAyKTtcbiAgY29uc3QgZm9ybWF0WmlwOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoemlwLCAxMCk7XG5cbiAgaWYoZm9ybWF0RXhwTW9udGgpIHtcbiAgICBwYXltZW50Q2FyZC5leHBNb250aCA9IGZvcm1hdEV4cE1vbnRoO1xuICB9XG5cbiAgaWYoZm9ybWF0RXhwWWVhcikge1xuICAgIHBheW1lbnRDYXJkLmV4cFllYXIgPSBmb3JtYXRFeHBZZWFyO1xuICB9XG5cbiAgaWYoZm9ybWF0Q2l0eSkge1xuICAgIHBheW1lbnRDYXJkLmNpdHkgPSBmb3JtYXRDaXR5O1xuICB9XG5cbiAgaWYoZm9ybWF0Q291bnRyeSkge1xuICAgIHBheW1lbnRDYXJkLmNvdW50cnkgPSBmb3JtYXRDb3VudHJ5O1xuICB9XG5cbiAgaWYoZm9ybWF0RnVsbE5hbWUpIHtcbiAgICBwYXltZW50Q2FyZC5mdWxsTmFtZSA9IGZvcm1hdEZ1bGxOYW1lO1xuICB9XG5cbiAgaWYoZm9ybWF0U3RyZWV0MSkge1xuICAgIHBheW1lbnRDYXJkLnN0cmVldDEgPSBmb3JtYXRTdHJlZXQxO1xuICB9XG5cbiAgaWYoZm9ybWF0U3RhdGUpIHtcbiAgICBwYXltZW50Q2FyZC5zdGF0ZSA9IGZvcm1hdFN0YXRlO1xuICB9XG5cbiAgaWYoZm9ybWF0WmlwKSB7XG4gICAgcGF5bWVudENhcmQuemlwID0gZm9ybWF0WmlwO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlOiBhbnkgPSBwYXltZW50Q2FyZDtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICAgIExFVCB1cGRhdGVkQ2FyZCA9IEZJUlNUKFxuICAgICAgICBGT1IgYyBJTiBjcmVkaXRDYXJkc1xuICAgICAgICBGSUxURVIgYy5fa2V5ID09ICR7Zm9ybWF0SWR9ICYmIGMudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgICAgICBVUERBVEUgYyBXSVRIICR7dXBkYXRlfSBJTiBjcmVkaXRDYXJkc1xuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFJFVFVSTiBORVdcbiAgICAgIClcbiAgICAgIExFVCB1c2VyID0gRklSU1QoXG4gICAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVcbiAgICAgIClcbiAgICAgIFJFVFVSTiB7dXNlcjogdXNlciwgY2FyZDogdXBkYXRlZENhcmR9YDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChyZXN1bHRzID0ge2NhcmQ6IHt9LCB1c2VyOiB7fX0pID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSByZXN1bHRzLmNhcmQ7XG4gICAgICBjb25zdCB7dXNlcn0gPSByZXN1bHRzO1xuXG4gICAgICBpZighdXBkYXRlZENhcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcignbm90X2ZvdW5kJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtzdHJpcGVDdXN0b21lcklkfSA9IHVzZXI7XG4gICAgICBjb25zdCB7c3RyaXBlSWR9ID0gY2FyZDtcblxuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuICAgICAgY29uc3QgdXBkYXRlOiBhbnkgPSB7XG4gICAgICAgIGFkZHJlc3NfY2l0eTogZm9ybWF0Q2l0eSxcbiAgICAgICAgYWRkcmVzc19jb3VudHJ5OiBmb3JtYXRDb3VudHJ5LFxuICAgICAgICBhZGRyZXNzX2xpbmUxOiBmb3JtYXRTdHJlZXQxLFxuICAgICAgICBhZGRyZXNzX3N0YXRlOiBmb3JtYXRTdGF0ZSxcbiAgICAgICAgYWRkcmVzc196aXA6IGZvcm1hdFppcCxcbiAgICAgICAgZXhwX21vbnRoOiBmb3JtYXRFeHBNb250aCxcbiAgICAgICAgZXhwX3llYXI6IGZvcm1hdEV4cFllYXIsXG4gICAgICAgIG5hbWU6IGZvcm1hdEZ1bGxOYW1lXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAudXBkYXRlU291cmNlKHN0cmlwZUN1c3RvbWVySWQsIHN0cmlwZUlkLCB1cGRhdGUpXG4gICAgICAgIC50aGVuKCgpID0+IGNhcmQpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3BheW1lbnRzOjp1cGRhdGVDYXJkOjplcnJvcicsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENyZWRpdENhcmRzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPFBheW1lbnRDYXJkVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldENyZWRpdENhcmRzJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICBGSUxURVIgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigobGlzdDogUGF5bWVudENhcmRUeXBlW10gPSBbXSkgPT4gbGlzdClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVDcmVkaXRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmRJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRDYXJkSWQ6IHN0cmluZyA9IHBhcnNlSWQoY2FyZElkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBMRVQgY2FyZCA9IEZJUlNUKFxuICAgICAgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtmb3JtYXRDYXJkSWR9ICYmIGMudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVNT1ZFIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgIFJFVFVSTiBPTERcbiAgICApXG4gICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVUVVJOIHVcbiAgICApXG4gICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiBjYXJkfWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocmVzdWx0ID0ge2NhcmQ6IHt9LCB1c2VyOiB7fX0pID0+IHtcbiAgICAgIGlmKCFyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7Y2FyZCwgdXNlcn0gPSByZXN1bHQ7XG4gICAgICBjb25zdCB7X2tleTogY2FyZEtleX0gPSBjYXJkO1xuXG4gICAgICAvLyBSZW1vdmUgbGlua2VkIGVkZ2VzXG4gICAgICBjb25zdCBlZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oJ2hhc1BheW1lbnQnKTtcblxuICAgICAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLm91dEVkZ2VzKGNhcmRLZXksIHt9KVxuICAgICAgICAudGhlbigoZWRnZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmKGVkZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBlZGdlcy5tYXAoKGVkZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7X2tleTogZWRnZUtleX0gPSBlZGdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUFxbFFyeTogQXFsUXVlcnkgPSBhcWxgUkVNT1ZFIHtfa2V5OiR7ZWRnZUtleX19IElOIGhhc1BheW1lbnRgO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShyZW1vdmVBcWxRcnkpO1xuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN0cmlwZVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAgICAgICAgICAgLmRlbGV0ZVNvdXJjZSh1c2VyLnN0cmlwZUN1c3RvbWVySWQsIGNhcmQuc3RyaXBlSWQpXG4gICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3BheW1lbnRzOjpkZWxldGVDYXJkOjplcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlQmFua0FjY291bnQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgYmFua0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2xlYW4gZGJcbiAgY29uc3QgdXBkYXRlOiBVc2VyID0ge1xuICAgIGJhbmtBY2NvdW50OiAnJyxcbiAgICBiYW5rRnVsbE5hbWU6ICcnLFxuICAgIGJhbmtJZDogJycsXG4gICAgYmFua1JvdXRpbmc6ICcnLFxuICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7c2Vzc2lvbklkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXI6IFVzZXIgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH0gPSB1c2VyO1xuXG4gICAgICAvLyBTdHJpcGVcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgICAgIC5kZWxldGVTb3VyY2Uoc3RyaXBlQWNjb3VudElkLCBiYW5rSWQpXG4gICAgICAgIC50aGVuKChyZXNwb25zZTogYW55ID0ge2RlbGV0ZWQ6IGZhbHNlfSkgPT4gcmVzcG9uc2UuZGVsZXRlZClcbiAgICAgICAgLmNhdGNoKCgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBheW1lbnRUcmFuc2ZlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0cmFuc2ZlcjogUGF5bWVudFRyYW5zZmVyKTogUHJvbWlzZTxQYXltZW50VHJhbnNmZXI+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHthbW91bnQsIGN1cnJlbmN5fSA9IHRyYW5zZmVyO1xuICBjb25zdCBmb3JtYXRBbW91bnQ6IG51bWJlciA9IHBhcnNlTnVtKGFtb3VudCk7XG4gIGNvbnN0IGZvcm1hdEN1cnJlbmN5OiBzdHJpbmcgPSBwYXJzZUNoYXIoY3VycmVuY3ksIDMsICdVU0QnKS50b1VwcGVyQ2FzZSgpO1xuXG4gIHJldHVybiBnZXRVc2VyKGNvbnRleHQsIHNlc3Npb25JZClcbiAgICAudGhlbigodXNlcjogVXNlcikgPT4ge1xuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH0gPSB1c2VyO1xuXG4gICAgICAvLyBTdHJpcGVcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQudHJhbnNmZXJzXG4gICAgICAgIC5jcmVhdGUoe1xuICAgICAgICAgIGFtb3VudDogZm9ybWF0QW1vdW50LFxuICAgICAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgICAgICBkZXN0aW5hdGlvbjogc3RyaXBlQWNjb3VudElkXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChzdHJpcGVUcmFuc2ZlcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHN0cmlwZVRyYW5zZmVyKTtcbiAgICAgICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0OiBQYXltZW50VHJhbnNmZXIgPSB7XG4gICAgICAgICAgICBhZGRlZDogbm93LFxuICAgICAgICAgICAgYW1vdW50OiBmb3JtYXRBbW91bnQsXG4gICAgICAgICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiB0cmFuc2ZlcnMgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgICAgICAudGhlbigobmV3VHJhbnNmZXI6IFBheW1lbnRUcmFuc2ZlcikgPT4gbmV3VHJhbnNmZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXltZW50SG9sZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwYXltZW50OiBQYXltZW50Q2hhcmdlKTogUHJvbWlzZTxQYXltZW50Q2hhcmdlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7YW1vdW50LCBjYXB0dXJlLCBjYXJkSWQsIGN1cnJlbmN5LCBkZXNjcmlwdGlvbn0gPSBwYXltZW50O1xuICBjb25zdCBmb3JtYXRDdXJyZW5jeSA9IHBhcnNlQ2hhcihjdXJyZW5jeSwgMywgJ1VTRCcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcblxuICByZXR1cm4gc3RyaXBlQ2xpZW50LmNoYXJnZXNcbiAgICAuY3JlYXRlKHtcbiAgICAgIGFtb3VudCxcbiAgICAgIGNhcHR1cmUsXG4gICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHNvdXJjZTogY2FyZElkXG4gICAgfSlcbiAgICAudGhlbigoc3RyaXBlQ2hhcmdlKSA9PiB7XG4gICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBpbnNlcnQ6IFBheW1lbnRDaGFyZ2UgPSB7XG4gICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgY2FwdHVyZSxcbiAgICAgICAgY2FyZElkLFxuICAgICAgICBjaGFyZ2VGYWlsQ29kZTogc3RyaXBlQ2hhcmdlLmZhaWx1cmVfY29kZSxcbiAgICAgICAgY2hhcmdlRmFpbE1zZzogc3RyaXBlQ2hhcmdlLmZhaWx1cmVfbWVzc2FnZSxcbiAgICAgICAgY2hhcmdlSWQ6IHN0cmlwZUNoYXJnZS5pZCxcbiAgICAgICAgY2hhcmdlU3RhdHVzOiBzdHJpcGVDaGFyZ2Uuc3RhdHVzLFxuICAgICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBwYXltZW50cyBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKChuZXdQYXltZW50OiBQYXltZW50Q2hhcmdlKSA9PiBuZXdQYXltZW50KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygncGF5bWVudHM6OmNyZWF0ZUhvbGQ6OmVycm9yJywgZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgIH0pO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUEsbUJBQWtGO0FBQ2xGLHNCQUFrQjtBQUlsQixvQkFBbUI7QUFFbkIsb0JBQXFCO0FBRXJCLHVCQUFrQztBQUNsQyxtQkFBc0I7QUFFdEIsTUFBTSxnQkFBd0I7QUFDOUIsTUFBTSxhQUFrQjtBQUVqQixNQUFNLHFCQUFxQixDQUFDLFlBQTBDO0FBQzNFLFFBQU0sU0FBaUI7QUFDdkIsUUFBTSxFQUFDLFVBQVUsU0FBUyxFQUFDLFFBQVEsV0FBVyxTQUFRLEVBQUMsSUFBSTtBQUczRCxRQUFNLGVBQWUsSUFBSSxjQUFBQSxRQUFPLHFCQUFPLElBQUksY0FBYyxHQUFHLEVBQUMsWUFBWSxZQUFZLEtBQUksQ0FBQztBQUUxRixTQUFPLGFBQWEsVUFDakIsT0FBTztBQUFBLElBQ04sVUFBVTtBQUFBLE1BQ1IsUUFBUTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDLEVBQ0EsS0FBSyxDQUFDLGFBQWE7QUFFbEIsVUFBTSxN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
@@ -24,6 +24,8 @@ __export(posts_exports, {
24
24
  getPost: () => getPost,
25
25
  getPostComments: () => getPostComments,
26
26
  getPostOptional: () => getPostOptional,
27
+ getPostsByArea: () => getPostsByArea,
28
+ getPostsByLatest: () => getPostsByLatest,
27
29
  getPostsByReactions: () => getPostsByReactions,
28
30
  getPostsByTags: () => getPostsByTags,
29
31
  getPostsByUser: () => getPostsByUser,
@@ -57,7 +59,7 @@ const getPostOptional = (fields, sessionId) => fields.reduce((selects, field) =>
57
59
  switch (field) {
58
60
  case "hasRsvp": {
59
61
  selects.queries.push(`LET hasRsvp = TO_BOOL(FIRST(
60
- FOR post, r IN INBOUND p._id hasReactions
62
+ FOR post, r IN INBOUND p._id hasReaction
61
63
  FILTER r.name == "rsvp" && r.type == "posts" && r._from == "users/${sessionId}"
62
64
  COLLECT WITH COUNT INTO count
63
65
  RETURN count
@@ -67,7 +69,7 @@ const getPostOptional = (fields, sessionId) => fields.reduce((selects, field) =>
67
69
  }
68
70
  case "isSaved": {
69
71
  selects.queries.push(`LET isSaved = TO_BOOL(FIRST(
70
- FOR post, r IN INBOUND p._id hasReactions
72
+ FOR post, r IN INBOUND p._id hasReaction
71
73
  FILTER r.name == "pin" && r.type == "posts" && r._from == "users/${sessionId}"
72
74
  COLLECT WITH COUNT INTO count
73
75
  RETURN count
@@ -77,7 +79,7 @@ const getPostOptional = (fields, sessionId) => fields.reduce((selects, field) =>
77
79
  }
78
80
  case "reactions": {
79
81
  selects.queries.push(`LET reactions = (
80
- FOR post, r IN INBOUND p._id hasReactions
82
+ FOR post, r IN INBOUND p._id hasReaction
81
83
  COLLECT reactionName = r.value INTO reactionItems
82
84
  RETURN {name: reactionName, count: LENGTH(reactionItems[*].r.value)}
83
85
  )`);
@@ -86,7 +88,7 @@ const getPostOptional = (fields, sessionId) => fields.reduce((selects, field) =>
86
88
  }
87
89
  case "rsvpCount": {
88
90
  selects.queries.push(`LET rsvpCount = FIRST(
89
- FOR post, r IN INBOUND p._id hasReactions
91
+ FOR post, r IN INBOUND p._id hasReaction
90
92
  FILTER r.name == "rsvp" && r.type == "posts"
91
93
  COLLECT WITH COUNT INTO count
92
94
  RETURN count
@@ -96,7 +98,7 @@ const getPostOptional = (fields, sessionId) => fields.reduce((selects, field) =>
96
98
  }
97
99
  case "viewCount": {
98
100
  selects.queries.push(`LET viewCount = FIRST(
99
- FOR post, r IN INBOUND p._id hasReactions
101
+ FOR post, r IN INBOUND p._id hasReaction
100
102
  FILTER r.name == "view" && r.type == "posts"
101
103
  COLLECT WITH COUNT INTO count
102
104
  RETURN count
@@ -156,6 +158,45 @@ const getPost = (context, itemId, options) => {
156
158
  label: "db_error"
157
159
  }, error, context).then(() => ({})));
158
160
  };
161
+ const getPostsByArea = (context, latitude, longitude, options) => {
162
+ const { database, fields, session: { userId: sessionId } } = context;
163
+ const { limit, type } = parsePostOptions(options);
164
+ const formatLatitude = (0, import_utils.parseNum)(latitude);
165
+ const formatLongitude = (0, import_utils.parseNum)(longitude);
166
+ const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
167
+ selectQueries.push(`LET distance = DISTANCE(
168
+ ${formatLatitude},
169
+ ${formatLongitude},
170
+ NOT_NULL(p.latitude, 0),
171
+ NOT_NULL(p.longitude, 0))
172
+ `);
173
+ selectObjects.push("distance:distance");
174
+ const aqlQry = `FOR p IN posts
175
+ ${selectQueries.join("\n")}
176
+ FILTER p.type == "${type}" && p.privacy == "public" && p.parentId == null
177
+ ${limit.aql}
178
+ SORT distance, p.added
179
+ RETURN DISTINCT MERGE(p, {${selectObjects.join(", ")}})`;
180
+ return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
181
+ throw error;
182
+ });
183
+ };
184
+ const getPostsByLatest = (context, options) => {
185
+ console.log("getPostsByLatest::options", options);
186
+ const { database, fields, session: { userId: sessionId } } = context;
187
+ const { limit, type } = parsePostOptions(options);
188
+ const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
189
+ const aqlQry = `FOR p IN posts
190
+ FILTER p.type == "${type}" && p.privacy == "public" && p.parent == null
191
+ ${selectQueries.join("\n")}
192
+ ${limit.aql}
193
+ SORT p.added DESC
194
+ RETURN DISTINCT MERGE(p, {${selectObjects.join(", ")}})`;
195
+ console.log("getPostsByLatest::aqlQry", aqlQry);
196
+ return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
197
+ throw error;
198
+ });
199
+ };
159
200
  const getPostsByReactions = (context, reactions = [], options) => {
160
201
  const action = "getPostsByReactions";
161
202
  const { database, fields, session: { userId: sessionId } } = context;
@@ -189,7 +230,7 @@ const getPostsByReactions = (context, reactions = [], options) => {
189
230
  }
190
231
  sortBy.push("p.added DESC");
191
232
  selectObjects.push("reactions:reactions");
192
- const aqlQry = `FOR p, r IN OUTBOUND "${formatSessionId}" hasReactions
233
+ const aqlQry = `FOR p, r IN OUTBOUND "${formatSessionId}" hasReaction
193
234
  LET reactions = (
194
235
  FOR reaction, hr IN 1..1 INBOUND p isTagged
195
236
  LET matched = LENGTH(${formatReactions}) > 0 && POSITION(${formatReactions}, reaction.name)
@@ -509,10 +550,12 @@ const createPostEdge = (db, file, postId) => {
509
550
  getPost,
510
551
  getPostComments,
511
552
  getPostOptional,
553
+ getPostsByArea,
554
+ getPostsByLatest,
512
555
  getPostsByReactions,
513
556
  getPostsByTags,
514
557
  getPostsByUser,
515
558
  parsePostOptions,
516
559
  updatePost
517
560
  });
518
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcG9zdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbCwgRGF0YWJhc2V9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5cbmltcG9ydCB7QXBpQ29udGV4dCwgRmlsZVR5cGUsIFBvc3RJbnB1dFR5cGUsIFBvc3RPcHRpb25zLCBQb3N0VHlwZSwgVGFnVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgbG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7dXBkYXRlRmlsZXN9IGZyb20gJy4vZmlsZXMnO1xuaW1wb3J0IHtleHRyYWN0VGFncywgbGlua1RhZ3N9IGZyb20gJy4vdGFncyc7XG5cbmNvbnN0IE1BWF9DT05URU5UX0xFTkdUSDogbnVtYmVyID0gMTAwMDAwO1xuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3Bvc3RzJztcblxuZXhwb3J0IGNvbnN0IHBhcnNlUG9zdE9wdGlvbnMgPSAob3B0aW9uczogUG9zdE9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgbGF0aXR1ZGUgPSAwLFxuICAgIGxvbmdpdHVkZSA9IDAsXG4gICAgdG8gPSAzMCxcbiAgICB0eXBlID0gJ3Bvc3QnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IHBhcnNlTnVtKGxhdGl0dWRlLCAzMiksXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSxcbiAgICBsb25naXR1ZGU6IHBhcnNlTnVtKGxvbmdpdHVkZSwgMzIpLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0T3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSwgc2Vzc2lvbklkOiBzdHJpbmcpID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHM6IGFueSwgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIHN3aXRjaChmaWVsZCkge1xuICAgICAgY2FzZSAnaGFzUnN2cCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCBoYXNSc3ZwID0gVE9fQk9PTChGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uc1xuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJyc3ZwXCIgJiYgci50eXBlID09IFwicG9zdHNcIiAmJiByLl9mcm9tID09IFwidXNlcnMvJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjb3VudFxuICAgICAgICAgIFJFVFVSTiBjb3VudFxuICAgICAgICApKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgnaGFzUnN2cDpoYXNSc3ZwJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAnaXNTYXZlZCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCBpc1NhdmVkID0gVE9fQk9PTChGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uc1xuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJwaW5cIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiICYmIHIuX2Zyb20gPT0gXCJ1c2Vycy8ke3Nlc3Npb25JZH1cIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgICkpYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdpc1NhdmVkOmlzU2F2ZWQnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25zXG4gICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICdyc3ZwQ291bnQnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcnN2cENvdW50ID0gRklSU1QoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvbnNcbiAgICAgICAgICBGSUxURVIgci5uYW1lID09IFwicnN2cFwiICYmIHIudHlwZSA9PSBcInBvc3RzXCJcbiAgICAgICAgICBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjb3VudFxuICAgICAgICAgIFJFVFVSTiBjb3VudFxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdyc3ZwQ291bnQ6cnN2cENvdW50Jyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAndmlld0NvdW50Jzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHZpZXdDb3VudCA9IEZJUlNUKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25zXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInZpZXdcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndmlld0NvdW50OnZpZXdDb3VudCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgfVxuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nLCBvcHRpb25zOiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UGFydGlhbDxQb3N0VHlwZT4+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuICBjb25zdCB7dHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBkYiA9IGRhdGFiYXNlO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgRklMVEVSIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH0gJiYgcC50eXBlID09ICR7dHlwZX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHBgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHBvc3Q6IFBvc3RUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgX2lkOiBwb3N0RG9jSWQsXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAnZGVmYXVsdCdcbiAgICAgIH06IFBvc3RUeXBlID0gcG9zdDtcblxuICAgICAgLy8gUXVlcnkgYmFzZWQgb24gcHJpdmFjeSBsZXZlbFxuICAgICAgbGV0IHByaXZhY3lBcWxRcnk6IHN0cmluZztcblxuICAgICAgaWYoZ3JvdXBJZCAmJiBwcml2YWN5ID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgTEVUIHAgPSBET0NVTUVOVChcIiR7cG9zdERvY0lkfVwiKVxuICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAgICAgICBGT1IgZ3JvdXAgSU4gZ3JvdXBzXG4gICAgICAgICAgRklMVEVSIGdyb3VwLl9rZXkgPT0gcC5ncm91cElkXG4gICAgICAgICAgRk9SIHUsIGUgSU4gT1VUQk9VTkQgZ3JvdXAuX2lkIGlzR3JvdXBlZFxuICAgICAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gXCIke3Nlc3Npb25JZH1cIlxuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgICAgIH0gZWxzZSBpZihwcml2YWN5ID09PSAncHVibGljJykge1xuICAgICAgICBwcml2YWN5QXFsUXJ5ID0gYExFVCBwID0gRE9DVU1FTlQoXCIke3Bvc3REb2NJZH1cIilcbiAgICAgICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICAgICAgfVxuXG4gICAgICBpZihwcml2YWN5QXFsUXJ5KSB7XG4gICAgICAgIHJldHVybiBkYi5xdWVyeShwcml2YWN5QXFsUXJ5KVxuICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpIHx8IHt9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gKHt9KSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge307XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+ICh7fSkpKTtcbn07XG5cbi8vIGV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbi8vICAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5QXBwJztcbi8vICAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbi8vICAgY29uc29sZS5sb2coJ2dldFBvc3RMaXN0Ojpjb250ZXh0JywgY29udGV4dCk7XG4vLyAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuLy8gICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuLy8gICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuLy8gICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuLy8gICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbi8vICAgICAke2xpbWl0LmFxbH1cbi8vICAgICBTT1JUIHAuYWRkZWRcbi8vICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuLy8gICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuLy8gICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgIGNvbnNvbGUubG9nKCdnZXRQb3N0TGlzdDo6ZXJyb3InLCBlcnJvcik7XG4vLyAgICAgICB0aHJvdyBlcnJvcjtcbi8vICAgICB9KTtcbi8vIH07XG5cbi8vIGV4cG9ydCBjb25zdCBnZXRQb3N0c0J5QXJlYSA9IChcbi8vICAgY29udGV4dDogQXBpQ29udGV4dCxcbi8vICAgbGF0aXR1ZGU6IG51bWJlcixcbi8vICAgbG9uZ2l0dWRlOiBudW1iZXIsXG4vLyAgIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuLy8gKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4vLyAgIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeVVzZXInO1xuLy8gICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuLy8gICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbi8vICAgY29uc3QgZm9ybWF0TGF0aXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxhdGl0dWRlKTtcbi8vICAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuLy8gICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuLy8gICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuLy8gICAgICR7Zm9ybWF0TGF0aXR1ZGV9LFxuLy8gICAgICR7Zm9ybWF0TG9uZ2l0dWRlfSxcbi8vICAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbi8vICAgICBOT1RfTlVMTChwLmxvbmdpdHVkZSwgMCkpXG4vLyAgIGApO1xuLy8gICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG5cbi8vICAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbi8vICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4vLyAgICAgRklMVEVSIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiAmJiBwLnBhcmVudElkID09IG51bGxcbi8vICAgICAke2xpbWl0LmFxbH1cbi8vICAgICBTT1JUIGRpc3RhbmNlLCBwLmFkZGVkXG4vLyAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbi8vICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbi8vICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuLy8gICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4vLyAgICAgICB0aHJvdyBlcnJvcjtcbi8vICAgICB9KTtcbi8vIH07XG5cbi8vIGV4cG9ydCBjb25zdCBnZXRQb3N0c0J5R3JvdXAgPSAoXG4vLyAgIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4vLyAgIGdyb3VwSWQ6IHN0cmluZyxcbi8vICAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4vLyApOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbi8vICAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5R3JvdXAnO1xuLy8gICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuLy8gICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuXG4vLyAgIC8vIEdyb3VwIGlkXG4vLyAgIGNvbnN0IGZvcm1hdEdyb3VwSWQ6IHN0cmluZyA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4vLyAgIGNvbnN0IGRiID0gZGF0YWJhc2U7XG4vLyAgIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiB1LCBnIElOIElOQk9VTkQgJHtmb3JtYXRHcm91cElkfSBoYXNHcm91cFxuLy8gICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbi8vICAgICAgIFJFVFVSTiBnYDtcblxuLy8gICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuLy8gICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgLnRoZW4oKGdyb3VwczogR3JvdXBUeXBlW10gPSBbXSkgPT4ge1xuLy8gICAgICAgaWYoZ3JvdXBzLmxlbmd0aCkge1xuLy8gICAgICAgICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbi8vICAgICAgICAgY29uc3QgcG9zdEFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4vLyAgICAgICAgICAgRklMVEVSIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLmdyb3VwSWQgPT0gXCIke2Zvcm1hdEdyb3VwSWR9XCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuLy8gICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbi8vICAgICAgICAgICAke2xpbWl0LmFxbH1cbi8vICAgICAgICAgICBTT1JUIHAuYWRkZWRcbi8vICAgICAgICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuLy8gICAgICAgICByZXR1cm4gZGIucXVlcnkocG9zdEFxbFFyeSlcbi8vICAgICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuLy8gICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4vLyAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbi8vICAgICAgICAgICB9KTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgcmV0dXJuIFtdO1xuLy8gICAgIH0pXG4vLyAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuLy8gZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlMYXRlc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4vLyAgIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeUxhdGVzdCc7XG4vLyAgIGNvbnNvbGUubG9nKCdnZXRQb3N0c0J5TGF0ZXN0OjpvcHRpb25zJywgb3B0aW9ucyk7XG4vLyAgIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4vLyAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuLy8gICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuLy8gICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuLy8gICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuLy8gICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbi8vICAgICAke2xpbWl0LmFxbH1cbi8vICAgICBTT1JUIHAuYWRkZWQgREVTQ1xuLy8gICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4vLyAgIGNvbnNvbGUubG9nKCdnZXRQb3N0c0J5TGF0ZXN0OjphcWxRcnknLCBhcWxRcnkpO1xuLy8gICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuLy8gICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHJlYWN0aW9uczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdHNCeVJlYWN0aW9ucyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbGltaXQsIGxvbmdpdHVkZSwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBmb3JtYXRTZXNzaW9uSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbnM6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHJlYWN0aW9ucy5tYXAoKHJlYWN0aW9uKSA9PiBwYXJzZUNoYXIocmVhY3Rpb24sIDMyKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IHNvcnRCeTogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbYHAudHlwZSA9PSBcIiR7dHlwZX1cImAsICdwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiddO1xuICBjb25zdCBmb3JtYXRMYXRpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obGF0aXR1ZGUpO1xuICBjb25zdCBmb3JtYXRMb25naXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxvbmdpdHVkZSk7XG5cbiAgaWYoZm9ybWF0TGF0aXR1ZGUgJiYgZm9ybWF0TG9uZ2l0dWRlKSB7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAgICR7Zm9ybWF0TGF0aXR1ZGV9LFxuICAgICAgJHtmb3JtYXRMb25naXR1ZGV9LFxuICAgICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgICBOT1RfTlVMTChwLmxvbmdpdHVkZSwgMCkpXG4gICAgYCk7XG4gICAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuICAgIHNvcnRCeS5wdXNoKCdkaXN0YW5jZScpO1xuICB9XG5cbiAgaWYocmVhY3Rpb25zLmxlbmd0aCkge1xuICAgIHNvcnRCeS5wdXNoKCdtYXRjaGVkVGFncyBERVNDJyk7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgbWF0Y2hlZFJlYWN0aW9ucyA9IExFTkdUSChcbiAgICAgIEZPUiBtciBJTiByZWFjdGlvbnNcbiAgICAgIEZJTFRFUiBtci5tYXRjaGVkID09IHRydWVcbiAgICAgIFJFVFVSTiBtclxuICAgIClgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ21hdGNoZWRSZWFjdGlvbnM6bWF0Y2hlZFJlYWN0aW9ucycpO1xuICAgIGZpbHRlcnMucHVzaCgnbWF0Y2hlZFJlYWN0aW9ucyA+IDAnKTtcbiAgfVxuXG4gIHNvcnRCeS5wdXNoKCdwLmFkZGVkIERFU0MnKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCdyZWFjdGlvbnM6cmVhY3Rpb25zJyk7XG5cbiAgLy8gR2V0IGRhdGEgZnJvbSBkYXRhYmFzZVxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCwgciBJTiBPVVRCT1VORCBcIiR7Zm9ybWF0U2Vzc2lvbklkfVwiIGhhc1JlYWN0aW9uc1xuICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICBGT1IgcmVhY3Rpb24sIGhyIElOIDEuLjEgSU5CT1VORCBwIGlzVGFnZ2VkXG4gICAgICBMRVQgbWF0Y2hlZCA9IExFTkdUSCgke2Zvcm1hdFJlYWN0aW9uc30pID4gMCAmJiBQT1NJVElPTigke2Zvcm1hdFJlYWN0aW9uc30sIHJlYWN0aW9uLm5hbWUpXG4gICAgICBTT1JUIHJlYWN0aW9uLm5hbWVcbiAgICAgIFJFVFVSTiBNRVJHRShyZWFjdGlvbiwge21hdGNoZWQ6bWF0Y2hlZH0pXG4gICAgKVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBbXSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlUYWdzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB0YWdzOiBzdHJpbmdbXSA9IFtdLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xhdGl0dWRlLCBsaW1pdCwgbG9uZ2l0dWRlLCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGZvcm1hdFRhZ05hbWVzOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0YWdzLm1hcCgodGFnKSA9PiBwYXJzZUNoYXIodGFnLCAzMikudG9Mb3dlckNhc2UoKSkpO1xuICBjb25zdCBzb3J0Qnk6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gW2BwLnR5cGUgPT0gXCIke3R5cGV9XCJgLCAncC5wcml2YWN5ID09IFwicHVibGljXCInXTtcbiAgY29uc3QgZm9ybWF0TGF0aXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxhdGl0dWRlKTtcbiAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuXG4gIGlmKGZvcm1hdExhdGl0dWRlICYmIGZvcm1hdExvbmdpdHVkZSkge1xuICAgIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UoXG4gICAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAgICR7Zm9ybWF0TG9uZ2l0dWRlfSxcbiAgICAgIE5PVF9OVUxMKHAubGF0aXR1ZGUsIDApLFxuICAgICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICAgIGApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnZGlzdGFuY2U6ZGlzdGFuY2UnKTtcbiAgICBzb3J0QnkucHVzaCgnZGlzdGFuY2UnKTtcbiAgfVxuXG4gIGlmKHRhZ3MubGVuZ3RoKSB7XG4gICAgc29ydEJ5LnB1c2goJ21hdGNoZWRUYWdzIERFU0MnKTtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBtYXRjaGVkVGFncyA9IExFTkdUSChcbiAgICAgIEZPUiB0IElOIHRhZ3NcbiAgICAgIEZJTFRFUiB0Lm1hdGNoZWQgPT0gdHJ1ZVxuICAgICAgUkVUVVJOIHRcbiAgICApYCk7XG4gICAgc2VsZWN0T2JqZWN0cy5wdXNoKCdtYXRjaGVkVGFnczptYXRjaGVkVGFncycpO1xuICAgIGZpbHRlcnMucHVzaCgnbWF0Y2hlZFRhZ3MgPiAwJyk7XG4gIH1cblxuICBzb3J0QnkucHVzaCgncC5hZGRlZCBERVNDJyk7XG4gIHNlbGVjdE9iamVjdHMucHVzaCgndGFnczp0YWdzJyk7XG5cbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBMRVQgdGFncyA9IChcbiAgICAgIEZPUiB0YWcsIGl0IElOIDEuLjEgSU5CT1VORCBwIGlzVGFnZ2VkXG4gICAgICBMRVQgbWF0Y2hlZCA9IExFTkdUSCgke2Zvcm1hdFRhZ05hbWVzfSkgPiAwICYmIFBPU0lUSU9OKCR7Zm9ybWF0VGFnTmFtZXN9LCB0YWcubmFtZSlcbiAgICAgIFNPUlQgdGFnLm5hbWVcbiAgICAgIFJFVFVSTiBNRVJHRSh0YWcsIHttYXRjaGVkOm1hdGNoZWR9KVxuICAgIClcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCAke3NvcnRCeS5qb2luKCcsICcpfVxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIGNvbnNvbGUubG9nKHthcWxRcnksIG9wdGlvbnN9KTtcbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoKSA9PiBbXSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcklkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnVzZXJJZCA9PSBcIiR7Zm9ybWF0VXNlcklkfVwiICYmIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiAmJiBwLnBhcmVudCA9PSBudWxsXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgcC5hZGRlZFxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdENvbW1lbnRzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nLCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0Q29tbWVudHMnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuXG4gIC8vIEdldCB0aGUgcGFyZW50IHBvc3QgdG8gZ2V0IHJlc3RyaWN0aW9uc1xuICBjb25zdCBkYiA9IGRhdGFiYXNlO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgRklMVEVSIHAudHlwZSA9PSAke3R5cGV9ICYmIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHBgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHBvc3Q6IFBvc3RUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgX2tleSxcbiAgICAgICAgZ3JvdXBJZCxcbiAgICAgICAgcHJpdmFjeSA9ICdwdWJsaWMnXG4gICAgICB9OiBQb3N0VHlwZSA9IHBvc3Q7XG5cbiAgICAgIC8vIFF1ZXJ5IGJhc2VkIG9uIHByaXZhY3kgbGV2ZWxcbiAgICAgIGxldCBwcml2YWN5QXFsUXJ5OiBzdHJpbmc7XG5cbiAgICAgIGlmKGdyb3VwSWQgJiYgcHJpdmFjeSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBwcml2YWN5QXFsUXJ5ID0gYEZPUiBwIElOIHBvc3RzXG4gICAgICAgICAgRk9SIHVzZXIgSU4gdXNlcnNcbiAgICAgICAgICBGSUxURVIgcC5wYXJlbnQgPT0gXCIke19rZXl9XCIgJiYgdXNlci5fa2V5ID09IHAudXNlcklkXG4gICAgICAgICAgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgICBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfVxuICAgICAgICAgIClcbiAgICAgICAgICBGT1IgZ3JvdXAgSU4gZ3JvdXBzXG4gICAgICAgICAgRklMVEVSIGdyb3VwLl9rZXkgPT0gcC5ncm91cElkXG4gICAgICAgICAgRk9SIHUsIGUgSU4gT1VUQk9VTkQgZ3JvdXAuX2lkIGlzR3JvdXBlZFxuICAgICAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gXCIke3Nlc3Npb25JZH1cIlxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7dXNlcjogdXNlciwgcmVhY3Rpb25zOiByZWFjdGlvbnN9KWA7XG4gICAgICB9IGVsc2UgaWYocHJpdmFjeSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZPUiB1c2VyIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIHAucGFyZW50ID09IFwiJHtfa2V5fVwiICYmIHVzZXIuX2tleSA9PSBwLnVzZXJJZFxuICAgICAgICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgICApXG4gICAgICAgICAgU09SVCBwLmFkZGVkXG4gICAgICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHt1c2VyOiB1c2VyLCByZWFjdGlvbnM6IHJlYWN0aW9uc30pYDtcbiAgICAgIH1cblxuICAgICAgaWYocHJpdmFjeUFxbFFyeSkge1xuICAgICAgICByZXR1cm4gZGIucXVlcnkocHJpdmFjeUFxbFFyeSlcbiAgICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFBvc3QgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdDogUG9zdElucHV0VHlwZSk6IFByb21pc2U8UG9zdFR5cGU+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qge1xuICAgIGNvbnRlbnQgPSAnJyxcbiAgICBlbmREYXRlLFxuICAgIGdyb3VwSWQgPSAnJyxcbiAgICBsb2NhdGlvbixcbiAgICBsYXRpdHVkZSxcbiAgICBsb25naXR1ZGUsXG4gICAgbmFtZSA9ICcnLFxuICAgIHBhcmVudElkID0gbnVsbCxcbiAgICBwcml2YWN5ID0gJ3B1YmxpYycsXG4gICAgdGFncyA9IFtdLFxuICAgIHN0YXJ0RGF0ZSxcbiAgICB0eXBlID0gJ2RlZmF1bHQnXG4gIH0gPSBwb3N0O1xuXG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICBjb25zdCBpbnNlcnQ6IFBvc3RUeXBlID0ge1xuICAgIF9rZXk6IGNyZWF0ZUhhc2goYHBvc3QtJHtzZXNzaW9uSWR9YCksXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBjb250ZW50OiBwYXJzZVN0cmluZyhjb250ZW50LCBNQVhfQ09OVEVOVF9MRU5HVEgpLFxuICAgIGVuZERhdGU6IGVuZERhdGUgPyBwYXJzZU51bShlbmREYXRlLCAxMykgOiB1bmRlZmluZWQsXG4gICAgZ3JvdXBJZDogZ3JvdXBJZCA/IHBhcnNlSWQoZ3JvdXBJZCkgOiB1bmRlZmluZWQsXG4gICAgbGF0aXR1ZGU6IGxhdGl0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsYXRpdHVkZSkgOiB1bmRlZmluZWQsXG4gICAgbG9jYXRpb246IGxvY2F0aW9uID8gcGFyc2VTdHJpbmcobG9jYXRpb24sIDE2MCkgOiB1bmRlZmluZWQsXG4gICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUgIT09IHVuZGVmaW5lZCA/IHBhcnNlTnVtKGxvbmdpdHVkZSkgOiB1bmRlZmluZWQsXG4gICAgbW9kaWZpZWQ6IG5vdyxcbiAgICBuYW1lOiBwYXJzZVN0cmluZyhuYW1lLCAxNjApLFxuICAgIHBhcmVudElkOiBwYXJlbnRJZCA/IHBhcnNlSWQocGFyZW50SWQpIDogdW5kZWZpbmVkLFxuICAgIHByaXZhY3k6IHByaXZhY3kgPyBwYXJzZVZhckNoYXIocHJpdmFjeSwgMTYpIDogdW5kZWZpbmVkLFxuICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlID8gcGFyc2VOdW0oc3RhcnREYXRlLCAxMykgOiB1bmRlZmluZWQsXG4gICAgdHlwZTogcGFyc2VDaGFyKHR5cGUsIDMyKSxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9O1xuXG4gIGNvbnN0IGRiOiBEYXRhYmFzZSA9IGRhdGFiYXNlO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzYXZlZFBvc3Q6IFBvc3RUeXBlID0gYXdhaXQgZGIucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkgfHwge30pO1xuXG4gICAgY29uc3Qge19pZDogcG9zdERvY0lkfSA9IHNhdmVkUG9zdDtcblxuICAgIGNvbnNvbGUubG9nKHt0YWdzfSk7XG4gICAgaWYodGFncyAmJiB0YWdzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdGFnTmFtZXM6IHN0cmluZ1tdID0gdGFncy5tYXAoKHtuYW1lfSkgPT4gcGFyc2VDaGFyKG5hbWUsIDMyKSk7XG4gICAgICBjb25zb2xlLmxvZyh7dGFnTmFtZXMsIHBvc3REb2NJZH0pO1xuICAgICAgYXdhaXQgbGlua1RhZ3MoZGIsIHRhZ05hbWVzLCBwb3N0RG9jSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3Mgd2l0aGluIHBvc3RzXG4gICAgICBjb25zdCB0YWdMaXN0OiBUYWdUeXBlW10gPSBhd2FpdCBleHRyYWN0VGFncyhkYiwgcG9zdERvY0lkLCBpbnNlcnQuY29udGVudCk7XG4gICAgICBzYXZlZFBvc3QudGFncyA9IHRhZ0xpc3Q7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhdmVkUG9zdDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlUG9zdCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBwb3N0OiBQb3N0SW5wdXRUeXBlKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICd1cGRhdGUnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCB7XG4gICAgY29udGVudCxcbiAgICBlbmREYXRlLFxuICAgIGdyb3VwSWQsXG4gICAgbmFtZSxcbiAgICBwYXJlbnRJZCxcbiAgICBwb3N0SWQsXG4gICAgcHJpdmFjeSxcbiAgICBzdGFydERhdGUsXG4gICAgdGFncyA9IFtdLFxuICAgIHR5cGVcbiAgfSA9IHBvc3Q7XG5cbiAgY29uc3QgdXBkYXRlOiBQb3N0VHlwZSA9IHtcbiAgICBjb250ZW50OiBjb250ZW50ID8gcGFyc2VTdHJpbmcoY29udGVudCwgTUFYX0NPTlRFTlRfTEVOR1RIKSA6IHVuZGVmaW5lZCxcbiAgICBlbmREYXRlOiBlbmREYXRlID8gcGFyc2VOdW0oZW5kRGF0ZSwgMTMpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogbmFtZSA/IHBhcnNlU3RyaW5nKG5hbWUsIDE2MCkgOiB1bmRlZmluZWQsXG4gICAgcGFyZW50SWQ6IHBhcmVudElkID8gcGFyc2VTdHJpbmcocGFyZW50SWQsIDE2MCkgOiB1bmRlZmluZWQsXG4gICAgcHJpdmFjeTogcHJpdmFjeSA/IHBhcnNlVmFyQ2hhcihwcml2YWN5LCAxNikgOiB1bmRlZmluZWQsXG4gICAgc3RhcnREYXRlOiBzdGFydERhdGUgPyBwYXJzZU51bShzdGFydERhdGUsIDEzKSA6IHVuZGVmaW5lZCxcbiAgICB0eXBlOiB0eXBlICE9PSB1bmRlZmluZWQgPyBwYXJzZUNoYXIodHlwZSwgMTYpIDogdW5kZWZpbmVkXG4gIH07XG5cbiAgbGV0IGZvcm1hdElkOiBzdHJpbmcgPSBwYXJzZUlkKHBvc3RJZCk7XG4gIGZvcm1hdElkID0gZm9ybWF0SWQgPT09ICcnID8gY3JlYXRlSGFzaChgcG9zdC0ke3Nlc3Npb25JZH1gKSA6IGZvcm1hdElkO1xuICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBpbnNlcnQ6IGFueSA9IHtcbiAgICAuLi51cGRhdGUsXG4gICAgX2tleTogZm9ybWF0SWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBncm91cElkOiBmb3JtYXRHcm91cElkLFxuICAgIHByaXZhY3ksXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gZGF0YWJhc2U7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdElkfSwgdXNlcklkOiAke3Nlc3Npb25JZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBwb3N0cyBSRVRVUk4gTkVXYDtcblxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRQb3N0OiBQb3N0VHlwZSA9IGF3YWl0IGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpIHx8IHt9KTtcblxuICAgIGNvbnN0IHtfaWQ6IHVwZGF0ZWRQb3N0SWR9ID0gdXBkYXRlZFBvc3Q7XG5cbiAgICBpZih0YWdzICYmIHRhZ3MubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0YWdOYW1lczogc3RyaW5nW10gPSB0YWdzLm1hcCgoe25hbWV9KSA9PiBwYXJzZUNoYXIobmFtZSwgMzIpKTtcbiAgICAgIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdCBJTiB0YWdzXG4gICAgICAgIEZJTFRFUiBQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KHRhZ05hbWVzKX0sIHQubmFtZSlcbiAgICAgICAgUkVUVVJOIHRgO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1RhZ3MgPSBhd2FpdCBkYi5xdWVyeSh0YWdRdWVyeSkudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbiAgICAgIGNvbnN0IHRhZ0lkczogc3RyaW5nW10gPSBleGlzdGluZ1RhZ3MubWFwKCh7X2lkOiB0YWdJZH0pID0+IHRhZ0lkKTtcbiAgICAgIGF3YWl0IGxpbmtUYWdzKGRiLCB0YWdJZHMsIHVwZGF0ZWRQb3N0SWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3NcbiAgICAgIGNvbnN0IHRhZ0xpc3QgPSBhd2FpdCBleHRyYWN0VGFncyhkYiwgdXBkYXRlZFBvc3RJZCwgdXBkYXRlLmNvbnRlbnQgfHwgJycpIHx8IFtdO1xuICAgICAgdXBkYXRlZFBvc3QudGFncyA9IHRhZ0xpc3Q7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGxpbmtlZCBmaWxlc1xuICAgIGNvbnN0IGZpbGVzOiBGaWxlVHlwZVtdID0gdXBkYXRlZFBvc3QuZmlsZXMgfHwgW107XG5cbiAgICBpZihmaWxlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZpbGVMaXN0ID0gYXdhaXQgdXBkYXRlRmlsZXMoZGIsIGZvcm1hdElkLCBmaWxlcykgfHwgW107XG4gICAgICB1cGRhdGVkUG9zdC5maWxlcyA9IGZpbGVMaXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVkUG9zdC5maWxlcyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkUG9zdDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlUG9zdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwb3N0SWQ6IHN0cmluZyk6IFByb21pc2U8UG9zdFR5cGU+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZGVsZXRlJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChwb3N0SWQpO1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSBkYXRhYmFzZTtcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgICBGSUxURVIgcC5fa2V5ID09ICR7Zm9ybWF0SXRlbUlkfSAmJiBwLnVzZXJJZCA9PSAke3Nlc3Npb25JZH1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFTU9WRSBwIElOIHBvc3RzXG4gICAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBpZihwb3N0KSB7XG4gICAgICAgIC8vIFJlbW92ZSB0YWcgbGlua3NcbiAgICAgICAgY29uc3QgZWRnZUFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHQgSU4gaXNUYWdnZWRcbiAgICAgICAgICAgIEZJTFRFUiB0Ll90byA9PSAke2Zvcm1hdEl0ZW1JZH1cbiAgICAgICAgICAgIFJFTU9WRSB0IElOIGlzVGFnZ2VkYDtcblxuICAgICAgICByZXR1cm4gZGIucXVlcnkoZWRnZUFxbFFyeSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgYXR0YWNoZWQgZmlsZXNcbiAgICAgICAgICAgIGNvbnN0IGZpbGVBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBmIElOIGhhc0ZpbGVcbiAgICAgICAgICAgICAgICBGSUxURVIgZi5fdG8gPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICAgICAgICAgICAgUkVNT1ZFIGYgSU4gaGFzRmlsZWA7XG5cbiAgICAgICAgICAgIHJldHVybiBkYi5xdWVyeShmaWxlQXFsUXJ5KVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiBwb3N0KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbGVhblBvc3RzID0gKGRhdGFiYXNlOiBEYXRhYmFzZSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIC8vIFJlbW92ZSBhbGwgbWVzc2FnZXMgdGhhdCBhcmUgb3ZlciA2MCBkYXlzIGFuZCBub3Qgc2F2ZWRcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgICAgRklMVEVSIHAuYWRkZWQgPCBEQVRFX1RJTUVTVEFNUChEQVRFX1NVQlRSQUNUKERBVEVfTk9XKCksIDYwLCAnZGF5JykpICYmIHAudHlwZSA9PSBcImRlZmF1bHRcIlxuICAgICAgUkVNT1ZFIHAgSU4gcG9zdHNcbiAgICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigocmVzdWx0czogUG9zdFR5cGVbXSA9IFtdKSA9PiByZXN1bHRzLmxlbmd0aClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUG9zdEVkZ2UgPSAoZGI6IERhdGFiYXNlLCBmaWxlOiBGaWxlVHlwZSwgcG9zdElkOiBzdHJpbmcpOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRiLmNvbGxlY3Rpb24oJ2lzUG9zdGVkJyk7XG4gIGNvbnN0IHtmaWxlSWR9ID0gZmlsZTtcbiAgY29uc3QgZm9ybWF0RmlsZUlkOiBzdHJpbmcgPSBwYXJzZUlkKGZpbGVJZCk7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgZmlsZS0ke3Bvc3RJZH0tJHtmb3JtYXRGaWxlSWR9YCk7XG4gIGNvbnN0IGZvcm1hdFBvc3RJZDogc3RyaW5nID0gcGFyc2VJZChwb3N0SWQpO1xuICBjb25zdCBmaWxlVHlwZTogc3RyaW5nID0gcGFyc2VDaGFyKGZpbGUuZmlsZVR5cGUsIDE2KTtcblxuICBjb25zdCBlZGdlOiBhbnkgPSB7XG4gICAgX2Zyb206IGBwb3N0cy8ke2Zvcm1hdFBvc3RJZH1gLFxuICAgIF9rZXk6IGVkZ2VJZCxcbiAgICBfdG86IGBmaWxlcy8ke2Zvcm1hdEZpbGVJZH1gLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIHR5cGU6IGZpbGVUeXBlXG4gIH07XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pXG4gICAgLnRoZW4oKCkgPT4gZmlsZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBLG1CQUFrRjtBQUNsRixzQkFBNEI7QUFNNUIsSUFBQUEsZ0JBQWlDO0FBQ2pDLG1CQUEwQjtBQUMxQixrQkFBb0M7QUFFcEMsTUFBTSxxQkFBNkI7QUFDbkMsTUFBTSxnQkFBd0I7QUFFdkIsTUFBTSxtQkFBbUIsQ0FBQyxVQUF1QixDQUFDLE1BQU07QUFDN0QsUUFBTTtBQUFBLElBQ0osT0FBTztBQUFBLElBQ1AsV0FBVztBQUFBLElBQ1gsWUFBWTtBQUFBLElBQ1osS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1QsSUFBSTtBQUVKLFNBQU87QUFBQSxJQUNMLGNBQVUsdUJBQVMsVUFBVSxFQUFFO0FBQUEsSUFDL0IsV0FBTyx3QkFBUyxNQUFNLEVBQUU7QUFBQSxJQUN4QixlQUFXLHVCQUFTLFdBQVcsRUFBRTtBQUFBLElBQ2pDLFVBQU0sd0JBQVUsTUFBTSxFQUFF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
561
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcG9zdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbCwgRGF0YWJhc2V9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5cbmltcG9ydCB7QXBpQ29udGV4dCwgRmlsZVR5cGUsIFBvc3RJbnB1dFR5cGUsIFBvc3RPcHRpb25zLCBQb3N0VHlwZSwgVGFnVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgbG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7dXBkYXRlRmlsZXN9IGZyb20gJy4vZmlsZXMnO1xuaW1wb3J0IHtleHRyYWN0VGFncywgbGlua1RhZ3N9IGZyb20gJy4vdGFncyc7XG5cbmNvbnN0IE1BWF9DT05URU5UX0xFTkdUSDogbnVtYmVyID0gMTAwMDAwO1xuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3Bvc3RzJztcblxuZXhwb3J0IGNvbnN0IHBhcnNlUG9zdE9wdGlvbnMgPSAob3B0aW9uczogUG9zdE9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgbGF0aXR1ZGUgPSAwLFxuICAgIGxvbmdpdHVkZSA9IDAsXG4gICAgdG8gPSAzMCxcbiAgICB0eXBlID0gJ3Bvc3QnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IHBhcnNlTnVtKGxhdGl0dWRlLCAzMiksXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSxcbiAgICBsb25naXR1ZGU6IHBhcnNlTnVtKGxvbmdpdHVkZSwgMzIpLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0T3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSwgc2Vzc2lvbklkOiBzdHJpbmcpID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHM6IGFueSwgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIHN3aXRjaChmaWVsZCkge1xuICAgICAgY2FzZSAnaGFzUnN2cCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCBoYXNSc3ZwID0gVE9fQk9PTChGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInJzdnBcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiICYmIHIuX2Zyb20gPT0gXCJ1c2Vycy8ke3Nlc3Npb25JZH1cIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgICkpYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdoYXNSc3ZwOmhhc1JzdnAnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICdpc1NhdmVkJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIGlzU2F2ZWQgPSBUT19CT09MKEZJUlNUKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBGSUxURVIgci5uYW1lID09IFwicGluXCIgJiYgci50eXBlID09IFwicG9zdHNcIiAmJiByLl9mcm9tID09IFwidXNlcnMvJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjb3VudFxuICAgICAgICAgIFJFVFVSTiBjb3VudFxuICAgICAgICApKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgnaXNTYXZlZDppc1NhdmVkJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAncmVhY3Rpb25zJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICdyc3ZwQ291bnQnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcnN2cENvdW50ID0gRklSU1QoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvblxuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJyc3ZwXCIgJiYgci50eXBlID09IFwicG9zdHNcIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JzdnBDb3VudDpyc3ZwQ291bnQnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd2aWV3Q291bnQnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgdmlld0NvdW50ID0gRklSU1QoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvblxuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJ2aWV3XCIgJiYgci50eXBlID09IFwicG9zdHNcIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3ZpZXdDb3VudDp2aWV3Q291bnQnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgIH1cbiAgfSwge29iamVjdHM6IFtdLCBxdWVyaWVzOiBbXX0pO1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZywgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQYXJ0aWFsPFBvc3RUeXBlPj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IHt0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGRiID0gZGF0YWJhc2U7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC5fa2V5ID09ICR7Zm9ybWF0SXRlbUlkfSAmJiBwLnR5cGUgPT0gJHt0eXBlfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gcGA7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBfaWQ6IHBvc3REb2NJZCxcbiAgICAgICAgZ3JvdXBJZCxcbiAgICAgICAgcHJpdmFjeSA9ICdkZWZhdWx0J1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICAvLyBRdWVyeSBiYXNlZCBvbiBwcml2YWN5IGxldmVsXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBMRVQgcCA9IERPQ1VNRU5UKFwiJHtwb3N0RG9jSWR9XCIpXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgIEZPUiBncm91cCBJTiBncm91cHNcbiAgICAgICAgICBGSUxURVIgZ3JvdXAuX2tleSA9PSBwLmdyb3VwSWRcbiAgICAgICAgICBGT1IgdSwgZSBJTiBPVVRCT1VORCBncm91cC5faWQgaXNHcm91cGVkXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSBcIiR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgTEVUIHAgPSBET0NVTUVOVChcIiR7cG9zdERvY0lkfVwiKVxuICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkgfHwge30pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiAoe30pKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gKHt9KSkpO1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGdldFBvc3RMaXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuLy8gICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlBcHAnO1xuLy8gICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuLy8gICBjb25zb2xlLmxvZygnZ2V0UG9zdExpc3Q6OmNvbnRleHQnLCBjb250ZXh0KTtcbi8vICAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4vLyAgIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4vLyAgIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4vLyAgICAgRklMVEVSIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiAmJiBwLnBhcmVudCA9PSBudWxsXG4vLyAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuLy8gICAgICR7bGltaXQuYXFsfVxuLy8gICAgIFNPUlQgcC5hZGRlZFxuLy8gICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4vLyAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4vLyAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbi8vICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuLy8gICAgICAgY29uc29sZS5sb2coJ2dldFBvc3RMaXN0OjplcnJvcicsIGVycm9yKTtcbi8vICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlBcmVhID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBsYXRpdHVkZTogbnVtYmVyLFxuICBsb25naXR1ZGU6IG51bWJlcixcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5VXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRMYXRpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obGF0aXR1ZGUpO1xuICBjb25zdCBmb3JtYXRMb25naXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxvbmdpdHVkZSk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UoXG4gICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgJHtmb3JtYXRMb25naXR1ZGV9LFxuICAgIE5PVF9OVUxMKHAubGF0aXR1ZGUsIDApLFxuICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgYCk7XG4gIHNlbGVjdE9iamVjdHMucHVzaCgnZGlzdGFuY2U6ZGlzdGFuY2UnKTtcblxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAucHJpdmFjeSA9PSBcInB1YmxpY1wiICYmIHAucGFyZW50SWQgPT0gbnVsbFxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgZGlzdGFuY2UsIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlHcm91cCA9IChcbi8vICAgY29udGV4dDogQXBpQ29udGV4dCxcbi8vICAgZ3JvdXBJZDogc3RyaW5nLFxuLy8gICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbi8vICk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuLy8gICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlHcm91cCc7XG4vLyAgIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4vLyAgIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG5cbi8vICAgLy8gR3JvdXAgaWRcbi8vICAgY29uc3QgZm9ybWF0R3JvdXBJZDogc3RyaW5nID0gcGFyc2VJZChncm91cElkKTtcbi8vICAgY29uc3QgZGIgPSBkYXRhYmFzZTtcbi8vICAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHUsIGcgSU4gSU5CT1VORCAke2Zvcm1hdEdyb3VwSWR9IGhhc0dyb3VwXG4vLyAgICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuLy8gICAgICAgUkVUVVJOIGdgO1xuXG4vLyAgIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4vLyAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbi8vICAgICAudGhlbigoZ3JvdXBzOiBHcm91cFR5cGVbXSA9IFtdKSA9PiB7XG4vLyAgICAgICBpZihncm91cHMubGVuZ3RoKSB7XG4vLyAgICAgICAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuLy8gICAgICAgICBjb25zdCBwb3N0QXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbi8vICAgICAgICAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAuZ3JvdXBJZCA9PSBcIiR7Zm9ybWF0R3JvdXBJZH1cIiAmJiBwLnBhcmVudCA9PSBudWxsXG4vLyAgICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuLy8gICAgICAgICAgICR7bGltaXQuYXFsfVxuLy8gICAgICAgICAgIFNPUlQgcC5hZGRlZFxuLy8gICAgICAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4vLyAgICAgICAgIHJldHVybiBkYi5xdWVyeShwb3N0QXFsUXJ5KVxuLy8gICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgICAgICAgIH0pO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICByZXR1cm4gW107XG4vLyAgICAgfSlcbi8vICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuLy8gICAgICAgdGhyb3cgZXJyb3I7XG4vLyAgICAgfSk7XG4vLyB9O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5TGF0ZXN0JztcbiAgY29uc29sZS5sb2coJ2dldFBvc3RzQnlMYXRlc3Q6Om9wdGlvbnMnLCBvcHRpb25zKTtcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgRklMVEVSIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiAmJiBwLnBhcmVudCA9PSBudWxsXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgcC5hZGRlZCBERVNDXG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgY29uc29sZS5sb2coJ2dldFBvc3RzQnlMYXRlc3Q6OmFxbFFyeScsIGFxbFFyeSk7XG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeVJlYWN0aW9ucyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcmVhY3Rpb25zOiBzdHJpbmdbXSA9IFtdLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0c0J5UmVhY3Rpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xhdGl0dWRlLCBsaW1pdCwgbG9uZ2l0dWRlLCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocmVhY3Rpb25zLm1hcCgocmVhY3Rpb24pID0+IHBhcnNlQ2hhcihyZWFjdGlvbiwgMzIpLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29ydEJ5OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgcC50eXBlID09IFwiJHt0eXBlfVwiYCwgJ3AucHJpdmFjeSA9PSBcInB1YmxpY1wiJ107XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcblxuICBpZihmb3JtYXRMYXRpdHVkZSAmJiBmb3JtYXRMb25naXR1ZGUpIHtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuICAgICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbiAgICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgICBgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG4gICAgc29ydEJ5LnB1c2goJ2Rpc3RhbmNlJyk7XG4gIH1cblxuICBpZihyZWFjdGlvbnMubGVuZ3RoKSB7XG4gICAgc29ydEJ5LnB1c2goJ21hdGNoZWRUYWdzIERFU0MnKTtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBtYXRjaGVkUmVhY3Rpb25zID0gTEVOR1RIKFxuICAgICAgRk9SIG1yIElOIHJlYWN0aW9uc1xuICAgICAgRklMVEVSIG1yLm1hdGNoZWQgPT0gdHJ1ZVxuICAgICAgUkVUVVJOIG1yXG4gICAgKWApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnbWF0Y2hlZFJlYWN0aW9uczptYXRjaGVkUmVhY3Rpb25zJyk7XG4gICAgZmlsdGVycy5wdXNoKCdtYXRjaGVkUmVhY3Rpb25zID4gMCcpO1xuICB9XG5cbiAgc29ydEJ5LnB1c2goJ3AuYWRkZWQgREVTQycpO1xuICBzZWxlY3RPYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwLCByIElOIE9VVEJPVU5EIFwiJHtmb3JtYXRTZXNzaW9uSWR9XCIgaGFzUmVhY3Rpb25cbiAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgRk9SIHJlYWN0aW9uLCBociBJTiAxLi4xIElOQk9VTkQgcCBpc1RhZ2dlZFxuICAgICAgTEVUIG1hdGNoZWQgPSBMRU5HVEgoJHtmb3JtYXRSZWFjdGlvbnN9KSA+IDAgJiYgUE9TSVRJT04oJHtmb3JtYXRSZWFjdGlvbnN9LCByZWFjdGlvbi5uYW1lKVxuICAgICAgU09SVCByZWFjdGlvbi5uYW1lXG4gICAgICBSRVRVUk4gTUVSR0UocmVhY3Rpb24sIHttYXRjaGVkOm1hdGNoZWR9KVxuICAgIClcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gW10pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGFnczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5VGFncyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbGltaXQsIGxvbmdpdHVkZSwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBmb3JtYXRUYWdOYW1lczogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGFncy5tYXAoKHRhZykgPT4gcGFyc2VDaGFyKHRhZywgMzIpLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29ydEJ5OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgcC50eXBlID09IFwiJHt0eXBlfVwiYCwgJ3AucHJpdmFjeSA9PSBcInB1YmxpY1wiJ107XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcblxuICBpZihmb3JtYXRMYXRpdHVkZSAmJiBmb3JtYXRMb25naXR1ZGUpIHtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuICAgICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbiAgICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgICBgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG4gICAgc29ydEJ5LnB1c2goJ2Rpc3RhbmNlJyk7XG4gIH1cblxuICBpZih0YWdzLmxlbmd0aCkge1xuICAgIHNvcnRCeS5wdXNoKCdtYXRjaGVkVGFncyBERVNDJyk7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgbWF0Y2hlZFRhZ3MgPSBMRU5HVEgoXG4gICAgICBGT1IgdCBJTiB0YWdzXG4gICAgICBGSUxURVIgdC5tYXRjaGVkID09IHRydWVcbiAgICAgIFJFVFVSTiB0XG4gICAgKWApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnbWF0Y2hlZFRhZ3M6bWF0Y2hlZFRhZ3MnKTtcbiAgICBmaWx0ZXJzLnB1c2goJ21hdGNoZWRUYWdzID4gMCcpO1xuICB9XG5cbiAgc29ydEJ5LnB1c2goJ3AuYWRkZWQgREVTQycpO1xuICBzZWxlY3RPYmplY3RzLnB1c2goJ3RhZ3M6dGFncycpO1xuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgTEVUIHRhZ3MgPSAoXG4gICAgICBGT1IgdGFnLCBpdCBJTiAxLi4xIElOQk9VTkQgcCBpc1RhZ2dlZFxuICAgICAgTEVUIG1hdGNoZWQgPSBMRU5HVEgoJHtmb3JtYXRUYWdOYW1lc30pID4gMCAmJiBQT1NJVElPTigke2Zvcm1hdFRhZ05hbWVzfSwgdGFnLm5hbWUpXG4gICAgICBTT1JUIHRhZy5uYW1lXG4gICAgICBSRVRVUk4gTUVSR0UodGFnLCB7bWF0Y2hlZDptYXRjaGVkfSlcbiAgICApXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgJHtzb3J0Qnkuam9pbignLCAnKX1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICBjb25zb2xlLmxvZyh7YXFsUXJ5LCBvcHRpb25zfSk7XG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKCkgPT4gW10pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nLCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5VXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRVc2VySWQ6IHN0cmluZyA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC51c2VySWQgPT0gXCIke2Zvcm1hdFVzZXJJZH1cIiAmJiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RDb21tZW50cyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZywgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldENvbW1lbnRzJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaXRlbUlkKTtcblxuICAvLyBHZXQgdGhlIHBhcmVudCBwb3N0IHRvIGdldCByZXN0cmljdGlvbnNcbiAgY29uc3QgZGIgPSBkYXRhYmFzZTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gJHt0eXBlfSAmJiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXksXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAncHVibGljJ1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICAvLyBRdWVyeSBiYXNlZCBvbiBwcml2YWN5IGxldmVsXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZPUiB1c2VyIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIHAucGFyZW50ID09IFwiJHtfa2V5fVwiICYmIHVzZXIuX2tleSA9PSBwLnVzZXJJZFxuICAgICAgICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgICApXG4gICAgICAgICAgRk9SIGdyb3VwIElOIGdyb3Vwc1xuICAgICAgICAgIEZJTFRFUiBncm91cC5fa2V5ID09IHAuZ3JvdXBJZFxuICAgICAgICAgIEZPUiB1LCBlIElOIE9VVEJPVU5EIGdyb3VwLl9pZCBpc0dyb3VwZWRcbiAgICAgICAgICBGSUxURVIgdS5fa2V5ID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwge3VzZXI6IHVzZXIsIHJlYWN0aW9uczogcmVhY3Rpb25zfSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGT1IgdXNlciBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnBhcmVudCA9PSBcIiR7X2tleX1cIiAmJiB1c2VyLl9rZXkgPT0gcC51c2VySWRcbiAgICAgICAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCByZWFjdGlvbnNcbiAgICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgICAgKVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7dXNlcjogdXNlciwgcmVhY3Rpb25zOiByZWFjdGlvbnN9KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRQb3N0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3Q6IFBvc3RJbnB1dFR5cGUpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHtcbiAgICBjb250ZW50ID0gJycsXG4gICAgZW5kRGF0ZSxcbiAgICBncm91cElkID0gJycsXG4gICAgbG9jYXRpb24sXG4gICAgbGF0aXR1ZGUsXG4gICAgbG9uZ2l0dWRlLFxuICAgIG5hbWUgPSAnJyxcbiAgICBwYXJlbnRJZCA9IG51bGwsXG4gICAgcHJpdmFjeSA9ICdwdWJsaWMnLFxuICAgIHRhZ3MgPSBbXSxcbiAgICBzdGFydERhdGUsXG4gICAgdHlwZSA9ICdkZWZhdWx0J1xuICB9ID0gcG9zdDtcblxuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG5cbiAgY29uc3QgaW5zZXJ0OiBQb3N0VHlwZSA9IHtcbiAgICBfa2V5OiBjcmVhdGVIYXNoKGBwb3N0LSR7c2Vzc2lvbklkfWApLFxuICAgIGFkZGVkOiBub3csXG4gICAgY29udGVudDogcGFyc2VTdHJpbmcoY29udGVudCwgTUFYX0NPTlRFTlRfTEVOR1RIKSxcbiAgICBlbmREYXRlOiBlbmREYXRlID8gcGFyc2VOdW0oZW5kRGF0ZSwgMTMpIDogdW5kZWZpbmVkLFxuICAgIGdyb3VwSWQ6IGdyb3VwSWQgPyBwYXJzZUlkKGdyb3VwSWQpIDogdW5kZWZpbmVkLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VOdW0obGF0aXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIGxvY2F0aW9uOiBsb2NhdGlvbiA/IHBhcnNlU3RyaW5nKGxvY2F0aW9uLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsb25naXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VTdHJpbmcobmFtZSwgMTYwKSxcbiAgICBwYXJlbnRJZDogcGFyZW50SWQgPyBwYXJzZUlkKHBhcmVudElkKSA6IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiBwcml2YWN5ID8gcGFyc2VWYXJDaGFyKHByaXZhY3ksIDE2KSA6IHVuZGVmaW5lZCxcbiAgICBzdGFydERhdGU6IHN0YXJ0RGF0ZSA/IHBhcnNlTnVtKHN0YXJ0RGF0ZSwgMTMpIDogdW5kZWZpbmVkLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMiksXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcblxuICBjb25zdCBkYjogRGF0YWJhc2UgPSBkYXRhYmFzZTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHBvc3RzIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWRQb3N0OiBQb3N0VHlwZSA9IGF3YWl0IGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpIHx8IHt9KTtcblxuICAgIGNvbnN0IHtfaWQ6IHBvc3REb2NJZH0gPSBzYXZlZFBvc3Q7XG5cbiAgICBjb25zb2xlLmxvZyh7dGFnc30pO1xuICAgIGlmKHRhZ3MgJiYgdGFncy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRhZ05hbWVzOiBzdHJpbmdbXSA9IHRhZ3MubWFwKCh7bmFtZX0pID0+IHBhcnNlQ2hhcihuYW1lLCAzMikpO1xuICAgICAgY29uc29sZS5sb2coe3RhZ05hbWVzLCBwb3N0RG9jSWR9KTtcbiAgICAgIGF3YWl0IGxpbmtUYWdzKGRiLCB0YWdOYW1lcywgcG9zdERvY0lkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlIGxpbmtlZCB0YWdzIHdpdGhpbiBwb3N0c1xuICAgICAgY29uc3QgdGFnTGlzdDogVGFnVHlwZVtdID0gYXdhaXQgZXh0cmFjdFRhZ3MoZGIsIHBvc3REb2NJZCwgaW5zZXJ0LmNvbnRlbnQpO1xuICAgICAgc2F2ZWRQb3N0LnRhZ3MgPSB0YWdMaXN0O1xuICAgIH1cblxuICAgIHJldHVybiBzYXZlZFBvc3Q7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVBvc3QgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdDogUG9zdElucHV0VHlwZSk6IFByb21pc2U8UG9zdFR5cGU+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAndXBkYXRlJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qge1xuICAgIGNvbnRlbnQsXG4gICAgZW5kRGF0ZSxcbiAgICBncm91cElkLFxuICAgIG5hbWUsXG4gICAgcGFyZW50SWQsXG4gICAgcG9zdElkLFxuICAgIHByaXZhY3ksXG4gICAgc3RhcnREYXRlLFxuICAgIHRhZ3MgPSBbXSxcbiAgICB0eXBlXG4gIH0gPSBwb3N0O1xuXG4gIGNvbnN0IHVwZGF0ZTogUG9zdFR5cGUgPSB7XG4gICAgY29udGVudDogY29udGVudCA/IHBhcnNlU3RyaW5nKGNvbnRlbnQsIE1BWF9DT05URU5UX0xFTkdUSCkgOiB1bmRlZmluZWQsXG4gICAgZW5kRGF0ZTogZW5kRGF0ZSA/IHBhcnNlTnVtKGVuZERhdGUsIDEzKSA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IG5hbWUgPyBwYXJzZVN0cmluZyhuYW1lLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHBhcmVudElkOiBwYXJlbnRJZCA/IHBhcnNlU3RyaW5nKHBhcmVudElkLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHByaXZhY3k6IHByaXZhY3kgPyBwYXJzZVZhckNoYXIocHJpdmFjeSwgMTYpIDogdW5kZWZpbmVkLFxuICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlID8gcGFyc2VOdW0oc3RhcnREYXRlLCAxMykgOiB1bmRlZmluZWQsXG4gICAgdHlwZTogdHlwZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VDaGFyKHR5cGUsIDE2KSA6IHVuZGVmaW5lZFxuICB9O1xuXG4gIGxldCBmb3JtYXRJZDogc3RyaW5nID0gcGFyc2VJZChwb3N0SWQpO1xuICBmb3JtYXRJZCA9IGZvcm1hdElkID09PSAnJyA/IGNyZWF0ZUhhc2goYHBvc3QtJHtzZXNzaW9uSWR9YCkgOiBmb3JtYXRJZDtcbiAgY29uc3QgZm9ybWF0R3JvdXBJZDogc3RyaW5nID0gcGFyc2VJZChncm91cElkKTtcbiAgY29uc3QgaW5zZXJ0OiBhbnkgPSB7XG4gICAgLi4udXBkYXRlLFxuICAgIF9rZXk6IGZvcm1hdElkLFxuICAgIGFkZGVkOiBub3csXG4gICAgZ3JvdXBJZDogZm9ybWF0R3JvdXBJZCxcbiAgICBwcml2YWN5LFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG4gIGNvbnN0IGRiOiBEYXRhYmFzZSA9IGRhdGFiYXNlO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQU0VSVCB7X2tleTogJHtmb3JtYXRJZH0sIHVzZXJJZDogJHtzZXNzaW9uSWR9fVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGRhdGVkUG9zdDogUG9zdFR5cGUgPSBhd2FpdCBkYi5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSB8fCB7fSk7XG5cbiAgICBjb25zdCB7X2lkOiB1cGRhdGVkUG9zdElkfSA9IHVwZGF0ZWRQb3N0O1xuXG4gICAgaWYodGFncyAmJiB0YWdzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdGFnTmFtZXM6IHN0cmluZ1tdID0gdGFncy5tYXAoKHtuYW1lfSkgPT4gcGFyc2VDaGFyKG5hbWUsIDMyKSk7XG4gICAgICBjb25zdCB0YWdRdWVyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHQgSU4gdGFnc1xuICAgICAgICBGSUxURVIgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeSh0YWdOYW1lcyl9LCB0Lm5hbWUpXG4gICAgICAgIFJFVFVSTiB0YDtcblxuICAgICAgY29uc3QgZXhpc3RpbmdUYWdzID0gYXdhaXQgZGIucXVlcnkodGFnUXVlcnkpLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG4gICAgICBjb25zdCB0YWdJZHM6IHN0cmluZ1tdID0gZXhpc3RpbmdUYWdzLm1hcCgoe19pZDogdGFnSWR9KSA9PiB0YWdJZCk7XG4gICAgICBhd2FpdCBsaW5rVGFncyhkYiwgdGFnSWRzLCB1cGRhdGVkUG9zdElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlIGxpbmtlZCB0YWdzXG4gICAgICBjb25zdCB0YWdMaXN0ID0gYXdhaXQgZXh0cmFjdFRhZ3MoZGIsIHVwZGF0ZWRQb3N0SWQsIHVwZGF0ZS5jb250ZW50IHx8ICcnKSB8fCBbXTtcbiAgICAgIHVwZGF0ZWRQb3N0LnRhZ3MgPSB0YWdMaXN0O1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsaW5rZWQgZmlsZXNcbiAgICBjb25zdCBmaWxlczogRmlsZVR5cGVbXSA9IHVwZGF0ZWRQb3N0LmZpbGVzIHx8IFtdO1xuXG4gICAgaWYoZmlsZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBmaWxlTGlzdCA9IGF3YWl0IHVwZGF0ZUZpbGVzKGRiLCBmb3JtYXRJZCwgZmlsZXMpIHx8IFtdO1xuICAgICAgdXBkYXRlZFBvc3QuZmlsZXMgPSBmaWxlTGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlZFBvc3QuZmlsZXMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZFBvc3Q7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVBvc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdElkOiBzdHJpbmcpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gZGF0YWJhc2U7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgICAgRklMVEVSIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH0gJiYgcC51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgaWYocG9zdCkge1xuICAgICAgICAvLyBSZW1vdmUgdGFnIGxpbmtzXG4gICAgICAgIGNvbnN0IGVkZ2VBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIGlzVGFnZ2VkXG4gICAgICAgICAgICBGSUxURVIgdC5fdG8gPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICAgICAgICBSRU1PVkUgdCBJTiBpc1RhZ2dlZGA7XG5cbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KGVkZ2VBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGF0dGFjaGVkIGZpbGVzXG4gICAgICAgICAgICBjb25zdCBmaWxlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZiBJTiBoYXNGaWxlXG4gICAgICAgICAgICAgICAgRklMVEVSIGYuX3RvID09ICR7Zm9ybWF0SXRlbUlkfVxuICAgICAgICAgICAgICAgIFJFTU9WRSBmIElOIGhhc0ZpbGVgO1xuXG4gICAgICAgICAgICByZXR1cm4gZGIucXVlcnkoZmlsZUFxbFFyeSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gcG9zdClcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYW5Qb3N0cyA9IChkYXRhYmFzZTogRGF0YWJhc2UpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAvLyBSZW1vdmUgYWxsIG1lc3NhZ2VzIHRoYXQgYXJlIG92ZXIgNjAgZGF5cyBhbmQgbm90IHNhdmVkXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHAgSU4gcG9zdHNcbiAgICAgIEZJTFRFUiBwLmFkZGVkIDwgREFURV9USU1FU1RBTVAoREFURV9TVUJUUkFDVChEQVRFX05PVygpLCA2MCwgJ2RheScpKSAmJiBwLnR5cGUgPT0gXCJkZWZhdWx0XCJcbiAgICAgIFJFTU9WRSBwIElOIHBvc3RzXG4gICAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHJlc3VsdHM6IFBvc3RUeXBlW10gPSBbXSkgPT4gcmVzdWx0cy5sZW5ndGgpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvc3RFZGdlID0gKGRiOiBEYXRhYmFzZSwgZmlsZTogRmlsZVR5cGUsIHBvc3RJZDogc3RyaW5nKTogUHJvbWlzZTxGaWxlVHlwZT4gPT4ge1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSBkYi5jb2xsZWN0aW9uKCdpc1Bvc3RlZCcpO1xuICBjb25zdCB7ZmlsZUlkfSA9IGZpbGU7XG4gIGNvbnN0IGZvcm1hdEZpbGVJZDogc3RyaW5nID0gcGFyc2VJZChmaWxlSWQpO1xuICBjb25zdCBlZGdlSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYGZpbGUtJHtwb3N0SWR9LSR7Zm9ybWF0RmlsZUlkfWApO1xuICBjb25zdCBmb3JtYXRQb3N0SWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcbiAgY29uc3QgZmlsZVR5cGU6IHN0cmluZyA9IHBhcnNlQ2hhcihmaWxlLmZpbGVUeXBlLCAxNik7XG5cbiAgY29uc3QgZWRnZTogYW55ID0ge1xuICAgIF9mcm9tOiBgcG9zdHMvJHtmb3JtYXRQb3N0SWR9YCxcbiAgICBfa2V5OiBlZGdlSWQsXG4gICAgX3RvOiBgZmlsZXMvJHtmb3JtYXRGaWxlSWR9YCxcbiAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICB0eXBlOiBmaWxlVHlwZVxuICB9O1xuXG4gIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KVxuICAgIC50aGVuKCgpID0+IGZpbGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUEsbUJBQWtGO0FBQ2xGLHNCQUE0QjtBQU01QixJQUFBQSxnQkFBaUM7QUFDakMsbUJBQTBCO0FBQzFCLGtCQUFvQztBQUVwQyxNQUFNLHFCQUE2QjtBQUNuQyxNQUFNLGdCQUF3QjtBQUV2QixNQUFNLG1CQUFtQixDQUFDLFVBQXVCLENBQUMsTUFBTTtBQUM3RCxRQUFNO0FBQUEsSUFDSixPQUFPO0FBQUEsSUFDUCxXQUFXO0FBQUEsSUFDWCxZQUFZO0FBQUEsSUFDWixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVCxJQUFJO0FBRUosU0FBTztBQUFBLElBQ0wsY0FBVSx1QkFBUyxVQUFVLEVBQUU7QUFBQSxJQUMvQixXQUFPLHdCQUFTLE1BQU0sRUFBRTtBQUFBLElBQ3hCLGVBQVcsdUJBQVMsV0FBVyxFQUFFO0FBQUEsSUFDakMsVUFBTSx3QkFBVSxNQUFNLEVBQUU7QUFBQSxFQUMxQjtBQUNGO0FBRU8sTUFBTSxrQkFBa0IsQ0FBQyxRQUFrQixjQUNoRCxPQUFPLE9BQU8sQ0FBQyxTQUFjLFVBQWtCO0FBQzdDLFVBQU8sT0FBTztBQUFBLElBQ1osS0FBSyxXQUFXO0FBQ2QsY0FBUSxRQUFRLEtBQUs7QUFBQTtBQUFBLDhF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VUFBVSxFQUN2QixLQUFLLE1BQU07QUFFVixjQUFNLGFBQXVCO0FBQUEsa0NBQ1AsWUFBWTtBQUFBO0FBR2xDLGVBQU8sR0FBRyxNQUFNLFVBQVUsRUFDdkIsS0FBSyxNQUFNLElBQUksRUFDZixNQUFNLENBQUMsVUFBaUI7QUFDdkIsZ0JBQU07QUFBQSxRQUNSLENBQUM7QUFBQSxNQUNMLENBQUMsRUFDQSxNQUFNLENBQUMsVUFBaUI7QUFDdkIsY0FBTTtBQUFBLE1BQ1IsQ0FBQztBQUFBLElBQ0w7QUFDQSxXQUFPLENBQUM7QUFBQSxFQUNWLENBQUMsRUFDQSxNQUFNLENBQUMsVUFBaUI7QUFDdkIsVUFBTTtBQUFBLEVBQ1IsQ0FBQztBQUNMO0FBRU8sTUFBTSxhQUFhLENBQUMsYUFBd0M7QUFFakUsUUFBTSxTQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUt6QixTQUFPLFNBQVMsTUFBTSxNQUFNLEVBQ3pCLEtBQUssQ0FBQyxXQUF3QixPQUFPLElBQUksQ0FBQyxFQUMxQyxLQUFLLENBQUMsVUFBc0IsQ0FBQyxNQUFNLFFBQVEsTUFBTSxFQUNqRCxNQUFNLENBQUMsVUFBaUI7QUFDdkIsVUFBTTtBQUFBLEVBQ1IsQ0FBQztBQUNMO0FBRU8sTUFBTSxpQkFBaUIsQ0FBQyxJQUFjLE1BQWdCLFdBQXNDO0FBQ2pHLFFBQU0saUJBQWlDLEdBQUcsV0FBVyxVQUFVO0FBQy9ELFFBQU0sRUFBQyxPQUFNLElBQUk7QUFDakIsUUFBTSxtQkFBdUIsc0JBQVEsTUFBTTtBQUMzQyxRQUFNLGFBQWlCLHlCQUFXLFFBQVEsTUFBTSxJQUFJLFlBQVksRUFBRTtBQUNsRSxRQUFNLG1CQUF1QixzQkFBUSxNQUFNO0FBQzNDLFFBQU0sZUFBbUIsd0JBQVUsS0FBSyxVQUFVLEVBQUU7QUFFcEQsUUFBTSxPQUFZO0FBQUEsSUFDaEIsT0FBTyxTQUFTLFlBQVk7QUFBQSxJQUM1QixNQUFNO0FBQUEsSUFDTixLQUFLLFNBQVMsWUFBWTtBQUFBLElBQzFCLE9BQU8sS0FBSyxJQUFJO0FBQUEsSUFDaEIsTUFBTTtBQUFBLEVBQ1I7QUFFQSxTQUFPLGVBQWUsS0FBSyxNQUFNLEVBQUMsV0FBVyxLQUFJLENBQUMsRUFDL0MsS0FBSyxNQUFNLElBQUksRUFDZixNQUFNLENBQUMsVUFBaUI7QUFDdkIsVUFBTTtBQUFBLEVBQ1IsQ0FBQztBQUNMOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfdXRpbHMiLCAibmFtZSJdCn0K