velocious 1.0.596 → 1.0.597

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 (106) hide show
  1. package/README.md +16 -0
  2. package/build/background-jobs/pooled-runner-broker-identity.js +22 -4
  3. package/build/background-jobs/store.js +383 -9
  4. package/build/background-jobs/types.js +1 -0
  5. package/build/cli/commands/db/tenants/migrations/pending.js +45 -0
  6. package/build/configuration-types.js +3 -0
  7. package/build/configuration.js +5 -2
  8. package/build/database/drivers/sqlite/base.js +3 -3
  9. package/build/database/tenants/migration-pending-inspector.js +77 -0
  10. package/build/environment-handlers/base.js +8 -0
  11. package/build/environment-handlers/node.js +14 -0
  12. package/build/mailer/backends/resend-smtp.js +121 -0
  13. package/build/mailer/base.js +52 -22
  14. package/build/mailer/delivery-operation-store.js +152 -0
  15. package/build/mailer/delivery-operation.js +205 -0
  16. package/build/mailer/delivery.js +9 -4
  17. package/build/mailer/index.js +5 -1
  18. package/build/mailer.js +6 -1
  19. package/build/src/background-jobs/pooled-runner-broker-identity.d.ts +10 -1
  20. package/build/src/background-jobs/pooled-runner-broker-identity.d.ts.map +1 -1
  21. package/build/src/background-jobs/pooled-runner-broker-identity.js +23 -5
  22. package/build/src/background-jobs/store.d.ts +154 -0
  23. package/build/src/background-jobs/store.d.ts.map +1 -1
  24. package/build/src/background-jobs/store.js +350 -10
  25. package/build/src/background-jobs/types.d.ts +5 -0
  26. package/build/src/background-jobs/types.d.ts.map +1 -1
  27. package/build/src/background-jobs/types.js +2 -1
  28. package/build/src/cli/commands/db/tenants/migrations/pending.d.ts +15 -0
  29. package/build/src/cli/commands/db/tenants/migrations/pending.d.ts.map +1 -0
  30. package/build/src/cli/commands/db/tenants/migrations/pending.js +40 -0
  31. package/build/src/configuration-types.d.ts +20 -0
  32. package/build/src/configuration-types.d.ts.map +1 -1
  33. package/build/src/configuration-types.js +4 -1
  34. package/build/src/configuration.d.ts +2 -2
  35. package/build/src/configuration.d.ts.map +1 -1
  36. package/build/src/configuration.js +6 -3
  37. package/build/src/database/drivers/sqlite/base.js +4 -4
  38. package/build/src/database/tenants/migration-pending-inspector.d.ts +38 -0
  39. package/build/src/database/tenants/migration-pending-inspector.d.ts.map +1 -0
  40. package/build/src/database/tenants/migration-pending-inspector.js +70 -0
  41. package/build/src/environment-handlers/base.d.ts +10 -0
  42. package/build/src/environment-handlers/base.d.ts.map +1 -1
  43. package/build/src/environment-handlers/base.js +8 -1
  44. package/build/src/environment-handlers/node.d.ts +11 -0
  45. package/build/src/environment-handlers/node.d.ts.map +1 -1
  46. package/build/src/environment-handlers/node.js +14 -1
  47. package/build/src/mailer/backends/resend-smtp.d.ts +43 -0
  48. package/build/src/mailer/backends/resend-smtp.d.ts.map +1 -0
  49. package/build/src/mailer/backends/resend-smtp.js +106 -0
  50. package/build/src/mailer/base.d.ts +9 -2
  51. package/build/src/mailer/base.d.ts.map +1 -1
  52. package/build/src/mailer/base.js +41 -19
  53. package/build/src/mailer/delivery-operation-store.d.ts +52 -0
  54. package/build/src/mailer/delivery-operation-store.d.ts.map +1 -0
  55. package/build/src/mailer/delivery-operation-store.js +130 -0
  56. package/build/src/mailer/delivery-operation.d.ts +73 -0
  57. package/build/src/mailer/delivery-operation.d.ts.map +1 -0
  58. package/build/src/mailer/delivery-operation.js +185 -0
  59. package/build/src/mailer/delivery.d.ts +4 -2
  60. package/build/src/mailer/delivery.d.ts.map +1 -1
  61. package/build/src/mailer/delivery.js +9 -5
  62. package/build/src/mailer/index.d.ts +24 -1
  63. package/build/src/mailer/index.d.ts.map +1 -1
  64. package/build/src/mailer/index.js +6 -2
  65. package/build/src/mailer.d.ts +11 -13
  66. package/build/src/mailer.d.ts.map +1 -1
  67. package/build/src/mailer.js +7 -2
  68. package/build/src/sync/local-mutation-log.d.ts +5 -5
  69. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  70. package/build/src/sync/local-mutation-log.js +34 -10
  71. package/build/src/sync/stable-json.d.ts +1 -8
  72. package/build/src/sync/stable-json.d.ts.map +1 -1
  73. package/build/src/sync/stable-json.js +2 -27
  74. package/build/src/sync/sync-envelope-replay-service.d.ts +3 -2
  75. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  76. package/build/src/sync/sync-envelope-replay-service.js +12 -8
  77. package/build/src/utils/stable-json.d.ts +7 -0
  78. package/build/src/utils/stable-json.d.ts.map +1 -0
  79. package/build/src/utils/stable-json.js +25 -0
  80. package/build/sync/local-mutation-log.js +37 -6
  81. package/build/sync/stable-json.js +1 -28
  82. package/build/sync/sync-envelope-replay-service.js +11 -7
  83. package/build/tsconfig.tsbuildinfo +1 -1
  84. package/build/utils/stable-json.js +26 -0
  85. package/package.json +1 -1
  86. package/src/background-jobs/pooled-runner-broker-identity.js +22 -4
  87. package/src/background-jobs/store.js +383 -9
  88. package/src/background-jobs/types.js +1 -0
  89. package/src/cli/commands/db/tenants/migrations/pending.js +45 -0
  90. package/src/configuration-types.js +3 -0
  91. package/src/configuration.js +5 -2
  92. package/src/database/drivers/sqlite/base.js +3 -3
  93. package/src/database/tenants/migration-pending-inspector.js +77 -0
  94. package/src/environment-handlers/base.js +8 -0
  95. package/src/environment-handlers/node.js +14 -0
  96. package/src/mailer/backends/resend-smtp.js +121 -0
  97. package/src/mailer/base.js +52 -22
  98. package/src/mailer/delivery-operation-store.js +152 -0
  99. package/src/mailer/delivery-operation.js +205 -0
  100. package/src/mailer/delivery.js +9 -4
  101. package/src/mailer/index.js +5 -1
  102. package/src/mailer.js +6 -1
  103. package/src/sync/local-mutation-log.js +37 -6
  104. package/src/sync/stable-json.js +1 -28
  105. package/src/sync/sync-envelope-replay-service.js +11 -7
  106. package/src/utils/stable-json.js +26 -0
@@ -741,8 +741,9 @@ export default class SyncEnvelopeReplayService {
741
741
  * Projects affected mutation fields through the resource's readable
742
742
  * attribute contract. Writable-but-hidden fields are omitted, while custom
743
743
  * `<attribute>Attribute(model)` serializers and model accessors remain the
744
- * source of frontend-visible values. The full model attribute hash is never
745
- * exposed.
744
+ * source of frontend-visible values (Date values are kept raw so the normal
745
+ * frontend-model transport serializer can emit its date marker). The full
746
+ * model attribute hash is never exposed.
746
747
  * @param {object} args - Projection args.
747
748
  * @param {Record<string, ReturnType<typeof JSON.parse>>} args.attributes - Permitted affected mutation attributes.
748
749
  * @param {import("../database/record/index.js").default} args.existingRecord - Authorized server record.
@@ -776,16 +777,16 @@ export default class SyncEnvelopeReplayService {
776
777
  continue;
777
778
  const resourceAttribute = resource.resourceMethod(`${attributeName}Attribute`);
778
779
  if (resourceAttribute) {
779
- serializedAttributes[affectedField] = normalizeConflictValue(await resourceAttribute.method.call(resourceAttribute.resource, existingRecord));
780
+ serializedAttributes[affectedField] = await resourceAttribute.method.call(resourceAttribute.resource, existingRecord);
780
781
  continue;
781
782
  }
782
783
  const recordMethods = /** @type {Record<string, ReturnType<typeof JSON.parse>>} */ ( /** @type {unknown} */(existingRecord));
783
784
  const attributeMethod = recordMethods[attributeName];
784
785
  if (typeof attributeMethod === "function") {
785
- serializedAttributes[affectedField] = normalizeConflictValue(await attributeMethod.call(existingRecord));
786
+ serializedAttributes[affectedField] = await attributeMethod.call(existingRecord);
786
787
  }
787
788
  else {
788
- serializedAttributes[affectedField] = normalizeConflictValue(existingRecord.readAttribute(attributeName));
789
+ serializedAttributes[affectedField] = existingRecord.readAttribute(attributeName);
789
790
  }
790
791
  }
791
792
  return serializedAttributes;
@@ -1019,8 +1020,11 @@ export function syncReplayConflictLockName({ resourceId, resourceType }) {
1019
1020
  return `vsr:${hash}`;
1020
1021
  }
1021
1022
  /**
1022
- * Normalizes an authoritative conflict value for JSON transport and deterministic comparison.
1023
- * @param {ReturnType<typeof JSON.parse>} value - Raw value from a database record.
1023
+ * Normalizes a version value for deterministic comparison and transport.
1024
+ * Only version values participate in stable-JSON comparison against client
1025
+ * `baseVersion` strings; resource serializer/accessor results must stay raw so
1026
+ * the frontend-model transport serializer can retain Date markers.
1027
+ * @param {ReturnType<typeof JSON.parse>} value - Raw version value from a database record.
1024
1028
  * @returns {ReturnType<typeof JSON.parse>} - Normalized value (Date values become ISO strings).
1025
1029
  */
1026
1030
  function normalizeConflictValue(value) {
@@ -1028,4 +1032,4 @@ function normalizeConflictValue(value) {
1028
1032
  return value.toISOString();
1029
1033
  return value;
1030
1034
  }
1031
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDM0YsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDMUQsT0FBTyx1QkFBdUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNyRSxPQUFPLG1CQUFtQixNQUFNLGtCQUFrQixDQUFBO0FBQ2xELE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFBO0FBQzlDLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSw0QkFBNEIsRUFBQyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUMzRCxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRDs7Ozs7O0dBTUc7QUFDSDs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8seUJBQXlCO0lBQzVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EyQkc7SUFDSCxZQUFZLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUE7UUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQTtRQUN2QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxD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LFFBQVEsQ0FBQyxjQUFjO1lBQzdCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVTtZQUNoQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDcEMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRO1NBQzdCLENBQUE7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFNO1FBQ2pELDRFQUE0RTtRQUM1RSwrRUFBK0U7UUFDL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTTtRQUU3QixNQUFNLHlCQUF5QixDQUFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQTtJQUNyRyxDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBQztJQUNuRSxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRTdDLE9BQU8sT0FBTyxJQUFJLEVBQUUsQ0FBQTtBQUN0QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsc0JBQXNCLENBQUMsS0FBSztJQUNuQyxJQUFJLEtBQUssWUFBWSxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUE7SUFFckQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGVsaXZlckRlY2xhcmVkQnJvYWRjYXN0cywgdXBzZXJ0U3luY1Jvd30gZnJvbSBcIi4vc3luYy1jaGFuZ2UtZmFub3V0LmpzXCJcbmltcG9ydCB7bWFya1NlcnZlckFwcGx5fSBmcm9tIFwiLi9zeW5jLXB1Ymxpc2gtc3VwcHJlc3Npb24uanNcIlxuaW1wb3J0IHtyZXNvbHZlRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3N9IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiXG5pbXBvcnQge3Jlc29sdmVTeW5jQ29uZmxpY3R9IGZyb20gXCIuL2NvbmZsaWN0LXN0cmF0ZWd5LmpzXCJcbmltcG9ydCBTeW5jUmVwbGF5VXBzZXJ0QXBwbGllciBmcm9tIFwiLi9zeW5jLXJlcGxheS11cHNlcnQtYXBwbGllci5qc1wiXG5pbXBvcnQgc3RhYmxlSnNvblN0cmluZ2lmeSBmcm9tIFwiLi9zdGFibGUtanNvbi5qc1wiXG5pbXBvcnQgc2hhMjU2SGV4IGZyb20gXCIuLi91dGlscy9zaGEyNTYtaGV4LmpzXCJcbmltcG9ydCB7ZGVjb2RlUmVwbGF5UGVyc2lzdGVkRGF0YSwgc2VyaWFsaXplUmVwbGF5UGVyc2lzdGVkRGF0YX0gZnJvbSBcIi4vc3luYy1yZXBsYXktcGVyc2lzdGVkLWRhdGEuanNcIlxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3J9IGZyb20gXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuaW1wb3J0IFZlbG9jaW91c0Vycm9yIGZyb20gXCIuLi92ZWxvY2lvdXMtZXJyb3IuanNcIlxuXG4vKipcbiAqIFJlc29sdmVkIHJvdXRlZC1yZXNvdXJjZSByZWdpc3RyYXRpb24gZm9yIG9uZSByZXBsYXkgcmVzb3VyY2UgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsTmFtZSAtIEVmZmVjdGl2ZSBmcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gcmVzb3VyY2VDbGFzcyAtIFJvdXRlZCByZXNvdXJjZSBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbiB8IG51bGx9IHJlc291cmNlQ29uZmlndXJhdGlvbiAtIE5vcm1hbGl6ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiB3aGVuIHJlZ2lzdHJ5LXJlc29sdmVkLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNSZXBsYXlNdXRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBbYmFzZVZlcnNpb25dIC0gQmFzZSBzZXJ2ZXIvY2xpZW50IHZlcnNpb24gb2JzZXJ2ZWQgYnkgdGhlIGNsaWVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2xpZW50TXV0YXRpb25JZF0gLSBPcmlnaW5hbCBjbGllbnQgbXV0YXRpb24gaWQgZnJvbSB0aGUgc2lnbmVkIGVudmVsb3BlLlxuICogQHByb3BlcnR5IHtEYXRlfSBjbGllbnRVcGRhdGVkQXQgLSBDbGllbnQtc2lkZSBtdXRhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gZGF0YSAtIFBhcnNlZCBtdXRhdGlvbiBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gaWQgLSBDbGllbnQgc3luYyByb3cgaWQgZm9yIHBlci1zeW5jIHJlc3BvbnNlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXNvdXJjZUlkIC0gUmVzb3VyY2UgaWQgYXMgYSBzdHJpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VUeXBlIC0gUmVzb3VyY2UvbW9kZWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXJpYWxpemVkRGF0YSAtIEpTT04gc2VyaWFsaXplZCBtdXRhdGlvbiBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN5bmNUeXBlIC0gU3luYyBvcGVyYXRpb24gdHlwZS5cbiAqL1xuLyoqXG4gKiBPbmUgZGVjbGFyYXRpdmUgYnJvYWRjYXN0IGZhbm5lZCBvdXQgYWZ0ZXIgYSBtdXRhdGlvbiBhcHBsaWVzLlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1JlcGxheUJyb2FkY2FzdFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCAoKGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gc3RyaW5nKX0gY2hhbm5lbCAtIENoYW5uZWwgbmFtZSBvciByZXNvbHZlci5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBicm9hZGNhc3RQYXJhbXMgLSBDaGFubmVsIHJvdXRpbmcgcGFyYW1zLlxuICogQHByb3BlcnR5IHsoYXJnczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYm9keSAtIEJyb2FkY2FzdCBib2R5LlxuICogQHByb3BlcnR5IHsoYXJnczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBib29sZWFufSBbd2hlbl0gLSBPcHRpb25hbCBnYXRlOyBza2lwcGVkIHdoZW4gaXQgcmV0dXJucyBmYWxzZS5cbiAqL1xuXG4vKipcbiAqIFJlcGxheXMgY2xpZW50IHN5bmMgZW52ZWxvcGVzIHRocm91Z2ggcHJvamVjdCBzdXBwbGllZCBhdXRoZW50aWNhdGlvbixcbiAqIGF1dGhvcml6YXRpb24sIGFwcGxpY2F0aW9uLCBhbmQgcGVyc2lzdGVuY2UgaG9va3MuXG4gKlxuICogVGhpcyBpcyBpbnRlbnRpb25hbGx5IHRyYW5zcG9ydC9tb2RlbCBhZ25vc3RpYzogVmVsb2Npb3VzIG93bnMgdGhlIGdlbmVyaWNcbiAqIHJlcGxheSBsb29wLCBub3JtYWxpemF0aW9uLCBzdGFsZS1jbGllbnQgY29tcGFyaXNvbiwgYW5kIHBlci1zeW5jIHJlc3VsdFxuICogc2hhcGUgd2hpbGUgZWFjaCBhcHAgb3ducyBpdHMgdG9rZW4gbG9va3VwLCBtb2RlbCBoYW5kbGVycywgYW5kXG4gKiBkb21haW4gYXV0aG9yaXphdGlvbiBydWxlcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3luYyBlbnZlbG9wZSByZXBsYXkgc2VydmljZS5cbiAgICpcbiAgICogV2hlbiBhIHN5bmMgbW9kZWwgaXMgZ2l2ZW4sIGBmaW5kRXhpc3RpbmdSZXBsYXlTeW5jYCBhbmRcbiAgICogYHBlcnNpc3RSZXBsYXlNdXRhdGlvbmAgZ2V0IG1vZGVsLWJhY2tlZCBkZWZhdWx0IGltcGxlbWVudGF0aW9ucy4gVGhlIHN5bmNcbiAgICogbW9kZWwgbXVzdCBleHBvc2UgYGZpbmRCeWAvYGNyZWF0ZWAgc3RhdGljcyBwbHVzIGluc3RhbmNlXG4gICAqIGBhc3NpZ25gL2BzYXZlYC9gY2xpZW50VXBkYXRlZEF0YCBhbmQgYGFkdmFuY2VTZXJ2ZXJTZXF1ZW5jZWAgKHRoZVxuICAgKiBjaGFuZ2UtZmVlZCBzZXF1ZW5jZSBjb250cmFjdCksIGFuZCB0aGUgYWN0b3IgcmV0dXJuZWQgZnJvbVxuICAgKiBgYXV0aGVudGljYXRlUmVwbGF5YCBtdXN0IGV4cG9zZSBhbiBgaWQoKWAgbWV0aG9kLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gQ29uc3RydWN0b3IgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3tkZWJ1Zz86ICguLi5hcmdzOiBBcnJheTx1bmtub3duPikgPT4gdm9pZCwgd2Fybj86ICguLi5hcmdzOiBBcnJheTx1bmtub3duPikgPT4gdm9pZH19IFthcmdzLmxvZ2dlcl0gLSBMb2dnZXIgdXNlZCBmb3Igbm9ybWFsaXphdGlvbiB3YXJuaW5ncy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW2FyZ3Muc3luY01vZGVsXSAtIFN5bmMvY2hhbmdlIG1vZGVsIGVuYWJsaW5nIG1vZGVsLWJhY2tlZCBkZWZhdWx0IGhvb2tzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uXSAtIFN5bmMgbW9kZWwgY29sdW1uIGxpbmtpbmcgcm93cyB0byB0aGUgcmVwbGF5IGFjdG9yLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbYXJncy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWxdIC0gVG9rZW4gbW9kZWwgZW5hYmxpbmcgdGhlIGRlZmF1bHQgdG9rZW4tbG9va3VwIGF1dGhlbnRpY2F0ZVJlcGxheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5Db2x1bW5dIC0gVG9rZW4gbW9kZWwgY29sdW1uIGhvbGRpbmcgdGhlIHRva2VuLiBEZWZhdWx0cyB0byBcInRva2VuXCIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5hdXRoZW50aWNhdGlvblRva2VuUGFyYW1dIC0gUmVxdWVzdCBwYXJhbSBjYXJyeWluZyB0aGUgdG9rZW4uIERlZmF1bHRzIHRvIFwiYXV0aGVudGljYXRpb25Ub2tlblwiLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsICgoYXJnczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgfCBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFN5bmNSZXBsYXlVcHNlcnRBcHBsaWVyPlswXT59IFthcmdzLmFwcGx5SGFuZGxlcnNdIC0gUGVyLXJlc291cmNlVHlwZSBhcHBseSBoYW5kbGVycyAoZnVuY3Rpb25zIG9yIGRlY2xhcmF0aXZlIHVwc2VydC1hcHBsaWVyIHNwZWNzKSBlbmFibGluZyB0aGUgZGVmYXVsdCBhcHBseVJlcGxheU11dGF0aW9uIGRpc3BhdGNoLiBEZXByZWNhdGVkOiBwcmVmZXIgcmVzb3VyY2Ugcm91dGluZyB2aWEgYGNvbmZpZ3VyYXRpb25gL2ByZXNvdXJjZVR5cGVPdmVycmlkZXNgOyBhcHBseUhhbmRsZXJzIHJlbWFpbiBmb3IgcmVsZWFzZWQgYWRvcHRlcnMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciB0aGVpciBtaWdyYXRpb24uXG4gICAqIEBwYXJhbSB7KGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbYXJncy5wZXJzaXN0RXh0cmFBdHRyaWJ1dGVzXSAtIEV4dHJhIGF0dHJpYnV0ZXMgbWVyZ2VkIGludG8gdGhlIG1vZGVsLWJhY2tlZCBwZXJzaXN0ZWQgcm93IChlLmcuIGFuIGV2ZW50IHNjb3BlIGNvbHVtbikuXG4gICAqIEBwYXJhbSB7KGFyZ3M6IHttdXRhdGlvbjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGFwcGx5UmVzdWx0OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0pID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbYXJncy5wZXJzaXN0U2VyaWFsaXplZERhdGFdIC0gT3ZlcnJpZGVzIHRoZSBwZXJzaXN0ZWQgZGF0YSBwYXlsb2FkIChvYmplY3QgcmVzdWx0cyBhcmUgSlNPTiBzdHJpbmdpZmllZCkuXG4gICAqIEBwYXJhbSB7KGJyb2FkY2FzdDoge2NoYW5uZWw6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGJvZHk6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSkgPT4gUHJvbWlzZTx2b2lkPn0gW2FyZ3MuYnJvYWRjYXN0ZXJdIC0gRGVsaXZlcnMgZGVjbGFyYXRpdmUgYnJvYWRjYXN0cy4gUmVxdWlyZWQgd2hlbiBicm9hZGNhc3RzIGFyZSBjb25maWd1cmVkLlxuICAgKiBAcGFyYW0ge1N5bmNSZXBsYXlCcm9hZGNhc3RbXX0gW2FyZ3MuYnJvYWRjYXN0c10gLSBCcm9hZGNhc3RzIGZhbm5lZCBvdXQgYnkgdGhlIGRlZmF1bHQgYWZ0ZXJSZXBsYXlNdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiB3aG9zZSBmcm9udGVuZC1tb2RlbCByZWdpc3RyeSByb3V0ZXMgbXV0YXRpb25zIHRvIHJlc291cmNlIGNsYXNzZXMuXG4gICAqIEBwYXJhbSB7e3N0cmF0ZWd5PzogXCJvcHRpbWlzdGljVmVyc2lvblwiIHwgXCJzZXJ2ZXJXaW5zXCIsIHZlcnNpb25BdHRyaWJ1dGU6IHN0cmluZ30gfCBudWxsfSBbYXJncy5jb25mbGljdFN0cmF0ZWd5XSAtIE9wdGlvbmFsIGJhc2UtdmVyc2lvbiBjb25mbGljdCBkZXRlY3Rpb24gZm9yIHJvdXRlZCB1cHNlcnRzLiBPbmx5IGBvcHRpbWlzdGljVmVyc2lvbmAgYW5kIGBzZXJ2ZXJXaW5zYCBhcmUgc3VwcG9ydGVkIGZvciBiYWNrZW5kIHJlcGxheSBiZWNhdXNlIHRoZSBzZXJ2ZXIgZG9lcyBub3QgaGF2ZSB0aGUgY2xpZW50J3MgYmFzZSBzbmFwc2hvdC4gV2hlbiBgc3RyYXRlZ3lgIGlzIG9taXR0ZWQgaXQgZGVmYXVsdHMgdG8gYG9wdGltaXN0aWNWZXJzaW9uYCwgbWF0Y2hpbmcgYHJlc29sdmVTeW5jQ29uZmxpY3RgIGFuZCBub3JtYWxpemVkIHJlc291cmNlIGNvbmZpZy4gV2hlbiBjb25maWd1cmVkLCBhIG11dGF0aW9uIHdob3NlIGJhc2VWZXJzaW9uIGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IHNlcnZlciB2ZXJzaW9uQXR0cmlidXRlIGlzIHJlamVjdGVkIHdpdGggYSBzdHJ1Y3R1cmVkIGNvbmZsaWN0IHJlc3VsdCBpbnN0ZWFkIG9mIGJlaW5nIGFwcGxpZWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBzdHJpbmc+fSBbYXJncy5yZXNvdXJjZVR5cGVPdmVycmlkZXNdIC0gUGVyLXJlc291cmNlVHlwZSByb3V0aW5nIG92ZXJyaWRlczogYSByZXNvdXJjZSBjbGFzcywgb3IgYSBzdHJpbmcgYWxpYXMgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHR9IFthcmdzLmFiaWxpdHldIC0gQWJpbGl0eSBzY29waW5nIHJvdXRlZCByZWNvcmQgbG9va3VwcyBhbmQgY3JlYXRlIG1lbWJlcnNoaXAgY2hlY2tzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW2FyZ3MuYWJpbGl0eUNvbnRleHRdIC0gQWJpbGl0eSBjb250ZXh0IHBhc3NlZCB0byByb3V0ZWQgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW2FyZ3MubG9jYWxzXSAtIExvY2FscyBwYXNzZWQgdG8gcm91dGVkIHJlc291cmNlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyID0gYXJncy5sb2dnZXIgfHwgY29uc29sZVxuICAgIHRoaXMuc3luY01vZGVsID0gYXJncy5zeW5jTW9kZWwgfHwgbnVsbFxuICAgIHRoaXMuYWN0b3JGb3JlaWduS2V5Q29sdW1uID0gYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW4gfHwgXCJhdXRoZW50aWNhdGlvbl90b2tlbl9pZFwiXG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWwgPSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbCB8fCBudWxsXG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblRva2VuQ29sdW1uID0gYXJncy5hdXRoZW50aWNhdGlvblRva2VuQ29sdW1uIHx8IFwidG9rZW5cIlxuICAgIHRoaXMuYXV0aGVudGljYXRpb25Ub2tlblBhcmFtID0gYXJncy5hdXRoZW50aWNhdGlvblRva2VuUGFyYW0gfHwgXCJhdXRoZW50aWNhdGlvblRva2VuXCJcbiAgICB0aGlzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMgPSBhcmdzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMgfHwgbnVsbFxuICAgIHRoaXMucGVyc2lzdFNlcmlhbGl6ZWREYXRhID0gYXJncy5wZXJzaXN0U2VyaWFsaXplZERhdGEgfHwgbnVsbFxuICAgIHRoaXMuYnJvYWRjYXN0ZXIgPSBhcmdzLmJyb2FkY2FzdGVyIHx8IG51bGxcbiAgICB0aGlzLmJyb2FkY2FzdHMgPSBhcmdzLmJyb2FkY2FzdHMgfHwgbnVsbFxuICAgIHRoaXMuYXBwbHlIYW5kbGVycyA9IGFyZ3MuYXBwbHlIYW5kbGVycyA/IHRoaXMuYnVpbHRBcHBseUhhbmRsZXJzKGFyZ3MuYXBwbHlIYW5kbGVycykgOiBudWxsXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gYXJncy5jb25maWd1cmF0aW9uIHx8IG51bGxcbiAgICB0aGlzLmNvbmZsaWN0U3RyYXRlZ3kgPSBhcmdzLmNvbmZsaWN0U3RyYXRlZ3kgfHwgbnVsbFxuICAgIHRoaXMucmVzb3VyY2VUeXBlT3ZlcnJpZGVzID0gYXJncy5yZXNvdXJjZVR5cGVPdmVycmlkZXMgfHwgbnVsbFxuICAgIHRoaXMuYWJpbGl0eSA9IGFyZ3MuYWJpbGl0eSB8fCBudWxsXG4gICAgdGhpcy5hYmlsaXR5Q29udGV4dCA9IGFyZ3MuYWJpbGl0eUNvbnRleHQgfHwgbnVsbFxuICAgIHRoaXMubG9jYWxzID0gYXJncy5sb2NhbHMgfHwgbnVsbFxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgU3luY1JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uIHwgbnVsbD59ICovXG4gICAgdGhpcy5fcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb25zID0gbmV3IE1hcCgpXG5cbiAgICBpZiAoYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW4gIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIGFyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uICE9PSBcInN0cmluZ1wiIHx8IGFyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uLmxlbmd0aCA8IDEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFjdG9yRm9yZWlnbktleUNvbHVtbiBtdXN0IGJlIGEgbm9uLWJsYW5rIHN0cmluZywgZ290OiAke1N0cmluZyhhcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbil9YClcbiAgICB9XG4gICAgaWYgKHRoaXMuYnJvYWRjYXN0cyAmJiAhdGhpcy5icm9hZGNhc3Rlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSBicm9hZGNhc3RzIHJlcXVpcmUgYSBicm9hZGNhc3RlciBvcHRpb24gZGVsaXZlcmluZyB0aGVtXCIpXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZsaWN0U3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN1cHBvcnRlZENvbmZsaWN0U3RyYXRlZ2llcyA9IG5ldyBTZXQoW1wib3B0aW1pc3RpY1ZlcnNpb25cIiwgXCJzZXJ2ZXJXaW5zXCJdKVxuXG4gICAgICBpZiAoIXRoaXMuY29uZmxpY3RTdHJhdGVneS52ZXJzaW9uQXR0cmlidXRlIHx8IHR5cGVvZiB0aGlzLmNvbmZsaWN0U3RyYXRlZ3kudmVyc2lvbkF0dHJpYnV0ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlIGNvbmZsaWN0U3RyYXRlZ3kgcmVxdWlyZXMgYSBub24tYmxhbmsgdmVyc2lvbkF0dHJpYnV0ZVwiKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uZmxpY3RTdHJhdGVneS5zdHJhdGVneSAhPT0gdW5kZWZpbmVkICYmICFzdXBwb3J0ZWRDb25mbGljdFN0cmF0ZWdpZXMuaGFzKHRoaXMuY29uZmxpY3RTdHJhdGVneS5zdHJhdGVneSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzeW5jIGNvbmZsaWN0IHN0cmF0ZWd5IGZvciBiYWNrZW5kIHJlcGxheTogJHt0aGlzLmNvbmZsaWN0U3RyYXRlZ3kuc3RyYXRlZ3l9LiBPbmx5IG9wdGltaXN0aWNWZXJzaW9uIGFuZCBzZXJ2ZXJXaW5zIGFyZSBzdXBwb3J0ZWQuYClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JhcHMgZGVjbGFyYXRpdmUgYXBwbHktaGFuZGxlciBzcGVjcyBpbiB1cHNlcnQgYXBwbGllcnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcHBseUhhbmRsZXJzIC0gUmF3IGFwcGx5IGhhbmRsZXJzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgKGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBDYWxsYWJsZSBoYW5kbGVycyBieSByZXNvdXJjZSB0eXBlLlxuICAgKi9cbiAgYnVpbHRBcHBseUhhbmRsZXJzKGFwcGx5SGFuZGxlcnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGFwcGx5SGFuZGxlcnMpLm1hcCgoW3Jlc291cmNlVHlwZSwgaGFuZGxlcl0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gW3Jlc291cmNlVHlwZSwgaGFuZGxlcl1cblxuICAgICAgY29uc3QgYXBwbGllciA9IG5ldyBTeW5jUmVwbGF5VXBzZXJ0QXBwbGllcihoYW5kbGVyKVxuXG4gICAgICByZXR1cm4gW3Jlc291cmNlVHlwZSwgKC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyBhcHBseUFyZ3MpID0+IGFwcGxpZXIuYXBwbHkoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGFwcGx5QXJncykpXVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgYSBzeW5jIGJhdGNoLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMgY2FycnlpbmcgYXV0aGVudGljYXRpb24gYW5kIHN5bmNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW3JlcXVlc3RTdGF0ZV0gLSBSZXF1ZXN0LWxvY2FsIHN0YXRlIHBhc3NlZCB0byBhdXRoZW50aWNhdGlvbi9zeW5jIGV4dHJhY3Rpb24gaG9va3M7IHN1YmNsYXNzZXMgbWF5IHVzZSB0aGlzIHRvIHNoYXJlIHByZS1jb21wdXRlZCBwZXItcmVxdWVzdCBkYXRhIHdpdGhvdXQgaW5zdGFuY2UgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Piwgc3RhdHVzPzogc3RyaW5nLCBlcnJvckNvZGU/OiBzdHJpbmcsIGVycm9yTWVzc2FnZT86IHN0cmluZ30+fSBSZXBsYXkgcmVzcG9uc2UuXG4gICAqL1xuICBhc3luYyByZXBsYXkocGFyYW1zLCByZXF1ZXN0U3RhdGUgPSB7fSkge1xuICAgIGNvbnN0IGFjdG9yUmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoZW50aWNhdGVSZXBsYXkocGFyYW1zLCByZXF1ZXN0U3RhdGUpXG5cbiAgICBpZiAoIWFjdG9yUmVzdWx0LmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN5bmNzOiBbXSxcbiAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgIGVycm9yQ29kZTogYWN0b3JSZXN1bHQuZXJyb3JDb2RlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGFjdG9yUmVzdWx0LmVycm9yTWVzc2FnZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN5bmNSZXNwb25zZXMgPSBbXVxuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmJ1aWxkUmVwbGF5Q29udGV4dCh7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBwYXJhbXMsIHJlcXVlc3RTdGF0ZX0pXG5cbiAgICBmb3IgKGNvbnN0IHJhd1N5bmMgb2YgdGhpcy5yZXBsYXlTeW5jcyhwYXJhbXMsIHJlcXVlc3RTdGF0ZSkpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXN1bHQgPSB0aGlzLm5vcm1hbGl6ZVJlcGxheVN5bmMocmF3U3luYylcblxuICAgICAgaWYgKCFub3JtYWxpemVkUmVzdWx0Lm9rKSB7XG4gICAgICAgIHN5bmNSZXNwb25zZXMucHVzaChub3JtYWxpemVkUmVzdWx0LnJlc3BvbnNlKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtdXRhdGlvbiA9IG5vcm1hbGl6ZWRSZXN1bHQubXV0YXRpb25cbiAgICAgIGNvbnN0IGFjY2Vzc1Jlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aG9yaXplUmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgbXV0YXRpb259KVxuXG4gICAgICBpZiAoIWFjY2Vzc1Jlc3VsdC5hbGxvd2VkKSB7XG4gICAgICAgIHN5bmNSZXNwb25zZXMucHVzaCh7XG4gICAgICAgICAgaWQ6IG11dGF0aW9uLmlkLFxuICAgICAgICAgIHN5bmNTdGF0ZTogXCJmYWlsZWRcIixcbiAgICAgICAgICByZWFzb246IGFjY2Vzc1Jlc3VsdC5yZWFzb24gfHwgXCJhY2Nlc3MtZGVuaWVkXCJcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhpc3RpbmdTeW5jID0gYXdhaXQgdGhpcy5maW5kRXhpc3RpbmdSZXBsYXlTeW5jKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIG11dGF0aW9ufSlcbiAgICAgIGNvbnN0IHNob3VsZEFwcGx5ID0gYXdhaXQgdGhpcy5zaG91bGRBcHBseVJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KVxuICAgICAgY29uc3QgZHVwbGljYXRlID0gIXNob3VsZEFwcGx5ICYmIHRoaXMuaXNEdXBsaWNhdGVSZXBsYXlNdXRhdGlvbih7ZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pXG5cbiAgICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59ICovXG4gICAgICBsZXQgYXBwbHlSZXN1bHRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlSZXN1bHQgPSBzaG91bGRBcHBseVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5hcHBseVJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5za2lwcGVkUmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBDbGllbnQtc2FmZSBhcHBseSBmYWlsdXJlcyAoc2NoZW1hIHZhbGlkYXRpb24sIG1vZGVsIHZhbGlkYXRpb24sXG4gICAgICAgIC8vIGF1dGhvcml6YXRpb24gZGVuaWFscywgdW5rbm93biByZXNvdXJjZSB0eXBlcykgZmFpbCB0aGlzIHN5bmMgYW5kXG4gICAgICAgIC8vIGtlZXAgdGhlIGJhdGNoIGdvaW5nOyB1bmV4cGVjdGVkIGVycm9ycyBrZWVwIHByb3BhZ2F0aW5nLlxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNFcnJvciAmJiBlcnJvci5zYWZlVG9FeHBvc2UpIHtcbiAgICAgICAgICBzeW5jUmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgICAgaWQ6IG11dGF0aW9uLmlkLFxuICAgICAgICAgICAgc3luY1N0YXRlOiBcImZhaWxlZFwiLFxuICAgICAgICAgICAgcmVhc29uOiBlcnJvci5jb2RlIHx8IFwiYXBwbHktZmFpbGVkXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGx5UmVzdWx0ICYmIGFwcGx5UmVzdWx0LnN0YXR1cyA9PT0gXCJjb25mbGljdFwiKSB7XG4gICAgICAgIHN5bmNSZXNwb25zZXMucHVzaCh7XG4gICAgICAgICAgY29uZmxpY3Q6IGFwcGx5UmVzdWx0LmNvbmZsaWN0LFxuICAgICAgICAgIGlkOiBtdXRhdGlvbi5pZCxcbiAgICAgICAgICBzeW5jU3RhdGU6IFwiY29uZmxpY3RcIlxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3RSZXBsYXlNdXRhdGlvbih7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIGFwcGx5UmVzdWx0LCBtdXRhdGlvbiwgc2hvdWxkQXBwbHl9KVxuICAgICAgYXdhaXQgdGhpcy5hZnRlclJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgYXBwbHlSZXN1bHQsIG11dGF0aW9uLCBzaG91bGRBcHBseX0pXG5cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgICAgY29uc3Qgc3VjY2Vzc2Z1bFJlc3BvbnNlID0ge2lkOiBtdXRhdGlvbi5pZCwgc3luY1N0YXRlOiBkdXBsaWNhdGUgPyBcImR1cGxpY2F0ZVwiIDogXCJzdWNjZXNzZnVsXCJ9XG5cbiAgICAgIGNvbnN0IHBlcnNpc3RlZFJlcGxheU1ldGFkYXRhID0gZHVwbGljYXRlID8gdGhpcy5yZXBsYXlQZXJzaXN0ZWRNZXRhZGF0YShleGlzdGluZ1N5bmMpIDogbnVsbFxuXG4gICAgICBpZiAocGVyc2lzdGVkUmVwbGF5TWV0YWRhdGEpIHtcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlLnNlcnZlclZlcnNpb24gPSBwZXJzaXN0ZWRSZXBsYXlNZXRhZGF0YS5hY2tub3dsZWRnZW1lbnRWZXJzaW9uXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmxpY3RTdHJhdGVneSAmJiBtdXRhdGlvbi5iYXNlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGFwcGx5UmVzdWx0Py5yZWNvcmQpIHtcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlLnNlcnZlclZlcnNpb24gPSBub3JtYWxpemVDb25mbGljdFZhbHVlKGFwcGx5UmVzdWx0LnJlY29yZC5yZWFkQXR0cmlidXRlKHRoaXMuY29uZmxpY3RTdHJhdGVneS52ZXJzaW9uQXR0cmlidXRlKSlcbiAgICAgIH1cblxuICAgICAgc3luY1Jlc3BvbnNlcy5wdXNoKHN1Y2Nlc3NmdWxSZXNwb25zZSlcbiAgICB9XG5cbiAgICByZXR1cm4ge3N5bmNzOiBzeW5jUmVzcG9uc2VzfVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZXMgdGhlIHN5bmMgYmF0Y2ggYWN0b3IuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGEgdG9rZW4tbW9kZWwgbG9va3VwIHdoZW4gYGF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbGAgaXNcbiAgICogY29uZmlndXJlZDsgb3RoZXJ3aXNlIGFwcHMgb3ZlcnJpZGUgdGhpcyBob29rLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbX3JlcXVlc3RTdGF0ZV0gLSBSZXF1ZXN0LWxvY2FsIHN0YXRlIHBvcHVsYXRlZCBieSBzdWJjbGFzc2VzIGJlZm9yZSB0aGUgYmFzZSByZXBsYXkgbG9vcCBydW5zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7YXV0aGVudGljYXRlZDogdHJ1ZSwgYWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB8IHthdXRoZW50aWNhdGVkOiBmYWxzZSwgZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogc3RyaW5nfT59IEF1dGggcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgYXV0aGVudGljYXRlUmVwbGF5KHBhcmFtcywgX3JlcXVlc3RTdGF0ZSkge1xuICAgIGlmICghdGhpcy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UuYXV0aGVudGljYXRlUmVwbGF5IG11c3QgYmUgaW1wbGVtZW50ZWQgKG9yIGNvbmZpZ3VyZSBhdXRoZW50aWNhdGlvblRva2VuTW9kZWwpXCIpXG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSBwYXJhbXNbdGhpcy5hdXRoZW50aWNhdGlvblRva2VuUGFyYW1dXG5cbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICByZXR1cm4ge2F1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlcnJvckNvZGU6IFwibWlzc2luZy1hdXRoZW50aWNhdGlvbi10b2tlblwiLCBlcnJvck1lc3NhZ2U6IFwiTWlzc2luZyBhdXRoZW50aWNhdGlvbiB0b2tlblwifVxuICAgIH1cblxuICAgIGNvbnN0IGFjdG9yID0gYXdhaXQgdGhpcy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWwuZmluZEJ5KHtbdGhpcy5hdXRoZW50aWNhdGlvblRva2VuQ29sdW1uXTogdG9rZW59KVxuXG4gICAgaWYgKCFhY3Rvcikge1xuICAgICAgcmV0dXJuIHthdXRoZW50aWNhdGVkOiBmYWxzZSwgZXJyb3JDb2RlOiBcImludmFsaWQtYXV0aGVudGljYXRpb24tdG9rZW5cIiwgZXJyb3JNZXNzYWdlOiBcIkludmFsaWQgYXV0aGVudGljYXRpb24gdG9rZW5cIn1cbiAgICB9XG5cbiAgICByZXR1cm4ge2FjdG9yLCBhdXRoZW50aWNhdGVkOiB0cnVlfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBwZXItYmF0Y2ggbXV0YWJsZSBjb250ZXh0IGZvciBjYWNoZXMgc2hhcmVkIGFjcm9zcyBzeW5jIGl0ZW1zLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHBhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCByZXF1ZXN0U3RhdGU6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IF9hcmdzIC0gQWN0b3IsIHJlcXVlc3QgcGFyYW1zLCBhbmQgcmVxdWVzdC1sb2NhbCBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gUmVwbGF5IGNvbnRleHQuXG4gICAqL1xuICBhc3luYyBidWlsZFJlcGxheUNvbnRleHQoX2FyZ3MpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJhdyBzeW5jIGVudHJpZXMgZnJvbSByZXF1ZXN0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW19yZXF1ZXN0U3RhdGVdIC0gUmVxdWVzdC1sb2NhbCBzdGF0ZSBwb3B1bGF0ZWQgYnkgc3ViY2xhc3NlcyBiZWZvcmUgdGhlIGJhc2UgcmVwbGF5IGxvb3AgcnVucy5cbiAgICogQHJldHVybnMge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gUmF3IHN5bmMgZW50cmllcy5cbiAgICovXG4gIHJlcGxheVN5bmNzKHBhcmFtcywgX3JlcXVlc3RTdGF0ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcmFtcy5zeW5jcykgPyBwYXJhbXMuc3luY3MgOiBbXVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgb25lIHN5bmMgZW50cnkuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJhd1N5bmMgLSBSYXcgc3luYyBlbnRyeS5cbiAgICogQHJldHVybnMge3tvazogdHJ1ZSwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IHwge29rOiBmYWxzZSwgcmVzcG9uc2U6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IE5vcm1hbGl6ZWQgbXV0YXRpb24gb3IgZmFpbGVkIHJlc3BvbnNlLlxuICAgKi9cbiAgbm9ybWFsaXplUmVwbGF5U3luYyhyYXdTeW5jKSB7XG4gICAgaWYgKCFyYXdTeW5jIHx8IHR5cGVvZiByYXdTeW5jICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocmF3U3luYykpIHtcbiAgICAgIHJldHVybiB7b2s6IGZhbHNlLCByZXNwb25zZToge2lkOiB1bmRlZmluZWQsIHN5bmNTdGF0ZTogXCJmYWlsZWRcIiwgcmVhc29uOiBcImludmFsaWQtc3luY1wifX1cbiAgICB9XG5cbiAgICBjb25zdCBzeW5jID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChyYXdTeW5jKVxuICAgIGNvbnN0IHtjbGllbnRNdXRhdGlvbklkLCBjbGllbnRVcGRhdGVkQXQsIGRhdGEsIGlkLCByZXNvdXJjZUlkLCByZXNvdXJjZVR5cGUsIHN5bmNUeXBlfSA9IHN5bmNcblxuICAgIGlmICh0eXBlb2YgcmVzb3VyY2VUeXBlICE9PSBcInN0cmluZ1wiIHx8IHJlc291cmNlVHlwZS5sZW5ndGggPCAxIHx8IHJlc291cmNlSWQgPT09IHVuZGVmaW5lZCB8fCByZXNvdXJjZUlkID09PSBudWxsIHx8IHR5cGVvZiBzeW5jVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCBzeW5jVHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4ge29rOiBmYWxzZSwgcmVzcG9uc2U6IHtpZCwgc3luY1N0YXRlOiBcImZhaWxlZFwiLCByZWFzb246IFwiaW52YWxpZC1yZXNvdXJjZS1pZFwifX1cbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZUlkU3RyaW5nID0gU3RyaW5nKHJlc291cmNlSWQpXG4gICAgbGV0IGNsaWVudFVwZGF0ZWRBdERhdGUgPSB0eXBlb2YgY2xpZW50VXBkYXRlZEF0ID09PSBcInN0cmluZ1wiIHx8IGNsaWVudFVwZGF0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZShjbGllbnRVcGRhdGVkQXQpIDogbmV3IERhdGUoKVxuXG4gICAgaWYgKE51bWJlci5pc05hTihjbGllbnRVcGRhdGVkQXREYXRlLmdldFRpbWUoKSkpIGNsaWVudFVwZGF0ZWRBdERhdGUgPSBuZXcgRGF0ZSgpXG5cbiAgICBjb25zdCBub3JtYWxpemVkRGF0YVJlc3VsdCA9IHRoaXMubm9ybWFsaXplUmVwbGF5U3luY0RhdGEoe2RhdGEsIGlkLCByZXNvdXJjZUlkOiByZXNvdXJjZUlkU3RyaW5nLCByZXNvdXJjZVR5cGV9KVxuXG4gICAgaWYgKCFub3JtYWxpemVkRGF0YVJlc3VsdC5vaykgcmV0dXJuIG5vcm1hbGl6ZWREYXRhUmVzdWx0XG5cbiAgICByZXR1cm4ge1xuICAgICAgb2s6IHRydWUsXG4gICAgICBtdXRhdGlvbjoge1xuICAgICAgICBiYXNlVmVyc2lvbjogc3luYy5iYXNlVmVyc2lvbixcbiAgICAgICAgY2xpZW50TXV0YXRpb25JZCxcbiAgICAgICAgY2xpZW50VXBkYXRlZEF0OiBjbGllbnRVcGRhdGVkQXREYXRlLFxuICAgICAgICBkYXRhOiBub3JtYWxpemVkRGF0YVJlc3VsdC5kYXRhLFxuICAgICAgICBpZCxcbiAgICAgICAgcmVzb3VyY2VJZDogcmVzb3VyY2VJZFN0cmluZyxcbiAgICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgICBzZXJpYWxpemVkRGF0YTogSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZERhdGFSZXN1bHQuZGF0YSksXG4gICAgICAgIHN5bmNUeXBlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgb25lIHN5bmMgZGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge3tkYXRhOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgaWQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCByZXNvdXJjZUlkOiBzdHJpbmcsIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIFN5bmMgcGF5bG9hZCBub3JtYWxpemF0aW9uIGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge3tvazogdHJ1ZSwgZGF0YTogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSB8IHtvazogZmFsc2UsIHJlc3BvbnNlOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSBOb3JtYWxpemVkIHBheWxvYWQgb3IgZmFpbGVkIHJlc3BvbnNlLlxuICAgKi9cbiAgbm9ybWFsaXplUmVwbGF5U3luY0RhdGEoe2RhdGEsIGlkLCByZXNvdXJjZUlkLCByZXNvdXJjZVR5cGV9KSB7XG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSByZXR1cm4ge29rOiB0cnVlLCBkYXRhOiB7fX1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGF0YSlcblxuICAgICAgICBpZiAoIXBhcnNlZERhdGEgfHwgdHlwZW9mIHBhcnNlZERhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShwYXJzZWREYXRhKSkgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YToge319XG5cbiAgICAgICAgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YTogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChwYXJzZWREYXRhKX1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4/LihcIkludmFsaWQgc3luYyBkYXRhIEpTT05cIiwge2Vycm9yLCBpZCwgcmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlfSlcbiAgICAgICAgcmV0dXJuIHtvazogZmFsc2UsIHJlc3BvbnNlOiB7aWQsIHN5bmNTdGF0ZTogXCJmYWlsZWRcIiwgcmVhc29uOiBcImludmFsaWQtZGF0YVwifX1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YToge319XG5cbiAgICByZXR1cm4ge29rOiB0cnVlLCBkYXRhOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKX1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRob3JpemVzIG9uZSBub3JtYWxpemVkIG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBfYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHthbGxvd2VkOiBib29sZWFuLCByZWFzb24/OiBzdHJpbmd9Pn0gQWNjZXNzIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGF1dGhvcml6ZVJlcGxheU11dGF0aW9uKF9hcmdzKSB7XG4gICAgcmV0dXJuIHthbGxvd2VkOiB0cnVlfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBwcmV2aW91c2x5IHN0b3JlZCBzeW5jL2NoYW5nZSByb3cgZm9yIHN0YWxlLWNsaWVudCBjb21wYXJpc29uLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBhIHN5bmMtbW9kZWwgbG9va3VwIGJ5IGFjdG9yIGFuZCByZXNvdXJjZSBpZGVudGl0eSB3aGVuIGEgc3luY1xuICAgKiBtb2RlbCBpcyBjb25maWd1cmVkOyBvdGhlcndpc2UgYXBwcyBvdmVycmlkZSB0aGlzIGhvb2suXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IEV4aXN0aW5nIHN5bmMgcm93LlxuICAgKi9cbiAgYXN5bmMgZmluZEV4aXN0aW5nUmVwbGF5U3luYyh7YWN0b3IsIG11dGF0aW9ufSkge1xuICAgIGlmICghdGhpcy5zeW5jTW9kZWwpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jTW9kZWwuZmluZEJ5KHtcbiAgICAgIFt0aGlzLmFjdG9yRm9yZWlnbktleUNvbHVtbl06IHRoaXMucmVwbGF5QWN0b3JJZChhY3RvciksXG4gICAgICByZXNvdXJjZV9pZDogbXV0YXRpb24ucmVzb3VyY2VJZCxcbiAgICAgIHJlc291cmNlX3R5cGU6IG11dGF0aW9uLnJlc291cmNlVHlwZVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCBhY3RvciBpZCB1c2VkIGJ5IG1vZGVsLWJhY2tlZCBkZWZhdWx0IGhvb2tzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhY3RvciAtIEFjdG9yIHJldHVybmVkIGZyb20gYXV0aGVudGljYXRlUmVwbGF5LlxuICAgKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IEFjdG9yIGlkLlxuICAgKi9cbiAgcmVwbGF5QWN0b3JJZChhY3Rvcikge1xuICAgIGlmICghYWN0b3IgfHwgdHlwZW9mIGFjdG9yICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBhY3Rvci5pZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlIG1vZGVsLWJhY2tlZCBkZWZhdWx0cyByZXF1aXJlIGFuIGFjdG9yIHdpdGggYW4gaWQoKSBtZXRob2QgZnJvbSBhdXRoZW50aWNhdGVSZXBsYXlcIilcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0b3IuaWQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBhIG5vcm1hbGl6ZWQgbXV0YXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgdG8gZG9tYWluIG1vZGVscy5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGV4aXN0aW5nU3luYzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBleGlzdGluZyBzeW5jIHJvdywgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0byBhcHBseSB0aGUgbXV0YXRpb24uXG4gICAqL1xuICBhc3luYyBzaG91bGRBcHBseVJlcGxheU11dGF0aW9uKHtleGlzdGluZ1N5bmMsIG11dGF0aW9ufSkge1xuICAgIGNvbnN0IGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0ID0gdGhpcy5leGlzdGluZ1JlcGxheVN5bmNDbGllbnRVcGRhdGVkQXQoZXhpc3RpbmdTeW5jKVxuXG4gICAgcmV0dXJuICFleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCB8fCBtdXRhdGlvbi5jbGllbnRVcGRhdGVkQXQgPiBleGlzdGluZ0NsaWVudFVwZGF0ZWRBdFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBjbGllbnQgdGltZXN0YW1wIGZyb20gYW4gZXhpc3Rpbmcgc3luYyByb3cuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGV4aXN0aW5nU3luYyAtIEV4aXN0aW5nIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7RGF0ZSB8IG51bGx9IEV4aXN0aW5nIGNsaWVudCB0aW1lc3RhbXAuXG4gICAqL1xuICBleGlzdGluZ1JlcGxheVN5bmNDbGllbnRVcGRhdGVkQXQoZXhpc3RpbmdTeW5jKSB7XG4gICAgaWYgKCFleGlzdGluZ1N5bmMgfHwgdHlwZW9mIGV4aXN0aW5nU3luYyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHN5bmNSZWNvcmQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKGV4aXN0aW5nU3luYylcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBzeW5jUmVjb3JkLmNsaWVudFVwZGF0ZWRBdCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHN5bmNSZWNvcmQuY2xpZW50VXBkYXRlZEF0KClcbiAgICAgIDogc3luY1JlY29yZC5jbGllbnRVcGRhdGVkQXRcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB2YWx1ZVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gbmV3IERhdGUodmFsdWUpXG5cbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHBhcnNlZFZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogcGFyc2VkVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHNraXBwZWQgbXV0YXRpb24gZXhhY3RseSBtYXRjaGVzIHRoZSBwZXJzaXN0ZWQgcmVwbGF5IHJvdy5cbiAgICogT2xkZXIgZGlzdGluY3QgbXV0YXRpb25zIHJldGFpbiB0aGUgZXN0YWJsaXNoZWQgc3VjY2Vzc2Z1bCBzdGFsZS1za2lwIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge3tleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBFeGlzdGluZyByb3cgYW5kIGluY29taW5nIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGlzIGEgZHVwbGljYXRlIHJlcGxheS5cbiAgICovXG4gIGlzRHVwbGljYXRlUmVwbGF5TXV0YXRpb24oe2V4aXN0aW5nU3luYywgbXV0YXRpb259KSB7XG4gICAgaWYgKCFleGlzdGluZ1N5bmMpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnJlcGxheVBlcnNpc3RlZE1ldGFkYXRhKGV4aXN0aW5nU3luYylcblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhLmNsaWVudE11dGF0aW9uSWQgPT09IFN0cmluZyhtdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkIHx8IG11dGF0aW9uLmlkKVxuICAgICAgICAmJiBtZXRhZGF0YS5wYXlsb2FkRmluZ2VycHJpbnQgPT09IHNoYTI1NkhleChtdXRhdGlvbi5zZXJpYWxpemVkRGF0YSlcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCA9IHRoaXMuZXhpc3RpbmdSZXBsYXlTeW5jQ2xpZW50VXBkYXRlZEF0KGV4aXN0aW5nU3luYylcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSB0aGlzLnJlcGxheVN5bmNSZWNvcmRWYWx1ZShleGlzdGluZ1N5bmMsIFwiZGF0YVwiKVxuICAgIGNvbnN0IGV4aXN0aW5nU3luY1R5cGUgPSB0aGlzLnJlcGxheVN5bmNSZWNvcmRWYWx1ZShleGlzdGluZ1N5bmMsIFwic3luY1R5cGVcIilcbiAgICBjb25zdCBzZXJpYWxpemVkRXhpc3RpbmdEYXRhID0gdHlwZW9mIGV4aXN0aW5nRGF0YSA9PT0gXCJzdHJpbmdcIiA/IGV4aXN0aW5nRGF0YSA6IEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nRGF0YSlcblxuICAgIHJldHVybiBleGlzdGluZ0NsaWVudFVwZGF0ZWRBdD8uZ2V0VGltZSgpID09PSBtdXRhdGlvbi5jbGllbnRVcGRhdGVkQXQuZ2V0VGltZSgpXG4gICAgICAmJiBzZXJpYWxpemVkRXhpc3RpbmdEYXRhID09PSBtdXRhdGlvbi5zZXJpYWxpemVkRGF0YVxuICAgICAgJiYgZXhpc3RpbmdTeW5jVHlwZSA9PT0gbXV0YXRpb24uc3luY1R5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIG1vZGVsLWJhY2tlZCBzeW5jLXJvdyB2YWx1ZSB0aHJvdWdoIGl0cyBhY2Nlc3NvciBvciBwbGFpbiBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gc3luY1JlY29yZCAtIEV4aXN0aW5nIHN5bmMgcm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IFN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHJlcGxheVN5bmNSZWNvcmRWYWx1ZShzeW5jUmVjb3JkLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgcmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChzeW5jUmVjb3JkKVxuICAgIGNvbnN0IHZhbHVlID0gcmVjb3JkW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyB2YWx1ZS5jYWxsKHN5bmNSZWNvcmQpIDogdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBkdXJhYmxlIHJlcGxheSBhY2tub3dsZWRnZW1lbnQgbWV0YWRhdGEgZnJvbSBhIG1vZGVsLWJhY2tlZCBzeW5jIHJvdy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gc3luY1JlY29yZCAtIEV4aXN0aW5nIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7e2Fja25vd2xlZGdlbWVudFZlcnNpb246IHN0cmluZyB8IG51bWJlciB8IG51bGwsIGNsaWVudE11dGF0aW9uSWQ6IHN0cmluZywgcGF5bG9hZEZpbmdlcnByaW50OiBzdHJpbmd9IHwgbnVsbH0gUGVyc2lzdGVkIG1ldGFkYXRhLlxuICAgKi9cbiAgcmVwbGF5UGVyc2lzdGVkTWV0YWRhdGEoc3luY1JlY29yZCkge1xuICAgIGlmICghc3luY1JlY29yZCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBkZWNvZGVSZXBsYXlQZXJzaXN0ZWREYXRhKHRoaXMucmVwbGF5U3luY1JlY29yZFZhbHVlKHN5bmNSZWNvcmQsIFwiZGF0YVwiKSkubWV0YWRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIG9uZSBub3JtYWxpemVkIG11dGF0aW9uIHRvIGRvbWFpbiBtb2RlbHMuXG4gICAqXG4gICAqIERpc3BhdGNoZXMgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBhcHBseS1oYW5kbGVyIHJlZ2lzdHJ5IGZpcnN0IChjb21wYXRcbiAgICogcHJlY2VkZW5jZSk7IG11dGF0aW9ucyB3aXRob3V0IGEgbWF0Y2hpbmcgaGFuZGxlciBmYWxsIHRocm91Z2ggdG9cbiAgICogcmVzb3VyY2Ugcm91dGluZyB3aGVuIGEgY29uZmlndXJhdGlvbiBvciByZXNvdXJjZVR5cGVPdmVycmlkZXMgYXJlXG4gICAqIGNvbmZpZ3VyZWQsIGFuZCBvdGhlcndpc2UgZmFpbCBsb3VkbHkuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBQcm9qZWN0LXNwZWNpZmljIGFwcGx5IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGFwcGx5UmVwbGF5TXV0YXRpb24oYXJncykge1xuICAgIGlmICh0aGlzLmFwcGx5SGFuZGxlcnMpIHtcbiAgICAgIGNvbnN0IGFwcGx5SGFuZGxlciA9IHRoaXMuYXBwbHlIYW5kbGVyc1thcmdzLm11dGF0aW9uLnJlc291cmNlVHlwZV1cblxuICAgICAgaWYgKGFwcGx5SGFuZGxlcikgcmV0dXJuIGF3YWl0IGFwcGx5SGFuZGxlcihhcmdzKVxuICAgICAgaWYgKCF0aGlzLnJvdXRpbmdDb25maWd1cmVkKCkpIHRocm93IG5ldyBFcnJvcihgTm8gc3luYyBhcHBseSBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yOiAke2FyZ3MubXV0YXRpb24ucmVzb3VyY2VUeXBlfWApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucm91dGluZ0NvbmZpZ3VyZWQoKSkgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbHlSb3V0ZWRSZXBsYXlNdXRhdGlvbihhcmdzKVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgcmVzb3VyY2Ugcm91dGluZyBpcyBjb25maWd1cmVkIG9uIHRoaXMgc2VydmljZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgbXV0YXRpb25zIHJvdXRlIHRvIGZyb250ZW5kLW1vZGVsIHJlc291cmNlcy5cbiAgICovXG4gIHJvdXRpbmdDb25maWd1cmVkKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuY29uZmlndXJhdGlvbiB8fCB0aGlzLnJlc291cmNlVHlwZU92ZXJyaWRlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcm91dGVkIHJlc291cmNlIHJlZ2lzdHJhdGlvbiBmb3IgYSByZXNvdXJjZSB0eXBlLCBtZW1vaXplZFxuICAgKiBwZXIgcmVwbGF5IHNlcnZpY2UuIE92ZXJyaWRlcyB3aW4gb3ZlciB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RyeTsgc3RyaW5nXG4gICAqIG92ZXJyaWRlcyBhcmUgYWxpYXNlcyByZXNvbHZlZCB0aHJvdWdoIHRoZSByZWdpc3RyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlVHlwZSAtIE11dGF0aW9uIHJlc291cmNlIHR5cGUuXG4gICAqIEByZXR1cm5zIHtTeW5jUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24gfCBudWxsfSBSZXNvbHZlZCByZWdpc3RyYXRpb24gb3IgbnVsbCB3aGVuIHVucm91dGFibGUuXG4gICAqL1xuICByZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbihyZXNvdXJjZVR5cGUpIHtcbiAgICBjb25zdCBtZW1vaXplZFJlZ2lzdHJhdGlvbiA9IHRoaXMuX3JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9ucy5nZXQocmVzb3VyY2VUeXBlKVxuXG4gICAgaWYgKG1lbW9pemVkUmVnaXN0cmF0aW9uICE9PSB1bmRlZmluZWQpIHJldHVybiBtZW1vaXplZFJlZ2lzdHJhdGlvblxuXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZXNvbHZlUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24ocmVzb3VyY2VUeXBlKVxuXG4gICAgdGhpcy5fcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb25zLnNldChyZXNvdXJjZVR5cGUsIHJlZ2lzdHJhdGlvbilcblxuICAgIHJldHVybiByZWdpc3RyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmNhY2hlZCByb3V0ZWQtcmVzb3VyY2UgcmVzb2x1dGlvbiBiZWhpbmQge0BsaW5rIFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UjcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb259LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VUeXBlIC0gTXV0YXRpb24gcmVzb3VyY2UgdHlwZS5cbiAgICogQHJldHVybnMge1N5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbiB8IG51bGx9IFJlc29sdmVkIHJlZ2lzdHJhdGlvbiBvciBudWxsIHdoZW4gdW5yb3V0YWJsZS5cbiAgICovXG4gIHJlc29sdmVSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbihyZXNvdXJjZVR5cGUpIHtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMucmVzb3VyY2VUeXBlT3ZlcnJpZGVzPy5bcmVzb3VyY2VUeXBlXVxuXG4gICAgaWYgKG92ZXJyaWRlICYmIHR5cGVvZiBvdmVycmlkZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHttb2RlbE5hbWU6IHJlc291cmNlVHlwZSwgcmVzb3VyY2VDbGFzczogb3ZlcnJpZGUsIHJlc291cmNlQ29uZmlndXJhdGlvbjogbnVsbH1cbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RyeVJlc291cmNlVHlwZSA9IHR5cGVvZiBvdmVycmlkZSA9PT0gXCJzdHJpbmdcIiA/IG92ZXJyaWRlIDogcmVzb3VyY2VUeXBlXG5cbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHJlc29sdmVkUmVnaXN0cmF0aW9uID0gcmVzb2x2ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzKHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sIHJlc291cmNlVHlwZTogcmVnaXN0cnlSZXNvdXJjZVR5cGV9KVxuXG4gICAgaWYgKCFyZXNvbHZlZFJlZ2lzdHJhdGlvbikgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB7XG4gICAgICBtb2RlbE5hbWU6IHJlc29sdmVkUmVnaXN0cmF0aW9uLm1vZGVsTmFtZSxcbiAgICAgIHJlc291cmNlQ2xhc3M6IHJlc29sdmVkUmVnaXN0cmF0aW9uLnJlc291cmNlQ2xhc3MsXG4gICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb246IHJlc29sdmVkUmVnaXN0cmF0aW9uLnJlc291cmNlQ29uZmlndXJhdGlvblxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgYWJpbGl0eSBhbmQgcmVzb3VyY2UgY29udGV4dCB1c2VkIHRvIGF1dGhvcml6ZSByb3V0ZWRcbiAgICogcmVzb3VyY2VzLiBEZWZhdWx0cyB0byB0aGUgY29uc3RydWN0b3Itd2lkZSBhYmlsaXR5L2FiaWxpdHlDb250ZXh0O1xuICAgKiBzdWJjbGFzc2VzIChzaWduZWQgcmVwbGF5KSBvdmVycmlkZSB0aGlzIHRvIGRlcml2ZSBhdXRob3JpemF0aW9uIGZyb20gYVxuICAgKiB2ZXJpZmllZCBhY3Rvci9ncmFudCBpbnN0ZWFkIG9mIHVwbG9hZGVyLWdsb2JhbCBzdGF0ZS5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSBfYXJncyAtIFJlcGxheSBhY3RvciBhbmQgYmF0Y2ggY29udGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2FiaWxpdHk6IGltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCBhYmlsaXR5Q29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fT59IEFiaWxpdHkgYW5kIHJlc291cmNlIGNvbnRleHQuXG4gICAqL1xuICBhc3luYyByZXBsYXlBYmlsaXR5Rm9yKF9hcmdzKSB7XG4gICAgcmV0dXJuIHthYmlsaXR5OiB0aGlzLmFiaWxpdHkgfHwgdW5kZWZpbmVkLCBhYmlsaXR5Q29udGV4dDogdGhpcy5hYmlsaXR5Q29udGV4dCB8fCB7fX1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZSBoYW5kbGluZyBvbmUgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy5hY3RvciAtIFJlcGxheSBhY3Rvci5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuY29udGV4dCAtIFJlcGxheSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtTeW5jUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb259IGFyZ3MucmVnaXN0cmF0aW9uIC0gUmVzb2x2ZWQgcmVzb3VyY2UgcmVnaXN0cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHQ+fSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqL1xuICBhc3luYyBidWlsZFJlcGxheVJlc291cmNlKHthY3RvciwgY29udGV4dCwgbXV0YXRpb24sIHJlZ2lzdHJhdGlvbn0pIHtcbiAgICBjb25zdCBSZXNvdXJjZUNsYXNzID0gcmVnaXN0cmF0aW9uLnJlc291cmNlQ2xhc3NcbiAgICBjb25zdCB7YWJpbGl0eSwgYWJpbGl0eUNvbnRleHR9ID0gYXdhaXQgdGhpcy5yZXBsYXlBYmlsaXR5Rm9yKHthY3RvciwgY29udGV4dH0pXG5cbiAgICByZXR1cm4gbmV3IFJlc291cmNlQ2xhc3Moe1xuICAgICAgYWJpbGl0eSxcbiAgICAgIGNvbnRleHQ6IGFiaWxpdHlDb250ZXh0LFxuICAgICAgbG9jYWxzOiB7Li4uKHRoaXMubG9jYWxzIHx8IHt9KSwgLi4uKHRoaXMuY29uZmlndXJhdGlvbiA/IHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb259IDoge30pfSxcbiAgICAgIG1vZGVsTmFtZTogcmVnaXN0cmF0aW9uLm1vZGVsTmFtZSxcbiAgICAgIHBhcmFtczogbXV0YXRpb24uZGF0YSxcbiAgICAgIC4uLihyZWdpc3RyYXRpb24ucmVzb3VyY2VDb25maWd1cmF0aW9uID8ge3Jlc291cmNlQ29uZmlndXJhdGlvbjogcmVnaXN0cmF0aW9uLnJlc291cmNlQ29uZmlndXJhdGlvbn0gOiB7fSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgb25lIG11dGF0aW9uIHRocm91Z2ggaXRzIHJvdXRlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZTpcbiAgICogYXV0aG9yaXphdGlvbiwgYWJpbGl0eS1zY29wZWQgcmVjb3JkIGxvb2t1cCwgc2NoZW1hIG5vcm1hbGl6YXRpb24gYW5kXG4gICAqIGFzc2lnbi9zYXZlIGZvciB1cGRhdGVzLCBzYXZlLXRoZW4tY2hlY2sgbWVtYmVyc2hpcCBjcmVhdGVzLCBkZXN0cm95cyBmb3JcbiAgICogZGVsZXRlcywgYW5kIHRoZSByZXNvdXJjZSdzIGFmdGVyU3luY0FwcGx5IHRhaWwuIENsaWVudC1zYWZlIGZhaWx1cmVzXG4gICAqIHRocm93IHNhZmUgZXJyb3JzIHRoYXQgZmFpbCB0aGUgc2luZ2xlIHN5bmMuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gQXBwbHkgcmVzdWx0IHdpdGggcmVjb3JkLCBjcmVhdGVkL2RlbGV0ZWQgZmxhZ3MsIGFuZCBhZnRlclN5bmNBcHBseSBleHRyYXMuXG4gICAqL1xuICBhc3luYyBhcHBseVJvdXRlZFJlcGxheU11dGF0aW9uKHthY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uKG11dGF0aW9uLnJlc291cmNlVHlwZSlcblxuICAgIGlmICghcmVnaXN0cmF0aW9uKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBVbmtub3duIHN5bmMgcmVzb3VyY2UgdHlwZTogJHttdXRhdGlvbi5yZXNvdXJjZVR5cGV9LmAsIHtjb2RlOiBcInVua25vd24tcmVzb3VyY2UtdHlwZVwifSlcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuYnVpbGRSZXBsYXlSZXNvdXJjZSh7YWN0b3IsIGNvbnRleHQsIG11dGF0aW9uLCByZWdpc3RyYXRpb259KVxuICAgIGNvbnN0IGN1c3RvbUFwcGx5UmVzdWx0ID0gYXdhaXQgcmVzb3VyY2UuYXBwbHlTeW5jKHtjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSlcblxuICAgIGlmIChjdXN0b21BcHBseVJlc3VsdCAhPT0gbnVsbCkgcmV0dXJuIGN1c3RvbUFwcGx5UmVzdWx0XG5cbiAgICBjb25zdCBhdXRob3JpemF0aW9uID0gYXdhaXQgcmVzb3VyY2UuYXV0aG9yaXplU3luY011dGF0aW9uKHtjb250ZXh0LCBtdXRhdGlvbn0pXG5cbiAgICBpZiAoIWF1dGhvcml6YXRpb24uYWxsb3dlZCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgU3luYyBtdXRhdGlvbiBkZW5pZWQgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uYCwge2NvZGU6IGF1dGhvcml6YXRpb24ucmVhc29uIHx8IFwiYWNjZXNzLWRlbmllZFwifSlcbiAgICB9XG5cbiAgICBpZiAobXV0YXRpb24uc3luY1R5cGUgPT09IFwiZGVsZXRlXCIpIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5Um91dGVkUmVwbGF5RGVsZXRlKHttdXRhdGlvbiwgcmVzb3VyY2V9KVxuXG4gICAgY29uc3QgY29tbWFuZEFwcGx5UmVzdWx0ID0gYXdhaXQgdGhpcy5hcHBseVJvdXRlZFJlcGxheUNvbW1hbmQoe2NvbnRleHQsIG11dGF0aW9uLCByZXNvdXJjZX0pXG5cbiAgICBpZiAoY29tbWFuZEFwcGx5UmVzdWx0ICE9PSBudWxsKSByZXR1cm4gY29tbWFuZEFwcGx5UmVzdWx0XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVJvdXRlZFJlcGxheVVwc2VydCh7Y29udGV4dCwgbXV0YXRpb24sIHJlc291cmNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGEgcm91dGVkIHN5bmMgbXV0YXRpb24gd2hvc2Ugc3luY1R5cGUgbWF0Y2hlcyBhIHJlc291cmNlLWRlY2xhcmVkXG4gICAqIGN1c3RvbSBjb21tYW5kLiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgbXV0YXRpb24gaXMgbm90IGEgY29tbWFuZCBzbyB0aGVcbiAgICogY2FsbGVyIGNhbiBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgdXBzZXJ0IHBhdGguXG4gICAqIEBwYXJhbSB7e2NvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb24sIHJlc291cmNlOiBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gQ29tbWFuZCBkaXNwYXRjaCBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsPn0gQ29tbWFuZCBhcHBseSByZXN1bHQgb3IgbnVsbC5cbiAgICovXG4gIGFzeW5jIGFwcGx5Um91dGVkUmVwbGF5Q29tbWFuZCh7Y29udGV4dCwgbXV0YXRpb24sIHJlc291cmNlfSkge1xuICAgIGNvbnN0IGNvbW1hbmRDb25maWcgPSB0aGlzLnJlc291cmNlQ29tbWFuZENvbmZpZyhyZXNvdXJjZSlcbiAgICBjb25zdCBjb21tYW5kTWV0aG9kTmFtZSA9IHRoaXMuY29tbWFuZE1ldGhvZE5hbWVGb3JTeW5jVHlwZSh7Y29tbWFuZENvbmZpZywgc3luY1R5cGU6IG11dGF0aW9uLnN5bmNUeXBlfSlcblxuICAgIGlmICghY29tbWFuZE1ldGhvZE5hbWUpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBjb21tYW5kTWV0aG9kID0gcmVzb3VyY2UucmVzb3VyY2VNZXRob2QoY29tbWFuZE1ldGhvZE5hbWUpXG5cbiAgICBpZiAoIWNvbW1hbmRNZXRob2QpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoYFN5bmMgY29tbWFuZCBoYW5kbGVyIG1pc3NpbmcgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uJHttdXRhdGlvbi5zeW5jVHlwZX0uYCwge2NvZGU6IFwic3luYy1jb21tYW5kLWhhbmRsZXItbWlzc2luZ1wifSlcbiAgICB9XG5cbiAgICBjb25zdCBhcmdzID0gdGhpcy5jb21tYW5kQXJnc0Zvck11dGF0aW9uKHtjb21tYW5kQ29uZmlnLCBjb21tYW5kTWV0aG9kTmFtZSwgbXV0YXRpb259KVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbW1hbmRNZXRob2QubWV0aG9kLmNhbGwoY29tbWFuZE1ldGhvZC5yZXNvdXJjZSwgYXJncylcblxuICAgIGNvbnN0IGFmdGVyRXh0cmFzID0gYXdhaXQgcmVzb3VyY2UuYWZ0ZXJTeW5jQXBwbHkoe2NvbnRleHQsIGNyZWF0ZWQ6IGZhbHNlLCBtdXRhdGlvbiwgcmVjb3JkOiBudWxsfSlcbiAgICBjb25zdCByZXN1bHRPYmplY3QgPSByZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDoge31cblxuICAgIHJldHVybiB7Y29tbWFuZFJlc3VsdDogcmVzdWx0LCBjcmVhdGVkOiBmYWxzZSwgZGVsZXRlZDogZmFsc2UsIHJlY29yZDogbnVsbCwgLi4ucmVzdWx0T2JqZWN0LCAuLi5hZnRlckV4dHJhc31cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgY3VzdG9tLWNvbW1hbmQgY29uZmlndXJhdGlvbiBkZWNsYXJlZCBvbiBhIHJvdXRlZCByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IHJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7e2NvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgbWVtYmVyQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSBDb21tYW5kIGNvbmZpZy5cbiAgICovXG4gIHJlc291cmNlQ29tbWFuZENvbmZpZyhyZXNvdXJjZSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAocmVzb3VyY2UucmVzb3VyY2VDb25maWd1cmF0aW9uVmFsdWUgfHwge30pXG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sbGVjdGlvbkNvbW1hbmRzOiBjb25maWcuY29sbGVjdGlvbkNvbW1hbmRzIHx8IHt9LFxuICAgICAgbWVtYmVyQ29tbWFuZHM6IGNvbmZpZy5tZW1iZXJDb21tYW5kcyB8fCB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcmVzb3VyY2UgbWV0aG9kIG5hbWUgZm9yIGEgc3luY1R5cGUgd2hlbiBpdCBuYW1lcyBhIGRlY2xhcmVkXG4gICAqIGN1c3RvbSBjb21tYW5kLlxuICAgKiBAcGFyYW0ge3tjb21tYW5kQ29uZmlnOiB7Y29sbGVjdGlvbkNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBtZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPn0sIHN5bmNUeXBlOiBzdHJpbmd9fSBhcmdzIC0gTG9va3VwIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSBNZXRob2QgbmFtZSBvciBudWxsLlxuICAgKi9cbiAgY29tbWFuZE1ldGhvZE5hbWVGb3JTeW5jVHlwZSh7Y29tbWFuZENvbmZpZywgc3luY1R5cGV9KSB7XG4gICAgaWYgKGNvbW1hbmRDb25maWcubWVtYmVyQ29tbWFuZHNbc3luY1R5cGVdKSByZXR1cm4gc3luY1R5cGVcbiAgICBpZiAoY29tbWFuZENvbmZpZy5jb2xsZWN0aW9uQ29tbWFuZHNbc3luY1R5cGVdKSByZXR1cm4gc3luY1R5cGVcblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhcmd1bWVudHMgb2JqZWN0IHBhc3NlZCB0byBhIHJlc291cmNlIGNvbW1hbmQgbWV0aG9kLiBNZW1iZXJcbiAgICogY29tbWFuZHMgcmVjZWl2ZSB0aGUgZW52ZWxvcGUncyByZXNvdXJjZUlkIGFzIGBpZGA7IHRoZSBlbnZlbG9wZSBpZGVudGl0eVxuICAgKiBpcyBhc3NpZ25lZCBhZnRlciB0aGUgcGF5bG9hZCBzbyBhIHBheWxvYWQgYGlkYCBjYW4gbmV2ZXIgcmV0YXJnZXQgdGhlXG4gICAqIGNvbW1hbmQgYXdheSBmcm9tIHRoZSByZXNvdXJjZSB0aGUgYXV0aG9yaXphdGlvbiBob29rcyBhcHByb3ZlZC5cbiAgICogQHBhcmFtIHt7Y29tbWFuZENvbmZpZzoge2NvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgbWVtYmVyQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz59LCBjb21tYW5kTWV0aG9kTmFtZTogc3RyaW5nLCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBcmdzIGJ1aWxkZXIgYXJncy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gQ29tbWFuZCBtZXRob2QgYXJndW1lbnRzLlxuICAgKi9cbiAgY29tbWFuZEFyZ3NGb3JNdXRhdGlvbih7Y29tbWFuZENvbmZpZywgY29tbWFuZE1ldGhvZE5hbWUsIG11dGF0aW9ufSkge1xuICAgIGNvbnN0IGlzTWVtYmVyID0gY29tbWFuZENvbmZpZy5tZW1iZXJDb21tYW5kc1tjb21tYW5kTWV0aG9kTmFtZV0gIT09IHVuZGVmaW5lZFxuXG4gICAgaWYgKGlzTWVtYmVyKSB7XG4gICAgICByZXR1cm4gey4uLm11dGF0aW9uLmRhdGEsIGlkOiBtdXRhdGlvbi5yZXNvdXJjZUlkfVxuICAgIH1cblxuICAgIHJldHVybiB7Li4ubXV0YXRpb24uZGF0YX1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgcm91dGVkIGRlbGV0ZSBtdXRhdGlvbi4gVGhlIHJlY29yZCBpcyBtYXJrZWQgYXMgYSBzZXJ2ZXIgYXBwbHlcbiAgICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LW93bmVkIGRlc3Ryb3kgLSBhbiBhY3RpdmUgU3luY1B1Ymxpc2hlclxuICAgKiBuZXZlciBwdWJsaXNoZXMgdGhlIHJlcGxheWVkIGRlbGV0ZSBhIHNlY29uZCB0aW1lICh0aGUgcmVwbGF5IG93bnMgaXRzXG4gICAqIG93biBwZXJzaXN0IGFuZCBicm9hZGNhc3RzKSwgd2hpbGUgbGF0ZXIgc2VydmVyLXNpZGUgd3JpdGVzIHRvIHRoZSBzYW1lXG4gICAqIGluc3RhbmNlIHB1Ymxpc2ggbm9ybWFsbHkgYWdhaW4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTm9ybWFsaXplZCByZXBsYXkgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBBcHBseSByZXN1bHQgd2l0aCB0aGUgZGVsZXRlZCBmbGFnLlxuICAgKi9cbiAgYXN5bmMgYXBwbHlSb3V0ZWRSZXBsYXlEZWxldGUoe211dGF0aW9uLCByZXNvdXJjZX0pIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gcmVzb3VyY2UubW9kZWxDbGFzcygpXG4gICAgY29uc3QgcnVuRGVsZXRlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgcmVzb3VyY2UuZmluZFN5bmNSZWNvcmQoe2ZvckRlbGV0ZTogdHJ1ZSwgbXV0YXRpb259KVxuXG4gICAgICBpZiAoIXJlY29yZCkgcmV0dXJuIHtjcmVhdGVkOiBmYWxzZSwgZGVsZXRlZDogZmFsc2UsIHJlY29yZDogbnVsbH1cblxuICAgICAgY29uc3QgY29uZmxpY3RSZXN1bHQgPSBhd2FpdCB0aGlzLnJvdXRlZFJlcGxheUNvbmZsaWN0UmVzdWx0KHthdHRyaWJ1dGVzOiB7fSwgZXhpc3RpbmdSZWNvcmQ6IHJlY29yZCwgbXV0YXRpb24sIHJlc291cmNlfSlcblxuICAgICAgaWYgKGNvbmZsaWN0UmVzdWx0KSByZXR1cm4gY29uZmxpY3RSZXN1bHRcblxuICAgICAgY29uc3QgcmVsZWFzZVNlcnZlckFwcGx5ID0gbWFya1NlcnZlckFwcGx5KHJlY29yZClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVjb3JkLmRlc3Ryb3koKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVsZWFzZVNlcnZlckFwcGx5KClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtjcmVhdGVkOiBmYWxzZSwgZGVsZXRlZDogdHJ1ZSwgcmVjb3JkfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25mbGljdFN0cmF0ZWd5KSByZXR1cm4gYXdhaXQgcnVuRGVsZXRlKClcblxuICAgIHJldHVybiBhd2FpdCBNb2RlbENsYXNzLndpdGhBZHZpc29yeUxvY2soc3luY1JlcGxheUNvbmZsaWN0TG9ja05hbWUoe3Jlc291cmNlSWQ6IG11dGF0aW9uLnJlc291cmNlSWQsIHJlc291cmNlVHlwZTogbXV0YXRpb24ucmVzb3VyY2VUeXBlfSksIHJ1bkRlbGV0ZSwge2RlZGljYXRlZENvbm5lY3Rpb246IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSByb3V0ZWQgdXBzZXJ0IG11dGF0aW9uOiBwZXJtaXR0ZWQgcGF5bG9hZCBhdHRyaWJ1dGVzIGFyZVxuICAgKiBhc3NpZ25lZCBhbmQgc2F2ZWQgb250byB0aGUgZm91bmQgcmVjb3JkICh0aGUgcmVjb3JkIGxheWVyIG93bnMgdmFsdWVcbiAgICogY2FzdGluZyBhbmQgdmFsaWRhdGlvbiksIGFuZCBtaXNzaW5nIHJlY29yZHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGVcbiAgICogY2xpZW50LWdlbmVyYXRlZCBwcmltYXJ5IGtleSBwbHVzIGEgc2F2ZS10aGVuLWNoZWNrIG1lbWJlcnNoaXAgY2hlY2suXG4gICAqIFdyaXR0ZW4gcmVjb3JkcyBhcmUgbWFya2VkIGFzIHNlcnZlciBhcHBsaWVzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlXG4gICAqIHJlcGxheS1vd25lZCB3cml0ZSAtIGFuIGFjdGl2ZSBTeW5jUHVibGlzaGVyIG5ldmVyIHB1Ymxpc2hlcyB0aGUgcmVwbGF5ZWRcbiAgICogbXV0YXRpb24gYSBzZWNvbmQgdGltZSAodGhlIHJlcGxheSBvd25zIGl0cyBvd24gcGVyc2lzdCBhbmQgYnJvYWRjYXN0cyksXG4gICAqIHdoaWxlIGxhdGVyIHNlcnZlci1zaWRlIHdyaXRlcyB0byB0aGUgc2FtZSBpbnN0YW5jZSBwdWJsaXNoIG5vcm1hbGx5XG4gICAqIGFnYWluLiBNb2RlbCB2YWxpZGF0aW9uIGZhaWx1cmVzIGJlY29tZSBjbGllbnQtc2FmZSBwZXItc3luYyBmYWlsdXJlc1xuICAgKiBjYXJyeWluZyB0aGUgdHJhbnNsYXRlZCB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuY29udGV4dCAtIFJlcGxheSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IEFwcGx5IHJlc3VsdCB3aXRoIHJlY29yZCwgY3JlYXRlZCBmbGFnLCBhbmQgYWZ0ZXJTeW5jQXBwbHkgZXh0cmFzLlxuICAgKi9cbiAgYXN5bmMgYXBwbHlSb3V0ZWRSZXBsYXlVcHNlcnQoe2NvbnRleHQsIG11dGF0aW9uLCByZXNvdXJjZX0pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5wZXJtaXR0ZWRSb3V0ZWRBdHRyaWJ1dGVzKHttdXRhdGlvbiwgcmVzb3VyY2V9KVxuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSByZXNvdXJjZS5tb2RlbENsYXNzKClcbiAgICBjb25zdCBydW5VcHNlcnQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGF3YWl0IHJlc291cmNlLmZpbmRTeW5jUmVjb3JkKHttdXRhdGlvbn0pXG4gICAgICBjb25zdCBjb25mbGljdFJlc3VsdCA9IGF3YWl0IHRoaXMucm91dGVkUmVwbGF5Q29uZmxpY3RSZXN1bHQoe2F0dHJpYnV0ZXMsIGV4aXN0aW5nUmVjb3JkLCBtdXRhdGlvbiwgcmVzb3VyY2V9KVxuXG4gICAgICBpZiAoY29uZmxpY3RSZXN1bHQpIHJldHVybiBjb25mbGljdFJlc3VsdFxuXG4gICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICAgIGxldCByZWNvcmQgPSBleGlzdGluZ1JlY29yZFxuICAgICAgbGV0IGNyZWF0ZWQgPSBmYWxzZVxuXG4gICAgICBpZiAoZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgICAgY29uc3QgcmVsZWFzZVNlcnZlckFwcGx5ID0gbWFya1NlcnZlckFwcGx5KGV4aXN0aW5nUmVjb3JkKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZXhpc3RpbmdSZWNvcmQuYXNzaWduKGF0dHJpYnV0ZXMpXG4gICAgICAgICAgYXdhaXQgdGhpcy5zYXZlUm91dGVkUmVwbGF5UmVjb3JkKGV4aXN0aW5nUmVjb3JkKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlbGVhc2VTZXJ2ZXJBcHBseSgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuY3JlYXRlUm91dGVkUmVwbGF5UmVjb3JkKHthdHRyaWJ1dGVzLCBtdXRhdGlvbiwgcmVzb3VyY2V9KVxuICAgICAgICBjcmVhdGVkID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRyYXMgPSBhd2FpdCByZXNvdXJjZS5hZnRlclN5bmNBcHBseSh7Y29udGV4dCwgY3JlYXRlZCwgbXV0YXRpb24sIHJlY29yZH0pXG5cbiAgICAgIHJldHVybiB7Y3JlYXRlZCwgZGVsZXRlZDogZmFsc2UsIHJlY29yZCwgLi4uZXh0cmFzfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25mbGljdFN0cmF0ZWd5KSByZXR1cm4gYXdhaXQgcnVuVXBzZXJ0KClcblxuICAgIHJldHVybiBhd2FpdCBNb2RlbENsYXNzLndpdGhBZHZpc29yeUxvY2soc3luY1JlcGxheUNvbmZsaWN0TG9ja05hbWUoe3Jlc291cmNlSWQ6IG11dGF0aW9uLnJlc291cmNlSWQsIHJlc291cmNlVHlwZTogbXV0YXRpb24ucmVzb3VyY2VUeXBlfSksIHJ1blVwc2VydCwge2RlZGljYXRlZENvbm5lY3Rpb246IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgcm91dGVkIHVwc2VydCBtdXRhdGlvbiBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBzZXJ2ZXJcbiAgICogc3RhdGUgd2hlbiB0aGUgc2VydmljZSBpcyBjb25maWd1cmVkIHdpdGggYSBjb25mbGljdCBzdHJhdGVneS4gQSBtdXRhdGlvblxuICAgKiB3aG9zZSBiYXNlVmVyc2lvbiBkb2VzIG5vdCBtYXRjaCB0aGUgc2VydmVyJ3MgY3VycmVudCB2ZXJzaW9uQXR0cmlidXRlIGlzXG4gICAqIHJlamVjdGVkIHdpdGggYSBzdHJ1Y3R1cmVkIGNvbmZsaWN0IHBheWxvYWQgaW5zdGVhZCBvZiBiZWluZyBhcHBsaWVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIENvbmZsaWN0LWNoZWNrIGFyZ3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLmF0dHJpYnV0ZXMgLSBQZXJtaXR0ZWQgbXV0YXRpb24gYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGx9IGFyZ3MuZXhpc3RpbmdSZWNvcmQgLSBFeGlzdGluZyBzZXJ2ZXIgcmVjb3JkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IG51bGw+fSAtIENvbmZsaWN0IGFwcGx5IHJlc3VsdCwgb3IgbnVsbCB3aGVuIG5vIGNvbmZsaWN0LlxuICAgKi9cbiAgYXN5bmMgcm91dGVkUmVwbGF5Q29uZmxpY3RSZXN1bHQoe2F0dHJpYnV0ZXMsIGV4aXN0aW5nUmVjb3JkLCBtdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZsaWN0U3RyYXRlZ3kpIHJldHVybiBudWxsXG4gICAgaWYgKCFleGlzdGluZ1JlY29yZCB8fCBtdXRhdGlvbi5zeW5jVHlwZSA9PT0gXCJjcmVhdGVcIikgcmV0dXJuIG51bGxcbiAgICBpZiAobXV0YXRpb24uYmFzZVZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBtdXRhdGlvbi5iYXNlVmVyc2lvbiA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHZlcnNpb25BdHRyaWJ1dGUgPSB0aGlzLmNvbmZsaWN0U3RyYXRlZ3kudmVyc2lvbkF0dHJpYnV0ZVxuICAgIGNvbnN0IHNlcnZlclZlcnNpb24gPSBub3JtYWxpemVDb25mbGljdFZhbHVlKGV4aXN0aW5nUmVjb3JkLnJlYWRBdHRyaWJ1dGUodmVyc2lvbkF0dHJpYnV0ZSkpXG5cbiAgICBpZiAoc3RhYmxlSnNvblN0cmluZ2lmeShzZXJ2ZXJWZXJzaW9uKSA9PT0gc3RhYmxlSnNvblN0cmluZ2lmeShtdXRhdGlvbi5iYXNlVmVyc2lvbikpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBNb2RlbENsYXNzID0gcmVzb3VyY2UubW9kZWxDbGFzcygpXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgY29uc3Qgc2VyaWFsaXplZEFmZmVjdGVkQXR0cmlidXRlcyA9IGF3YWl0IHRoaXMuc2VyaWFsaXplZFJvdXRlZENvbmZsaWN0QXR0cmlidXRlcyh7YXR0cmlidXRlcywgZXhpc3RpbmdSZWNvcmQsIHJlc291cmNlfSlcbiAgICBjb25zdCBzZXJ2ZXJBdHRyaWJ1dGVzID0ge1xuICAgICAgLi4uc2VyaWFsaXplZEFmZmVjdGVkQXR0cmlidXRlcyxcbiAgICAgIFtwcmltYXJ5S2V5XTogZXhpc3RpbmdSZWNvcmQucmVhZEF0dHJpYnV0ZShwcmltYXJ5S2V5KSxcbiAgICAgIFt2ZXJzaW9uQXR0cmlidXRlXTogc2VydmVyVmVyc2lvblxuICAgIH1cblxuICAgIGNvbnN0IHNlcnZlclJlY29yZCA9IHtcbiAgICAgIGF0dHJpYnV0ZXM6IHNlcnZlckF0dHJpYnV0ZXMsXG4gICAgICB2ZXJzaW9uOiBzZXJ2ZXJWZXJzaW9uXG4gICAgfVxuICAgIGNvbnN0IGNvbmZsaWN0TXV0YXRpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHtcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBiYXNlVmVyc2lvbjogbXV0YXRpb24uYmFzZVZlcnNpb24sXG4gICAgICBjbGllbnRNdXRhdGlvbklkOiBtdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkIHx8IG11dGF0aW9uLmlkLFxuICAgICAgbW9kZWw6IG11dGF0aW9uLnJlc291cmNlVHlwZSxcbiAgICAgIG9wZXJhdGlvbjogbXV0YXRpb24uc3luY1R5cGUsXG4gICAgICBwYXlsb2FkOiB7aWQ6IG11dGF0aW9uLnJlc291cmNlSWR9XG4gICAgfSkpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZVN5bmNDb25mbGljdCh7XG4gICAgICBiYXNlUmVjb3JkOiBudWxsLFxuICAgICAgbXV0YXRpb246IGNvbmZsaWN0TXV0YXRpb24sXG4gICAgICBzZXJ2ZXJSZWNvcmQsXG4gICAgICBzdHJhdGVneTogdGhpcy5jb25mbGljdFN0cmF0ZWd5LnN0cmF0ZWd5IHx8IFwib3B0aW1pc3RpY1ZlcnNpb25cIixcbiAgICAgIHZlcnNpb25BdHRyaWJ1dGVcbiAgICB9KVxuXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IFwiY29uZmxpY3RcIikgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB7Y29uZmxpY3Q6IHJlc3VsdC5jb25mbGljdCwgY3JlYXRlZDogZmFsc2UsIGRlbGV0ZWQ6IGZhbHNlLCByZWNvcmQ6IGV4aXN0aW5nUmVjb3JkLCBzdGF0dXM6IFwiY29uZmxpY3RcIn1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0cyBhZmZlY3RlZCBtdXRhdGlvbiBmaWVsZHMgdGhyb3VnaCB0aGUgcmVzb3VyY2UncyByZWFkYWJsZVxuICAgKiBhdHRyaWJ1dGUgY29udHJhY3QuIFdyaXRhYmxlLWJ1dC1oaWRkZW4gZmllbGRzIGFyZSBvbWl0dGVkLCB3aGlsZSBjdXN0b21cbiAgICogYDxhdHRyaWJ1dGU+QXR0cmlidXRlKG1vZGVsKWAgc2VyaWFsaXplcnMgYW5kIG1vZGVsIGFjY2Vzc29ycyByZW1haW4gdGhlXG4gICAqIHNvdXJjZSBvZiBmcm9udGVuZC12aXNpYmxlIHZhbHVlcy4gVGhlIGZ1bGwgbW9kZWwgYXR0cmlidXRlIGhhc2ggaXMgbmV2ZXJcbiAgICogZXhwb3NlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBQcm9qZWN0aW9uIGFyZ3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLmF0dHJpYnV0ZXMgLSBQZXJtaXR0ZWQgYWZmZWN0ZWQgbXV0YXRpb24gYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5leGlzdGluZ1JlY29yZCAtIEF1dGhvcml6ZWQgc2VydmVyIHJlY29yZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IFNlcmlhbGl6ZWQgcmVhZGFibGUgYWZmZWN0ZWQgYXR0cmlidXRlcy5cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZWRSb3V0ZWRDb25mbGljdEF0dHJpYnV0ZXMoe2F0dHJpYnV0ZXMsIGV4aXN0aW5nUmVjb3JkLCByZXNvdXJjZX0pIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gcmVzb3VyY2UubW9kZWxDbGFzcygpXG4gICAgY29uc3QgUmVzb3VyY2VDbGFzcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9ICovIChyZXNvdXJjZS5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCByZWFkYWJsZUF0dHJpYnV0ZXMgPSBuZXcgU2V0KClcbiAgICBjb25zdCBjb25maWd1cmVkQXR0cmlidXRlcyA9IFJlc291cmNlQ2xhc3MucmVzb3VyY2VDb25maWcoKS5hdHRyaWJ1dGVzXG4gICAgY29uc3QgY29uZmlndXJlZEVudHJpZXMgPSBBcnJheS5pc0FycmF5KGNvbmZpZ3VyZWRBdHRyaWJ1dGVzKSA/IGNvbmZpZ3VyZWRBdHRyaWJ1dGVzIDogT2JqZWN0LmtleXMoY29uZmlndXJlZEF0dHJpYnV0ZXMpXG5cbiAgICBpZiAoY29uZmlndXJlZEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lID0gTW9kZWxDbGFzcy5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKClcblxuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIE9iamVjdC5rZXlzKGF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWUpKSB7XG4gICAgICAgIHJlYWRhYmxlQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlTmFtZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZpZ3VyZWRBdHRyaWJ1dGUgb2YgY29uZmlndXJlZEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWROYW1lID0gdHlwZW9mIGNvbmZpZ3VyZWRBdHRyaWJ1dGUgPT09IFwic3RyaW5nXCIgPyBjb25maWd1cmVkQXR0cmlidXRlIDogY29uZmlndXJlZEF0dHJpYnV0ZS5uYW1lXG5cbiAgICAgIGlmICghY29uZmlndXJlZE5hbWUpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGNhbm9uaWNhbE5hbWUgPSBNb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKGNvbmZpZ3VyZWROYW1lKVxuXG4gICAgICByZWFkYWJsZUF0dHJpYnV0ZXMuYWRkKGNhbm9uaWNhbE5hbWUgfHwgY29uZmlndXJlZE5hbWUpXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gICAgY29uc3Qgc2VyaWFsaXplZEF0dHJpYnV0ZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBhZmZlY3RlZEZpZWxkIG9mIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gTW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShhZmZlY3RlZEZpZWxkKVxuXG4gICAgICBpZiAoIWF0dHJpYnV0ZU5hbWUgfHwgIXJlYWRhYmxlQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSkpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2UucmVzb3VyY2VNZXRob2QoYCR7YXR0cmlidXRlTmFtZX1BdHRyaWJ1dGVgKVxuXG4gICAgICBpZiAocmVzb3VyY2VBdHRyaWJ1dGUpIHtcbiAgICAgICAgc2VyaWFsaXplZEF0dHJpYnV0ZXNbYWZmZWN0ZWRGaWVsZF0gPSBub3JtYWxpemVDb25mbGljdFZhbHVlKGF3YWl0IHJlc291cmNlQXR0cmlidXRlLm1ldGhvZC5jYWxsKHJlc291cmNlQXR0cmlidXRlLnJlc291cmNlLCBleGlzdGluZ1JlY29yZCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlY29yZE1ldGhvZHMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGV4aXN0aW5nUmVjb3JkKSlcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZU1ldGhvZCA9IHJlY29yZE1ldGhvZHNbYXR0cmlidXRlTmFtZV1cblxuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVNZXRob2QgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBzZXJpYWxpemVkQXR0cmlidXRlc1thZmZlY3RlZEZpZWxkXSA9IG5vcm1hbGl6ZUNvbmZsaWN0VmFsdWUoYXdhaXQgYXR0cmlidXRlTWV0aG9kLmNhbGwoZXhpc3RpbmdSZWNvcmQpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VyaWFsaXplZEF0dHJpYnV0ZXNbYWZmZWN0ZWRGaWVsZF0gPSBub3JtYWxpemVDb25mbGljdFZhbHVlKGV4aXN0aW5nUmVjb3JkLnJlYWRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRBdHRyaWJ1dGVzXG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhIHJvdXRlZCBtdXRhdGlvbiBwYXlsb2FkIGRvd24gdG8gdGhlIHJlc291cmNlJ3MgZGVjbGFyZWRcbiAgICogd3JpdGFibGUtYXR0cmlidXRlIHBlcm1pdCBsaXN0LiBBY2NlcHRlZCBrZXlzIHBlciBwZXJtaXR0ZWQgYXR0cmlidXRlIGFyZVxuICAgKiB0aGUgY2FtZWxDYXNlIGF0dHJpYnV0ZSBuYW1lIHBsdXMgdGhlIG1vZGVsJ3MgYWN0dWFsIGNvbHVtbiBuYW1lOyB1bmtub3duXG4gICAqIGtleXMgZmFpbCB0aGUgc3luYyBsb3VkbHkuIFRoZSBwcmltYXJ5IGtleSBpcyBkcm9wcGVkIHdoZW4gcGVybWl0dGVkXG4gICAqIChzbmFwc2hvdCBwYXlsb2Fkcykg4oCUIHRoZSBlbnZlbG9wZSdzIHJlc291cmNlSWQgaXMgdGhlIGF1dGhvcml0YXRpdmVcbiAgICogcmVjb3JkIGlkZW50aXR5LCBzbyBhIHBheWxvYWQgaWQgY2FuIG5ldmVyIHJldGFyZ2V0IHRoZSByb3cuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTm9ybWFsaXplZCByZXBsYXkgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBQZXJtaXR0ZWQgYXR0cmlidXRlcyBmb3IgcmVjb3JkLmFzc2lnbi5cbiAgICovXG4gIHBlcm1pdHRlZFJvdXRlZEF0dHJpYnV0ZXMoe211dGF0aW9uLCByZXNvdXJjZX0pIHtcbiAgICBjb25zdCBwZXJtaXR0ZWRBdHRyaWJ1dGVzID0gcmVzb3VyY2UuZGVjbGFyZWRXcml0YWJsZUF0dHJpYnV0ZXMoKVxuXG4gICAgaWYgKCFwZXJtaXR0ZWRBdHRyaWJ1dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2UuY29uc3RydWN0b3IubmFtZX0gbXVzdCBkZWNsYXJlIHN0YXRpYyB3cml0YWJsZUF0dHJpYnV0ZXMgdG8gYXBwbHkgcm91dGVkIHN5bmMgbXV0YXRpb25zIGZvcjogJHttdXRhdGlvbi5yZXNvdXJjZVR5cGV9YClcbiAgICB9XG5cbiAgICBjb25zdCBNb2RlbENsYXNzID0gcmVzb3VyY2UubW9kZWxDbGFzcygpXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZSA9IE1vZGVsQ2xhc3MuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpXG5cbiAgICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGFsbG93ZWRLZXlzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgcGVybWl0dGVkQXR0cmlidXRlcykge1xuICAgICAgYWxsb3dlZEtleXMuYWRkKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBhdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICAgIGlmIChjb2x1bW5OYW1lKSBhbGxvd2VkS2V5cy5hZGQoY29sdW1uTmFtZSlcbiAgICB9XG5cbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gTW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgICBjb25zdCBwcmltYXJ5S2V5QXR0cmlidXRlID0gTW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwKClbcHJpbWFyeUtleV1cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobXV0YXRpb24uZGF0YSkpIHtcbiAgICAgIGlmICghYWxsb3dlZEtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgcmVzb3VyY2Uud3JpdGFibGVBdHRyaWJ1dGVFcnJvcihgVW5rbm93biBhdHRyaWJ1dGU6ICR7a2V5fS5gLCB7Y29kZTogXCJzeW5jLXVua25vd24tYXR0cmlidXRlXCJ9KVxuICAgICAgfVxuXG4gICAgICBpZiAoa2V5ID09PSBwcmltYXJ5S2V5IHx8IGtleSA9PT0gcHJpbWFyeUtleUF0dHJpYnV0ZSkgY29udGludWVcblxuICAgICAgYXR0cmlidXRlc1trZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHJvdXRlZCByZWNvcmQgd2l0aCB0aGUgY2xpZW50LWdlbmVyYXRlZCBwcmltYXJ5IGtleSAobWFya2VkXG4gICAqIGFzIGEgc2VydmVyIGFwcGx5IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNyZWF0ZSAtIGluY2x1ZGluZyB0aGVcbiAgICogbWVtYmVyc2hpcC1jaGVjayBjb21wZW5zYXRpb24gZGVzdHJveSAtIHNvIGFuIGFjdGl2ZSBTeW5jUHVibGlzaGVyIG5ldmVyXG4gICAqIHB1Ymxpc2hlcyB0aGUgcmVwbGF5ZWQgY3JlYXRlIGEgc2Vjb25kIHRpbWUpLCB0aGVuXG4gICAqIHZlcmlmaWVzIGNyZWF0ZS1zY29wZSBtZW1iZXJzaGlwIHdoZW4gYW4gYWJpbGl0eSBpcyBjb25maWd1cmVkOiByZWNvcmRzXG4gICAqIG91dHNpZGUgdGhlIGFiaWxpdHkncyBjcmVhdGUgc2NvcGUgYXJlIGRlc3Ryb3llZCBhZ2FpbiBhbmQgZmFpbCB0aGUgc3luY1xuICAgKiB3aXRoIHRoZSByZXNvdXJjZS1kZWNsYXJlZCByZWFzb24uIEEgcmVjb3JkIHRoYXQgYWxyZWFkeSBleGlzdHMgb3V0c2lkZVxuICAgKiB0aGUgcmVzb3VyY2UncyBsb29rdXAgc2NvcGUgZmFpbHMgdGhlIHN5bmMgYXMgYW4gYXV0aG9yaXphdGlvbiBkZW5pYWxcbiAgICogaW5zdGVhZCBvZiBjb2xsaWRpbmcgb24gdGhlIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLmF0dHJpYnV0ZXMgLSBQZXJtaXR0ZWQgcGF5bG9hZCBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gQ3JlYXRlZCByZWNvcmQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVSb3V0ZWRSZXBsYXlSZWNvcmQoe2F0dHJpYnV0ZXMsIG11dGF0aW9uLCByZXNvdXJjZX0pIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gcmVzb3VyY2UubW9kZWxDbGFzcygpXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgY29uc3QgY29uZmxpY3RpbmdJZHMgPSBhd2FpdCBNb2RlbENsYXNzLndoZXJlKHtbcHJpbWFyeUtleV06IG11dGF0aW9uLnJlc291cmNlSWR9KS5wbHVjayhwcmltYXJ5S2V5KVxuXG4gICAgaWYgKGNvbmZsaWN0aW5nSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoYFN5bmMgdXBkYXRlIGRlbmllZCBmb3I6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfS5gLCB7XG4gICAgICAgIGNvZGU6IHJlc291cmNlLnN5bmNBdXRob3JpemF0aW9uRmFpbHVyZVJlYXNvbih7YWN0aW9uOiBcInVwZGF0ZVwiLCBtdXRhdGlvbn0pIHx8IFwiYWNjZXNzLWRlbmllZFwiXG4gICAgICB9KVxuICAgIH1cblxuICAgIGF3YWl0IE1vZGVsQ2xhc3MuZW5zdXJlSW5pdGlhbGl6ZWQoKVxuXG4gICAgY29uc3QgcmVjb3JkID0gbmV3IE1vZGVsQ2xhc3Moe1twcmltYXJ5S2V5XTogbXV0YXRpb24ucmVzb3VyY2VJZCwgLi4uYXR0cmlidXRlc30pXG4gICAgY29uc3QgcmVsZWFzZVNlcnZlckFwcGx5ID0gbWFya1NlcnZlckFwcGx5KHJlY29yZClcblxuICAgIHRyeSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWNvcmQuc2F2ZSgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyB0aGlzLnJvdXRlZFJlcGxheVNhdmVFcnJvcihlcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWJpbGl0eSA9IHJlc291cmNlLmFiaWxpdHlcblxuICAgICAgaWYgKGFiaWxpdHkpIHtcbiAgICAgICAgY29uc3QgbWVtYmVySWRzID0gYXdhaXQgTW9kZWxDbGFzc1xuICAgICAgICAgIC5hY2Nlc3NpYmxlRm9yKHJlc291cmNlLnN5bmNBYmlsaXR5QWN0aW9uKFwiY3JlYXRlXCIpLCBhYmlsaXR5KVxuICAgICAgICAgIC53aGVyZSh7W3ByaW1hcnlLZXldOiByZWNvcmQuaWQoKX0pXG4gICAgICAgICAgLnBsdWNrKHByaW1hcnlLZXkpXG5cbiAgICAgICAgaWYgKG1lbWJlcklkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhd2FpdCByZWNvcmQuZGVzdHJveSgpXG5cbiAgICAgICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBTeW5jIGNyZWF0ZSBkZW5pZWQgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uYCwge1xuICAgICAgICAgICAgY29kZTogcmVzb3VyY2Uuc3luY0F1dGhvcml6YXRpb25GYWlsdXJlUmVhc29uKHthY3Rpb246IFwiY3JlYXRlXCIsIG11dGF0aW9ufSkgfHwgXCJhY2Nlc3MtZGVuaWVkXCJcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWNvcmRcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVsZWFzZVNlcnZlckFwcGx5KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgYSByb3V0ZWQgcmVjb3JkLCBjb252ZXJ0aW5nIG1vZGVsIHZhbGlkYXRpb24gZmFpbHVyZXMgaW50b1xuICAgKiBjbGllbnQtc2FmZSBwZXItc3luYyBlcnJvcnMgY2FycnlpbmcgdGhlIHRyYW5zbGF0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBSZWNvcmQgdG8gc2F2ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gc2F2ZWQuXG4gICAqL1xuICBhc3luYyBzYXZlUm91dGVkUmVwbGF5UmVjb3JkKHJlY29yZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZWNvcmQuc2F2ZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMucm91dGVkUmVwbGF5U2F2ZUVycm9yKGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgcm91dGVkIHNhdmUvY3JlYXRlIGZhaWx1cmU6IG1vZGVsIHZhbGlkYXRpb24gZXJyb3JzIGJlY29tZVxuICAgKiBjbGllbnQtc2FmZSBlcnJvcnMgd2l0aCB0aGVpciB0cmFuc2xhdGVkIG1lc3NhZ2VzLCBldmVyeXRoaW5nIGVsc2VcbiAgICogcHJvcGFnYXRlcyB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGVycm9yIC0gVGhyb3duIHNhdmUvY3JlYXRlIGVycm9yLlxuICAgKiBAcmV0dXJucyB7RXJyb3J9IEVycm9yIHRvIHJldGhyb3cuXG4gICAqL1xuICByb3V0ZWRSZXBsYXlTYXZlRXJyb3IoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIHJldHVybiBWZWxvY2lvdXNFcnJvci5zYWZlKGVycm9yLm1lc3NhZ2UsIHtjYXVzZTogZXJyb3IsIGNvZGU6IFwidmFsaWRhdGlvbi1lcnJvclwifSlcbiAgICB9XG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuIGFwcGx5IHJlc3VsdCBmb3Igc3RhbGUgbXV0YXRpb25zIHRoYXQgc2hvdWxkIG5vdCB0b3VjaCBkb21haW4gbW9kZWxzLlxuICAgKiBFeGFjdCBkdXBsaWNhdGVzIHJlc29sdmUgdGhlIGN1cnJlbnQgcm91dGVkIHJlY29yZCBzbyB0aGUgYWNrbm93bGVkZ2VtZW50XG4gICAqIGNhbiBpbmNsdWRlIGl0cyBhdXRob3JpdGF0aXZlIHZlcnNpb24gd2l0aG91dCBhcHBseWluZyB0aGUgbXV0YXRpb24gYWdhaW4uXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBQcm9qZWN0LXNwZWNpZmljIGFwcGx5IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHNraXBwZWRSZXBsYXlNdXRhdGlvbih7YWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KSB7XG4gICAgaWYgKCF0aGlzLmlzRHVwbGljYXRlUmVwbGF5TXV0YXRpb24oe2V4aXN0aW5nU3luYywgbXV0YXRpb259KSB8fCAhdGhpcy5yb3V0aW5nQ29uZmlndXJlZCgpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbihtdXRhdGlvbi5yZXNvdXJjZVR5cGUpXG5cbiAgICBpZiAoIXJlZ2lzdHJhdGlvbikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFJlcGxheVJlc291cmNlKHthY3RvciwgY29udGV4dCwgbXV0YXRpb24sIHJlZ2lzdHJhdGlvbn0pXG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgcmVzb3VyY2UuZmluZFN5bmNSZWNvcmQoe2ZvckRlbGV0ZTogbXV0YXRpb24uc3luY1R5cGUgPT09IFwiZGVsZXRlXCIsIG11dGF0aW9ufSlcblxuICAgIHJldHVybiB7Y3JlYXRlZDogZmFsc2UsIGRlbGV0ZWQ6IGZhbHNlLCBkdXBsaWNhdGU6IHRydWUsIHJlY29yZH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0cyBvbmUgbm9ybWFsaXplZCBtdXRhdGlvbiBpbnRvIHRoZSBhcHAgc3luYy9jaGFuZ2Ugc3RvcmUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGEgc3RhbGUtZ3VhcmRlZCBzeW5jLW1vZGVsIHVwc2VydCAod2l0aCBzZXJ2ZXIgcmUtc2VxdWVuY2luZyBvblxuICAgKiB1cGRhdGVzKSB3aGVuIGEgc3luYyBtb2RlbCBpcyBjb25maWd1cmVkOyBvdGhlcndpc2UgYXBwcyBvdmVycmlkZSB0aGlzIGhvb2suXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBhcHBseVJlc3VsdDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9uLCBzaG91bGRBcHBseTogYm9vbGVhbn19IGFyZ3MgLSBSZXBsYXkgcGVyc2lzdGVuY2UgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHBlcnNpc3RSZXBsYXlNdXRhdGlvbih7YWN0b3IsIGFwcGx5UmVzdWx0LCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9uLCBzaG91bGRBcHBseX0pIHtcbiAgICBpZiAoIXRoaXMuc3luY01vZGVsKSByZXR1cm5cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLnJlcGxheVBlcnNpc3RBdHRyaWJ1dGVzKHthY3RvciwgbXV0YXRpb259KVxuXG4gICAgLy8gU3RhbGUgcmVwbGF5cyBuZXZlciBhcHBsaWVkIGFueXRoaW5nLCBzbyB0aGUgYXBwbHlSZXN1bHQtZHJpdmVuIGV4dGVuc2lvblxuICAgIC8vIGhvb2tzIG11c3Qgbm90IHJ1biBhZ2FpbnN0IHRoZSBkZWZhdWx0IG51bGwgc2tpcHBlZCByZXN1bHQuXG4gICAgaWYgKHRoaXMucGVyc2lzdEV4dHJhQXR0cmlidXRlcyAmJiBzaG91bGRBcHBseSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihhdHRyaWJ1dGVzLCB0aGlzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMoe2FjdG9yLCBhcHBseVJlc3VsdCwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbiwgc2hvdWxkQXBwbHl9KSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wZXJzaXN0U2VyaWFsaXplZERhdGEgJiYgc2hvdWxkQXBwbHkpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWREYXRhID0gdGhpcy5wZXJzaXN0U2VyaWFsaXplZERhdGEoe2FwcGx5UmVzdWx0LCBtdXRhdGlvbn0pXG5cbiAgICAgIGlmIChzZXJpYWxpemVkRGF0YSAhPT0gdW5kZWZpbmVkICYmIHNlcmlhbGl6ZWREYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMuZGF0YSA9IHR5cGVvZiBzZXJpYWxpemVkRGF0YSA9PT0gXCJzdHJpbmdcIiA/IHNlcmlhbGl6ZWREYXRhIDogSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZERhdGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmxpY3RTdHJhdGVneSAmJiBzaG91bGRBcHBseSAmJiBtdXRhdGlvbi5iYXNlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGFwcGx5UmVzdWx0Py5yZWNvcmQpIHtcbiAgICAgIGNvbnN0IHB1YmxpY1BheWxvYWQgPSBkZWNvZGVSZXBsYXlQZXJzaXN0ZWREYXRhKGF0dHJpYnV0ZXMuZGF0YSkucGF5bG9hZFxuICAgICAgY29uc3QgYWNrbm93bGVkZ2VtZW50VmVyc2lvbiA9IG5vcm1hbGl6ZUNvbmZsaWN0VmFsdWUoYXBwbHlSZXN1bHQucmVjb3JkLnJlYWRBdHRyaWJ1dGUodGhpcy5jb25mbGljdFN0cmF0ZWd5LnZlcnNpb25BdHRyaWJ1dGUpKVxuXG4gICAgICBhdHRyaWJ1dGVzLmRhdGEgPSBzZXJpYWxpemVSZXBsYXlQZXJzaXN0ZWREYXRhKHtcbiAgICAgICAgYWNrbm93bGVkZ2VtZW50VmVyc2lvbixcbiAgICAgICAgY2xpZW50TXV0YXRpb25JZDogU3RyaW5nKG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQgfHwgbXV0YXRpb24uaWQpLFxuICAgICAgICBwYXlsb2FkOiBwdWJsaWNQYXlsb2FkLFxuICAgICAgICBwYXlsb2FkRmluZ2VycHJpbnQ6IHNoYTI1NkhleChtdXRhdGlvbi5zZXJpYWxpemVkRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nU3luYykge1xuICAgICAgY29uc3QgZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQgPSB0aGlzLmV4aXN0aW5nUmVwbGF5U3luY0NsaWVudFVwZGF0ZWRBdChleGlzdGluZ1N5bmMpXG5cbiAgICAgIGlmIChleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCAmJiBtdXRhdGlvbi5jbGllbnRVcGRhdGVkQXQgPD0gZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQpIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHVwc2VydFN5bmNSb3coe2F0dHJpYnV0ZXMsIGV4aXN0aW5nU3luYywgc3luY01vZGVsOiB0aGlzLnN5bmNNb2RlbH0pXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBzeW5jLW1vZGVsIGF0dHJpYnV0ZXMgcGVyc2lzdGVkIGJ5IHRoZSBtb2RlbC1iYWNrZWQgZGVmYXVsdC5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFN5bmMgcm93IGF0dHJpYnV0ZXMuXG4gICAqL1xuICByZXBsYXlQZXJzaXN0QXR0cmlidXRlcyh7YWN0b3IsIG11dGF0aW9ufSkge1xuICAgIHJldHVybiB7XG4gICAgICBbdGhpcy5hY3RvckZvcmVpZ25LZXlDb2x1bW5dOiB0aGlzLnJlcGxheUFjdG9ySWQoYWN0b3IpLFxuICAgICAgY2xpZW50X3VwZGF0ZWRfYXQ6IG11dGF0aW9uLmNsaWVudFVwZGF0ZWRBdCxcbiAgICAgIGRhdGE6IG11dGF0aW9uLnNlcmlhbGl6ZWREYXRhLFxuICAgICAgcmVzb3VyY2VfaWQ6IG11dGF0aW9uLnJlc291cmNlSWQsXG4gICAgICByZXNvdXJjZV90eXBlOiBtdXRhdGlvbi5yZXNvdXJjZVR5cGUsXG4gICAgICBzeW5jX3R5cGU6IG11dGF0aW9uLnN5bmNUeXBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2lkZSBlZmZlY3RzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBtdXRhdGlvbiByZXBsYXkgYW5kIHBlcnNpc3RlbmNlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBmYW5uaW5nIHRoZSBhcHBsaWVkIHJlc3VsdCBvdXQgdGhyb3VnaCB0aGUgY29uZmlndXJlZFxuICAgKiBkZWNsYXJhdGl2ZSBicm9hZGNhc3RzLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgZXhpc3RpbmdTeW5jOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgYXBwbHlSZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbiwgc2hvdWxkQXBwbHk6IGJvb2xlYW59fSBhcmdzIC0gUmVwbGF5IHNpZGUtZWZmZWN0IGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZnRlclJlcGxheU11dGF0aW9uKGFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuYnJvYWRjYXN0cyB8fCAhdGhpcy5icm9hZGNhc3RlcikgcmV0dXJuXG4gICAgLy8gU3RhbGUgcmVwbGF5cyBuZXZlciBhcHBsaWVkIGFueXRoaW5nIC0gYnJvYWRjYXN0aW5nIHRoZWlyIHNraXBwZWQgcmVzdWx0c1xuICAgIC8vIHdvdWxkIGZhbiBvdXQgc3RhbGUgc2lkZSBlZmZlY3RzIChvciBjcmFzaCBvbiB0aGUgZGVmYXVsdCBudWxsIGFwcGx5UmVzdWx0KS5cbiAgICBpZiAoIWFyZ3Muc2hvdWxkQXBwbHkpIHJldHVyblxuXG4gICAgYXdhaXQgZGVsaXZlckRlY2xhcmVkQnJvYWRjYXN0cyh7YXJncywgYnJvYWRjYXN0ZXI6IHRoaXMuYnJvYWRjYXN0ZXIsIGJyb2FkY2FzdHM6IHRoaXMuYnJvYWRjYXN0c30pXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGV0ZXJtaW5pc3RpYywgTXlTUUwtc2FmZSBhZHZpc29yeS1sb2NrIG5hbWUgZm9yIGEgcm91dGVkIHJlcGxheVxuICogcmVzb3VyY2UgaWRlbnRpdHkuIFRoZSBmdWxsIGB7cmVzb3VyY2VUeXBlLCByZXNvdXJjZUlkfWAgaWRlbnRpdHkgaXMgaGFzaGVkXG4gKiB3aXRoIFNIQS0yNTYgYW5kIHRydW5jYXRlZCB0byAzMiBoZXggY2hhcmFjdGVycyBzbyB0aGUgZmluYWwgbmFtZSBzdGF5cyB3ZWxsXG4gKiB1bmRlciBNeVNRTC9NYXJpYURCJ3MgNjQtY2hhcmFjdGVyIGBHRVRfTE9DS2AgbGltaXQgd2hpbGUgcmVtYWluaW5nXG4gKiBjb2xsaXNpb24tcmVzaXN0YW50LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBMb2NrIGlkZW50aXR5IGFyZ3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZUlkIC0gUmVzb3VyY2UgaWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZVR5cGUgLSBSZXNvdXJjZSB0eXBlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBBZHZpc29yeSBsb2NrIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW5jUmVwbGF5Q29uZmxpY3RMb2NrTmFtZSh7cmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlfSkge1xuICBjb25zdCBpZGVudGl0eSA9IHN0YWJsZUpzb25TdHJpbmdpZnkoe3Jlc291cmNlSWQsIHJlc291cmNlVHlwZX0pXG4gIGNvbnN0IGhhc2ggPSBzaGEyNTZIZXgoaWRlbnRpdHkpLnNsaWNlKDAsIDMyKVxuXG4gIHJldHVybiBgdnNyOiR7aGFzaH1gXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbiBhdXRob3JpdGF0aXZlIGNvbmZsaWN0IHZhbHVlIGZvciBKU09OIHRyYW5zcG9ydCBhbmQgZGV0ZXJtaW5pc3RpYyBjb21wYXJpc29uLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBSYXcgdmFsdWUgZnJvbSBhIGRhdGFiYXNlIHJlY29yZC5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBOb3JtYWxpemVkIHZhbHVlIChEYXRlIHZhbHVlcyBiZWNvbWUgSVNPIHN0cmluZ3MpLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVDb25mbGljdFZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpXG5cbiAgcmV0dXJuIHZhbHVlXG59XG4iXX0=
1035
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDM0YsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDMUQsT0FBTyx1QkFBdUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNyRSxPQUFPLG1CQUFtQixNQUFNLGtCQUFrQixDQUFBO0FBQ2xELE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFBO0FBQzlDLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSw0QkFBNEIsRUFBQyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUMzRCxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRDs7Ozs7O0dBTUc7QUFDSDs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8seUJBQXlCO0lBQzVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EyQkc7SUFDSCxZQUFZLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUE7UUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQTtRQUN2QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxD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aEMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxZQUFZO1lBQ3BDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUTtTQUM3QixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBSTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTTtRQUNqRCw0RUFBNEU7UUFDNUUsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU07UUFFN0IsTUFBTSx5QkFBeUIsQ0FBQyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUE7SUFDckcsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUM7SUFDbkUsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsRUFBQyxVQUFVLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtJQUNoRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUU3QyxPQUFPLE9BQU8sSUFBSSxFQUFFLENBQUE7QUFDdEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLEtBQUs7SUFDbkMsSUFBSSxLQUFLLFlBQVksSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBRXJELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RlbGl2ZXJEZWNsYXJlZEJyb2FkY2FzdHMsIHVwc2VydFN5bmNSb3d9IGZyb20gXCIuL3N5bmMtY2hhbmdlLWZhbm91dC5qc1wiXG5pbXBvcnQge21hcmtTZXJ2ZXJBcHBseX0gZnJvbSBcIi4vc3luYy1wdWJsaXNoLXN1cHByZXNzaW9uLmpzXCJcbmltcG9ydCB7cmVzb2x2ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzfSBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL3Jlc291cmNlLWRlZmluaXRpb24uanNcIlxuaW1wb3J0IHtyZXNvbHZlU3luY0NvbmZsaWN0fSBmcm9tIFwiLi9jb25mbGljdC1zdHJhdGVneS5qc1wiXG5pbXBvcnQgU3luY1JlcGxheVVwc2VydEFwcGxpZXIgZnJvbSBcIi4vc3luYy1yZXBsYXktdXBzZXJ0LWFwcGxpZXIuanNcIlxuaW1wb3J0IHN0YWJsZUpzb25TdHJpbmdpZnkgZnJvbSBcIi4vc3RhYmxlLWpzb24uanNcIlxuaW1wb3J0IHNoYTI1NkhleCBmcm9tIFwiLi4vdXRpbHMvc2hhMjU2LWhleC5qc1wiXG5pbXBvcnQge2RlY29kZVJlcGxheVBlcnNpc3RlZERhdGEsIHNlcmlhbGl6ZVJlcGxheVBlcnNpc3RlZERhdGF9IGZyb20gXCIuL3N5bmMtcmVwbGF5LXBlcnNpc3RlZC1kYXRhLmpzXCJcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yfSBmcm9tIFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCJcbmltcG9ydCBWZWxvY2lvdXNFcnJvciBmcm9tIFwiLi4vdmVsb2Npb3VzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBSZXNvbHZlZCByb3V0ZWQtcmVzb3VyY2UgcmVnaXN0cmF0aW9uIGZvciBvbmUgcmVwbGF5IHJlc291cmNlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbE5hbWUgLSBFZmZlY3RpdmUgZnJvbnRlbmQgbW9kZWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IHJlc291cmNlQ2xhc3MgLSBSb3V0ZWQgcmVzb3VyY2UgY2xhc3MuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24gfCBudWxsfSByZXNvdXJjZUNvbmZpZ3VyYXRpb24gLSBOb3JtYWxpemVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gd2hlbiByZWdpc3RyeS1yZXNvbHZlZC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUmVwbGF5TXV0YXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gW2Jhc2VWZXJzaW9uXSAtIEJhc2Ugc2VydmVyL2NsaWVudCB2ZXJzaW9uIG9ic2VydmVkIGJ5IHRoZSBjbGllbnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NsaWVudE11dGF0aW9uSWRdIC0gT3JpZ2luYWwgY2xpZW50IG11dGF0aW9uIGlkIGZyb20gdGhlIHNpZ25lZCBlbnZlbG9wZS5cbiAqIEBwcm9wZXJ0eSB7RGF0ZX0gY2xpZW50VXBkYXRlZEF0IC0gQ2xpZW50LXNpZGUgbXV0YXRpb24gdGltZXN0YW1wLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGRhdGEgLSBQYXJzZWQgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGlkIC0gQ2xpZW50IHN5bmMgcm93IGlkIGZvciBwZXItc3luYyByZXNwb25zZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VJZCAtIFJlc291cmNlIGlkIGFzIGEgc3RyaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlVHlwZSAtIFJlc291cmNlL21vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VyaWFsaXplZERhdGEgLSBKU09OIHNlcmlhbGl6ZWQgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzeW5jVHlwZSAtIFN5bmMgb3BlcmF0aW9uIHR5cGUuXG4gKi9cbi8qKlxuICogT25lIGRlY2xhcmF0aXZlIGJyb2FkY2FzdCBmYW5uZWQgb3V0IGFmdGVyIGEgbXV0YXRpb24gYXBwbGllcy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNSZXBsYXlCcm9hZGNhc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKChhcmdzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IHN0cmluZyl9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUgb3IgcmVzb2x2ZXIuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYnJvYWRjYXN0UGFyYW1zIC0gQ2hhbm5lbCByb3V0aW5nIHBhcmFtcy5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGJvZHkgLSBCcm9hZGNhc3QgYm9keS5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gYm9vbGVhbn0gW3doZW5dIC0gT3B0aW9uYWwgZ2F0ZTsgc2tpcHBlZCB3aGVuIGl0IHJldHVybnMgZmFsc2UuXG4gKi9cblxuLyoqXG4gKiBSZXBsYXlzIGNsaWVudCBzeW5jIGVudmVsb3BlcyB0aHJvdWdoIHByb2plY3Qgc3VwcGxpZWQgYXV0aGVudGljYXRpb24sXG4gKiBhdXRob3JpemF0aW9uLCBhcHBsaWNhdGlvbiwgYW5kIHBlcnNpc3RlbmNlIGhvb2tzLlxuICpcbiAqIFRoaXMgaXMgaW50ZW50aW9uYWxseSB0cmFuc3BvcnQvbW9kZWwgYWdub3N0aWM6IFZlbG9jaW91cyBvd25zIHRoZSBnZW5lcmljXG4gKiByZXBsYXkgbG9vcCwgbm9ybWFsaXphdGlvbiwgc3RhbGUtY2xpZW50IGNvbXBhcmlzb24sIGFuZCBwZXItc3luYyByZXN1bHRcbiAqIHNoYXBlIHdoaWxlIGVhY2ggYXBwIG93bnMgaXRzIHRva2VuIGxvb2t1cCwgbW9kZWwgaGFuZGxlcnMsIGFuZFxuICogZG9tYWluIGF1dGhvcml6YXRpb24gcnVsZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHN5bmMgZW52ZWxvcGUgcmVwbGF5IHNlcnZpY2UuXG4gICAqXG4gICAqIFdoZW4gYSBzeW5jIG1vZGVsIGlzIGdpdmVuLCBgZmluZEV4aXN0aW5nUmVwbGF5U3luY2AgYW5kXG4gICAqIGBwZXJzaXN0UmVwbGF5TXV0YXRpb25gIGdldCBtb2RlbC1iYWNrZWQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMuIFRoZSBzeW5jXG4gICAqIG1vZGVsIG11c3QgZXhwb3NlIGBmaW5kQnlgL2BjcmVhdGVgIHN0YXRpY3MgcGx1cyBpbnN0YW5jZVxuICAgKiBgYXNzaWduYC9gc2F2ZWAvYGNsaWVudFVwZGF0ZWRBdGAgYW5kIGBhZHZhbmNlU2VydmVyU2VxdWVuY2VgICh0aGVcbiAgICogY2hhbmdlLWZlZWQgc2VxdWVuY2UgY29udHJhY3QpLCBhbmQgdGhlIGFjdG9yIHJldHVybmVkIGZyb21cbiAgICogYGF1dGhlbnRpY2F0ZVJlcGxheWAgbXVzdCBleHBvc2UgYW4gYGlkKClgIG1ldGhvZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIENvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHt7ZGVidWc/OiAoLi4uYXJnczogQXJyYXk8dW5rbm93bj4pID0+IHZvaWQsIHdhcm4/OiAoLi4uYXJnczogQXJyYXk8dW5rbm93bj4pID0+IHZvaWR9fSBbYXJncy5sb2dnZXJdIC0gTG9nZ2VyIHVzZWQgZm9yIG5vcm1hbGl6YXRpb24gd2FybmluZ3MuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IFthcmdzLnN5bmNNb2RlbF0gLSBTeW5jL2NoYW5nZSBtb2RlbCBlbmFibGluZyBtb2RlbC1iYWNrZWQgZGVmYXVsdCBob29rcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbl0gLSBTeW5jIG1vZGVsIGNvbHVtbiBsaW5raW5nIHJvd3MgdG8gdGhlIHJlcGxheSBhY3Rvci5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW2FyZ3MuYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsXSAtIFRva2VuIG1vZGVsIGVuYWJsaW5nIHRoZSBkZWZhdWx0IHRva2VuLWxvb2t1cCBhdXRoZW50aWNhdGVSZXBsYXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5hdXRoZW50aWNhdGlvblRva2VuQ29sdW1uXSAtIFRva2VuIG1vZGVsIGNvbHVtbiBob2xkaW5nIHRoZSB0b2tlbi4gRGVmYXVsdHMgdG8gXCJ0b2tlblwiLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYXV0aGVudGljYXRpb25Ub2tlblBhcmFtXSAtIFJlcXVlc3QgcGFyYW0gY2FycnlpbmcgdGhlIHRva2VuLiBEZWZhdWx0cyB0byBcImF1dGhlbnRpY2F0aW9uVG9rZW5cIi5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCAoKGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pIHwgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBTeW5jUmVwbGF5VXBzZXJ0QXBwbGllcj5bMF0+fSBbYXJncy5hcHBseUhhbmRsZXJzXSAtIFBlci1yZXNvdXJjZVR5cGUgYXBwbHkgaGFuZGxlcnMgKGZ1bmN0aW9ucyBvciBkZWNsYXJhdGl2ZSB1cHNlcnQtYXBwbGllciBzcGVjcykgZW5hYmxpbmcgdGhlIGRlZmF1bHQgYXBwbHlSZXBsYXlNdXRhdGlvbiBkaXNwYXRjaC4gRGVwcmVjYXRlZDogcHJlZmVyIHJlc291cmNlIHJvdXRpbmcgdmlhIGBjb25maWd1cmF0aW9uYC9gcmVzb3VyY2VUeXBlT3ZlcnJpZGVzYDsgYXBwbHlIYW5kbGVycyByZW1haW4gZm9yIHJlbGVhc2VkIGFkb3B0ZXJzIGFuZCB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgdGhlaXIgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0geyhhcmdzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW2FyZ3MucGVyc2lzdEV4dHJhQXR0cmlidXRlc10gLSBFeHRyYSBhdHRyaWJ1dGVzIG1lcmdlZCBpbnRvIHRoZSBtb2RlbC1iYWNrZWQgcGVyc2lzdGVkIHJvdyAoZS5nLiBhbiBldmVudCBzY29wZSBjb2x1bW4pLlxuICAgKiBAcGFyYW0geyhhcmdzOiB7bXV0YXRpb246IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBhcHBseVJlc3VsdDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW2FyZ3MucGVyc2lzdFNlcmlhbGl6ZWREYXRhXSAtIE92ZXJyaWRlcyB0aGUgcGVyc2lzdGVkIGRhdGEgcGF5bG9hZCAob2JqZWN0IHJlc3VsdHMgYXJlIEpTT04gc3RyaW5naWZpZWQpLlxuICAgKiBAcGFyYW0geyhicm9hZGNhc3Q6IHtjaGFubmVsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBib2R5OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0pID0+IFByb21pc2U8dm9pZD59IFthcmdzLmJyb2FkY2FzdGVyXSAtIERlbGl2ZXJzIGRlY2xhcmF0aXZlIGJyb2FkY2FzdHMuIFJlcXVpcmVkIHdoZW4gYnJvYWRjYXN0cyBhcmUgY29uZmlndXJlZC5cbiAgICogQHBhcmFtIHtTeW5jUmVwbGF5QnJvYWRjYXN0W119IFthcmdzLmJyb2FkY2FzdHNdIC0gQnJvYWRjYXN0cyBmYW5uZWQgb3V0IGJ5IHRoZSBkZWZhdWx0IGFmdGVyUmVwbGF5TXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbYXJncy5jb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gd2hvc2UgZnJvbnRlbmQtbW9kZWwgcmVnaXN0cnkgcm91dGVzIG11dGF0aW9ucyB0byByZXNvdXJjZSBjbGFzc2VzLlxuICAgKiBAcGFyYW0ge3tzdHJhdGVneT86IFwib3B0aW1pc3RpY1ZlcnNpb25cIiB8IFwic2VydmVyV2luc1wiLCB2ZXJzaW9uQXR0cmlidXRlOiBzdHJpbmd9IHwgbnVsbH0gW2FyZ3MuY29uZmxpY3RTdHJhdGVneV0gLSBPcHRpb25hbCBiYXNlLXZlcnNpb24gY29uZmxpY3QgZGV0ZWN0aW9uIGZvciByb3V0ZWQgdXBzZXJ0cy4gT25seSBgb3B0aW1pc3RpY1ZlcnNpb25gIGFuZCBgc2VydmVyV2luc2AgYXJlIHN1cHBvcnRlZCBmb3IgYmFja2VuZCByZXBsYXkgYmVjYXVzZSB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgdGhlIGNsaWVudCdzIGJhc2Ugc25hcHNob3QuIFdoZW4gYHN0cmF0ZWd5YCBpcyBvbWl0dGVkIGl0IGRlZmF1bHRzIHRvIGBvcHRpbWlzdGljVmVyc2lvbmAsIG1hdGNoaW5nIGByZXNvbHZlU3luY0NvbmZsaWN0YCBhbmQgbm9ybWFsaXplZCByZXNvdXJjZSBjb25maWcuIFdoZW4gY29uZmlndXJlZCwgYSBtdXRhdGlvbiB3aG9zZSBiYXNlVmVyc2lvbiBkb2VzIG5vdCBtYXRjaCB0aGUgY3VycmVudCBzZXJ2ZXIgdmVyc2lvbkF0dHJpYnV0ZSBpcyByZWplY3RlZCB3aXRoIGEgc3RydWN0dXJlZCBjb25mbGljdCByZXN1bHQgaW5zdGVhZCBvZiBiZWluZyBhcHBsaWVkLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgc3RyaW5nPn0gW2FyZ3MucmVzb3VyY2VUeXBlT3ZlcnJpZGVzXSAtIFBlci1yZXNvdXJjZVR5cGUgcm91dGluZyBvdmVycmlkZXM6IGEgcmVzb3VyY2UgY2xhc3MsIG9yIGEgc3RyaW5nIGFsaWFzIHJlc29sdmVkIHRocm91Z2ggdGhlIHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0fSBbYXJncy5hYmlsaXR5XSAtIEFiaWxpdHkgc2NvcGluZyByb3V0ZWQgcmVjb3JkIGxvb2t1cHMgYW5kIGNyZWF0ZSBtZW1iZXJzaGlwIGNoZWNrcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFthcmdzLmFiaWxpdHlDb250ZXh0XSAtIEFiaWxpdHkgY29udGV4dCBwYXNzZWQgdG8gcm91dGVkIHJlc291cmNlcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFthcmdzLmxvY2Fsc10gLSBMb2NhbHMgcGFzc2VkIHRvIHJvdXRlZCByZXNvdXJjZXMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhcmdzID0ge30pIHtcbiAgICB0aGlzLmxvZ2dlciA9IGFyZ3MubG9nZ2VyIHx8IGNvbnNvbGVcbiAgICB0aGlzLnN5bmNNb2RlbCA9IGFyZ3Muc3luY01vZGVsIHx8IG51bGxcbiAgICB0aGlzLmFjdG9yRm9yZWlnbktleUNvbHVtbiA9IGFyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uIHx8IFwiYXV0aGVudGljYXRpb25fdG9rZW5faWRcIlxuICAgIHRoaXMuYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsID0gYXJncy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWwgfHwgbnVsbFxuICAgIHRoaXMuYXV0aGVudGljYXRpb25Ub2tlbkNvbHVtbiA9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbkNvbHVtbiB8fCBcInRva2VuXCJcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5QYXJhbSA9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlblBhcmFtIHx8IFwiYXV0aGVudGljYXRpb25Ub2tlblwiXG4gICAgdGhpcy5wZXJzaXN0RXh0cmFBdHRyaWJ1dGVzID0gYXJncy5wZXJzaXN0RXh0cmFBdHRyaWJ1dGVzIHx8IG51bGxcbiAgICB0aGlzLnBlcnNpc3RTZXJpYWxpemVkRGF0YSA9IGFyZ3MucGVyc2lzdFNlcmlhbGl6ZWREYXRhIHx8IG51bGxcbiAgICB0aGlzLmJyb2FkY2FzdGVyID0gYXJncy5icm9hZGNhc3RlciB8fCBudWxsXG4gICAgdGhpcy5icm9hZGNhc3RzID0gYXJncy5icm9hZGNhc3RzIHx8IG51bGxcbiAgICB0aGlzLmFwcGx5SGFuZGxlcnMgPSBhcmdzLmFwcGx5SGFuZGxlcnMgPyB0aGlzLmJ1aWx0QXBwbHlIYW5kbGVycyhhcmdzLmFwcGx5SGFuZGxlcnMpIDogbnVsbFxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGFyZ3MuY29uZmlndXJhdGlvbiB8fCBudWxsXG4gICAgdGhpcy5jb25mbGljdFN0cmF0ZWd5ID0gYXJncy5jb25mbGljdFN0cmF0ZWd5IHx8IG51bGxcbiAgICB0aGlzLnJlc291cmNlVHlwZU92ZXJyaWRlcyA9IGFyZ3MucmVzb3VyY2VUeXBlT3ZlcnJpZGVzIHx8IG51bGxcbiAgICB0aGlzLmFiaWxpdHkgPSBhcmdzLmFiaWxpdHkgfHwgbnVsbFxuICAgIHRoaXMuYWJpbGl0eUNvbnRleHQgPSBhcmdzLmFiaWxpdHlDb250ZXh0IHx8IG51bGxcbiAgICB0aGlzLmxvY2FscyA9IGFyZ3MubG9jYWxzIHx8IG51bGxcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFN5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbiB8IG51bGw+fSAqL1xuICAgIHRoaXMuX3JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgaWYgKGFyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBhcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbiAhPT0gXCJzdHJpbmdcIiB8fCBhcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbi5sZW5ndGggPCAxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhY3RvckZvcmVpZ25LZXlDb2x1bW4gbXVzdCBiZSBhIG5vbi1ibGFuayBzdHJpbmcsIGdvdDogJHtTdHJpbmcoYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW4pfWApXG4gICAgfVxuICAgIGlmICh0aGlzLmJyb2FkY2FzdHMgJiYgIXRoaXMuYnJvYWRjYXN0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UgYnJvYWRjYXN0cyByZXF1aXJlIGEgYnJvYWRjYXN0ZXIgb3B0aW9uIGRlbGl2ZXJpbmcgdGhlbVwiKVxuICAgIH1cbiAgICBpZiAodGhpcy5jb25mbGljdFN0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzdXBwb3J0ZWRDb25mbGljdFN0cmF0ZWdpZXMgPSBuZXcgU2V0KFtcIm9wdGltaXN0aWNWZXJzaW9uXCIsIFwic2VydmVyV2luc1wiXSlcblxuICAgICAgaWYgKCF0aGlzLmNvbmZsaWN0U3RyYXRlZ3kudmVyc2lvbkF0dHJpYnV0ZSB8fCB0eXBlb2YgdGhpcy5jb25mbGljdFN0cmF0ZWd5LnZlcnNpb25BdHRyaWJ1dGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSBjb25mbGljdFN0cmF0ZWd5IHJlcXVpcmVzIGEgbm9uLWJsYW5rIHZlcnNpb25BdHRyaWJ1dGVcIilcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZsaWN0U3RyYXRlZ3kuc3RyYXRlZ3kgIT09IHVuZGVmaW5lZCAmJiAhc3VwcG9ydGVkQ29uZmxpY3RTdHJhdGVnaWVzLmhhcyh0aGlzLmNvbmZsaWN0U3RyYXRlZ3kuc3RyYXRlZ3kpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc3luYyBjb25mbGljdCBzdHJhdGVneSBmb3IgYmFja2VuZCByZXBsYXk6ICR7dGhpcy5jb25mbGljdFN0cmF0ZWd5LnN0cmF0ZWd5fS4gT25seSBvcHRpbWlzdGljVmVyc2lvbiBhbmQgc2VydmVyV2lucyBhcmUgc3VwcG9ydGVkLmApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGRlY2xhcmF0aXZlIGFwcGx5LWhhbmRsZXIgc3BlY3MgaW4gdXBzZXJ0IGFwcGxpZXJzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXBwbHlIYW5kbGVycyAtIFJhdyBhcHBseSBoYW5kbGVycy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIChhcmdzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gQ2FsbGFibGUgaGFuZGxlcnMgYnkgcmVzb3VyY2UgdHlwZS5cbiAgICovXG4gIGJ1aWx0QXBwbHlIYW5kbGVycyhhcHBseUhhbmRsZXJzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhcHBseUhhbmRsZXJzKS5tYXAoKFtyZXNvdXJjZVR5cGUsIGhhbmRsZXJdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFtyZXNvdXJjZVR5cGUsIGhhbmRsZXJdXG5cbiAgICAgIGNvbnN0IGFwcGxpZXIgPSBuZXcgU3luY1JlcGxheVVwc2VydEFwcGxpZXIoaGFuZGxlcilcblxuICAgICAgcmV0dXJuIFtyZXNvdXJjZVR5cGUsICgvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gYXBwbHlBcmdzKSA9PiBhcHBsaWVyLmFwcGx5KC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59ICovIChhcHBseUFyZ3MpKV1cbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXlzIGEgc3luYyBiYXRjaC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zIGNhcnJ5aW5nIGF1dGhlbnRpY2F0aW9uIGFuZCBzeW5jcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFtyZXF1ZXN0U3RhdGVdIC0gUmVxdWVzdC1sb2NhbCBzdGF0ZSBwYXNzZWQgdG8gYXV0aGVudGljYXRpb24vc3luYyBleHRyYWN0aW9uIGhvb2tzOyBzdWJjbGFzc2VzIG1heSB1c2UgdGhpcyB0byBzaGFyZSBwcmUtY29tcHV0ZWQgcGVyLXJlcXVlc3QgZGF0YSB3aXRob3V0IGluc3RhbmNlIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c3luY3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj4sIHN0YXR1cz86IHN0cmluZywgZXJyb3JDb2RlPzogc3RyaW5nLCBlcnJvck1lc3NhZ2U/OiBzdHJpbmd9Pn0gUmVwbGF5IHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgcmVwbGF5KHBhcmFtcywgcmVxdWVzdFN0YXRlID0ge30pIHtcbiAgICBjb25zdCBhY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aGVudGljYXRlUmVwbGF5KHBhcmFtcywgcmVxdWVzdFN0YXRlKVxuXG4gICAgaWYgKCFhY3RvclJlc3VsdC5hdXRoZW50aWNhdGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzeW5jczogW10sXG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBlcnJvckNvZGU6IGFjdG9yUmVzdWx0LmVycm9yQ29kZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBhY3RvclJlc3VsdC5lcnJvck1lc3NhZ2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzeW5jUmVzcG9uc2VzID0gW11cbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5idWlsZFJlcGxheUNvbnRleHQoe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgcGFyYW1zLCByZXF1ZXN0U3RhdGV9KVxuXG4gICAgZm9yIChjb25zdCByYXdTeW5jIG9mIHRoaXMucmVwbGF5U3luY3MocGFyYW1zLCByZXF1ZXN0U3RhdGUpKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVzdWx0ID0gdGhpcy5ub3JtYWxpemVSZXBsYXlTeW5jKHJhd1N5bmMpXG5cbiAgICAgIGlmICghbm9ybWFsaXplZFJlc3VsdC5vaykge1xuICAgICAgICBzeW5jUmVzcG9uc2VzLnB1c2gobm9ybWFsaXplZFJlc3VsdC5yZXNwb25zZSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgbXV0YXRpb24gPSBub3JtYWxpemVkUmVzdWx0Lm11dGF0aW9uXG4gICAgICBjb25zdCBhY2Nlc3NSZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGhvcml6ZVJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIG11dGF0aW9ufSlcblxuICAgICAgaWYgKCFhY2Nlc3NSZXN1bHQuYWxsb3dlZCkge1xuICAgICAgICBzeW5jUmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgIGlkOiBtdXRhdGlvbi5pZCxcbiAgICAgICAgICBzeW5jU3RhdGU6IFwiZmFpbGVkXCIsXG4gICAgICAgICAgcmVhc29uOiBhY2Nlc3NSZXN1bHQucmVhc29uIHx8IFwiYWNjZXNzLWRlbmllZFwiXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU3luYyA9IGF3YWl0IHRoaXMuZmluZEV4aXN0aW5nUmVwbGF5U3luYyh7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBtdXRhdGlvbn0pXG4gICAgICBjb25zdCBzaG91bGRBcHBseSA9IGF3YWl0IHRoaXMuc2hvdWxkQXBwbHlSZXBsYXlNdXRhdGlvbih7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSlcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9ICFzaG91bGRBcHBseSAmJiB0aGlzLmlzRHVwbGljYXRlUmVwbGF5TXV0YXRpb24oe2V4aXN0aW5nU3luYywgbXV0YXRpb259KVxuXG4gICAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqL1xuICAgICAgbGV0IGFwcGx5UmVzdWx0XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcGx5UmVzdWx0ID0gc2hvdWxkQXBwbHlcbiAgICAgICAgICA/IGF3YWl0IHRoaXMuYXBwbHlSZXBsYXlNdXRhdGlvbih7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSlcbiAgICAgICAgICA6IGF3YWl0IHRoaXMuc2tpcHBlZFJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gQ2xpZW50LXNhZmUgYXBwbHkgZmFpbHVyZXMgKHNjaGVtYSB2YWxpZGF0aW9uLCBtb2RlbCB2YWxpZGF0aW9uLFxuICAgICAgICAvLyBhdXRob3JpemF0aW9uIGRlbmlhbHMsIHVua25vd24gcmVzb3VyY2UgdHlwZXMpIGZhaWwgdGhpcyBzeW5jIGFuZFxuICAgICAgICAvLyBrZWVwIHRoZSBiYXRjaCBnb2luZzsgdW5leHBlY3RlZCBlcnJvcnMga2VlcCBwcm9wYWdhdGluZy5cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVmVsb2Npb3VzRXJyb3IgJiYgZXJyb3Iuc2FmZVRvRXhwb3NlKSB7XG4gICAgICAgICAgc3luY1Jlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBtdXRhdGlvbi5pZCxcbiAgICAgICAgICAgIHN5bmNTdGF0ZTogXCJmYWlsZWRcIixcbiAgICAgICAgICAgIHJlYXNvbjogZXJyb3IuY29kZSB8fCBcImFwcGx5LWZhaWxlZFwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGlmIChhcHBseVJlc3VsdCAmJiBhcHBseVJlc3VsdC5zdGF0dXMgPT09IFwiY29uZmxpY3RcIikge1xuICAgICAgICBzeW5jUmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgIGNvbmZsaWN0OiBhcHBseVJlc3VsdC5jb25mbGljdCxcbiAgICAgICAgICBpZDogbXV0YXRpb24uaWQsXG4gICAgICAgICAgc3luY1N0YXRlOiBcImNvbmZsaWN0XCJcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0UmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBhcHBseVJlc3VsdCwgbXV0YXRpb24sIHNob3VsZEFwcGx5fSlcbiAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJSZXBsYXlNdXRhdGlvbih7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIGFwcGx5UmVzdWx0LCBtdXRhdGlvbiwgc2hvdWxkQXBwbHl9KVxuXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxSZXNwb25zZSA9IHtpZDogbXV0YXRpb24uaWQsIHN5bmNTdGF0ZTogZHVwbGljYXRlID8gXCJkdXBsaWNhdGVcIiA6IFwic3VjY2Vzc2Z1bFwifVxuXG4gICAgICBjb25zdCBwZXJzaXN0ZWRSZXBsYXlNZXRhZGF0YSA9IGR1cGxpY2F0ZSA/IHRoaXMucmVwbGF5UGVyc2lzdGVkTWV0YWRhdGEoZXhpc3RpbmdTeW5jKSA6IG51bGxcblxuICAgICAgaWYgKHBlcnNpc3RlZFJlcGxheU1ldGFkYXRhKSB7XG4gICAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZS5zZXJ2ZXJWZXJzaW9uID0gcGVyc2lzdGVkUmVwbGF5TWV0YWRhdGEuYWNrbm93bGVkZ2VtZW50VmVyc2lvblxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZsaWN0U3RyYXRlZ3kgJiYgbXV0YXRpb24uYmFzZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBhcHBseVJlc3VsdD8ucmVjb3JkKSB7XG4gICAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZS5zZXJ2ZXJWZXJzaW9uID0gbm9ybWFsaXplQ29uZmxpY3RWYWx1ZShhcHBseVJlc3VsdC5yZWNvcmQucmVhZEF0dHJpYnV0ZSh0aGlzLmNvbmZsaWN0U3RyYXRlZ3kudmVyc2lvbkF0dHJpYnV0ZSkpXG4gICAgICB9XG5cbiAgICAgIHN5bmNSZXNwb25zZXMucHVzaChzdWNjZXNzZnVsUmVzcG9uc2UpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtzeW5jczogc3luY1Jlc3BvbnNlc31cbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVzIHRoZSBzeW5jIGJhdGNoIGFjdG9yLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBhIHRva2VuLW1vZGVsIGxvb2t1cCB3aGVuIGBhdXRoZW50aWNhdGlvblRva2VuTW9kZWxgIGlzXG4gICAqIGNvbmZpZ3VyZWQ7IG90aGVyd2lzZSBhcHBzIG92ZXJyaWRlIHRoaXMgaG9vay5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW19yZXF1ZXN0U3RhdGVdIC0gUmVxdWVzdC1sb2NhbCBzdGF0ZSBwb3B1bGF0ZWQgYnkgc3ViY2xhc3NlcyBiZWZvcmUgdGhlIGJhc2UgcmVwbGF5IGxvb3AgcnVucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2F1dGhlbnRpY2F0ZWQ6IHRydWUsIGFjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gfCB7YXV0aGVudGljYXRlZDogZmFsc2UsIGVycm9yQ29kZTogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IHN0cmluZ30+fSBBdXRoIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZVJlcGxheShwYXJhbXMsIF9yZXF1ZXN0U3RhdGUpIHtcbiAgICBpZiAoIXRoaXMuYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlLmF1dGhlbnRpY2F0ZVJlcGxheSBtdXN0IGJlIGltcGxlbWVudGVkIChvciBjb25maWd1cmUgYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsKVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHRva2VuID0gcGFyYW1zW3RoaXMuYXV0aGVudGljYXRpb25Ub2tlblBhcmFtXVxuXG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuIHthdXRoZW50aWNhdGVkOiBmYWxzZSwgZXJyb3JDb2RlOiBcIm1pc3NpbmctYXV0aGVudGljYXRpb24tdG9rZW5cIiwgZXJyb3JNZXNzYWdlOiBcIk1pc3NpbmcgYXV0aGVudGljYXRpb24gdG9rZW5cIn1cbiAgICB9XG5cbiAgICBjb25zdCBhY3RvciA9IGF3YWl0IHRoaXMuYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsLmZpbmRCeSh7W3RoaXMuYXV0aGVudGljYXRpb25Ub2tlbkNvbHVtbl06IHRva2VufSlcblxuICAgIGlmICghYWN0b3IpIHtcbiAgICAgIHJldHVybiB7YXV0aGVudGljYXRlZDogZmFsc2UsIGVycm9yQ29kZTogXCJpbnZhbGlkLWF1dGhlbnRpY2F0aW9uLXRva2VuXCIsIGVycm9yTWVzc2FnZTogXCJJbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHRva2VuXCJ9XG4gICAgfVxuXG4gICAgcmV0dXJuIHthY3RvciwgYXV0aGVudGljYXRlZDogdHJ1ZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgcGVyLWJhdGNoIG11dGFibGUgY29udGV4dCBmb3IgY2FjaGVzIHNoYXJlZCBhY3Jvc3Mgc3luYyBpdGVtcy5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgcmVxdWVzdFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSBfYXJncyAtIEFjdG9yLCByZXF1ZXN0IHBhcmFtcywgYW5kIHJlcXVlc3QtbG9jYWwgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IFJlcGxheSBjb250ZXh0LlxuICAgKi9cbiAgYXN5bmMgYnVpbGRSZXBsYXlDb250ZXh0KF9hcmdzKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyByYXcgc3luYyBlbnRyaWVzIGZyb20gcmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBwYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFtfcmVxdWVzdFN0YXRlXSAtIFJlcXVlc3QtbG9jYWwgc3RhdGUgcG9wdWxhdGVkIGJ5IHN1YmNsYXNzZXMgYmVmb3JlIHRoZSBiYXNlIHJlcGxheSBsb29wIHJ1bnMuXG4gICAqIEByZXR1cm5zIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFJhdyBzeW5jIGVudHJpZXMuXG4gICAqL1xuICByZXBsYXlTeW5jcyhwYXJhbXMsIF9yZXF1ZXN0U3RhdGUpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXJhbXMuc3luY3MpID8gcGFyYW1zLnN5bmNzIDogW11cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIG9uZSBzeW5jIGVudHJ5LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByYXdTeW5jIC0gUmF3IHN5bmMgZW50cnkuXG4gICAqIEByZXR1cm5zIHt7b2s6IHRydWUsIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSB8IHtvazogZmFsc2UsIHJlc3BvbnNlOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSBOb3JtYWxpemVkIG11dGF0aW9uIG9yIGZhaWxlZCByZXNwb25zZS5cbiAgICovXG4gIG5vcm1hbGl6ZVJlcGxheVN5bmMocmF3U3luYykge1xuICAgIGlmICghcmF3U3luYyB8fCB0eXBlb2YgcmF3U3luYyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJhd1N5bmMpKSB7XG4gICAgICByZXR1cm4ge29rOiBmYWxzZSwgcmVzcG9uc2U6IHtpZDogdW5kZWZpbmVkLCBzeW5jU3RhdGU6IFwiZmFpbGVkXCIsIHJlYXNvbjogXCJpbnZhbGlkLXN5bmNcIn19XG4gICAgfVxuXG4gICAgY29uc3Qgc3luYyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAocmF3U3luYylcbiAgICBjb25zdCB7Y2xpZW50TXV0YXRpb25JZCwgY2xpZW50VXBkYXRlZEF0LCBkYXRhLCBpZCwgcmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlLCBzeW5jVHlwZX0gPSBzeW5jXG5cbiAgICBpZiAodHlwZW9mIHJlc291cmNlVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCByZXNvdXJjZVR5cGUubGVuZ3RoIDwgMSB8fCByZXNvdXJjZUlkID09PSB1bmRlZmluZWQgfHwgcmVzb3VyY2VJZCA9PT0gbnVsbCB8fCB0eXBlb2Ygc3luY1R5cGUgIT09IFwic3RyaW5nXCIgfHwgc3luY1R5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0dXJuIHtvazogZmFsc2UsIHJlc3BvbnNlOiB7aWQsIHN5bmNTdGF0ZTogXCJmYWlsZWRcIiwgcmVhc29uOiBcImludmFsaWQtcmVzb3VyY2UtaWRcIn19XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VJZFN0cmluZyA9IFN0cmluZyhyZXNvdXJjZUlkKVxuICAgIGxldCBjbGllbnRVcGRhdGVkQXREYXRlID0gdHlwZW9mIGNsaWVudFVwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiB8fCBjbGllbnRVcGRhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gbmV3IERhdGUoY2xpZW50VXBkYXRlZEF0KSA6IG5ldyBEYXRlKClcblxuICAgIGlmIChOdW1iZXIuaXNOYU4oY2xpZW50VXBkYXRlZEF0RGF0ZS5nZXRUaW1lKCkpKSBjbGllbnRVcGRhdGVkQXREYXRlID0gbmV3IERhdGUoKVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZERhdGFSZXN1bHQgPSB0aGlzLm5vcm1hbGl6ZVJlcGxheVN5bmNEYXRhKHtkYXRhLCBpZCwgcmVzb3VyY2VJZDogcmVzb3VyY2VJZFN0cmluZywgcmVzb3VyY2VUeXBlfSlcblxuICAgIGlmICghbm9ybWFsaXplZERhdGFSZXN1bHQub2spIHJldHVybiBub3JtYWxpemVkRGF0YVJlc3VsdFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiB0cnVlLFxuICAgICAgbXV0YXRpb246IHtcbiAgICAgICAgYmFzZVZlcnNpb246IHN5bmMuYmFzZVZlcnNpb24sXG4gICAgICAgIGNsaWVudE11dGF0aW9uSWQsXG4gICAgICAgIGNsaWVudFVwZGF0ZWRBdDogY2xpZW50VXBkYXRlZEF0RGF0ZSxcbiAgICAgICAgZGF0YTogbm9ybWFsaXplZERhdGFSZXN1bHQuZGF0YSxcbiAgICAgICAgaWQsXG4gICAgICAgIHJlc291cmNlSWQ6IHJlc291cmNlSWRTdHJpbmcsXG4gICAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgICAgc2VyaWFsaXplZERhdGE6IEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWREYXRhUmVzdWx0LmRhdGEpLFxuICAgICAgICBzeW5jVHlwZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIG9uZSBzeW5jIGRhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHt7ZGF0YTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGlkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgcmVzb3VyY2VJZDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBTeW5jIHBheWxvYWQgbm9ybWFsaXphdGlvbiBhcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHt7b2s6IHRydWUsIGRhdGE6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gfCB7b2s6IGZhbHNlLCByZXNwb25zZTogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gTm9ybWFsaXplZCBwYXlsb2FkIG9yIGZhaWxlZCByZXNwb25zZS5cbiAgICovXG4gIG5vcm1hbGl6ZVJlcGxheVN5bmNEYXRhKHtkYXRhLCBpZCwgcmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlfSkge1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YToge319XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKGRhdGEpXG5cbiAgICAgICAgaWYgKCFwYXJzZWREYXRhIHx8IHR5cGVvZiBwYXJzZWREYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkRGF0YSkpIHJldHVybiB7b2s6IHRydWUsIGRhdGE6IHt9fVxuXG4gICAgICAgIHJldHVybiB7b2s6IHRydWUsIGRhdGE6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAocGFyc2VkRGF0YSl9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuPy4oXCJJbnZhbGlkIHN5bmMgZGF0YSBKU09OXCIsIHtlcnJvciwgaWQsIHJlc291cmNlSWQsIHJlc291cmNlVHlwZX0pXG4gICAgICAgIHJldHVybiB7b2s6IGZhbHNlLCByZXNwb25zZToge2lkLCBzeW5jU3RhdGU6IFwiZmFpbGVkXCIsIHJlYXNvbjogXCJpbnZhbGlkLWRhdGFcIn19XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiB7b2s6IHRydWUsIGRhdGE6IHt9fVxuXG4gICAgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSl9XG4gIH1cblxuICAvKipcbiAgICogQXV0aG9yaXplcyBvbmUgbm9ybWFsaXplZCBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gX2FyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7YWxsb3dlZDogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nfT59IEFjY2VzcyByZXN1bHQuXG4gICAqL1xuICBhc3luYyBhdXRob3JpemVSZXBsYXlNdXRhdGlvbihfYXJncykge1xuICAgIHJldHVybiB7YWxsb3dlZDogdHJ1ZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgcHJldmlvdXNseSBzdG9yZWQgc3luYy9jaGFuZ2Ugcm93IGZvciBzdGFsZS1jbGllbnQgY29tcGFyaXNvbi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYSBzeW5jLW1vZGVsIGxvb2t1cCBieSBhY3RvciBhbmQgcmVzb3VyY2UgaWRlbnRpdHkgd2hlbiBhIHN5bmNcbiAgICogbW9kZWwgaXMgY29uZmlndXJlZDsgb3RoZXJ3aXNlIGFwcHMgb3ZlcnJpZGUgdGhpcyBob29rLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IsIGJhdGNoIGNvbnRleHQsIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBFeGlzdGluZyBzeW5jIHJvdy5cbiAgICovXG4gIGFzeW5jIGZpbmRFeGlzdGluZ1JlcGxheVN5bmMoe2FjdG9yLCBtdXRhdGlvbn0pIHtcbiAgICBpZiAoIXRoaXMuc3luY01vZGVsKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3luY01vZGVsLmZpbmRCeSh7XG4gICAgICBbdGhpcy5hY3RvckZvcmVpZ25LZXlDb2x1bW5dOiB0aGlzLnJlcGxheUFjdG9ySWQoYWN0b3IpLFxuICAgICAgcmVzb3VyY2VfaWQ6IG11dGF0aW9uLnJlc291cmNlSWQsXG4gICAgICByZXNvdXJjZV90eXBlOiBtdXRhdGlvbi5yZXNvdXJjZVR5cGVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgYWN0b3IgaWQgdXNlZCBieSBtb2RlbC1iYWNrZWQgZGVmYXVsdCBob29rcy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYWN0b3IgLSBBY3RvciByZXR1cm5lZCBmcm9tIGF1dGhlbnRpY2F0ZVJlcGxheS5cbiAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBBY3RvciBpZC5cbiAgICovXG4gIHJlcGxheUFjdG9ySWQoYWN0b3IpIHtcbiAgICBpZiAoIWFjdG9yIHx8IHR5cGVvZiBhY3RvciAhPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgYWN0b3IuaWQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSBtb2RlbC1iYWNrZWQgZGVmYXVsdHMgcmVxdWlyZSBhbiBhY3RvciB3aXRoIGFuIGlkKCkgbWV0aG9kIGZyb20gYXV0aGVudGljYXRlUmVwbGF5XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdG9yLmlkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBub3JtYWxpemVkIG11dGF0aW9uIHNob3VsZCBiZSBhcHBsaWVkIHRvIGRvbWFpbiBtb2RlbHMuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdG8gYXBwbHkgdGhlIG11dGF0aW9uLlxuICAgKi9cbiAgYXN5bmMgc2hvdWxkQXBwbHlSZXBsYXlNdXRhdGlvbih7ZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pIHtcbiAgICBjb25zdCBleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCA9IHRoaXMuZXhpc3RpbmdSZXBsYXlTeW5jQ2xpZW50VXBkYXRlZEF0KGV4aXN0aW5nU3luYylcblxuICAgIHJldHVybiAhZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQgfHwgbXV0YXRpb24uY2xpZW50VXBkYXRlZEF0ID4gZXhpc3RpbmdDbGllbnRVcGRhdGVkQXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgY2xpZW50IHRpbWVzdGFtcCBmcm9tIGFuIGV4aXN0aW5nIHN5bmMgcm93LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBleGlzdGluZ1N5bmMgLSBFeGlzdGluZyBzeW5jIHJvdy5cbiAgICogQHJldHVybnMge0RhdGUgfCBudWxsfSBFeGlzdGluZyBjbGllbnQgdGltZXN0YW1wLlxuICAgKi9cbiAgZXhpc3RpbmdSZXBsYXlTeW5jQ2xpZW50VXBkYXRlZEF0KGV4aXN0aW5nU3luYykge1xuICAgIGlmICghZXhpc3RpbmdTeW5jIHx8IHR5cGVvZiBleGlzdGluZ1N5bmMgIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBzeW5jUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChleGlzdGluZ1N5bmMpXG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2Ygc3luY1JlY29yZC5jbGllbnRVcGRhdGVkQXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBzeW5jUmVjb3JkLmNsaWVudFVwZGF0ZWRBdCgpXG4gICAgICA6IHN5bmNSZWNvcmQuY2xpZW50VXBkYXRlZEF0XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdmFsdWVcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuXG4gICAgcmV0dXJuIE51bWJlci5pc05hTihwYXJzZWRWYWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHBhcnNlZFZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBza2lwcGVkIG11dGF0aW9uIGV4YWN0bHkgbWF0Y2hlcyB0aGUgcGVyc2lzdGVkIHJlcGxheSByb3cuXG4gICAqIE9sZGVyIGRpc3RpbmN0IG11dGF0aW9ucyByZXRhaW4gdGhlIGVzdGFibGlzaGVkIHN1Y2Nlc3NmdWwgc3RhbGUtc2tpcCByZXNwb25zZS5cbiAgICogQHBhcmFtIHt7ZXhpc3RpbmdTeW5jOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gRXhpc3Rpbmcgcm93IGFuZCBpbmNvbWluZyBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBpcyBhIGR1cGxpY2F0ZSByZXBsYXkuXG4gICAqL1xuICBpc0R1cGxpY2F0ZVJlcGxheU11dGF0aW9uKHtleGlzdGluZ1N5bmMsIG11dGF0aW9ufSkge1xuICAgIGlmICghZXhpc3RpbmdTeW5jKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5yZXBsYXlQZXJzaXN0ZWRNZXRhZGF0YShleGlzdGluZ1N5bmMpXG5cbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIHJldHVybiBtZXRhZGF0YS5jbGllbnRNdXRhdGlvbklkID09PSBTdHJpbmcobXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCB8fCBtdXRhdGlvbi5pZClcbiAgICAgICAgJiYgbWV0YWRhdGEucGF5bG9hZEZpbmdlcnByaW50ID09PSBzaGEyNTZIZXgobXV0YXRpb24uc2VyaWFsaXplZERhdGEpXG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQgPSB0aGlzLmV4aXN0aW5nUmVwbGF5U3luY0NsaWVudFVwZGF0ZWRBdChleGlzdGluZ1N5bmMpXG4gICAgY29uc3QgZXhpc3RpbmdEYXRhID0gdGhpcy5yZXBsYXlTeW5jUmVjb3JkVmFsdWUoZXhpc3RpbmdTeW5jLCBcImRhdGFcIilcbiAgICBjb25zdCBleGlzdGluZ1N5bmNUeXBlID0gdGhpcy5yZXBsYXlTeW5jUmVjb3JkVmFsdWUoZXhpc3RpbmdTeW5jLCBcInN5bmNUeXBlXCIpXG4gICAgY29uc3Qgc2VyaWFsaXplZEV4aXN0aW5nRGF0YSA9IHR5cGVvZiBleGlzdGluZ0RhdGEgPT09IFwic3RyaW5nXCIgPyBleGlzdGluZ0RhdGEgOiBKU09OLnN0cmluZ2lmeShleGlzdGluZ0RhdGEpXG5cbiAgICByZXR1cm4gZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQ/LmdldFRpbWUoKSA9PT0gbXV0YXRpb24uY2xpZW50VXBkYXRlZEF0LmdldFRpbWUoKVxuICAgICAgJiYgc2VyaWFsaXplZEV4aXN0aW5nRGF0YSA9PT0gbXV0YXRpb24uc2VyaWFsaXplZERhdGFcbiAgICAgICYmIGV4aXN0aW5nU3luY1R5cGUgPT09IG11dGF0aW9uLnN5bmNUeXBlXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSBtb2RlbC1iYWNrZWQgc3luYy1yb3cgdmFsdWUgdGhyb3VnaCBpdHMgYWNjZXNzb3Igb3IgcGxhaW4gcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHN5bmNSZWNvcmQgLSBFeGlzdGluZyBzeW5jIHJvdy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBTdG9yZWQgdmFsdWUuXG4gICAqL1xuICByZXBsYXlTeW5jUmVjb3JkVmFsdWUoc3luY1JlY29yZCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IHJlY29yZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoc3luY1JlY29yZClcbiAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFthdHRyaWJ1dGVOYW1lXVxuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdmFsdWUuY2FsbChzeW5jUmVjb3JkKSA6IHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgZHVyYWJsZSByZXBsYXkgYWNrbm93bGVkZ2VtZW50IG1ldGFkYXRhIGZyb20gYSBtb2RlbC1iYWNrZWQgc3luYyByb3cuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHN5bmNSZWNvcmQgLSBFeGlzdGluZyBzeW5jIHJvdy5cbiAgICogQHJldHVybnMge3thY2tub3dsZWRnZW1lbnRWZXJzaW9uOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLCBjbGllbnRNdXRhdGlvbklkOiBzdHJpbmcsIHBheWxvYWRGaW5nZXJwcmludDogc3RyaW5nfSB8IG51bGx9IFBlcnNpc3RlZCBtZXRhZGF0YS5cbiAgICovXG4gIHJlcGxheVBlcnNpc3RlZE1ldGFkYXRhKHN5bmNSZWNvcmQpIHtcbiAgICBpZiAoIXN5bmNSZWNvcmQpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gZGVjb2RlUmVwbGF5UGVyc2lzdGVkRGF0YSh0aGlzLnJlcGxheVN5bmNSZWNvcmRWYWx1ZShzeW5jUmVjb3JkLCBcImRhdGFcIikpLm1ldGFkYXRhXG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBvbmUgbm9ybWFsaXplZCBtdXRhdGlvbiB0byBkb21haW4gbW9kZWxzLlxuICAgKlxuICAgKiBEaXNwYXRjaGVzIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgYXBwbHktaGFuZGxlciByZWdpc3RyeSBmaXJzdCAoY29tcGF0XG4gICAqIHByZWNlZGVuY2UpOyBtdXRhdGlvbnMgd2l0aG91dCBhIG1hdGNoaW5nIGhhbmRsZXIgZmFsbCB0aHJvdWdoIHRvXG4gICAqIHJlc291cmNlIHJvdXRpbmcgd2hlbiBhIGNvbmZpZ3VyYXRpb24gb3IgcmVzb3VyY2VUeXBlT3ZlcnJpZGVzIGFyZVxuICAgKiBjb25maWd1cmVkLCBhbmQgb3RoZXJ3aXNlIGZhaWwgbG91ZGx5LlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgZXhpc3RpbmdTeW5jOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IsIGJhdGNoIGNvbnRleHQsIGV4aXN0aW5nIHN5bmMgcm93LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gUHJvamVjdC1zcGVjaWZpYyBhcHBseSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBhcHBseVJlcGxheU11dGF0aW9uKGFyZ3MpIHtcbiAgICBpZiAodGhpcy5hcHBseUhhbmRsZXJzKSB7XG4gICAgICBjb25zdCBhcHBseUhhbmRsZXIgPSB0aGlzLmFwcGx5SGFuZGxlcnNbYXJncy5tdXRhdGlvbi5yZXNvdXJjZVR5cGVdXG5cbiAgICAgIGlmIChhcHBseUhhbmRsZXIpIHJldHVybiBhd2FpdCBhcHBseUhhbmRsZXIoYXJncylcbiAgICAgIGlmICghdGhpcy5yb3V0aW5nQ29uZmlndXJlZCgpKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgYXBwbHkgaGFuZGxlciByZWdpc3RlcmVkIGZvcjogJHthcmdzLm11dGF0aW9uLnJlc291cmNlVHlwZX1gKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJvdXRpbmdDb25maWd1cmVkKCkpIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5Um91dGVkUmVwbGF5TXV0YXRpb24oYXJncylcblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHJlc291cmNlIHJvdXRpbmcgaXMgY29uZmlndXJlZCBvbiB0aGlzIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG11dGF0aW9ucyByb3V0ZSB0byBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMuXG4gICAqL1xuICByb3V0aW5nQ29uZmlndXJlZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNvbmZpZ3VyYXRpb24gfHwgdGhpcy5yZXNvdXJjZVR5cGVPdmVycmlkZXMpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHJvdXRlZCByZXNvdXJjZSByZWdpc3RyYXRpb24gZm9yIGEgcmVzb3VyY2UgdHlwZSwgbWVtb2l6ZWRcbiAgICogcGVyIHJlcGxheSBzZXJ2aWNlLiBPdmVycmlkZXMgd2luIG92ZXIgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0cnk7IHN0cmluZ1xuICAgKiBvdmVycmlkZXMgYXJlIGFsaWFzZXMgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZVR5cGUgLSBNdXRhdGlvbiByZXNvdXJjZSB0eXBlLlxuICAgKiBAcmV0dXJucyB7U3luY1JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uIHwgbnVsbH0gUmVzb2x2ZWQgcmVnaXN0cmF0aW9uIG9yIG51bGwgd2hlbiB1bnJvdXRhYmxlLlxuICAgKi9cbiAgcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24ocmVzb3VyY2VUeXBlKSB7XG4gICAgY29uc3QgbWVtb2l6ZWRSZWdpc3RyYXRpb24gPSB0aGlzLl9yZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbnMuZ2V0KHJlc291cmNlVHlwZSlcblxuICAgIGlmIChtZW1vaXplZFJlZ2lzdHJhdGlvbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbWVtb2l6ZWRSZWdpc3RyYXRpb25cblxuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMucmVzb2x2ZVJlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uKHJlc291cmNlVHlwZSlcblxuICAgIHRoaXMuX3JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9ucy5zZXQocmVzb3VyY2VUeXBlLCByZWdpc3RyYXRpb24pXG5cbiAgICByZXR1cm4gcmVnaXN0cmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogVW5jYWNoZWQgcm91dGVkLXJlc291cmNlIHJlc29sdXRpb24gYmVoaW5kIHtAbGluayBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlI3JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9ufS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlVHlwZSAtIE11dGF0aW9uIHJlc291cmNlIHR5cGUuXG4gICAqIEByZXR1cm5zIHtTeW5jUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24gfCBudWxsfSBSZXNvbHZlZCByZWdpc3RyYXRpb24gb3IgbnVsbCB3aGVuIHVucm91dGFibGUuXG4gICAqL1xuICByZXNvbHZlUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24ocmVzb3VyY2VUeXBlKSB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLnJlc291cmNlVHlwZU92ZXJyaWRlcz8uW3Jlc291cmNlVHlwZV1cblxuICAgIGlmIChvdmVycmlkZSAmJiB0eXBlb2Ygb3ZlcnJpZGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7bW9kZWxOYW1lOiByZXNvdXJjZVR5cGUsIHJlc291cmNlQ2xhc3M6IG92ZXJyaWRlLCByZXNvdXJjZUNvbmZpZ3VyYXRpb246IG51bGx9XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0cnlSZXNvdXJjZVR5cGUgPSB0eXBlb2Ygb3ZlcnJpZGUgPT09IFwic3RyaW5nXCIgPyBvdmVycmlkZSA6IHJlc291cmNlVHlwZVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHJldHVybiBudWxsXG5cbiAgICBjb25zdCByZXNvbHZlZFJlZ2lzdHJhdGlvbiA9IHJlc29sdmVGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzcyh7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCByZXNvdXJjZVR5cGU6IHJlZ2lzdHJ5UmVzb3VyY2VUeXBlfSlcblxuICAgIGlmICghcmVzb2x2ZWRSZWdpc3RyYXRpb24pIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxOYW1lOiByZXNvbHZlZFJlZ2lzdHJhdGlvbi5tb2RlbE5hbWUsXG4gICAgICByZXNvdXJjZUNsYXNzOiByZXNvbHZlZFJlZ2lzdHJhdGlvbi5yZXNvdXJjZUNsYXNzLFxuICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uOiByZXNvbHZlZFJlZ2lzdHJhdGlvbi5yZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGFiaWxpdHkgYW5kIHJlc291cmNlIGNvbnRleHQgdXNlZCB0byBhdXRob3JpemUgcm91dGVkXG4gICAqIHJlc291cmNlcy4gRGVmYXVsdHMgdG8gdGhlIGNvbnN0cnVjdG9yLXdpZGUgYWJpbGl0eS9hYmlsaXR5Q29udGV4dDtcbiAgICogc3ViY2xhc3NlcyAoc2lnbmVkIHJlcGxheSkgb3ZlcnJpZGUgdGhpcyB0byBkZXJpdmUgYXV0aG9yaXphdGlvbiBmcm9tIGFcbiAgICogdmVyaWZpZWQgYWN0b3IvZ3JhbnQgaW5zdGVhZCBvZiB1cGxvYWRlci1nbG9iYWwgc3RhdGUuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gX2FyZ3MgLSBSZXBsYXkgYWN0b3IgYW5kIGJhdGNoIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHthYmlsaXR5OiBpbXBvcnQoXCIuLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgYWJpbGl0eUNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0+fSBBYmlsaXR5IGFuZCByZXNvdXJjZSBjb250ZXh0LlxuICAgKi9cbiAgYXN5bmMgcmVwbGF5QWJpbGl0eUZvcihfYXJncykge1xuICAgIHJldHVybiB7YWJpbGl0eTogdGhpcy5hYmlsaXR5IHx8IHVuZGVmaW5lZCwgYWJpbGl0eUNvbnRleHQ6IHRoaXMuYWJpbGl0eUNvbnRleHQgfHwge319XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSByb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UgaGFuZGxpbmcgb25lIG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MuYWN0b3IgLSBSZXBsYXkgYWN0b3IuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLmNvbnRleHQgLSBSZXBsYXkgY29udGV4dC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTm9ybWFsaXplZCByZXBsYXkgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7U3luY1JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9ufSBhcmdzLnJlZ2lzdHJhdGlvbiAtIFJlc29sdmVkIHJlc291cmNlIHJlZ2lzdHJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0Pn0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKi9cbiAgYXN5bmMgYnVpbGRSZXBsYXlSZXNvdXJjZSh7YWN0b3IsIGNvbnRleHQsIG11dGF0aW9uLCByZWdpc3RyYXRpb259KSB7XG4gICAgY29uc3QgUmVzb3VyY2VDbGFzcyA9IHJlZ2lzdHJhdGlvbi5yZXNvdXJjZUNsYXNzXG4gICAgY29uc3Qge2FiaWxpdHksIGFiaWxpdHlDb250ZXh0fSA9IGF3YWl0IHRoaXMucmVwbGF5QWJpbGl0eUZvcih7YWN0b3IsIGNvbnRleHR9KVxuXG4gICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNsYXNzKHtcbiAgICAgIGFiaWxpdHksXG4gICAgICBjb250ZXh0OiBhYmlsaXR5Q29udGV4dCxcbiAgICAgIGxvY2Fsczogey4uLih0aGlzLmxvY2FscyB8fCB7fSksIC4uLih0aGlzLmNvbmZpZ3VyYXRpb24gPyB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSA6IHt9KX0sXG4gICAgICBtb2RlbE5hbWU6IHJlZ2lzdHJhdGlvbi5tb2RlbE5hbWUsXG4gICAgICBwYXJhbXM6IG11dGF0aW9uLmRhdGEsXG4gICAgICAuLi4ocmVnaXN0cmF0aW9uLnJlc291cmNlQ29uZmlndXJhdGlvbiA/IHtyZXNvdXJjZUNvbmZpZ3VyYXRpb246IHJlZ2lzdHJhdGlvbi5yZXNvdXJjZUNvbmZpZ3VyYXRpb259IDoge30pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIG9uZSBtdXRhdGlvbiB0aHJvdWdoIGl0cyByb3V0ZWQgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2U6XG4gICAqIGF1dGhvcml6YXRpb24sIGFiaWxpdHktc2NvcGVkIHJlY29yZCBsb29rdXAsIHNjaGVtYSBub3JtYWxpemF0aW9uIGFuZFxuICAgKiBhc3NpZ24vc2F2ZSBmb3IgdXBkYXRlcywgc2F2ZS10aGVuLWNoZWNrIG1lbWJlcnNoaXAgY3JlYXRlcywgZGVzdHJveXMgZm9yXG4gICAqIGRlbGV0ZXMsIGFuZCB0aGUgcmVzb3VyY2UncyBhZnRlclN5bmNBcHBseSB0YWlsLiBDbGllbnQtc2FmZSBmYWlsdXJlc1xuICAgKiB0aHJvdyBzYWZlIGVycm9ycyB0aGF0IGZhaWwgdGhlIHNpbmdsZSBzeW5jLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgZXhpc3RpbmdTeW5jOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IsIGJhdGNoIGNvbnRleHQsIGV4aXN0aW5nIHN5bmMgcm93LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IEFwcGx5IHJlc3VsdCB3aXRoIHJlY29yZCwgY3JlYXRlZC9kZWxldGVkIGZsYWdzLCBhbmQgYWZ0ZXJTeW5jQXBwbHkgZXh0cmFzLlxuICAgKi9cbiAgYXN5bmMgYXBwbHlSb3V0ZWRSZXBsYXlNdXRhdGlvbih7YWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KSB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbihtdXRhdGlvbi5yZXNvdXJjZVR5cGUpXG5cbiAgICBpZiAoIXJlZ2lzdHJhdGlvbikge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgVW5rbm93biBzeW5jIHJlc291cmNlIHR5cGU6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfS5gLCB7Y29kZTogXCJ1bmtub3duLXJlc291cmNlLXR5cGVcIn0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkUmVwbGF5UmVzb3VyY2Uoe2FjdG9yLCBjb250ZXh0LCBtdXRhdGlvbiwgcmVnaXN0cmF0aW9ufSlcbiAgICBjb25zdCBjdXN0b21BcHBseVJlc3VsdCA9IGF3YWl0IHJlc291cmNlLmFwcGx5U3luYyh7Y29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pXG5cbiAgICBpZiAoY3VzdG9tQXBwbHlSZXN1bHQgIT09IG51bGwpIHJldHVybiBjdXN0b21BcHBseVJlc3VsdFxuXG4gICAgY29uc3QgYXV0aG9yaXphdGlvbiA9IGF3YWl0IHJlc291cmNlLmF1dGhvcml6ZVN5bmNNdXRhdGlvbih7Y29udGV4dCwgbXV0YXRpb259KVxuXG4gICAgaWYgKCFhdXRob3JpemF0aW9uLmFsbG93ZWQpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoYFN5bmMgbXV0YXRpb24gZGVuaWVkIGZvcjogJHttdXRhdGlvbi5yZXNvdXJjZVR5cGV9LmAsIHtjb2RlOiBhdXRob3JpemF0aW9uLnJlYXNvbiB8fCBcImFjY2Vzcy1kZW5pZWRcIn0pXG4gICAgfVxuXG4gICAgaWYgKG11dGF0aW9uLnN5bmNUeXBlID09PSBcImRlbGV0ZVwiKSByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVJvdXRlZFJlcGxheURlbGV0ZSh7bXV0YXRpb24sIHJlc291cmNlfSlcblxuICAgIGNvbnN0IGNvbW1hbmRBcHBseVJlc3VsdCA9IGF3YWl0IHRoaXMuYXBwbHlSb3V0ZWRSZXBsYXlDb21tYW5kKHtjb250ZXh0LCBtdXRhdGlvbiwgcmVzb3VyY2V9KVxuXG4gICAgaWYgKGNvbW1hbmRBcHBseVJlc3VsdCAhPT0gbnVsbCkgcmV0dXJuIGNvbW1hbmRBcHBseVJlc3VsdFxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbHlSb3V0ZWRSZXBsYXlVcHNlcnQoe2NvbnRleHQsIG11dGF0aW9uLCByZXNvdXJjZX0pXG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhIHJvdXRlZCBzeW5jIG11dGF0aW9uIHdob3NlIHN5bmNUeXBlIG1hdGNoZXMgYSByZXNvdXJjZS1kZWNsYXJlZFxuICAgKiBjdXN0b20gY29tbWFuZC4gUmV0dXJucyBudWxsIHdoZW4gdGhlIG11dGF0aW9uIGlzIG5vdCBhIGNvbW1hbmQgc28gdGhlXG4gICAqIGNhbGxlciBjYW4gZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHVwc2VydCBwYXRoLlxuICAgKiBAcGFyYW0ge3tjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9uLCByZXNvdXJjZTogaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fX0gYXJncyAtIENvbW1hbmQgZGlzcGF0Y2ggYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgbnVsbD59IENvbW1hbmQgYXBwbHkgcmVzdWx0IG9yIG51bGwuXG4gICAqL1xuICBhc3luYyBhcHBseVJvdXRlZFJlcGxheUNvbW1hbmQoe2NvbnRleHQsIG11dGF0aW9uLCByZXNvdXJjZX0pIHtcbiAgICBjb25zdCBjb21tYW5kQ29uZmlnID0gdGhpcy5yZXNvdXJjZUNvbW1hbmRDb25maWcocmVzb3VyY2UpXG4gICAgY29uc3QgY29tbWFuZE1ldGhvZE5hbWUgPSB0aGlzLmNvbW1hbmRNZXRob2ROYW1lRm9yU3luY1R5cGUoe2NvbW1hbmRDb25maWcsIHN5bmNUeXBlOiBtdXRhdGlvbi5zeW5jVHlwZX0pXG5cbiAgICBpZiAoIWNvbW1hbmRNZXRob2ROYW1lKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgY29tbWFuZE1ldGhvZCA9IHJlc291cmNlLnJlc291cmNlTWV0aG9kKGNvbW1hbmRNZXRob2ROYW1lKVxuXG4gICAgaWYgKCFjb21tYW5kTWV0aG9kKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBTeW5jIGNvbW1hbmQgaGFuZGxlciBtaXNzaW5nIGZvcjogJHttdXRhdGlvbi5yZXNvdXJjZVR5cGV9LiR7bXV0YXRpb24uc3luY1R5cGV9LmAsIHtjb2RlOiBcInN5bmMtY29tbWFuZC1oYW5kbGVyLW1pc3NpbmdcIn0pXG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IHRoaXMuY29tbWFuZEFyZ3NGb3JNdXRhdGlvbih7Y29tbWFuZENvbmZpZywgY29tbWFuZE1ldGhvZE5hbWUsIG11dGF0aW9ufSlcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb21tYW5kTWV0aG9kLm1ldGhvZC5jYWxsKGNvbW1hbmRNZXRob2QucmVzb3VyY2UsIGFyZ3MpXG5cbiAgICBjb25zdCBhZnRlckV4dHJhcyA9IGF3YWl0IHJlc291cmNlLmFmdGVyU3luY0FwcGx5KHtjb250ZXh0LCBjcmVhdGVkOiBmYWxzZSwgbXV0YXRpb24sIHJlY29yZDogbnVsbH0pXG4gICAgY29uc3QgcmVzdWx0T2JqZWN0ID0gcmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IHt9XG5cbiAgICByZXR1cm4ge2NvbW1hbmRSZXN1bHQ6IHJlc3VsdCwgY3JlYXRlZDogZmFsc2UsIGRlbGV0ZWQ6IGZhbHNlLCByZWNvcmQ6IG51bGwsIC4uLnJlc3VsdE9iamVjdCwgLi4uYWZ0ZXJFeHRyYXN9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGN1c3RvbS1jb21tYW5kIGNvbmZpZ3VyYXRpb24gZGVjbGFyZWQgb24gYSByb3V0ZWQgcmVzb3VyY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSByZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3tjb2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIG1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fX0gQ29tbWFuZCBjb25maWcuXG4gICAqL1xuICByZXNvdXJjZUNvbW1hbmRDb25maWcocmVzb3VyY2UpIHtcbiAgICBjb25zdCBjb25maWcgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHJlc291cmNlLnJlc291cmNlQ29uZmlndXJhdGlvblZhbHVlIHx8IHt9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbGxlY3Rpb25Db21tYW5kczogY29uZmlnLmNvbGxlY3Rpb25Db21tYW5kcyB8fCB7fSxcbiAgICAgIG1lbWJlckNvbW1hbmRzOiBjb25maWcubWVtYmVyQ29tbWFuZHMgfHwge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHJlc291cmNlIG1ldGhvZCBuYW1lIGZvciBhIHN5bmNUeXBlIHdoZW4gaXQgbmFtZXMgYSBkZWNsYXJlZFxuICAgKiBjdXN0b20gY29tbWFuZC5cbiAgICogQHBhcmFtIHt7Y29tbWFuZENvbmZpZzoge2NvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgbWVtYmVyQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz59LCBzeW5jVHlwZTogc3RyaW5nfX0gYXJncyAtIExvb2t1cCBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gTWV0aG9kIG5hbWUgb3IgbnVsbC5cbiAgICovXG4gIGNvbW1hbmRNZXRob2ROYW1lRm9yU3luY1R5cGUoe2NvbW1hbmRDb25maWcsIHN5bmNUeXBlfSkge1xuICAgIGlmIChjb21tYW5kQ29uZmlnLm1lbWJlckNvbW1hbmRzW3N5bmNUeXBlXSkgcmV0dXJuIHN5bmNUeXBlXG4gICAgaWYgKGNvbW1hbmRDb25maWcuY29sbGVjdGlvbkNvbW1hbmRzW3N5bmNUeXBlXSkgcmV0dXJuIHN5bmNUeXBlXG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYXJndW1lbnRzIG9iamVjdCBwYXNzZWQgdG8gYSByZXNvdXJjZSBjb21tYW5kIG1ldGhvZC4gTWVtYmVyXG4gICAqIGNvbW1hbmRzIHJlY2VpdmUgdGhlIGVudmVsb3BlJ3MgcmVzb3VyY2VJZCBhcyBgaWRgOyB0aGUgZW52ZWxvcGUgaWRlbnRpdHlcbiAgICogaXMgYXNzaWduZWQgYWZ0ZXIgdGhlIHBheWxvYWQgc28gYSBwYXlsb2FkIGBpZGAgY2FuIG5ldmVyIHJldGFyZ2V0IHRoZVxuICAgKiBjb21tYW5kIGF3YXkgZnJvbSB0aGUgcmVzb3VyY2UgdGhlIGF1dGhvcml6YXRpb24gaG9va3MgYXBwcm92ZWQuXG4gICAqIEBwYXJhbSB7e2NvbW1hbmRDb25maWc6IHtjb2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIG1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSwgY29tbWFuZE1ldGhvZE5hbWU6IHN0cmluZywgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQXJncyBidWlsZGVyIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IENvbW1hbmQgbWV0aG9kIGFyZ3VtZW50cy5cbiAgICovXG4gIGNvbW1hbmRBcmdzRm9yTXV0YXRpb24oe2NvbW1hbmRDb25maWcsIGNvbW1hbmRNZXRob2ROYW1lLCBtdXRhdGlvbn0pIHtcbiAgICBjb25zdCBpc01lbWJlciA9IGNvbW1hbmRDb25maWcubWVtYmVyQ29tbWFuZHNbY29tbWFuZE1ldGhvZE5hbWVdICE9PSB1bmRlZmluZWRcblxuICAgIGlmIChpc01lbWJlcikge1xuICAgICAgcmV0dXJuIHsuLi5tdXRhdGlvbi5kYXRhLCBpZDogbXV0YXRpb24ucmVzb3VyY2VJZH1cbiAgICB9XG5cbiAgICByZXR1cm4gey4uLm11dGF0aW9uLmRhdGF9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhIHJvdXRlZCBkZWxldGUgbXV0YXRpb24uIFRoZSByZWNvcmQgaXMgbWFya2VkIGFzIGEgc2VydmVyIGFwcGx5XG4gICAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHJlcGxheS1vd25lZCBkZXN0cm95IC0gYW4gYWN0aXZlIFN5bmNQdWJsaXNoZXJcbiAgICogbmV2ZXIgcHVibGlzaGVzIHRoZSByZXBsYXllZCBkZWxldGUgYSBzZWNvbmQgdGltZSAodGhlIHJlcGxheSBvd25zIGl0c1xuICAgKiBvd24gcGVyc2lzdCBhbmQgYnJvYWRjYXN0cyksIHdoaWxlIGxhdGVyIHNlcnZlci1zaWRlIHdyaXRlcyB0byB0aGUgc2FtZVxuICAgKiBpbnN0YW5jZSBwdWJsaXNoIG5vcm1hbGx5IGFnYWluLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gQXBwbHkgcmVzdWx0IHdpdGggdGhlIGRlbGV0ZWQgZmxhZy5cbiAgICovXG4gIGFzeW5jIGFwcGx5Um91dGVkUmVwbGF5RGVsZXRlKHttdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IHJ1bkRlbGV0ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHJlc291cmNlLmZpbmRTeW5jUmVjb3JkKHtmb3JEZWxldGU6IHRydWUsIG11dGF0aW9ufSlcblxuICAgICAgaWYgKCFyZWNvcmQpIHJldHVybiB7Y3JlYXRlZDogZmFsc2UsIGRlbGV0ZWQ6IGZhbHNlLCByZWNvcmQ6IG51bGx9XG5cbiAgICAgIGNvbnN0IGNvbmZsaWN0UmVzdWx0ID0gYXdhaXQgdGhpcy5yb3V0ZWRSZXBsYXlDb25mbGljdFJlc3VsdCh7YXR0cmlidXRlczoge30sIGV4aXN0aW5nUmVjb3JkOiByZWNvcmQsIG11dGF0aW9uLCByZXNvdXJjZX0pXG5cbiAgICAgIGlmIChjb25mbGljdFJlc3VsdCkgcmV0dXJuIGNvbmZsaWN0UmVzdWx0XG5cbiAgICAgIGNvbnN0IHJlbGVhc2VTZXJ2ZXJBcHBseSA9IG1hcmtTZXJ2ZXJBcHBseShyZWNvcmQpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlY29yZC5kZXN0cm95KClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlbGVhc2VTZXJ2ZXJBcHBseSgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7Y3JlYXRlZDogZmFsc2UsIGRlbGV0ZWQ6IHRydWUsIHJlY29yZH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmxpY3RTdHJhdGVneSkgcmV0dXJuIGF3YWl0IHJ1bkRlbGV0ZSgpXG5cbiAgICByZXR1cm4gYXdhaXQgTW9kZWxDbGFzcy53aXRoQWR2aXNvcnlMb2NrKHN5bmNSZXBsYXlDb25mbGljdExvY2tOYW1lKHtyZXNvdXJjZUlkOiBtdXRhdGlvbi5yZXNvdXJjZUlkLCByZXNvdXJjZVR5cGU6IG11dGF0aW9uLnJlc291cmNlVHlwZX0pLCBydW5EZWxldGUsIHtkZWRpY2F0ZWRDb25uZWN0aW9uOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgcm91dGVkIHVwc2VydCBtdXRhdGlvbjogcGVybWl0dGVkIHBheWxvYWQgYXR0cmlidXRlcyBhcmVcbiAgICogYXNzaWduZWQgYW5kIHNhdmVkIG9udG8gdGhlIGZvdW5kIHJlY29yZCAodGhlIHJlY29yZCBsYXllciBvd25zIHZhbHVlXG4gICAqIGNhc3RpbmcgYW5kIHZhbGlkYXRpb24pLCBhbmQgbWlzc2luZyByZWNvcmRzIGFyZSBjcmVhdGVkIHdpdGggdGhlXG4gICAqIGNsaWVudC1nZW5lcmF0ZWQgcHJpbWFyeSBrZXkgcGx1cyBhIHNhdmUtdGhlbi1jaGVjayBtZW1iZXJzaGlwIGNoZWNrLlxuICAgKiBXcml0dGVuIHJlY29yZHMgYXJlIG1hcmtlZCBhcyBzZXJ2ZXIgYXBwbGllcyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZVxuICAgKiByZXBsYXktb3duZWQgd3JpdGUgLSBhbiBhY3RpdmUgU3luY1B1Ymxpc2hlciBuZXZlciBwdWJsaXNoZXMgdGhlIHJlcGxheWVkXG4gICAqIG11dGF0aW9uIGEgc2Vjb25kIHRpbWUgKHRoZSByZXBsYXkgb3ducyBpdHMgb3duIHBlcnNpc3QgYW5kIGJyb2FkY2FzdHMpLFxuICAgKiB3aGlsZSBsYXRlciBzZXJ2ZXItc2lkZSB3cml0ZXMgdG8gdGhlIHNhbWUgaW5zdGFuY2UgcHVibGlzaCBub3JtYWxseVxuICAgKiBhZ2Fpbi4gTW9kZWwgdmFsaWRhdGlvbiBmYWlsdXJlcyBiZWNvbWUgY2xpZW50LXNhZmUgcGVyLXN5bmMgZmFpbHVyZXNcbiAgICogY2FycnlpbmcgdGhlIHRyYW5zbGF0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLmNvbnRleHQgLSBSZXBsYXkgY29udGV4dC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTm9ybWFsaXplZCByZXBsYXkgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBBcHBseSByZXN1bHQgd2l0aCByZWNvcmQsIGNyZWF0ZWQgZmxhZywgYW5kIGFmdGVyU3luY0FwcGx5IGV4dHJhcy5cbiAgICovXG4gIGFzeW5jIGFwcGx5Um91dGVkUmVwbGF5VXBzZXJ0KHtjb250ZXh0LCBtdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMucGVybWl0dGVkUm91dGVkQXR0cmlidXRlcyh7bXV0YXRpb24sIHJlc291cmNlfSlcbiAgICBjb25zdCBNb2RlbENsYXNzID0gcmVzb3VyY2UubW9kZWxDbGFzcygpXG4gICAgY29uc3QgcnVuVXBzZXJ0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBhd2FpdCByZXNvdXJjZS5maW5kU3luY1JlY29yZCh7bXV0YXRpb259KVxuICAgICAgY29uc3QgY29uZmxpY3RSZXN1bHQgPSBhd2FpdCB0aGlzLnJvdXRlZFJlcGxheUNvbmZsaWN0UmVzdWx0KHthdHRyaWJ1dGVzLCBleGlzdGluZ1JlY29yZCwgbXV0YXRpb24sIHJlc291cmNlfSlcblxuICAgICAgaWYgKGNvbmZsaWN0UmVzdWx0KSByZXR1cm4gY29uZmxpY3RSZXN1bHRcblxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgICBsZXQgcmVjb3JkID0gZXhpc3RpbmdSZWNvcmRcbiAgICAgIGxldCBjcmVhdGVkID0gZmFsc2VcblxuICAgICAgaWYgKGV4aXN0aW5nUmVjb3JkKSB7XG4gICAgICAgIGNvbnN0IHJlbGVhc2VTZXJ2ZXJBcHBseSA9IG1hcmtTZXJ2ZXJBcHBseShleGlzdGluZ1JlY29yZClcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGV4aXN0aW5nUmVjb3JkLmFzc2lnbihhdHRyaWJ1dGVzKVxuICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVJvdXRlZFJlcGxheVJlY29yZChleGlzdGluZ1JlY29yZClcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZWxlYXNlU2VydmVyQXBwbHkoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmNyZWF0ZVJvdXRlZFJlcGxheVJlY29yZCh7YXR0cmlidXRlcywgbXV0YXRpb24sIHJlc291cmNlfSlcbiAgICAgICAgY3JlYXRlZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0cmFzID0gYXdhaXQgcmVzb3VyY2UuYWZ0ZXJTeW5jQXBwbHkoe2NvbnRleHQsIGNyZWF0ZWQsIG11dGF0aW9uLCByZWNvcmR9KVxuXG4gICAgICByZXR1cm4ge2NyZWF0ZWQsIGRlbGV0ZWQ6IGZhbHNlLCByZWNvcmQsIC4uLmV4dHJhc31cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmxpY3RTdHJhdGVneSkgcmV0dXJuIGF3YWl0IHJ1blVwc2VydCgpXG5cbiAgICByZXR1cm4gYXdhaXQgTW9kZWxDbGFzcy53aXRoQWR2aXNvcnlMb2NrKHN5bmNSZXBsYXlDb25mbGljdExvY2tOYW1lKHtyZXNvdXJjZUlkOiBtdXRhdGlvbi5yZXNvdXJjZUlkLCByZXNvdXJjZVR5cGU6IG11dGF0aW9uLnJlc291cmNlVHlwZX0pLCBydW5VcHNlcnQsIHtkZWRpY2F0ZWRDb25uZWN0aW9uOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHJvdXRlZCB1cHNlcnQgbXV0YXRpb24gY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgc2VydmVyXG4gICAqIHN0YXRlIHdoZW4gdGhlIHNlcnZpY2UgaXMgY29uZmlndXJlZCB3aXRoIGEgY29uZmxpY3Qgc3RyYXRlZ3kuIEEgbXV0YXRpb25cbiAgICogd2hvc2UgYmFzZVZlcnNpb24gZG9lcyBub3QgbWF0Y2ggdGhlIHNlcnZlcidzIGN1cnJlbnQgdmVyc2lvbkF0dHJpYnV0ZSBpc1xuICAgKiByZWplY3RlZCB3aXRoIGEgc3RydWN0dXJlZCBjb25mbGljdCBwYXlsb2FkIGluc3RlYWQgb2YgYmVpbmcgYXBwbGllZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBDb25mbGljdC1jaGVjayBhcmdzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hdHRyaWJ1dGVzIC0gUGVybWl0dGVkIG11dGF0aW9uIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsfSBhcmdzLmV4aXN0aW5nUmVjb3JkIC0gRXhpc3Rpbmcgc2VydmVyIHJlY29yZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTm9ybWFsaXplZCByZXBsYXkgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsPn0gLSBDb25mbGljdCBhcHBseSByZXN1bHQsIG9yIG51bGwgd2hlbiBubyBjb25mbGljdC5cbiAgICovXG4gIGFzeW5jIHJvdXRlZFJlcGxheUNvbmZsaWN0UmVzdWx0KHthdHRyaWJ1dGVzLCBleGlzdGluZ1JlY29yZCwgbXV0YXRpb24sIHJlc291cmNlfSkge1xuICAgIGlmICghdGhpcy5jb25mbGljdFN0cmF0ZWd5KSByZXR1cm4gbnVsbFxuICAgIGlmICghZXhpc3RpbmdSZWNvcmQgfHwgbXV0YXRpb24uc3luY1R5cGUgPT09IFwiY3JlYXRlXCIpIHJldHVybiBudWxsXG4gICAgaWYgKG11dGF0aW9uLmJhc2VWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgbXV0YXRpb24uYmFzZVZlcnNpb24gPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCB2ZXJzaW9uQXR0cmlidXRlID0gdGhpcy5jb25mbGljdFN0cmF0ZWd5LnZlcnNpb25BdHRyaWJ1dGVcbiAgICBjb25zdCBzZXJ2ZXJWZXJzaW9uID0gbm9ybWFsaXplQ29uZmxpY3RWYWx1ZShleGlzdGluZ1JlY29yZC5yZWFkQXR0cmlidXRlKHZlcnNpb25BdHRyaWJ1dGUpKVxuXG4gICAgaWYgKHN0YWJsZUpzb25TdHJpbmdpZnkoc2VydmVyVmVyc2lvbikgPT09IHN0YWJsZUpzb25TdHJpbmdpZnkobXV0YXRpb24uYmFzZVZlcnNpb24pKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBNb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRBZmZlY3RlZEF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZWRSb3V0ZWRDb25mbGljdEF0dHJpYnV0ZXMoe2F0dHJpYnV0ZXMsIGV4aXN0aW5nUmVjb3JkLCByZXNvdXJjZX0pXG4gICAgY29uc3Qgc2VydmVyQXR0cmlidXRlcyA9IHtcbiAgICAgIC4uLnNlcmlhbGl6ZWRBZmZlY3RlZEF0dHJpYnV0ZXMsXG4gICAgICBbcHJpbWFyeUtleV06IGV4aXN0aW5nUmVjb3JkLnJlYWRBdHRyaWJ1dGUocHJpbWFyeUtleSksXG4gICAgICBbdmVyc2lvbkF0dHJpYnV0ZV06IHNlcnZlclZlcnNpb25cbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2ZXJSZWNvcmQgPSB7XG4gICAgICBhdHRyaWJ1dGVzOiBzZXJ2ZXJBdHRyaWJ1dGVzLFxuICAgICAgdmVyc2lvbjogc2VydmVyVmVyc2lvblxuICAgIH1cbiAgICBjb25zdCBjb25mbGljdE11dGF0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jTXV0YXRpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh7XG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgYmFzZVZlcnNpb246IG11dGF0aW9uLmJhc2VWZXJzaW9uLFxuICAgICAgY2xpZW50TXV0YXRpb25JZDogbXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCB8fCBtdXRhdGlvbi5pZCxcbiAgICAgIG1vZGVsOiBtdXRhdGlvbi5yZXNvdXJjZVR5cGUsXG4gICAgICBvcGVyYXRpb246IG11dGF0aW9uLnN5bmNUeXBlLFxuICAgICAgcGF5bG9hZDoge2lkOiBtdXRhdGlvbi5yZXNvdXJjZUlkfVxuICAgIH0pKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVTeW5jQ29uZmxpY3Qoe1xuICAgICAgYmFzZVJlY29yZDogbnVsbCxcbiAgICAgIG11dGF0aW9uOiBjb25mbGljdE11dGF0aW9uLFxuICAgICAgc2VydmVyUmVjb3JkLFxuICAgICAgc3RyYXRlZ3k6IHRoaXMuY29uZmxpY3RTdHJhdGVneS5zdHJhdGVneSB8fCBcIm9wdGltaXN0aWNWZXJzaW9uXCIsXG4gICAgICB2ZXJzaW9uQXR0cmlidXRlXG4gICAgfSlcblxuICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSBcImNvbmZsaWN0XCIpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4ge2NvbmZsaWN0OiByZXN1bHQuY29uZmxpY3QsIGNyZWF0ZWQ6IGZhbHNlLCBkZWxldGVkOiBmYWxzZSwgcmVjb3JkOiBleGlzdGluZ1JlY29yZCwgc3RhdHVzOiBcImNvbmZsaWN0XCJ9XG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdHMgYWZmZWN0ZWQgbXV0YXRpb24gZmllbGRzIHRocm91Z2ggdGhlIHJlc291cmNlJ3MgcmVhZGFibGVcbiAgICogYXR0cmlidXRlIGNvbnRyYWN0LiBXcml0YWJsZS1idXQtaGlkZGVuIGZpZWxkcyBhcmUgb21pdHRlZCwgd2hpbGUgY3VzdG9tXG4gICAqIGA8YXR0cmlidXRlPkF0dHJpYnV0ZShtb2RlbClgIHNlcmlhbGl6ZXJzIGFuZCBtb2RlbCBhY2Nlc3NvcnMgcmVtYWluIHRoZVxuICAgKiBzb3VyY2Ugb2YgZnJvbnRlbmQtdmlzaWJsZSB2YWx1ZXMgKERhdGUgdmFsdWVzIGFyZSBrZXB0IHJhdyBzbyB0aGUgbm9ybWFsXG4gICAqIGZyb250ZW5kLW1vZGVsIHRyYW5zcG9ydCBzZXJpYWxpemVyIGNhbiBlbWl0IGl0cyBkYXRlIG1hcmtlcikuIFRoZSBmdWxsXG4gICAqIG1vZGVsIGF0dHJpYnV0ZSBoYXNoIGlzIG5ldmVyIGV4cG9zZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUHJvamVjdGlvbiBhcmdzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hdHRyaWJ1dGVzIC0gUGVybWl0dGVkIGFmZmVjdGVkIG11dGF0aW9uIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MuZXhpc3RpbmdSZWNvcmQgLSBBdXRob3JpemVkIHNlcnZlciByZWNvcmQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBTZXJpYWxpemVkIHJlYWRhYmxlIGFmZmVjdGVkIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVkUm91dGVkQ29uZmxpY3RBdHRyaWJ1dGVzKHthdHRyaWJ1dGVzLCBleGlzdGluZ1JlY29yZCwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IFJlc291cmNlQ2xhc3MgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSAqLyAocmVzb3VyY2UuY29uc3RydWN0b3IpXG4gICAgY29uc3QgcmVhZGFibGVBdHRyaWJ1dGVzID0gbmV3IFNldCgpXG4gICAgY29uc3QgY29uZmlndXJlZEF0dHJpYnV0ZXMgPSBSZXNvdXJjZUNsYXNzLnJlc291cmNlQ29uZmlnKCkuYXR0cmlidXRlc1xuICAgIGNvbnN0IGNvbmZpZ3VyZWRFbnRyaWVzID0gQXJyYXkuaXNBcnJheShjb25maWd1cmVkQXR0cmlidXRlcykgPyBjb25maWd1cmVkQXR0cmlidXRlcyA6IE9iamVjdC5rZXlzKGNvbmZpZ3VyZWRBdHRyaWJ1dGVzKVxuXG4gICAgaWYgKGNvbmZpZ3VyZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZSA9IE1vZGVsQ2xhc3MuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpXG5cbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lKSkge1xuICAgICAgICByZWFkYWJsZUF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZU5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25maWd1cmVkQXR0cmlidXRlIG9mIGNvbmZpZ3VyZWRFbnRyaWVzKSB7XG4gICAgICBjb25zdCBjb25maWd1cmVkTmFtZSA9IHR5cGVvZiBjb25maWd1cmVkQXR0cmlidXRlID09PSBcInN0cmluZ1wiID8gY29uZmlndXJlZEF0dHJpYnV0ZSA6IGNvbmZpZ3VyZWRBdHRyaWJ1dGUubmFtZVxuXG4gICAgICBpZiAoIWNvbmZpZ3VyZWROYW1lKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBjYW5vbmljYWxOYW1lID0gTW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShjb25maWd1cmVkTmFtZSlcblxuICAgICAgcmVhZGFibGVBdHRyaWJ1dGVzLmFkZChjYW5vbmljYWxOYW1lIHx8IGNvbmZpZ3VyZWROYW1lKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBdHRyaWJ1dGVzID0ge31cblxuICAgIGZvciAoY29uc3QgYWZmZWN0ZWRGaWVsZCBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IE1vZGVsQ2xhc3MucmVzb2x2ZUF0dHJpYnV0ZU5hbWUoYWZmZWN0ZWRGaWVsZClcblxuICAgICAgaWYgKCFhdHRyaWJ1dGVOYW1lIHx8ICFyZWFkYWJsZUF0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZU5hbWUpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlLnJlc291cmNlTWV0aG9kKGAke2F0dHJpYnV0ZU5hbWV9QXR0cmlidXRlYClcblxuICAgICAgaWYgKHJlc291cmNlQXR0cmlidXRlKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRBdHRyaWJ1dGVzW2FmZmVjdGVkRmllbGRdID0gYXdhaXQgcmVzb3VyY2VBdHRyaWJ1dGUubWV0aG9kLmNhbGwocmVzb3VyY2VBdHRyaWJ1dGUucmVzb3VyY2UsIGV4aXN0aW5nUmVjb3JkKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWNvcmRNZXRob2RzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChleGlzdGluZ1JlY29yZCkpXG4gICAgICBjb25zdCBhdHRyaWJ1dGVNZXRob2QgPSByZWNvcmRNZXRob2RzW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTWV0aG9kID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgc2VyaWFsaXplZEF0dHJpYnV0ZXNbYWZmZWN0ZWRGaWVsZF0gPSBhd2FpdCBhdHRyaWJ1dGVNZXRob2QuY2FsbChleGlzdGluZ1JlY29yZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcmlhbGl6ZWRBdHRyaWJ1dGVzW2FmZmVjdGVkRmllbGRdID0gZXhpc3RpbmdSZWNvcmQucmVhZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkQXR0cmlidXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYSByb3V0ZWQgbXV0YXRpb24gcGF5bG9hZCBkb3duIHRvIHRoZSByZXNvdXJjZSdzIGRlY2xhcmVkXG4gICAqIHdyaXRhYmxlLWF0dHJpYnV0ZSBwZXJtaXQgbGlzdC4gQWNjZXB0ZWQga2V5cyBwZXIgcGVybWl0dGVkIGF0dHJpYnV0ZSBhcmVcbiAgICogdGhlIGNhbWVsQ2FzZSBhdHRyaWJ1dGUgbmFtZSBwbHVzIHRoZSBtb2RlbCdzIGFjdHVhbCBjb2x1bW4gbmFtZTsgdW5rbm93blxuICAgKiBrZXlzIGZhaWwgdGhlIHN5bmMgbG91ZGx5LiBUaGUgcHJpbWFyeSBrZXkgaXMgZHJvcHBlZCB3aGVuIHBlcm1pdHRlZFxuICAgKiAoc25hcHNob3QgcGF5bG9hZHMpIOKAlCB0aGUgZW52ZWxvcGUncyByZXNvdXJjZUlkIGlzIHRoZSBhdXRob3JpdGF0aXZlXG4gICAqIHJlY29yZCBpZGVudGl0eSwgc28gYSBwYXlsb2FkIGlkIGNhbiBuZXZlciByZXRhcmdldCB0aGUgcm93LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gUGVybWl0dGVkIGF0dHJpYnV0ZXMgZm9yIHJlY29yZC5hc3NpZ24uXG4gICAqL1xuICBwZXJtaXR0ZWRSb3V0ZWRBdHRyaWJ1dGVzKHttdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgcGVybWl0dGVkQXR0cmlidXRlcyA9IHJlc291cmNlLmRlY2xhcmVkV3JpdGFibGVBdHRyaWJ1dGVzKClcblxuICAgIGlmICghcGVybWl0dGVkQXR0cmlidXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlLmNvbnN0cnVjdG9yLm5hbWV9IG11c3QgZGVjbGFyZSBzdGF0aWMgd3JpdGFibGVBdHRyaWJ1dGVzIHRvIGFwcGx5IHJvdXRlZCBzeW5jIG11dGF0aW9ucyBmb3I6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfWApXG4gICAgfVxuXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWUgPSBNb2RlbENsYXNzLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBhbGxvd2VkS2V5cyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIHBlcm1pdHRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGFsbG93ZWRLZXlzLmFkZChhdHRyaWJ1dGVOYW1lKVxuXG4gICAgICBjb25zdCBjb2x1bW5OYW1lID0gYXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZVthdHRyaWJ1dGVOYW1lXVxuXG4gICAgICBpZiAoY29sdW1uTmFtZSkgYWxsb3dlZEtleXMuYWRkKGNvbHVtbk5hbWUpXG4gICAgfVxuXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgY29uc3QgcHJpbWFyeUtleUF0dHJpYnV0ZSA9IE1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpW3ByaW1hcnlLZXldXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG11dGF0aW9uLmRhdGEpKSB7XG4gICAgICBpZiAoIWFsbG93ZWRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgIHRocm93IHJlc291cmNlLndyaXRhYmxlQXR0cmlidXRlRXJyb3IoYFVua25vd24gYXR0cmlidXRlOiAke2tleX0uYCwge2NvZGU6IFwic3luYy11bmtub3duLWF0dHJpYnV0ZVwifSlcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PT0gcHJpbWFyeUtleSB8fCBrZXkgPT09IHByaW1hcnlLZXlBdHRyaWJ1dGUpIGNvbnRpbnVlXG5cbiAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSByb3V0ZWQgcmVjb3JkIHdpdGggdGhlIGNsaWVudC1nZW5lcmF0ZWQgcHJpbWFyeSBrZXkgKG1hcmtlZFxuICAgKiBhcyBhIHNlcnZlciBhcHBseSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjcmVhdGUgLSBpbmNsdWRpbmcgdGhlXG4gICAqIG1lbWJlcnNoaXAtY2hlY2sgY29tcGVuc2F0aW9uIGRlc3Ryb3kgLSBzbyBhbiBhY3RpdmUgU3luY1B1Ymxpc2hlciBuZXZlclxuICAgKiBwdWJsaXNoZXMgdGhlIHJlcGxheWVkIGNyZWF0ZSBhIHNlY29uZCB0aW1lKSwgdGhlblxuICAgKiB2ZXJpZmllcyBjcmVhdGUtc2NvcGUgbWVtYmVyc2hpcCB3aGVuIGFuIGFiaWxpdHkgaXMgY29uZmlndXJlZDogcmVjb3Jkc1xuICAgKiBvdXRzaWRlIHRoZSBhYmlsaXR5J3MgY3JlYXRlIHNjb3BlIGFyZSBkZXN0cm95ZWQgYWdhaW4gYW5kIGZhaWwgdGhlIHN5bmNcbiAgICogd2l0aCB0aGUgcmVzb3VyY2UtZGVjbGFyZWQgcmVhc29uLiBBIHJlY29yZCB0aGF0IGFscmVhZHkgZXhpc3RzIG91dHNpZGVcbiAgICogdGhlIHJlc291cmNlJ3MgbG9va3VwIHNjb3BlIGZhaWxzIHRoZSBzeW5jIGFzIGFuIGF1dGhvcml6YXRpb24gZGVuaWFsXG4gICAqIGluc3RlYWQgb2YgY29sbGlkaW5nIG9uIHRoZSBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hdHRyaWJ1dGVzIC0gUGVybWl0dGVkIHBheWxvYWQgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTm9ybWFsaXplZCByZXBsYXkgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IENyZWF0ZWQgcmVjb3JkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUm91dGVkUmVwbGF5UmVjb3JkKHthdHRyaWJ1dGVzLCBtdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBNb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICAgIGNvbnN0IGNvbmZsaWN0aW5nSWRzID0gYXdhaXQgTW9kZWxDbGFzcy53aGVyZSh7W3ByaW1hcnlLZXldOiBtdXRhdGlvbi5yZXNvdXJjZUlkfSkucGx1Y2socHJpbWFyeUtleSlcblxuICAgIGlmIChjb25mbGljdGluZ0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBTeW5jIHVwZGF0ZSBkZW5pZWQgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uYCwge1xuICAgICAgICBjb2RlOiByZXNvdXJjZS5zeW5jQXV0aG9yaXphdGlvbkZhaWx1cmVSZWFzb24oe2FjdGlvbjogXCJ1cGRhdGVcIiwgbXV0YXRpb259KSB8fCBcImFjY2Vzcy1kZW5pZWRcIlxuICAgICAgfSlcbiAgICB9XG5cbiAgICBhd2FpdCBNb2RlbENsYXNzLmVuc3VyZUluaXRpYWxpemVkKClcblxuICAgIGNvbnN0IHJlY29yZCA9IG5ldyBNb2RlbENsYXNzKHtbcHJpbWFyeUtleV06IG11dGF0aW9uLnJlc291cmNlSWQsIC4uLmF0dHJpYnV0ZXN9KVxuICAgIGNvbnN0IHJlbGVhc2VTZXJ2ZXJBcHBseSA9IG1hcmtTZXJ2ZXJBcHBseShyZWNvcmQpXG5cbiAgICB0cnkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVjb3JkLnNhdmUoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5yb3V0ZWRSZXBsYXlTYXZlRXJyb3IoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFiaWxpdHkgPSByZXNvdXJjZS5hYmlsaXR5XG5cbiAgICAgIGlmIChhYmlsaXR5KSB7XG4gICAgICAgIGNvbnN0IG1lbWJlcklkcyA9IGF3YWl0IE1vZGVsQ2xhc3NcbiAgICAgICAgICAuYWNjZXNzaWJsZUZvcihyZXNvdXJjZS5zeW5jQWJpbGl0eUFjdGlvbihcImNyZWF0ZVwiKSwgYWJpbGl0eSlcbiAgICAgICAgICAud2hlcmUoe1twcmltYXJ5S2V5XTogcmVjb3JkLmlkKCl9KVxuICAgICAgICAgIC5wbHVjayhwcmltYXJ5S2V5KVxuXG4gICAgICAgIGlmIChtZW1iZXJJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgcmVjb3JkLmRlc3Ryb3koKVxuXG4gICAgICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgU3luYyBjcmVhdGUgZGVuaWVkIGZvcjogJHttdXRhdGlvbi5yZXNvdXJjZVR5cGV9LmAsIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc291cmNlLnN5bmNBdXRob3JpemF0aW9uRmFpbHVyZVJlYXNvbih7YWN0aW9uOiBcImNyZWF0ZVwiLCBtdXRhdGlvbn0pIHx8IFwiYWNjZXNzLWRlbmllZFwiXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVjb3JkXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlbGVhc2VTZXJ2ZXJBcHBseSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgcm91dGVkIHJlY29yZCwgY29udmVydGluZyBtb2RlbCB2YWxpZGF0aW9uIGZhaWx1cmVzIGludG9cbiAgICogY2xpZW50LXNhZmUgcGVyLXN5bmMgZXJyb3JzIGNhcnJ5aW5nIHRoZSB0cmFuc2xhdGVkIHZhbGlkYXRpb24gbWVzc2FnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIHRvIHNhdmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIHNhdmVkLlxuICAgKi9cbiAgYXN5bmMgc2F2ZVJvdXRlZFJlcGxheVJlY29yZChyZWNvcmQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVjb3JkLnNhdmUoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLnJvdXRlZFJlcGxheVNhdmVFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIHJvdXRlZCBzYXZlL2NyZWF0ZSBmYWlsdXJlOiBtb2RlbCB2YWxpZGF0aW9uIGVycm9ycyBiZWNvbWVcbiAgICogY2xpZW50LXNhZmUgZXJyb3JzIHdpdGggdGhlaXIgdHJhbnNsYXRlZCBtZXNzYWdlcywgZXZlcnl0aGluZyBlbHNlXG4gICAqIHByb3BhZ2F0ZXMgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBlcnJvciAtIFRocm93biBzYXZlL2NyZWF0ZSBlcnJvci5cbiAgICogQHJldHVybnMge0Vycm9yfSBFcnJvciB0byByZXRocm93LlxuICAgKi9cbiAgcm91dGVkUmVwbGF5U2F2ZUVycm9yKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICByZXR1cm4gVmVsb2Npb3VzRXJyb3Iuc2FmZShlcnJvci5tZXNzYWdlLCB7Y2F1c2U6IGVycm9yLCBjb2RlOiBcInZhbGlkYXRpb24tZXJyb3JcIn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBhcHBseSByZXN1bHQgZm9yIHN0YWxlIG11dGF0aW9ucyB0aGF0IHNob3VsZCBub3QgdG91Y2ggZG9tYWluIG1vZGVscy5cbiAgICogRXhhY3QgZHVwbGljYXRlcyByZXNvbHZlIHRoZSBjdXJyZW50IHJvdXRlZCByZWNvcmQgc28gdGhlIGFja25vd2xlZGdlbWVudFxuICAgKiBjYW4gaW5jbHVkZSBpdHMgYXV0aG9yaXRhdGl2ZSB2ZXJzaW9uIHdpdGhvdXQgYXBwbHlpbmcgdGhlIG11dGF0aW9uIGFnYWluLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgZXhpc3RpbmdTeW5jOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IsIGJhdGNoIGNvbnRleHQsIGV4aXN0aW5nIHN5bmMgcm93LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gUHJvamVjdC1zcGVjaWZpYyBhcHBseSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBza2lwcGVkUmVwbGF5TXV0YXRpb24oe2FjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSkge1xuICAgIGlmICghdGhpcy5pc0R1cGxpY2F0ZVJlcGxheU11dGF0aW9uKHtleGlzdGluZ1N5bmMsIG11dGF0aW9ufSkgfHwgIXRoaXMucm91dGluZ0NvbmZpZ3VyZWQoKSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMucmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24obXV0YXRpb24ucmVzb3VyY2VUeXBlKVxuXG4gICAgaWYgKCFyZWdpc3RyYXRpb24pIHJldHVybiBudWxsXG5cbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuYnVpbGRSZXBsYXlSZXNvdXJjZSh7YWN0b3IsIGNvbnRleHQsIG11dGF0aW9uLCByZWdpc3RyYXRpb259KVxuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHJlc291cmNlLmZpbmRTeW5jUmVjb3JkKHtmb3JEZWxldGU6IG11dGF0aW9uLnN5bmNUeXBlID09PSBcImRlbGV0ZVwiLCBtdXRhdGlvbn0pXG5cbiAgICByZXR1cm4ge2NyZWF0ZWQ6IGZhbHNlLCBkZWxldGVkOiBmYWxzZSwgZHVwbGljYXRlOiB0cnVlLCByZWNvcmR9XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdHMgb25lIG5vcm1hbGl6ZWQgbXV0YXRpb24gaW50byB0aGUgYXBwIHN5bmMvY2hhbmdlIHN0b3JlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBhIHN0YWxlLWd1YXJkZWQgc3luYy1tb2RlbCB1cHNlcnQgKHdpdGggc2VydmVyIHJlLXNlcXVlbmNpbmcgb25cbiAgICogdXBkYXRlcykgd2hlbiBhIHN5bmMgbW9kZWwgaXMgY29uZmlndXJlZDsgb3RoZXJ3aXNlIGFwcHMgb3ZlcnJpZGUgdGhpcyBob29rLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgZXhpc3RpbmdTeW5jOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgYXBwbHlSZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbiwgc2hvdWxkQXBwbHk6IGJvb2xlYW59fSBhcmdzIC0gUmVwbGF5IHBlcnNpc3RlbmNlIGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBwZXJzaXN0UmVwbGF5TXV0YXRpb24oe2FjdG9yLCBhcHBseVJlc3VsdCwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbiwgc2hvdWxkQXBwbHl9KSB7XG4gICAgaWYgKCF0aGlzLnN5bmNNb2RlbCkgcmV0dXJuXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5yZXBsYXlQZXJzaXN0QXR0cmlidXRlcyh7YWN0b3IsIG11dGF0aW9ufSlcblxuICAgIC8vIFN0YWxlIHJlcGxheXMgbmV2ZXIgYXBwbGllZCBhbnl0aGluZywgc28gdGhlIGFwcGx5UmVzdWx0LWRyaXZlbiBleHRlbnNpb25cbiAgICAvLyBob29rcyBtdXN0IG5vdCBydW4gYWdhaW5zdCB0aGUgZGVmYXVsdCBudWxsIHNraXBwZWQgcmVzdWx0LlxuICAgIGlmICh0aGlzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMgJiYgc2hvdWxkQXBwbHkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oYXR0cmlidXRlcywgdGhpcy5wZXJzaXN0RXh0cmFBdHRyaWJ1dGVzKHthY3RvciwgYXBwbHlSZXN1bHQsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb24sIHNob3VsZEFwcGx5fSkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdFNlcmlhbGl6ZWREYXRhICYmIHNob3VsZEFwcGx5KSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVkRGF0YSA9IHRoaXMucGVyc2lzdFNlcmlhbGl6ZWREYXRhKHthcHBseVJlc3VsdCwgbXV0YXRpb259KVxuXG4gICAgICBpZiAoc2VyaWFsaXplZERhdGEgIT09IHVuZGVmaW5lZCAmJiBzZXJpYWxpemVkRGF0YSAhPT0gbnVsbCkge1xuICAgICAgICBhdHRyaWJ1dGVzLmRhdGEgPSB0eXBlb2Ygc2VyaWFsaXplZERhdGEgPT09IFwic3RyaW5nXCIgPyBzZXJpYWxpemVkRGF0YSA6IEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWREYXRhKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZsaWN0U3RyYXRlZ3kgJiYgc2hvdWxkQXBwbHkgJiYgbXV0YXRpb24uYmFzZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBhcHBseVJlc3VsdD8ucmVjb3JkKSB7XG4gICAgICBjb25zdCBwdWJsaWNQYXlsb2FkID0gZGVjb2RlUmVwbGF5UGVyc2lzdGVkRGF0YShhdHRyaWJ1dGVzLmRhdGEpLnBheWxvYWRcbiAgICAgIGNvbnN0IGFja25vd2xlZGdlbWVudFZlcnNpb24gPSBub3JtYWxpemVDb25mbGljdFZhbHVlKGFwcGx5UmVzdWx0LnJlY29yZC5yZWFkQXR0cmlidXRlKHRoaXMuY29uZmxpY3RTdHJhdGVneS52ZXJzaW9uQXR0cmlidXRlKSlcblxuICAgICAgYXR0cmlidXRlcy5kYXRhID0gc2VyaWFsaXplUmVwbGF5UGVyc2lzdGVkRGF0YSh7XG4gICAgICAgIGFja25vd2xlZGdlbWVudFZlcnNpb24sXG4gICAgICAgIGNsaWVudE11dGF0aW9uSWQ6IFN0cmluZyhtdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkIHx8IG11dGF0aW9uLmlkKSxcbiAgICAgICAgcGF5bG9hZDogcHVibGljUGF5bG9hZCxcbiAgICAgICAgcGF5bG9hZEZpbmdlcnByaW50OiBzaGEyNTZIZXgobXV0YXRpb24uc2VyaWFsaXplZERhdGEpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChleGlzdGluZ1N5bmMpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0ID0gdGhpcy5leGlzdGluZ1JlcGxheVN5bmNDbGllbnRVcGRhdGVkQXQoZXhpc3RpbmdTeW5jKVxuXG4gICAgICBpZiAoZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQgJiYgbXV0YXRpb24uY2xpZW50VXBkYXRlZEF0IDw9IGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0KSByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB1cHNlcnRTeW5jUm93KHthdHRyaWJ1dGVzLCBleGlzdGluZ1N5bmMsIHN5bmNNb2RlbDogdGhpcy5zeW5jTW9kZWx9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgc3luYy1tb2RlbCBhdHRyaWJ1dGVzIHBlcnNpc3RlZCBieSB0aGUgbW9kZWwtYmFja2VkIGRlZmF1bHQuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBTeW5jIHJvdyBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgcmVwbGF5UGVyc2lzdEF0dHJpYnV0ZXMoe2FjdG9yLCBtdXRhdGlvbn0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgW3RoaXMuYWN0b3JGb3JlaWduS2V5Q29sdW1uXTogdGhpcy5yZXBsYXlBY3RvcklkKGFjdG9yKSxcbiAgICAgIGNsaWVudF91cGRhdGVkX2F0OiBtdXRhdGlvbi5jbGllbnRVcGRhdGVkQXQsXG4gICAgICBkYXRhOiBtdXRhdGlvbi5zZXJpYWxpemVkRGF0YSxcbiAgICAgIHJlc291cmNlX2lkOiBtdXRhdGlvbi5yZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VfdHlwZTogbXV0YXRpb24ucmVzb3VyY2VUeXBlLFxuICAgICAgc3luY190eXBlOiBtdXRhdGlvbi5zeW5jVHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNpZGUgZWZmZWN0cyBhZnRlciBhIHN1Y2Nlc3NmdWwgbXV0YXRpb24gcmVwbGF5IGFuZCBwZXJzaXN0ZW5jZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gZmFubmluZyB0aGUgYXBwbGllZCByZXN1bHQgb3V0IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWRcbiAgICogZGVjbGFyYXRpdmUgYnJvYWRjYXN0cy5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGV4aXN0aW5nU3luYzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGFwcGx5UmVzdWx0OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb24sIHNob3VsZEFwcGx5OiBib29sZWFufX0gYXJncyAtIFJlcGxheSBzaWRlLWVmZmVjdCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgYWZ0ZXJSZXBsYXlNdXRhdGlvbihhcmdzKSB7XG4gICAgaWYgKCF0aGlzLmJyb2FkY2FzdHMgfHwgIXRoaXMuYnJvYWRjYXN0ZXIpIHJldHVyblxuICAgIC8vIFN0YWxlIHJlcGxheXMgbmV2ZXIgYXBwbGllZCBhbnl0aGluZyAtIGJyb2FkY2FzdGluZyB0aGVpciBza2lwcGVkIHJlc3VsdHNcbiAgICAvLyB3b3VsZCBmYW4gb3V0IHN0YWxlIHNpZGUgZWZmZWN0cyAob3IgY3Jhc2ggb24gdGhlIGRlZmF1bHQgbnVsbCBhcHBseVJlc3VsdCkuXG4gICAgaWYgKCFhcmdzLnNob3VsZEFwcGx5KSByZXR1cm5cblxuICAgIGF3YWl0IGRlbGl2ZXJEZWNsYXJlZEJyb2FkY2FzdHMoe2FyZ3MsIGJyb2FkY2FzdGVyOiB0aGlzLmJyb2FkY2FzdGVyLCBicm9hZGNhc3RzOiB0aGlzLmJyb2FkY2FzdHN9KVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRldGVybWluaXN0aWMsIE15U1FMLXNhZmUgYWR2aXNvcnktbG9jayBuYW1lIGZvciBhIHJvdXRlZCByZXBsYXlcbiAqIHJlc291cmNlIGlkZW50aXR5LiBUaGUgZnVsbCBge3Jlc291cmNlVHlwZSwgcmVzb3VyY2VJZH1gIGlkZW50aXR5IGlzIGhhc2hlZFxuICogd2l0aCBTSEEtMjU2IGFuZCB0cnVuY2F0ZWQgdG8gMzIgaGV4IGNoYXJhY3RlcnMgc28gdGhlIGZpbmFsIG5hbWUgc3RheXMgd2VsbFxuICogdW5kZXIgTXlTUUwvTWFyaWFEQidzIDY0LWNoYXJhY3RlciBgR0VUX0xPQ0tgIGxpbWl0IHdoaWxlIHJlbWFpbmluZ1xuICogY29sbGlzaW9uLXJlc2lzdGFudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gTG9jayBpZGVudGl0eSBhcmdzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VJZCAtIFJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VUeXBlIC0gUmVzb3VyY2UgdHlwZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQWR2aXNvcnkgbG9jayBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3luY1JlcGxheUNvbmZsaWN0TG9ja05hbWUoe3Jlc291cmNlSWQsIHJlc291cmNlVHlwZX0pIHtcbiAgY29uc3QgaWRlbnRpdHkgPSBzdGFibGVKc29uU3RyaW5naWZ5KHtyZXNvdXJjZUlkLCByZXNvdXJjZVR5cGV9KVxuICBjb25zdCBoYXNoID0gc2hhMjU2SGV4KGlkZW50aXR5KS5zbGljZSgwLCAzMilcblxuICByZXR1cm4gYHZzcjoke2hhc2h9YFxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSB2ZXJzaW9uIHZhbHVlIGZvciBkZXRlcm1pbmlzdGljIGNvbXBhcmlzb24gYW5kIHRyYW5zcG9ydC5cbiAqIE9ubHkgdmVyc2lvbiB2YWx1ZXMgcGFydGljaXBhdGUgaW4gc3RhYmxlLUpTT04gY29tcGFyaXNvbiBhZ2FpbnN0IGNsaWVudFxuICogYGJhc2VWZXJzaW9uYCBzdHJpbmdzOyByZXNvdXJjZSBzZXJpYWxpemVyL2FjY2Vzc29yIHJlc3VsdHMgbXVzdCBzdGF5IHJhdyBzb1xuICogdGhlIGZyb250ZW5kLW1vZGVsIHRyYW5zcG9ydCBzZXJpYWxpemVyIGNhbiByZXRhaW4gRGF0ZSBtYXJrZXJzLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBSYXcgdmVyc2lvbiB2YWx1ZSBmcm9tIGEgZGF0YWJhc2UgcmVjb3JkLlxuICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIE5vcm1hbGl6ZWQgdmFsdWUgKERhdGUgdmFsdWVzIGJlY29tZSBJU08gc3RyaW5ncykuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZsaWN0VmFsdWUodmFsdWUpIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKClcblxuICByZXR1cm4gdmFsdWVcbn1cbiJdfQ==