velocious 1.0.593 → 1.0.595

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 (136) hide show
  1. package/README.md +3 -2
  2. package/build/configuration.js +109 -14
  3. package/build/database/drivers/base.js +30 -0
  4. package/build/database/migrator.js +90 -24
  5. package/build/database/operation.js +55 -4
  6. package/build/database/query/join-object.js +7 -4
  7. package/build/database/query/model-class-query.js +38 -7
  8. package/build/database/query/preloader/belongs-to.js +9 -6
  9. package/build/database/query/preloader/has-many.js +25 -14
  10. package/build/database/query/preloader/has-one.js +7 -4
  11. package/build/database/query/preloader/query-for-model.js +16 -1
  12. package/build/database/query/preloader.js +6 -4
  13. package/build/database/query/query-data.js +3 -3
  14. package/build/database/query/where-model-class-hash.js +8 -4
  15. package/build/database/query/with-count.js +4 -3
  16. package/build/database/record/index.js +148 -5
  17. package/build/database/record/instance-relationships/base.js +13 -0
  18. package/build/database/record/instance-relationships/belongs-to.js +1 -1
  19. package/build/database/record/instance-relationships/has-many.js +5 -2
  20. package/build/database/record/instance-relationships/has-one.js +1 -1
  21. package/build/database/record/relationships/base.js +17 -0
  22. package/build/database/use-database.js +81 -28
  23. package/build/src/configuration.d.ts +31 -4
  24. package/build/src/configuration.d.ts.map +1 -1
  25. package/build/src/configuration.js +88 -17
  26. package/build/src/database/drivers/base.d.ts +11 -0
  27. package/build/src/database/drivers/base.d.ts.map +1 -1
  28. package/build/src/database/drivers/base.js +28 -1
  29. package/build/src/database/migrator.d.ts +34 -0
  30. package/build/src/database/migrator.d.ts.map +1 -1
  31. package/build/src/database/migrator.js +83 -23
  32. package/build/src/database/operation.d.ts +15 -1
  33. package/build/src/database/operation.d.ts.map +1 -1
  34. package/build/src/database/operation.js +52 -5
  35. package/build/src/database/query/join-object.d.ts.map +1 -1
  36. package/build/src/database/query/join-object.js +7 -5
  37. package/build/src/database/query/model-class-query.d.ts +6 -0
  38. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  39. package/build/src/database/query/model-class-query.js +33 -8
  40. package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
  41. package/build/src/database/query/preloader/belongs-to.js +9 -7
  42. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  43. package/build/src/database/query/preloader/has-many.js +23 -16
  44. package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
  45. package/build/src/database/query/preloader/has-one.js +7 -5
  46. package/build/src/database/query/preloader/query-for-model.d.ts +8 -0
  47. package/build/src/database/query/preloader/query-for-model.d.ts.map +1 -1
  48. package/build/src/database/query/preloader/query-for-model.js +15 -2
  49. package/build/src/database/query/preloader.d.ts.map +1 -1
  50. package/build/src/database/query/preloader.js +6 -5
  51. package/build/src/database/query/query-data.js +4 -4
  52. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  53. package/build/src/database/query/where-model-class-hash.js +7 -5
  54. package/build/src/database/query/with-count.js +5 -4
  55. package/build/src/database/record/index.d.ts +95 -0
  56. package/build/src/database/record/index.d.ts.map +1 -1
  57. package/build/src/database/record/index.js +126 -6
  58. package/build/src/database/record/instance-relationships/base.d.ts +6 -0
  59. package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
  60. package/build/src/database/record/instance-relationships/base.js +12 -1
  61. package/build/src/database/record/instance-relationships/belongs-to.js +2 -2
  62. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  63. package/build/src/database/record/instance-relationships/has-many.js +6 -3
  64. package/build/src/database/record/instance-relationships/has-one.js +2 -2
  65. package/build/src/database/record/relationships/base.d.ts +11 -0
  66. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  67. package/build/src/database/record/relationships/base.js +15 -1
  68. package/build/src/database/use-database.d.ts +33 -5
  69. package/build/src/database/use-database.d.ts.map +1 -1
  70. package/build/src/database/use-database.js +81 -30
  71. package/build/src/sync/server-change-feed.d.ts +14 -2
  72. package/build/src/sync/server-change-feed.d.ts.map +1 -1
  73. package/build/src/sync/server-change-feed.js +50 -10
  74. package/build/src/sync/sync-scope-store.d.ts +13 -2
  75. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  76. package/build/src/sync/sync-scope-store.js +48 -7
  77. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.d.ts +43 -1
  78. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.d.ts.map +1 -1
  79. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.js +141 -17
  80. package/build/src/tenants/tenant-handle.d.ts +36 -0
  81. package/build/src/tenants/tenant-handle.d.ts.map +1 -1
  82. package/build/src/tenants/tenant-handle.js +73 -3
  83. package/build/src/testing/browser-test-app.js +3 -1
  84. package/build/src/testing/browser-use-database-hook-scenarios.d.ts +16 -0
  85. package/build/src/testing/browser-use-database-hook-scenarios.d.ts.map +1 -0
  86. package/build/src/testing/browser-use-database-hook-scenarios.js +182 -0
  87. package/build/src/testing/test-runner.d.ts.map +1 -1
  88. package/build/src/testing/test-runner.js +9 -8
  89. package/build/src/utils/model-scope.d.ts +2 -2
  90. package/build/src/utils/model-scope.d.ts.map +1 -1
  91. package/build/src/utils/model-scope.js +5 -3
  92. package/build/src/utils/ransack.d.ts.map +1 -1
  93. package/build/src/utils/ransack.js +5 -3
  94. package/build/sync/server-change-feed.js +58 -8
  95. package/build/sync/sync-scope-store.js +55 -5
  96. package/build/tenants/frontend-tenant-sqlite-lifecycle.js +150 -15
  97. package/build/tenants/tenant-handle.js +90 -6
  98. package/build/testing/browser-test-app.js +2 -0
  99. package/build/testing/browser-use-database-hook-scenarios.js +204 -0
  100. package/build/testing/test-runner.js +8 -7
  101. package/build/tsconfig.tsbuildinfo +1 -1
  102. package/build/utils/model-scope.js +5 -2
  103. package/build/utils/ransack.js +5 -2
  104. package/package.json +2 -1
  105. package/scripts/browser-test-session.js +60 -0
  106. package/scripts/test-browser.js +7 -7
  107. package/src/configuration.js +109 -14
  108. package/src/database/drivers/base.js +30 -0
  109. package/src/database/migrator.js +90 -24
  110. package/src/database/operation.js +55 -4
  111. package/src/database/query/join-object.js +7 -4
  112. package/src/database/query/model-class-query.js +38 -7
  113. package/src/database/query/preloader/belongs-to.js +9 -6
  114. package/src/database/query/preloader/has-many.js +25 -14
  115. package/src/database/query/preloader/has-one.js +7 -4
  116. package/src/database/query/preloader/query-for-model.js +16 -1
  117. package/src/database/query/preloader.js +6 -4
  118. package/src/database/query/query-data.js +3 -3
  119. package/src/database/query/where-model-class-hash.js +8 -4
  120. package/src/database/query/with-count.js +4 -3
  121. package/src/database/record/index.js +148 -5
  122. package/src/database/record/instance-relationships/base.js +13 -0
  123. package/src/database/record/instance-relationships/belongs-to.js +1 -1
  124. package/src/database/record/instance-relationships/has-many.js +5 -2
  125. package/src/database/record/instance-relationships/has-one.js +1 -1
  126. package/src/database/record/relationships/base.js +17 -0
  127. package/src/database/use-database.js +81 -28
  128. package/src/sync/server-change-feed.js +58 -8
  129. package/src/sync/sync-scope-store.js +55 -5
  130. package/src/tenants/frontend-tenant-sqlite-lifecycle.js +150 -15
  131. package/src/tenants/tenant-handle.js +90 -6
  132. package/src/testing/browser-test-app.js +2 -0
  133. package/src/testing/browser-use-database-hook-scenarios.js +204 -0
  134. package/src/testing/test-runner.js +8 -7
  135. package/src/utils/model-scope.js +5 -2
  136. package/src/utils/ransack.js +5 -2
@@ -74,7 +74,7 @@ export default class VelociousDatabaseQueryPreloader {
74
74
  static async preload(models, queryOrSpec, { force = false } = {}) {
75
75
  if (models.length == 0)
76
76
  return;
77
- const modelClass = /** @type {typeof import("../record/index.js").default} */ (models[0].constructor);
77
+ const modelClass = models[0].getModelClass();
78
78
  const isQuery = Boolean(queryOrSpec) && typeof queryOrSpec == "object" && "_preload" in queryOrSpec;
79
79
  // Reuse the query builder's preload/select normalization for raw specs
80
80
  // instead of duplicating it here.
@@ -150,15 +150,16 @@ export default class VelociousDatabaseQueryPreloader {
150
150
  const models = targetModelsByClassName[className];
151
151
  if (models.length == 0)
152
152
  continue;
153
- const targetModelClass = configuration.getModelClass(className);
153
+ const targetModelClass = this.modelClass.bindRecordMetadataModelClass(configuration.getModelClass(className));
154
154
  const preloader = new VelociousDatabaseQueryPreloader({ modelClass: targetModelClass, models, preload: normalizedPreload, selection: this.selection });
155
155
  await preloader.run();
156
156
  }
157
157
  }
158
158
  else {
159
- const targetModelClass = relationship.getTargetModelClass();
160
- if (!targetModelClass)
159
+ const rawTargetModelClass = relationship.getTargetModelClass();
160
+ if (!rawTargetModelClass)
161
161
  throw new Error("No target model class could be gotten from relationship");
162
+ const targetModelClass = this.modelClass.bindRecordMetadataModelClass(rawTargetModelClass);
162
163
  const preloader = new VelociousDatabaseQueryPreloader({ modelClass: targetModelClass, models: targetModels, preload: normalizedPreload, selection: this.selection });
163
164
  await preloader.run();
164
165
  }
@@ -166,4 +167,4 @@ export default class VelociousDatabaseQueryPreloader {
166
167
  }
167
168
  }
168
169
  }
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlbG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3F1ZXJ5L3ByZWxvYWRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxrQkFBa0IsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRCxPQUFPLGdCQUFnQixNQUFNLHlCQUF5QixDQUFBO0FBQ3RELE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BELE9BQU8sa0JBQWtCLE1BQU0sMEJBQTBCLENBQUE7QUFDekQsT0FBTyxhQUFhLE1BQU0sZ0NBQWdDLENBQUE7QUFFMUQ7Ozs7R0FJRztBQUNILFNBQVMsc0JBQXNCLENBQUMsT0FBTztJQUNyQyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxJQUFJLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUV4RCxJQUFJLE9BQU8sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLE9BQU8sRUFBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBQyxDQUFBO0lBQzFCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMzQjs7cUVBRTZEO1FBQzdELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtRQUVqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUE7Z0JBQ3BCLFNBQVE7WUFDVixDQUFDO1lBRUQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sZUFBZSxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUVyRCxJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUNwQixLQUFL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QUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUE7b0JBRTNELElBQUksQ0FBQyxnQkFBZ0I7d0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO29CQUVqRyxNQUFNLFNBQVMsR0FBRyxJQUFJLCtCQUErQixDQUFDLEVBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQTtvQkFFbEssTUFBTSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQmVsb25nc1RvUHJlbG9hZGVyIGZyb20gXCIuL3ByZWxvYWRlci9iZWxvbmdzLXRvLmpzXCJcbmltcG9ydCBIYXNNYW55UHJlbG9hZGVyIGZyb20gXCIuL3ByZWxvYWRlci9oYXMtbWFueS5qc1wiXG5pbXBvcnQgSGFzT25lUHJlbG9hZGVyIGZyb20gXCIuL3ByZWxvYWRlci9oYXMtb25lLmpzXCJcbmltcG9ydCBQcmVsb2FkZXJTZWxlY3Rpb24gZnJvbSBcIi4vcHJlbG9hZGVyL3NlbGVjdGlvbi5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBuZXN0ZWQgcHJlbG9hZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IHN0cmluZyB8IHN0cmluZ1tdIHwgYm9vbGVhbn0gcHJlbG9hZCAtIFByZWxvYWQgZGF0YSBpbiBzaG9ydGhhbmQgb3IgbmVzdGVkIGZvcm0uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IG51bGx9IC0gTm9ybWFsaXplZCBuZXN0ZWQgcHJlbG9hZCByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5lc3RlZFByZWxvYWQocHJlbG9hZCkge1xuICBpZiAoIXByZWxvYWQgfHwgdHlwZW9mIHByZWxvYWQgPT0gXCJib29sZWFuXCIpIHJldHVybiBudWxsXG5cbiAgaWYgKHR5cGVvZiBwcmVsb2FkID09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4ge1twcmVsb2FkXTogdHJ1ZX1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHByZWxvYWQpKSB7XG4gICAgLyoqXG4gICAgICogUmVzdWx0LlxuICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkfSAqL1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHByZWxvYWQpIHtcbiAgICAgIGlmICh0eXBlb2YgZW50cnkgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXN1bHRbZW50cnldID0gdHJ1ZVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkgJiYgdHlwZW9mIGVudHJ5ID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVudHJ5ID0gbm9ybWFsaXplTmVzdGVkUHJlbG9hZChlbnRyeSlcblxuICAgICAgICBpZiAobm9ybWFsaXplZEVudHJ5KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZEVudHJ5KSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJlbG9hZCBlbnRyeSB0eXBlOiAke3R5cGVvZiBlbnRyeX1gKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGlmIChwcmVsb2FkICYmIHR5cGVvZiBwcmVsb2FkID09IFwib2JqZWN0XCIpIHtcbiAgICAvKipcbiAgICAgKiBSZXN1bHQuXG4gICAgICogQHR5cGUge2ltcG9ydChcIi4uL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmR9ICovXG4gICAgY29uc3QgcmVzdWx0ID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByZWxvYWQpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gbm9ybWFsaXplTmVzdGVkUHJlbG9hZCh2YWx1ZSlcblxuICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IG5vcm1hbGl6ZWRWYWx1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByZWxvYWQgdmFsdWUgZm9yICR7a2V5fTogJHt0eXBlb2YgdmFsdWV9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJlbG9hZCB0eXBlOiAke3R5cGVvZiBwcmVsb2FkfWApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUXVlcnlQcmVsb2FkZXIge1xuICAvKipcbiAgICogUHJlbG9hZHMgcmVsYXRpb25zaGlwKHMpIG9udG8gb25lIG9yIG1vcmUgYWxyZWFkeS1sb2FkZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKiBBY2NlcHRzIGVpdGhlciBhIHF1ZXJ5IGJ1aWx0IHZpYSBgTW9kZWwucHJlbG9hZCguLi4pLnNlbGVjdCguLi4pYCAoaXRzXG4gICAqIHByZWxvYWQgZ3JhcGggYW5kIHNlbGVjdHMgYXJlIHVzZWQpIG9yIGEgcmF3IHByZWxvYWQgc3BlY1xuICAgKiAoc3RyaW5nIC8gYXJyYXkgLyBuZXN0ZWQgb2JqZWN0KS5cbiAgICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IG1vZGVscyAtIE1vZGVsIGluc3RhbmNlcyB0byBwcmVsb2FkIG9udG8uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkIHwgc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkPn0gcXVlcnlPclNwZWMgLSBQcmVsb2FkIHNvdXJjZS5cbiAgICogQHBhcmFtIHt7Zm9yY2U/OiBib29sZWFufX0gW29wdGlvbnNdIC0gT3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBwcmVsb2FkaW5nIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBwcmVsb2FkKG1vZGVscywgcXVlcnlPclNwZWMsIHtmb3JjZSA9IGZhbHNlfSA9IHt9KSB7XG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBtb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChtb2RlbHNbMF0uY29uc3RydWN0b3IpXG4gICAgY29uc3QgaXNRdWVyeSA9IEJvb2xlYW4ocXVlcnlPclNwZWMpICYmIHR5cGVvZiBxdWVyeU9yU3BlYyA9PSBcIm9iamVjdFwiICYmIFwiX3ByZWxvYWRcIiBpbiBxdWVyeU9yU3BlY1xuICAgIC8vIFJldXNlIHRoZSBxdWVyeSBidWlsZGVyJ3MgcHJlbG9hZC9zZWxlY3Qgbm9ybWFsaXphdGlvbiBmb3IgcmF3IHNwZWNzXG4gICAgLy8gaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdCBoZXJlLlxuICAgIGNvbnN0IHF1ZXJ5ID0gaXNRdWVyeVxuICAgICAgPyAvKiogQHR5cGUge2ltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gKi8gKHF1ZXJ5T3JTcGVjKVxuICAgICAgOiBtb2RlbENsYXNzLnByZWxvYWQoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKHF1ZXJ5T3JTcGVjKSlcblxuICAgIGNvbnN0IHByZWxvYWRlciA9IG5ldyBWZWxvY2lvdXNEYXRhYmFzZVF1ZXJ5UHJlbG9hZGVyKHtcbiAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICBtb2RlbHMsXG4gICAgICBwcmVsb2FkOiBxdWVyeS5fcHJlbG9hZCxcbiAgICAgIHNlbGVjdGlvbjogbmV3IFByZWxvYWRlclNlbGVjdGlvbih7XG4gICAgICAgIHByZWxvYWRTZWxlY3RzOiBxdWVyeS5fcHJlbG9hZFNlbGVjdHMsXG4gICAgICAgIHByZWxvYWRTZWxlY3RzRXh0cmE6IHF1ZXJ5Ll9wcmVsb2FkU2VsZWN0c0V4dHJhLFxuICAgICAgICBmb3JjZVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgYXdhaXQgcHJlbG9hZGVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3MubW9kZWxzIC0gTW9kZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmR9IGFyZ3MucHJlbG9hZCAtIFByZWxvYWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBbYXJncy5wcmVsb2FkU2VsZWN0c10gLSBOYXJyb3dpbmcgc2VsZWN0cyBrZXllZCBieSB0YXJnZXQgbW9kZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFthcmdzLnByZWxvYWRTZWxlY3RzRXh0cmFdIC0gRXh0cmEgc2VsZWN0cyBrZXllZCBieSB0YXJnZXQgbW9kZWwgbmFtZS5cbiAgICogQHBhcmFtIHtQcmVsb2FkZXJTZWxlY3Rpb259IFthcmdzLnNlbGVjdGlvbl0gLSBQcmUtYnVpbHQgc2VsZWN0aW9uICh0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIHNlbGVjdCBtYXBzIHdoZW4gZ2l2ZW4pLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe21vZGVsQ2xhc3MsIG1vZGVscywgcHJlbG9hZCwgcHJlbG9hZFNlbGVjdHMgPSB7fSwgcHJlbG9hZFNlbGVjdHNFeHRyYSA9IHt9LCBzZWxlY3Rpb24sIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICB0aGlzLm1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzXG4gICAgdGhpcy5tb2RlbHMgPSBtb2RlbHNcbiAgICB0aGlzLnByZWxvYWQgPSBwcmVsb2FkXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24gfHwgbmV3IFByZWxvYWRlclNlbGVjdGlvbih7cHJlbG9hZFNlbGVjdHMsIHByZWxvYWRTZWxlY3RzRXh0cmF9KVxuICB9XG5cbiAgYXN5bmMgcnVuKCkge1xuICAgIGZvciAoY29uc3QgcHJlbG9hZFJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5wcmVsb2FkKSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzUmVsYXRpb25zaGlwID0gdGhpcy5tb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShwcmVsb2FkUmVsYXRpb25zaGlwTmFtZSlcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHRoaXMubW9kZWxzLmxlbmd0aCA+IDAgPyBtb2RlbENsYXNzUmVsYXRpb25zaGlwLnJlc29sdmVGb3JSZWNvcmQodGhpcy5tb2RlbHNbMF0pIDogbW9kZWxDbGFzc1JlbGF0aW9uc2hpcFxuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRoaXMubW9kZWxzKSB7XG4gICAgICAgIGlmIChtb2RlbENsYXNzUmVsYXRpb25zaGlwLnJlc29sdmVGb3JSZWNvcmQobW9kZWwpICE9PSByZWxhdGlvbnNoaXApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwcmVsb2FkICR7dGhpcy5tb2RlbENsYXNzLm5hbWV9IyR7cHJlbG9hZFJlbGF0aW9uc2hpcE5hbWV9IGFjcm9zcyBwaHlzaWNhbCBkYXRhYmFzZSBpZGVudGl0aWVzYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHByZWxvYWRSZXN1bHRcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJiZWxvbmdzVG9cIikge1xuICAgICAgICBjb25zdCBiZWxvbmdzVG9SZWxhdGlvbnNoaXAgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3JlY29yZC9yZWxhdGlvbnNoaXBzL2JlbG9uZ3MtdG8uanNcIikuZGVmYXVsdH0gKi8gKHJlbGF0aW9uc2hpcClcbiAgICAgICAgY29uc3QgaGFzTWFueVByZWxvYWRlciA9IG5ldyBCZWxvbmdzVG9QcmVsb2FkZXIoe21vZGVsczogdGhpcy5tb2RlbHMsIHJlbGF0aW9uc2hpcDogYmVsb25nc1RvUmVsYXRpb25zaGlwLCBzZWxlY3Rpb246IHRoaXMuc2VsZWN0aW9ufSlcblxuICAgICAgICBwcmVsb2FkUmVzdWx0ID0gYXdhaXQgaGFzTWFueVByZWxvYWRlci5ydW4oKVxuICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiaGFzTWFueVwiKSB7XG4gICAgICAgIGNvbnN0IGhhc01hbnlSZWxhdGlvbnNoaXAgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3JlY29yZC9yZWxhdGlvbnNoaXBzL2hhcy1tYW55LmpzXCIpLmRlZmF1bHR9ICovIChyZWxhdGlvbnNoaXApXG4gICAgICAgIGNvbnN0IGhhc01hbnlQcmVsb2FkZXIgPSBuZXcgSGFzTWFueVByZWxvYWRlcih7bW9kZWxzOiB0aGlzLm1vZGVscywgcmVsYXRpb25zaGlwOiBoYXNNYW55UmVsYXRpb25zaGlwLCBzZWxlY3Rpb246IHRoaXMuc2VsZWN0aW9ufSlcblxuICAgICAgICBwcmVsb2FkUmVzdWx0ID0gYXdhaXQgaGFzTWFueVByZWxvYWRlci5ydW4oKVxuICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiaGFzT25lXCIpIHtcbiAgICAgICAgY29uc3QgaGFzT25lUmVsYXRpb25zaGlwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9yZWNvcmQvcmVsYXRpb25zaGlwcy9oYXMtb25lLmpzXCIpLmRlZmF1bHR9ICovIChyZWxhdGlvbnNoaXApXG4gICAgICAgIGNvbnN0IGhhc09uZVByZWxvYWRlciA9IG5ldyBIYXNPbmVQcmVsb2FkZXIoe21vZGVsczogdGhpcy5tb2RlbHMsIHJlbGF0aW9uc2hpcDogaGFzT25lUmVsYXRpb25zaGlwLCBzZWxlY3Rpb246IHRoaXMuc2VsZWN0aW9ufSlcblxuICAgICAgICBwcmVsb2FkUmVzdWx0ID0gYXdhaXQgaGFzT25lUHJlbG9hZGVyLnJ1bigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVsYXRpb25zaGlwIHR5cGU6ICR7cmVsYXRpb25zaGlwLmdldFR5cGUoKX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbHMgPSBBcnJheS5pc0FycmF5KHByZWxvYWRSZXN1bHQpID8gcHJlbG9hZFJlc3VsdCA6IChwcmVsb2FkUmVzdWx0Py50YXJnZXRNb2RlbHMgfHwgW10pXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbHNCeUNsYXNzTmFtZSA9IEFycmF5LmlzQXJyYXkocHJlbG9hZFJlc3VsdCkgPyB1bmRlZmluZWQgOiBwcmVsb2FkUmVzdWx0Py50YXJnZXRNb2RlbHNCeUNsYXNzTmFtZVxuXG4gICAgICAvLyBIYW5kbGUgYW55IGZ1cnRoZXIgcHJlbG9hZHMgaW4gdGhlIHRyZWVcbiAgICAgIGNvbnN0IG5ld1ByZWxvYWQgPSB0aGlzLnByZWxvYWRbcHJlbG9hZFJlbGF0aW9uc2hpcE5hbWVdXG4gICAgICBjb25zdCBub3JtYWxpemVkUHJlbG9hZCA9IG5vcm1hbGl6ZU5lc3RlZFByZWxvYWQobmV3UHJlbG9hZClcblxuICAgICAgaWYgKG5vcm1hbGl6ZWRQcmVsb2FkICYmIHRhcmdldE1vZGVscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWMoKSAmJiB0YXJnZXRNb2RlbHNCeUNsYXNzTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSByZWxhdGlvbnNoaXAuZ2V0Q29uZmlndXJhdGlvbigpXG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBpbiB0YXJnZXRNb2RlbHNCeUNsYXNzTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgbW9kZWxzID0gdGFyZ2V0TW9kZWxzQnlDbGFzc05hbWVbY2xhc3NOYW1lXVxuXG4gICAgICAgICAgICBpZiAobW9kZWxzLmxlbmd0aCA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzKGNsYXNzTmFtZSlcbiAgICAgICAgICAgIGNvbnN0IHByZWxvYWRlciA9IG5ldyBWZWxvY2lvdXNEYXRhYmFzZVF1ZXJ5UHJlbG9hZGVyKHttb2RlbENsYXNzOiB0YXJnZXRNb2RlbENsYXNzLCBtb2RlbHMsIHByZWxvYWQ6IG5vcm1hbGl6ZWRQcmVsb2FkLCBzZWxlY3Rpb246IHRoaXMuc2VsZWN0aW9ufSlcblxuICAgICAgICAgICAgYXdhaXQgcHJlbG9hZGVyLnJ1bigpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICAgICAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihcIk5vIHRhcmdldCBtb2RlbCBjbGFzcyBjb3VsZCBiZSBnb3R0ZW4gZnJvbSByZWxhdGlvbnNoaXBcIilcblxuICAgICAgICAgIGNvbnN0IHByZWxvYWRlciA9IG5ldyBWZWxvY2lvdXNEYXRhYmFzZVF1ZXJ5UHJlbG9hZGVyKHttb2RlbENsYXNzOiB0YXJnZXRNb2RlbENsYXNzLCBtb2RlbHM6IHRhcmdldE1vZGVscywgcHJlbG9hZDogbm9ybWFsaXplZFByZWxvYWQsIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb259KVxuXG4gICAgICAgICAgYXdhaXQgcHJlbG9hZGVyLnJ1bigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlbG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3F1ZXJ5L3ByZWxvYWRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxrQkFBa0IsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRCxPQUFPLGdCQUFnQixNQUFNLHlCQUF5QixDQUFBO0FBQ3RELE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BELE9BQU8sa0JBQWtCLE1BQU0sMEJBQTBCLENBQUE7QUFDekQsT0FBTyxhQUFhLE1BQU0sZ0NBQWdDLENBQUE7QUFFMUQ7Ozs7R0FJRztBQUNILFNBQVMsc0JBQXNCLENBQUMsT0FBTztJQUNyQyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxJQUFJLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUV4RCxJQUFJLE9BQU8sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLE9BQU8sRUFBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBQyxDQUFBO0lBQzFCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMzQjs7cUVBRTZEO1FBQzdELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtRQUVqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUE7Z0JBQ3BCLFNBQVE7WUFDVixDQUFDO1lBRUQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sZUFBZSxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUVyRCxJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUNwQixLQUFL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LEVBQUUsQ0FBQTtvQkFDdkIsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxtQkFBbUIsR0FBRyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtvQkFFOUQsSUFBSSxDQUFDLG1CQUFtQjt3QkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUE7b0JBRXBHLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO29CQUUxRixNQUFNLFNBQVMsR0FBRyxJQUFJLCtCQUErQixDQUFDLEVBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQTtvQkFFbEssTUFBTSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQmVsb25nc1RvUHJlbG9hZGVyIGZyb20gXCIuL3ByZWxvYWRlci9iZWxvbmdzLXRvLmpzXCJcbmltcG9ydCBIYXNNYW55UHJlbG9hZGVyIGZyb20gXCIuL3ByZWxvYWRlci9oYXMtbWFueS5qc1wiXG5pbXBvcnQgSGFzT25lUHJlbG9hZGVyIGZyb20gXCIuL3ByZWxvYWRlci9oYXMtb25lLmpzXCJcbmltcG9ydCBQcmVsb2FkZXJTZWxlY3Rpb24gZnJvbSBcIi4vcHJlbG9hZGVyL3NlbGVjdGlvbi5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBuZXN0ZWQgcHJlbG9hZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IHN0cmluZyB8IHN0cmluZ1tdIHwgYm9vbGVhbn0gcHJlbG9hZCAtIFByZWxvYWQgZGF0YSBpbiBzaG9ydGhhbmQgb3IgbmVzdGVkIGZvcm0uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IG51bGx9IC0gTm9ybWFsaXplZCBuZXN0ZWQgcHJlbG9hZCByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5lc3RlZFByZWxvYWQocHJlbG9hZCkge1xuICBpZiAoIXByZWxvYWQgfHwgdHlwZW9mIHByZWxvYWQgPT0gXCJib29sZWFuXCIpIHJldHVybiBudWxsXG5cbiAgaWYgKHR5cGVvZiBwcmVsb2FkID09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4ge1twcmVsb2FkXTogdHJ1ZX1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHByZWxvYWQpKSB7XG4gICAgLyoqXG4gICAgICogUmVzdWx0LlxuICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkfSAqL1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHByZWxvYWQpIHtcbiAgICAgIGlmICh0eXBlb2YgZW50cnkgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXN1bHRbZW50cnldID0gdHJ1ZVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkgJiYgdHlwZW9mIGVudHJ5ID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVudHJ5ID0gbm9ybWFsaXplTmVzdGVkUHJlbG9hZChlbnRyeSlcblxuICAgICAgICBpZiAobm9ybWFsaXplZEVudHJ5KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZEVudHJ5KSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJlbG9hZCBlbnRyeSB0eXBlOiAke3R5cGVvZiBlbnRyeX1gKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGlmIChwcmVsb2FkICYmIHR5cGVvZiBwcmVsb2FkID09IFwib2JqZWN0XCIpIHtcbiAgICAvKipcbiAgICAgKiBSZXN1bHQuXG4gICAgICogQHR5cGUge2ltcG9ydChcIi4uL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmR9ICovXG4gICAgY29uc3QgcmVzdWx0ID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByZWxvYWQpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gbm9ybWFsaXplTmVzdGVkUHJlbG9hZCh2YWx1ZSlcblxuICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IG5vcm1hbGl6ZWRWYWx1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByZWxvYWQgdmFsdWUgZm9yICR7a2V5fTogJHt0eXBlb2YgdmFsdWV9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJlbG9hZCB0eXBlOiAke3R5cGVvZiBwcmVsb2FkfWApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUXVlcnlQcmVsb2FkZXIge1xuICAvKipcbiAgICogUHJlbG9hZHMgcmVsYXRpb25zaGlwKHMpIG9udG8gb25lIG9yIG1vcmUgYWxyZWFkeS1sb2FkZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKiBBY2NlcHRzIGVpdGhlciBhIHF1ZXJ5IGJ1aWx0IHZpYSBgTW9kZWwucHJlbG9hZCguLi4pLnNlbGVjdCguLi4pYCAoaXRzXG4gICAqIHByZWxvYWQgZ3JhcGggYW5kIHNlbGVjdHMgYXJlIHVzZWQpIG9yIGEgcmF3IHByZWxvYWQgc3BlY1xuICAgKiAoc3RyaW5nIC8gYXJyYXkgLyBuZXN0ZWQgb2JqZWN0KS5cbiAgICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IG1vZGVscyAtIE1vZGVsIGluc3RhbmNlcyB0byBwcmVsb2FkIG9udG8uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkIHwgc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkPn0gcXVlcnlPclNwZWMgLSBQcmVsb2FkIHNvdXJjZS5cbiAgICogQHBhcmFtIHt7Zm9yY2U/OiBib29sZWFufX0gW29wdGlvbnNdIC0gT3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBwcmVsb2FkaW5nIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBwcmVsb2FkKG1vZGVscywgcXVlcnlPclNwZWMsIHtmb3JjZSA9IGZhbHNlfSA9IHt9KSB7XG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBtb2RlbENsYXNzID0gbW9kZWxzWzBdLmdldE1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IGlzUXVlcnkgPSBCb29sZWFuKHF1ZXJ5T3JTcGVjKSAmJiB0eXBlb2YgcXVlcnlPclNwZWMgPT0gXCJvYmplY3RcIiAmJiBcIl9wcmVsb2FkXCIgaW4gcXVlcnlPclNwZWNcbiAgICAvLyBSZXVzZSB0aGUgcXVlcnkgYnVpbGRlcidzIHByZWxvYWQvc2VsZWN0IG5vcm1hbGl6YXRpb24gZm9yIHJhdyBzcGVjc1xuICAgIC8vIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQgaGVyZS5cbiAgICBjb25zdCBxdWVyeSA9IGlzUXVlcnlcbiAgICAgID8gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9ICovIChxdWVyeU9yU3BlYylcbiAgICAgIDogbW9kZWxDbGFzcy5wcmVsb2FkKC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59ICovIChxdWVyeU9yU3BlYykpXG5cbiAgICBjb25zdCBwcmVsb2FkZXIgPSBuZXcgVmVsb2Npb3VzRGF0YWJhc2VRdWVyeVByZWxvYWRlcih7XG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgbW9kZWxzLFxuICAgICAgcHJlbG9hZDogcXVlcnkuX3ByZWxvYWQsXG4gICAgICBzZWxlY3Rpb246IG5ldyBQcmVsb2FkZXJTZWxlY3Rpb24oe1xuICAgICAgICBwcmVsb2FkU2VsZWN0czogcXVlcnkuX3ByZWxvYWRTZWxlY3RzLFxuICAgICAgICBwcmVsb2FkU2VsZWN0c0V4dHJhOiBxdWVyeS5fcHJlbG9hZFNlbGVjdHNFeHRyYSxcbiAgICAgICAgZm9yY2VcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGF3YWl0IHByZWxvYWRlci5ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSBhcmdzLm1vZGVscyAtIE1vZGVsIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkfSBhcmdzLnByZWxvYWQgLSBQcmVsb2FkLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gW2FyZ3MucHJlbG9hZFNlbGVjdHNdIC0gTmFycm93aW5nIHNlbGVjdHMga2V5ZWQgYnkgdGFyZ2V0IG1vZGVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBbYXJncy5wcmVsb2FkU2VsZWN0c0V4dHJhXSAtIEV4dHJhIHNlbGVjdHMga2V5ZWQgYnkgdGFyZ2V0IG1vZGVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UHJlbG9hZGVyU2VsZWN0aW9ufSBbYXJncy5zZWxlY3Rpb25dIC0gUHJlLWJ1aWx0IHNlbGVjdGlvbiAodGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBzZWxlY3QgbWFwcyB3aGVuIGdpdmVuKS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHttb2RlbENsYXNzLCBtb2RlbHMsIHByZWxvYWQsIHByZWxvYWRTZWxlY3RzID0ge30sIHByZWxvYWRTZWxlY3RzRXh0cmEgPSB7fSwgc2VsZWN0aW9uLCAuLi5yZXN0QXJnc30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgdGhpcy5tb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuICAgIHRoaXMubW9kZWxzID0gbW9kZWxzXG4gICAgdGhpcy5wcmVsb2FkID0gcHJlbG9hZFxuICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uIHx8IG5ldyBQcmVsb2FkZXJTZWxlY3Rpb24oe3ByZWxvYWRTZWxlY3RzLCBwcmVsb2FkU2VsZWN0c0V4dHJhfSlcbiAgfVxuXG4gIGFzeW5jIHJ1bigpIHtcbiAgICBmb3IgKGNvbnN0IHByZWxvYWRSZWxhdGlvbnNoaXBOYW1lIGluIHRoaXMucHJlbG9hZCkge1xuICAgICAgY29uc3QgbW9kZWxDbGFzc1JlbGF0aW9uc2hpcCA9IHRoaXMubW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocHJlbG9hZFJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSB0aGlzLm1vZGVscy5sZW5ndGggPiAwID8gbW9kZWxDbGFzc1JlbGF0aW9uc2hpcC5yZXNvbHZlRm9yUmVjb3JkKHRoaXMubW9kZWxzWzBdKSA6IG1vZGVsQ2xhc3NSZWxhdGlvbnNoaXBcblxuICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLm1vZGVscykge1xuICAgICAgICBpZiAobW9kZWxDbGFzc1JlbGF0aW9uc2hpcC5yZXNvbHZlRm9yUmVjb3JkKG1vZGVsKSAhPT0gcmVsYXRpb25zaGlwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcHJlbG9hZCAke3RoaXMubW9kZWxDbGFzcy5uYW1lfSMke3ByZWxvYWRSZWxhdGlvbnNoaXBOYW1lfSBhY3Jvc3MgcGh5c2ljYWwgZGF0YWJhc2UgaWRlbnRpdGllc2ApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBwcmVsb2FkUmVzdWx0XG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiYmVsb25nc1RvXCIpIHtcbiAgICAgICAgY29uc3QgYmVsb25nc1RvUmVsYXRpb25zaGlwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9yZWNvcmQvcmVsYXRpb25zaGlwcy9iZWxvbmdzLXRvLmpzXCIpLmRlZmF1bHR9ICovIChyZWxhdGlvbnNoaXApXG4gICAgICAgIGNvbnN0IGhhc01hbnlQcmVsb2FkZXIgPSBuZXcgQmVsb25nc1RvUHJlbG9hZGVyKHttb2RlbHM6IHRoaXMubW9kZWxzLCByZWxhdGlvbnNoaXA6IGJlbG9uZ3NUb1JlbGF0aW9uc2hpcCwgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbn0pXG5cbiAgICAgICAgcHJlbG9hZFJlc3VsdCA9IGF3YWl0IGhhc01hbnlQcmVsb2FkZXIucnVuKClcbiAgICAgIH0gZWxzZSBpZiAocmVsYXRpb25zaGlwLmdldFR5cGUoKSA9PSBcImhhc01hbnlcIikge1xuICAgICAgICBjb25zdCBoYXNNYW55UmVsYXRpb25zaGlwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9yZWNvcmQvcmVsYXRpb25zaGlwcy9oYXMtbWFueS5qc1wiKS5kZWZhdWx0fSAqLyAocmVsYXRpb25zaGlwKVxuICAgICAgICBjb25zdCBoYXNNYW55UHJlbG9hZGVyID0gbmV3IEhhc01hbnlQcmVsb2FkZXIoe21vZGVsczogdGhpcy5tb2RlbHMsIHJlbGF0aW9uc2hpcDogaGFzTWFueVJlbGF0aW9uc2hpcCwgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbn0pXG5cbiAgICAgICAgcHJlbG9hZFJlc3VsdCA9IGF3YWl0IGhhc01hbnlQcmVsb2FkZXIucnVuKClcbiAgICAgIH0gZWxzZSBpZiAocmVsYXRpb25zaGlwLmdldFR5cGUoKSA9PSBcImhhc09uZVwiKSB7XG4gICAgICAgIGNvbnN0IGhhc09uZVJlbGF0aW9uc2hpcCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vcmVjb3JkL3JlbGF0aW9uc2hpcHMvaGFzLW9uZS5qc1wiKS5kZWZhdWx0fSAqLyAocmVsYXRpb25zaGlwKVxuICAgICAgICBjb25zdCBoYXNPbmVQcmVsb2FkZXIgPSBuZXcgSGFzT25lUHJlbG9hZGVyKHttb2RlbHM6IHRoaXMubW9kZWxzLCByZWxhdGlvbnNoaXA6IGhhc09uZVJlbGF0aW9uc2hpcCwgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbn0pXG5cbiAgICAgICAgcHJlbG9hZFJlc3VsdCA9IGF3YWl0IGhhc09uZVByZWxvYWRlci5ydW4oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJlbGF0aW9uc2hpcCB0eXBlOiAke3JlbGF0aW9uc2hpcC5nZXRUeXBlKCl9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxzID0gQXJyYXkuaXNBcnJheShwcmVsb2FkUmVzdWx0KSA/IHByZWxvYWRSZXN1bHQgOiAocHJlbG9hZFJlc3VsdD8udGFyZ2V0TW9kZWxzIHx8IFtdKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxzQnlDbGFzc05hbWUgPSBBcnJheS5pc0FycmF5KHByZWxvYWRSZXN1bHQpID8gdW5kZWZpbmVkIDogcHJlbG9hZFJlc3VsdD8udGFyZ2V0TW9kZWxzQnlDbGFzc05hbWVcblxuICAgICAgLy8gSGFuZGxlIGFueSBmdXJ0aGVyIHByZWxvYWRzIGluIHRoZSB0cmVlXG4gICAgICBjb25zdCBuZXdQcmVsb2FkID0gdGhpcy5wcmVsb2FkW3ByZWxvYWRSZWxhdGlvbnNoaXBOYW1lXVxuICAgICAgY29uc3Qgbm9ybWFsaXplZFByZWxvYWQgPSBub3JtYWxpemVOZXN0ZWRQcmVsb2FkKG5ld1ByZWxvYWQpXG5cbiAgICAgIGlmIChub3JtYWxpemVkUHJlbG9hZCAmJiB0YXJnZXRNb2RlbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAocmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljKCkgJiYgdGFyZ2V0TW9kZWxzQnlDbGFzc05hbWUpIHtcbiAgICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gcmVsYXRpb25zaGlwLmdldENvbmZpZ3VyYXRpb24oKVxuXG4gICAgICAgICAgZm9yIChjb25zdCBjbGFzc05hbWUgaW4gdGFyZ2V0TW9kZWxzQnlDbGFzc05hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVscyA9IHRhcmdldE1vZGVsc0J5Q2xhc3NOYW1lW2NsYXNzTmFtZV1cblxuICAgICAgICAgICAgaWYgKG1vZGVscy5sZW5ndGggPT0gMCkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHRoaXMubW9kZWxDbGFzcy5iaW5kUmVjb3JkTWV0YWRhdGFNb2RlbENsYXNzKGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzcyhjbGFzc05hbWUpKVxuICAgICAgICAgICAgY29uc3QgcHJlbG9hZGVyID0gbmV3IFZlbG9jaW91c0RhdGFiYXNlUXVlcnlQcmVsb2FkZXIoe21vZGVsQ2xhc3M6IHRhcmdldE1vZGVsQ2xhc3MsIG1vZGVscywgcHJlbG9hZDogbm9ybWFsaXplZFByZWxvYWQsIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb259KVxuXG4gICAgICAgICAgICBhd2FpdCBwcmVsb2FkZXIucnVuKClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmF3VGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgICAgICAgIGlmICghcmF3VGFyZ2V0TW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0IG1vZGVsIGNsYXNzIGNvdWxkIGJlIGdvdHRlbiBmcm9tIHJlbGF0aW9uc2hpcFwiKVxuXG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHRoaXMubW9kZWxDbGFzcy5iaW5kUmVjb3JkTWV0YWRhdGFNb2RlbENsYXNzKHJhd1RhcmdldE1vZGVsQ2xhc3MpXG5cbiAgICAgICAgICBjb25zdCBwcmVsb2FkZXIgPSBuZXcgVmVsb2Npb3VzRGF0YWJhc2VRdWVyeVByZWxvYWRlcih7bW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcywgbW9kZWxzOiB0YXJnZXRNb2RlbHMsIHByZWxvYWQ6IG5vcm1hbGl6ZWRQcmVsb2FkLCBzZWxlY3Rpb246IHRoaXMuc2VsZWN0aW9ufSlcblxuICAgICAgICAgIGF3YWl0IHByZWxvYWRlci5ydW4oKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -130,11 +130,11 @@ function resolveTargetModelClass(rootModelClass, chain) {
130
130
  let modelClass = rootModelClass;
131
131
  for (const segment of chain) {
132
132
  const relationship = modelClass.getRelationshipByName(segment);
133
- const target = relationship.getTargetModelClass();
134
- if (!target) {
133
+ const rawTarget = relationship.getTargetModelClass();
134
+ if (!rawTarget) {
135
135
  throw new Error(`queryData: could not resolve target model for ${modelClass.name}#${segment}`);
136
136
  }
137
- modelClass = target;
137
+ modelClass = modelClass.bindRecordMetadataModelClass(rawTarget);
138
138
  }
139
139
  return modelClass;
140
140
  }
@@ -331,4 +331,4 @@ async function executeChunkedEntryQuery({ primaryKey, query, rootIds, rootModels
331
331
  await executeEntryQuery({ primaryKey, query: cohortQuery, rootModels });
332
332
  }
333
333
  }
334
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9xdWVyeS1kYXRhLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFFN0M7Ozs7O0dBS0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRTtJQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFM0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4Qjs7c0NBRThCO1FBQzlCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUVsQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUMvQyxTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssTUFBTSxNQUFNLElBQUksc0JBQXNCLENBQUMsNENBQTRDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN4RyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUN0QixDQUFDO2dCQUNELFNBQVE7WUFDVixDQUFDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ2xFLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4Qjs7c0NBRThCO1FBQzlCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUVsQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hELElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQTtnQkFDOUMsU0FBUTtZQUNWLENBQUM7WUFFRCxJQUFJLEtBQUssS0FBSyxLQUFLO2dCQUFFLFNBQVE7WUFFN0IsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUUsS0FBSyxNQUFNLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNuSCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUN0QixDQUFDO2dCQUNELFNBQVE7WUFDVixDQUFDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBRyxNQUFNLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUMxRSxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUMzRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMseUJBQXlCLENBQUMsS0FBSztJQUN0QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRW5DOzsrREFFMkQ7SUFDM0QsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFBO0lBQ2QsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFBO0lBRWhCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDcEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBRXJDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRWhDLElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsdUJBQXVCLENBQUMsY0FBYyxFQUFFLEtBQUs7SUFDcEQsSUFBSSxVQUFVLEdBQUcsY0FBYyxDQUFBO0lBRS9CLEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7UUFDNUIsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzlELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1FBRWpELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELFVBQVUsQ0FBQyxJQUFJLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNoRyxDQUFDO1FBRUQsVUFBVSxHQUFHLE1BQU0sQ0FBQTtJQUNyQixDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsRUFBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQztJQUN0RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU07SUFFM0QsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBQzlDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLDhCQUE4QixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDeEcsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pDLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDdEUsS0FBSztRQUNMLFVBQVU7UUFDVixVQUFVO1FBQ1YsT0FBTztRQUNQLGNBQWM7UUFDZCxXQUFXO0tBQ1osQ0FBQyxDQUFDLENBQUE7SUFDSDs7bUhBRStHO0lBQy9HLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQTtJQUV0QixLQUFLLE1BQU0sYUFBYSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7WUFDN0QsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLGFBQWEsQ0FBQyxTQUFTO2dCQUFFLE9BQU8sS0FBSyxDQUFBO1lBQzdELElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQy9ELGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzNFLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUE7WUFFaEIsT0FBTyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzFFLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3ZFLEtBQUssTUFBTSxLQUFLLElBQUksYUFBYSxDQUFDLE9BQU87Z0JBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDL0UsQ0FBQzthQUFNLENBQUM7WUFDTixXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNmLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO2dCQUN2QyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7Z0JBQzFCLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUzthQUNuQyxDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxFQUFDLEtBQUssRUFBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sd0JBQXdCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBQzFFLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsWUFBWSxDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUM7SUFDekYsTUFBTSxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzdFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUU1RCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDUixNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsZ0JBQWdCLENBQUMsSUFBSSwrQkFBK0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDaEgsbUJBQW1CLGdCQUFnQixDQUFDLElBQUksY0FBYyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsOENBQThDLENBQUMsQ0FBQTtJQUNySSxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUV2RCxrRUFBa0U7SUFDbEUsMkNBQTJDO0lBQzNDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUNoQixLQUFLLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQTtJQUVuQixtRUFBbUU7SUFDbkUsa0VBQWtFO0lBQ2xFLCtEQUErRDtJQUMvRCxLQUFLLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFBO0lBRW5DLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7SUFDM0IsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQzVDLE1BQU0sU0FBUyxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUE7SUFFckYsTUFBTSxjQUFjLEdBQUcseUJBQXlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTdELElBQUksY0FBYyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzVCLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDdEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsZUFBZSxDQUFDLENBQUE7SUFFekMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUM3QyxDQUFDLENBQUMsU0FBUztRQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFbEQsc0VBQXNFO0lBQ3RFLG9FQUFvRTtJQUNwRSxnRUFBZ0U7SUFDaEUscURBQXFEO0lBQ3JELEVBQUUsQ0FBQztRQUNELGFBQWEsRUFBRSxLQUFLLENBQUMsTUFBTTtRQUMzQixNQUFNO1FBQ04sVUFBVSxFQUFFLGdCQUFnQjtRQUM1QixTQUFTLEVBQUUsT0FBTztRQUNsQixLQUFLO1FBQ0wsU0FBUyxFQUFFLGNBQWM7S0FDMUIsQ0FBQyxDQUFBO0lBRUYsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3RDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNwQyxjQUFjLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFaEUsT0FBTztRQUNMLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtRQUN0QixLQUFLO1FBQ0wsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLFVBQVUsRUFBRTtLQUNyRSxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBSztJQUM1QixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7SUFFbEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzFCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUVoRCxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRXZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFDO0lBQzlELE1BQU0sSUFBSSxHQUFHLG1FQUFtRSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtJQUM5RyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRTFCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQTtRQUU5QixJQUFJLFFBQVEsSUFBSSxJQUFJO1lBQUUsU0FBUTtRQUU5QixRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyw4QkFBOEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQUM3RSxtRUFBbUU7UUFDbkUsaUVBQWlFO1FBQ2pFLGlDQUFpQztRQUNqQyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUMvQixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFFakMsSUFBSSxDQUFDLEdBQUc7WUFBRSxTQUFRO1FBRWxCLEtBQUssTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxVQUFVLEtBQUssV0FBVztnQkFBRSxTQUFRO1lBRXhDLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxLQUFLLFVBQVUsd0JBQXdCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUM7SUFDOUUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQTtJQUMzQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBRTFHLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUUvRCxNQUFNLGlCQUFpQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtJQUN2RSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gXCJpcy1wbGFpbi1vYmplY3RcIlxuXG4vKipcbiAqIFF1ZXJ5RGF0YUVudHJ5IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVyeURhdGFFbnRyeVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY2hhaW4gLSBSZWxhdGlvbnNoaXAgY2hhaW4gZnJvbSB0aGUgcm9vdCBtb2RlbCB0byB0aGUgbW9kZWwgdGhhdCBkZWNsYXJlcyB0aGUgZm4uIEVtcHR5IGZvciBhIHJvb3QtbGV2ZWwgZW50cnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm5OYW1lIC0gSWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUgZm4gaXMgcmVnaXN0ZXJlZCBvbiB0aGUgZGVjbGFyaW5nIG1vZGVsLlxuICovXG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+PiB8IHtba2V5OiBzdHJpbmddOiB0cnVlIHwgZmFsc2UgfCBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IFF1ZXJ5RGF0YVNwZWNcbiAqL1xuXG4vKipcbiAqIFF1ZXJ5RGF0YUNhbGxiYWNrQXJncyB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlcnlEYXRhQ2FsbGJhY2tBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIE5hbWUgdW5kZXIgd2hpY2ggdGhlIGZuIHdhcyByZWdpc3RlcmVkLiBDb252ZW5pZW50IHdoZW4gYSBmbiBpcyByZXVzZWQgYWNyb3NzIGFsaWFzZXMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkcml2ZXIgLSBBY3RpdmUgZGF0YWJhc2UgZHJpdmVyLCBmb3IgcXVvdGluZyBoZWxwZXJzIGFuZCB0eXBlLXNwZWNpZmljIFNRTC5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdGhlIGZuIGlzIHJlZ2lzdGVyZWQgb24gKHRoZSBjaGFpbidzIHRhcmdldCkuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZyB8IG51bWJlcj59IHBhcmVudElkcyAtIFByaW1hcnkta2V5IHZhbHVlcyBvZiB0aGUgbG9hZGVkIHJvb3QgcmVjb3Jkcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBxdWVyeSAtIEdyb3VwZWQgcXVlcnkgYWxyZWFkeSBqb2luZWQgZG93biB0aGUgY2hhaW4sIGZpbHRlcmVkIGJ5IGBwYXJlbnRJZHNgLCB3aXRoIGBwYXJlbnRfaWRgIHByZS1zZWxlY3RlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBVbnF1b3RlZCB0YWJsZSByZWZlcmVuY2UgKGFsaWFzIG9yIHRhYmxlIG5hbWUpIGZvciB0aGUgY2hhaW4ncyB0YXJnZXQsIHJlYWR5IHRvIHBhc3RlIGludG8gU1FMLlxuICovXG5cbi8qKlxuICogUXVlcnlEYXRhRm4gdHlwZS5cbiAqIEB0eXBlZGVmIHsoYXJnczogUXVlcnlEYXRhQ2FsbGJhY2tBcmdzKSA9PiB2b2lkIHwgaW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBRdWVyeURhdGFGblxuICovXG5cbi8qKlxuICogTm9ybWFsaXplIGEgdXNlci1zdXBwbGllZCBxdWVyeURhdGEgc3BlYyBpbnRvIGEgZmxhdCBsaXN0IG9mIGVudHJpZXNcbiAqIHRoZSBydW5uZXIgY2FuIGNvbnN1bWUuIFRoZSBzcGVjIG1pcnJvcnMgdGhlIHNoYXBlIG9mIGBwcmVsb2FkYCwgd2l0aFxuICogdGhlIGltcG9ydGFudCBkaXN0aW5jdGlvbiB0aGF0ICoqbGVhZiBzdHJpbmdzIGFyZSBmbiBuYW1lcyoqLCBub3RcbiAqIGZ1cnRoZXIgcmVsYXRpb25zaGlwIHNlZ21lbnRzLiBOZXN0ZWQga2V5cyBhcmUgcmVsYXRpb25zaGlwIG5hbWVzXG4gKiBhbG9uZyB0aGUgam9pbiBjaGFpbiBmcm9tIHRoZSByb290IG1vZGVsIHRvIHRoZSBkZWNsYXJpbmcgbW9kZWwuXG4gKlxuICogQWNjZXB0ZWQgc2hhcGVzIChhbGwgeWllbGQgdGhlIHNhbWUgZmxhdCBlbnRyaWVzKTpcbiAqICAgXCJmb29cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtdLCBmbk5hbWU6IFwiZm9vXCJ9XVxuICogICBbXCJmb29cIiwgXCJiYXJcIl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBbe2NoYWluOiBbXSwgZm5OYW1lOiBcImZvb1wifSwge2NoYWluOiBbXSwgZm5OYW1lOiBcImJhclwifV1cbiAqICAge2ZvbzogdHJ1ZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBbe2NoYWluOiBbXSwgZm5OYW1lOiBcImZvb1wifV1cbiAqICAge3Byb2plY3RzOiBbXCJ0YXNrc0NvdW50XCJdfSAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtcInByb2plY3RzXCJdLCBmbk5hbWU6IFwidGFza3NDb3VudFwifV1cbiAqICAge3Byb2plY3RzOiB7dGFza3M6IFtcInRyYW5zcG9ydFNlY29uZHNTdW1cIiwge3RpbWVsb2dzOiBbXCJ0aW1lU2Vjb25kc1N1bVwiXX1dfX1cbiAqICAgICDihpIgW3tjaGFpbjogW1wicHJvamVjdHNcIixcInRhc2tzXCJdLCBmbk5hbWU6IFwidHJhbnNwb3J0U2Vjb25kc1N1bVwifSxcbiAqICAgICAgICB7Y2hhaW46IFtcInByb2plY3RzXCIsXCJ0YXNrc1wiLFwidGltZWxvZ3NcIl0sIGZuTmFtZTogXCJ0aW1lU2Vjb25kc1N1bVwifV1cbiAqIEBwYXJhbSB7UXVlcnlEYXRhU3BlY30gc3BlYyAtIFVzZXItc3VwcGxpZWQgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjaGFpbl0gLSBDdXJyZW50IGNoYWluIChpbnRlcm5hbCByZWN1cnNpb24pLlxuICogQHJldHVybnMge1F1ZXJ5RGF0YUVudHJ5W119IC0gRmxhdCBsaXN0IG9mIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVRdWVyeURhdGFTcGVjKHNwZWMsIGNoYWluID0gW10pIHtcbiAgaWYgKHNwZWMgPT0gbnVsbCkgcmV0dXJuIFtdXG5cbiAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFt7Y2hhaW46IFsuLi5jaGFpbl0sIGZuTmFtZTogc3BlY31dXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgIC8qKlxuICAgICAqIEVudHJpZXMuXG4gICAgICogQHR5cGUge1F1ZXJ5RGF0YUVudHJ5W119ICovXG4gICAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3BlYykge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7Y2hhaW46IFsuLi5jaGFpbl0sIGZuTmFtZTogaXRlbX0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIG5vcm1hbGl6ZVF1ZXJ5RGF0YVNwZWMoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGl0ZW0pLCBjaGFpbikpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2gobmVzdGVkKVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBxdWVyeURhdGEgYXJyYXkgZW50cnk6ICR7dHlwZW9mIGl0ZW19YClcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3Qoc3BlYykpIHtcbiAgICAvKipcbiAgICAgKiBFbnRyaWVzLlxuICAgICAqIEB0eXBlIHtRdWVyeURhdGFFbnRyeVtdfSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BlYykpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goe2NoYWluOiBbLi4uY2hhaW5dLCBmbk5hbWU6IGtleX0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIGNvbnRpbnVlXG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBuZXN0ZWQgb2Ygbm9ybWFsaXplUXVlcnlEYXRhU3BlYygvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAodmFsdWUpLCBbLi4uY2hhaW4sIGtleV0pKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKG5lc3RlZClcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHZhbHVlIGZvciBcIiR7a2V5fVwiOiAke3R5cGVvZiB2YWx1ZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHNwZWM6ICR7dHlwZW9mIHNwZWN9YClcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbmVzdGVkIGBqb2lucyguLi4pYCBkZXNjcmlwdG9yIGZvciBhIGNoYWluIG9mIHJlbGF0aW9uc2hpcCBuYW1lcy5cbiAqIGBbXCJwcm9qZWN0c1wiLCBcInRhc2tzXCJdYCDihpIgYHtwcm9qZWN0czoge3Rhc2tzOiB0cnVlfX1gLiBVc2VkIGludGVybmFsbHkgc29cbiAqIHRoZSBydW5uZXIgY2FuIHJldXNlIHRoZSBleGlzdGluZyBgam9pbnNgIHBhdGgtcmVnaXN0cmF0aW9uIG1hY2hpbmVyeVxuICogKEpvaW5UcmFja2VyLCBhbGlhcyBnZW5lcmF0aW9uLCBzY29wZSBhcHBsaWNhdGlvbikuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBjaGFpbiAtIFJlbGF0aW9uc2hpcCBjaGFpbi5cbiAqIEByZXR1cm5zIHt0cnVlIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIE5lc3RlZCBqb2luIGRlc2NyaXB0b3IsIG9yIGB0cnVlYCB3aGVuIHRoZSBjaGFpbiBpcyBlbXB0eS5cbiAqL1xuZnVuY3Rpb24gYnVpbGROZXN0ZWRKb2luRGVzY3JpcHRvcihjaGFpbikge1xuICBpZiAoY2hhaW4ubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZVxuXG4gIC8qKlxuICAgKiBPYmouXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gIGNvbnN0IG9iaiA9IHt9XG4gIGxldCBjdXJzb3IgPSBvYmpcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3Qgc2VnID0gY2hhaW5baV1cbiAgICBjb25zdCBpc0xhc3QgPSBpID09PSBjaGFpbi5sZW5ndGggLSAxXG5cbiAgICBjdXJzb3Jbc2VnXSA9IGlzTGFzdCA/IHRydWUgOiB7fVxuXG4gICAgaWYgKCFpc0xhc3QpIGN1cnNvciA9IGN1cnNvcltzZWddXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICogV2FsayBhIHJlbGF0aW9uc2hpcCBjaGFpbiBmcm9tIHRoZSByb290IG1vZGVsIGFuZCByZXR1cm4gdGhlIG1vZGVsXG4gKiBjbGFzcyBhdCBpdHMgdGFpbC4gVGhyb3dzIHdpdGggYSBjbGVhciBtZXNzYWdlIHdoZW4gYW55IHNlZ21lbnQgaXNcbiAqIHVua25vd24uXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gcm9vdE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gY2hhaW4gLSBSZWxhdGlvbnNoaXAgY2hhaW4uXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRhcmdldE1vZGVsQ2xhc3Mocm9vdE1vZGVsQ2xhc3MsIGNoYWluKSB7XG4gIGxldCBtb2RlbENsYXNzID0gcm9vdE1vZGVsQ2xhc3NcblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgY2hhaW4pIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShzZWdtZW50KVxuICAgIGNvbnN0IHRhcmdldCA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHF1ZXJ5RGF0YTogY291bGQgbm90IHJlc29sdmUgdGFyZ2V0IG1vZGVsIGZvciAke21vZGVsQ2xhc3MubmFtZX0jJHtzZWdtZW50fWApXG4gICAgfVxuXG4gICAgbW9kZWxDbGFzcyA9IHRhcmdldFxuICB9XG5cbiAgcmV0dXJuIG1vZGVsQ2xhc3Ncbn1cblxuLyoqXG4gKiBSdW4gZXZlcnkgcXVlcnlEYXRhIGVudHJ5IGFnYWluc3QgdGhlIGxvYWRlZCByb290IHJlY29yZHMsIGF0dGFjaGluZ1xuICogdGhlIHJlc3VsdGluZyB2YWx1ZXMgYXMgcXVlcnlEYXRhIGVudHJpZXMgb24gZWFjaCByb290IHJlY29yZC5cbiAqXG4gKiBPbmUgZ3JvdXBlZCBxdWVyeSBwZXIgZW50cnk6IHRoZSBydW5uZXIgYnVpbGRzIGEgZnJlc2ggcXVlcnkgb3ZlciB0aGVcbiAqIHJvb3QgbW9kZWwsIGpvaW5zIGRvd24gdGhlIGNoYWluLCBncm91cHMgYnkgdGhlIHJvb3QgdGFibGUncyBwcmltYXJ5XG4gKiBrZXksIGFuZCBpbnZva2VzIHRoZSByZWdpc3RlcmVkIGZuIHRvIGFkZCBpdHMgb3duIFNFTEVDVCAoYW5kIGFueVxuICogYWRkaXRpb25hbCBqb2lucy93aGVyZSkuIFJlc3VsdHMgYXJlIG1hcHBlZCBiYWNrIHRvIHJvb3QgbW9kZWxzIGJ5XG4gKiBwcmltYXJ5IGtleSBhbmQgYXR0YWNoZWQgdmlhIGBfc2V0UXVlcnlEYXRhKG5hbWUsIHZhbHVlKWAgZm9yIGV2ZXJ5XG4gKiBzZWxlY3RlZCBhbGlhcyAoZXhjZXB0IHRoZSByZXNlcnZlZCBgcGFyZW50X2lkYCkuIFJvd3MgbWlzc2luZyBmcm9tXG4gKiB0aGUgcmVzdWx0IGtlZXAgYG51bGxgIOKAlCBtYXRjaGVzIHRoZSBmZWF0dXJlJ3MgZG9jdW1lbnRlZCBkZWZhdWx0LlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIGBydW5XaXRoQ291bnRgOiBvbmUgcXVlcnkgcGVyIGVudHJ5LCBhIHNlcGFyYXRlXG4gKiBzdG9yYWdlIG1hcCBvbiB0aGUgcmVjb3JkLCBuZXZlciB0b3VjaGVzIGBfYXR0cmlidXRlc2AuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5yb290TW9kZWxDbGFzcyAtIFJvb3QgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3Mucm9vdE1vZGVscyAtIExvYWRlZCByb290IHJlY29yZHMuXG4gKiBAcGFyYW0ge1F1ZXJ5RGF0YUVudHJ5W119IGFyZ3MuZW50cmllcyAtIE5vcm1hbGl6ZWQgcXVlcnlEYXRhIGVudHJpZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blF1ZXJ5RGF0YSh7cm9vdE1vZGVsQ2xhc3MsIHJvb3RNb2RlbHMsIGVudHJpZXN9KSB7XG4gIGlmIChyb290TW9kZWxzLmxlbmd0aCA9PT0gMCB8fCBlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgY29uc3QgcHJpbWFyeUtleSA9IHJvb3RNb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICBjb25zdCByb290SWRzID0gcm9vdE1vZGVscy5tYXAoKG1vZGVsKSA9PiAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKG1vZGVsLnJlYWRDb2x1bW4ocHJpbWFyeUtleSkpKVxuICBjb25zdCBzb3VyY2VNb2RlbCA9IHJvb3RNb2RlbHNbMF1cbiAgY29uc3QgcHJlcGFyZWRFbnRyaWVzID0gZW50cmllcy5tYXAoKGVudHJ5LCBlbnRyeUluZGV4KSA9PiBwcmVwYXJlRW50cnkoe1xuICAgIGVudHJ5LFxuICAgIGVudHJ5SW5kZXgsXG4gICAgcHJpbWFyeUtleSxcbiAgICByb290SWRzLFxuICAgIHJvb3RNb2RlbENsYXNzLFxuICAgIHNvdXJjZU1vZGVsXG4gIH0pKVxuICAvKipcbiAgICogQ29tcGF0aWJsZSBxdWVyeSBncm91cHMuXG4gICAqIEB0eXBlIHtBcnJheTx7YWxpYXNlczogU2V0PHN0cmluZz4sIHF1ZXJ5OiBpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQsIHNpZ25hdHVyZTogc3RyaW5nfT59ICovXG4gIGNvbnN0IHF1ZXJ5R3JvdXBzID0gW11cblxuICBmb3IgKGNvbnN0IHByZXBhcmVkRW50cnkgb2YgcHJlcGFyZWRFbnRyaWVzKSB7XG4gICAgY29uc3QgY29tcGF0aWJsZUdyb3VwID0gcXVlcnlHcm91cHMuZmluZCgoZ3JvdXAsIGdyb3VwSW5kZXgpID0+IHtcbiAgICAgIGlmIChncm91cC5zaWduYXR1cmUgIT09IHByZXBhcmVkRW50cnkuc2lnbmF0dXJlKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChxdWVyeUdyb3Vwcy5zbGljZShncm91cEluZGV4ICsgMSkuc29tZSgoaW50ZXJ2ZW5pbmdHcm91cCkgPT4gKFxuICAgICAgICBwcmVwYXJlZEVudHJ5LmFsaWFzZXMuc29tZSgoYWxpYXMpID0+IGludGVydmVuaW5nR3JvdXAuYWxpYXNlcy5oYXMoYWxpYXMpKVxuICAgICAgKSkpIHJldHVybiBmYWxzZVxuXG4gICAgICByZXR1cm4gcHJlcGFyZWRFbnRyeS5hbGlhc2VzLmV2ZXJ5KChhbGlhcykgPT4gIWdyb3VwLmFsaWFzZXMuaGFzKGFsaWFzKSlcbiAgICB9KVxuXG4gICAgaWYgKGNvbXBhdGlibGVHcm91cCkge1xuICAgICAgY29tcGF0aWJsZUdyb3VwLnF1ZXJ5LnNlbGVjdChwcmVwYXJlZEVudHJ5LnF1ZXJ5LmdldFNlbGVjdHMoKS5zbGljZSgxKSlcbiAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgcHJlcGFyZWRFbnRyeS5hbGlhc2VzKSBjb21wYXRpYmxlR3JvdXAuYWxpYXNlcy5hZGQoYWxpYXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5R3JvdXBzLnB1c2goe1xuICAgICAgICBhbGlhc2VzOiBuZXcgU2V0KHByZXBhcmVkRW50cnkuYWxpYXNlcyksXG4gICAgICAgIHF1ZXJ5OiBwcmVwYXJlZEVudHJ5LnF1ZXJ5LFxuICAgICAgICBzaWduYXR1cmU6IHByZXBhcmVkRW50cnkuc2lnbmF0dXJlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qge3F1ZXJ5fSBvZiBxdWVyeUdyb3Vwcykge1xuICAgIGF3YWl0IGV4ZWN1dGVDaHVua2VkRW50cnlRdWVyeSh7cHJpbWFyeUtleSwgcXVlcnksIHJvb3RJZHMsIHJvb3RNb2RlbHN9KVxuICB9XG59XG5cbi8qKlxuICogUHJlcGFyZXMgb25lIHF1ZXJ5RGF0YSBlbnRyeSBhbmQgaXRzIGNvbXBhdGliaWxpdHkgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1F1ZXJ5RGF0YUVudHJ5fSBhcmdzLmVudHJ5IC0gRW50cnkgYmVpbmcgZXZhbHVhdGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuZW50cnlJbmRleCAtIFN0YWJsZSBwb3NpdGlvbiB1c2VkIHRvIGlzb2xhdGUgb3BhcXVlIHByb2plY3Rpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucHJpbWFyeUtleSAtIFJvb3QgbW9kZWwgcHJpbWFyeSBrZXkgY29sdW1uLlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXI+fSBhcmdzLnJvb3RJZHMgLSBSb290IHByaW1hcnkta2V5IHZhbHVlcy5cbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLnJvb3RNb2RlbENsYXNzIC0gUm9vdCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3Muc291cmNlTW9kZWwgLSBMb2FkZWQgb3BlcmF0aW9uIG93bmVyLlxuICogQHJldHVybnMge3thbGlhc2VzOiBzdHJpbmdbXSwgcXVlcnk6IGltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCwgc2lnbmF0dXJlOiBzdHJpbmd9fSAtIFByZXBhcmVkIGVudHJ5LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlRW50cnkoe2VudHJ5LCBlbnRyeUluZGV4LCBwcmltYXJ5S2V5LCByb290SWRzLCByb290TW9kZWxDbGFzcywgc291cmNlTW9kZWx9KSB7XG4gIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZXNvbHZlVGFyZ2V0TW9kZWxDbGFzcyhyb290TW9kZWxDbGFzcywgZW50cnkuY2hhaW4pXG4gIGNvbnN0IGZuID0gdGFyZ2V0TW9kZWxDbGFzcy5nZXRRdWVyeURhdGFCeU5hbWUoZW50cnkuZm5OYW1lKVxuXG4gIGlmICghZm4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHF1ZXJ5RGF0YTogJHt0YXJnZXRNb2RlbENsYXNzLm5hbWV9IGhhcyBubyBlbnRyeSByZWdpc3RlcmVkIGFzICR7SlNPTi5zdHJpbmdpZnkoZW50cnkuZm5OYW1lKX0uIGAgK1xuICAgICAgYERlY2xhcmUgaXQgd2l0aCAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX0ucXVlcnlEYXRhKCR7SlNPTi5zdHJpbmdpZnkoZW50cnkuZm5OYW1lKX0sICh7cXVlcnksIHRhYmxlTmFtZX0pID0+IHF1ZXJ5LnNlbGVjdCguLi4pKWApXG4gIH1cblxuICBjb25zdCBxdWVyeSA9IHNvdXJjZU1vZGVsLnF1ZXJ5Rm9yTW9kZWwocm9vdE1vZGVsQ2xhc3MpXG5cbiAgLy8gRW1wdHkgb3V0IGFueSBkZWZhdWx0cyB0aGUgcXVlcnkgZmFjdG9yeSBhZGRlZCDigJQgcXVlcnlEYXRhIHJ1bnNcbiAgLy8gYSBiYXJlIGFnZ3JlZ2F0ZSwgbm90IGEgZnVsbCBtb2RlbCBsb2FkLlxuICBxdWVyeS5yZXNlbGVjdCgpXG4gIHF1ZXJ5Ll9wcmVsb2FkID0ge31cblxuICAvLyBGb3JjZSB0aGUgcm9vdCBXSEVSRSB0byBxdWFsaWZ5IGJ5IHRhYmxlIG5hbWUgc28gaXQgc3Vydml2ZXMgdGhlXG4gIC8vIGpvaW5zIHRoZSBmbiBtYXkgYWRkIGxhdGVyIChvdGhlcndpc2UgYSBjaGlsZCB0YWJsZSBzaGFyaW5nIHRoZVxuICAvLyByb290IFBLIGNvbHVtbiBuYW1lLCBlLmcuIGBpZGAsIG1ha2VzIHRoZSBjbGF1c2UgYW1iaWd1b3VzKS5cbiAgcXVlcnkuX2ZvcmNlUXVhbGlmeUJhc2VUYWJsZSA9IHRydWVcblxuICBjb25zdCBkcml2ZXIgPSBxdWVyeS5kcml2ZXJcbiAgY29uc3Qgcm9vdFRhYmxlID0gcm9vdE1vZGVsQ2xhc3MudGFibGVOYW1lKClcbiAgY29uc3Qgcm9vdFBrU3FsID0gYCR7ZHJpdmVyLnF1b3RlVGFibGUocm9vdFRhYmxlKX0uJHtkcml2ZXIucXVvdGVDb2x1bW4ocHJpbWFyeUtleSl9YFxuXG4gIGNvbnN0IGpvaW5EZXNjcmlwdG9yID0gYnVpbGROZXN0ZWRKb2luRGVzY3JpcHRvcihlbnRyeS5jaGFpbilcblxuICBpZiAoam9pbkRlc2NyaXB0b3IgIT09IHRydWUpIHtcbiAgICBxdWVyeS5qb2lucyhqb2luRGVzY3JpcHRvcilcbiAgfVxuXG4gIHF1ZXJ5Lmdyb3VwKHJvb3RQa1NxbClcbiAgcXVlcnkuc2VsZWN0KGAke3Jvb3RQa1NxbH0gQVMgcGFyZW50X2lkYClcblxuICBjb25zdCB0YXJnZXRUYWJsZVJlZiA9IGVudHJ5LmNoYWluLmxlbmd0aCA9PT0gMFxuICAgID8gcm9vdFRhYmxlXG4gICAgOiBxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oLi4uZW50cnkuY2hhaW4pXG5cbiAgLy8gTkI6IHdlIGludGVudGlvbmFsbHkgbGVhdmUgYF9qb2luQmFzZVBhdGhgIGF0IFtdIHNvIHRoZSBvdXRlciBjaGFpblxuICAvLyBqb2lucyBjb250aW51ZSB0byByZXNvbHZlIGZyb20gdGhlIHJvb3QgbW9kZWwgYXQgcmVuZGVyIHRpbWUuIFRoZVxuICAvLyBmbiBnZXRzIGB0YWJsZU5hbWVgIGZvciBzZWxmLXJlZmVyZW5jZTsgYWRkaXRpb25hbCBqb2lucyBmcm9tXG4gIC8vIG5lc3RlZCBsZXZlbHMgc2hvdWxkIHVzZSBmdWxsIHBhdGhzIGZyb20gdGhlIHJvb3QuXG4gIGZuKHtcbiAgICBhdHRyaWJ1dGVOYW1lOiBlbnRyeS5mbk5hbWUsXG4gICAgZHJpdmVyLFxuICAgIG1vZGVsQ2xhc3M6IHRhcmdldE1vZGVsQ2xhc3MsXG4gICAgcGFyZW50SWRzOiByb290SWRzLFxuICAgIHF1ZXJ5LFxuICAgIHRhYmxlTmFtZTogdGFyZ2V0VGFibGVSZWZcbiAgfSlcblxuICBjb25zdCBhbGlhc2VzID0gc2VsZWN0ZWRBbGlhc2VzKHF1ZXJ5KVxuICBjb25zdCBzaWduYXR1cmVRdWVyeSA9IHF1ZXJ5LmNsb25lKClcbiAgc2lnbmF0dXJlUXVlcnkucmVzZWxlY3Qoc2lnbmF0dXJlUXVlcnkuZ2V0U2VsZWN0cygpLnNsaWNlKDAsIDEpKVxuXG4gIHJldHVybiB7XG4gICAgYWxpYXNlczogYWxpYXNlcyB8fCBbXSxcbiAgICBxdWVyeSxcbiAgICBzaWduYXR1cmU6IGFsaWFzZXMgPyBzaWduYXR1cmVRdWVyeS50b1NxbCgpIDogYG9wYXF1ZToke2VudHJ5SW5kZXh9YFxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBleHBsaWNpdCBhbGlhc2VzIHNlbGVjdGVkIGFmdGVyIHRoZSByZXNlcnZlZCBwYXJlbnQgaWQuXG4gKiBFbnRyaWVzIHdpdGggYW4gb3BhcXVlIHNlbGVjdCBzdGF5IGlzb2xhdGVkIGJ5IHJlY2VpdmluZyBhIHVuaXF1ZSBjb21wYXRpYmlsaXR5IGFsaWFzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IHF1ZXJ5IC0gUHJlcGFyZWQgcXVlcnlEYXRhIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gLSBTZWxlY3RlZCBhbGlhc2VzLCBvciBudWxsIGZvciBhbiBvcGFxdWUgcHJvamVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0ZWRBbGlhc2VzKHF1ZXJ5KSB7XG4gIGNvbnN0IGFsaWFzZXMgPSBbXVxuXG4gIGZvciAoY29uc3Qgc2VsZWN0IG9mIHF1ZXJ5LmdldFNlbGVjdHMoKS5zbGljZSgxKSkge1xuICAgIGNvbnN0IHNxbCA9IHNlbGVjdC50b1NxbCgpXG4gICAgY29uc3QgbWF0Y2ggPSBzcWwubWF0Y2goL1xcc0FTXFxzKyhbXlxcc10rKVxccyokL2l1KVxuXG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGxcblxuICAgIGFsaWFzZXMucHVzaChtYXRjaFsxXS5yZXBsYWNlKC9eW1wiW2BdfFtcImBcXF1dJC9ndSwgXCJcIikpXG4gIH1cblxuICByZXR1cm4gYWxpYXNlc1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIG9uZSBjb21wYXRpYmxlIHF1ZXJ5RGF0YSBncm91cCBhbmQgYXR0YWNoZXMgZXZlcnkgc2VsZWN0ZWQgYWxpYXMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcmltYXJ5S2V5IC0gUm9vdCBtb2RlbCBwcmltYXJ5IGtleSBjb2x1bW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFByZXBhcmVkIGdyb3VwZWQgcXVlcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3Mucm9vdE1vZGVscyAtIExvYWRlZCByb290IHJlY29yZHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUVudHJ5UXVlcnkoe3ByaW1hcnlLZXksIHF1ZXJ5LCByb290TW9kZWxzfSkge1xuICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSAqLyAoYXdhaXQgcXVlcnkuX2V4ZWN1dGVRdWVyeSgpKVxuICBjb25zdCBieVBhcmVudCA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHJvdy5wYXJlbnRfaWRcblxuICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSBjb250aW51ZVxuXG4gICAgYnlQYXJlbnQuc2V0KHBhcmVudElkLCByb3cpXG4gIH1cblxuICBmb3IgKGNvbnN0IG1vZGVsIG9mIHJvb3RNb2RlbHMpIHtcbiAgICBjb25zdCBtb2RlbElkID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKVxuICAgIC8vIERyaXZlci10eXBlIHRvbGVyYW5jZTogTXlTUUwgY2FuIHJldHVybiBQS3MgYXMgc3RyaW5ncyBldmVuIHdoZW5cbiAgICAvLyB0aGUgY29sdW1uIGlzIG51bWVyaWMuIEZhbGwgYmFjayB0byBhIHN0cmluZyBsb29rdXAgc28gcmVzdWx0c1xuICAgIC8vIHN0aWxsIGxhbmQgb24gdGhlIHJpZ2h0IG1vZGVsLlxuICAgIGNvbnN0IHJvdyA9IGJ5UGFyZW50Lmhhcyhtb2RlbElkKVxuICAgICAgPyBieVBhcmVudC5nZXQobW9kZWxJZClcbiAgICAgIDogYnlQYXJlbnQuZ2V0KFN0cmluZyhtb2RlbElkKSlcblxuICAgIGlmICghcm93KSBjb250aW51ZVxuXG4gICAgZm9yIChjb25zdCBbY29sdW1uTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJvdykpIHtcbiAgICAgIGlmIChjb2x1bW5OYW1lID09PSBcInBhcmVudF9pZFwiKSBjb250aW51ZVxuXG4gICAgICBtb2RlbC5fc2V0UXVlcnlEYXRhKGNvbHVtbk5hbWUsIHZhbHVlKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEV4ZWN1dGVzIG9uZSBjb21wYXRpYmxlIHF1ZXJ5RGF0YSBncm91cCBpbiBjb2hvcnRzIHNvIHRoZSByb290IElEIElOLWxpc3RcbiAqIHN0YXlzIHdpdGhpbiBkcml2ZXIgbGltaXRzLCBhdHRhY2hpbmcgZWFjaCBzZWxlY3RlZCBhbGlhcyB0byB0aGUgbWF0Y2hpbmdcbiAqIHJvb3QgcmVjb3JkLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucHJpbWFyeUtleSAtIFJvb3QgbW9kZWwgcHJpbWFyeSBrZXkgY29sdW1uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBQcmVwYXJlZCBncm91cGVkIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXI+fSBhcmdzLnJvb3RJZHMgLSBSb290IHByaW1hcnkta2V5IHZhbHVlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5yb290TW9kZWxzIC0gTG9hZGVkIHJvb3QgcmVjb3Jkcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlQ2h1bmtlZEVudHJ5UXVlcnkoe3ByaW1hcnlLZXksIHF1ZXJ5LCByb290SWRzLCByb290TW9kZWxzfSkge1xuICBjb25zdCBkcml2ZXIgPSBxdWVyeS5kcml2ZXJcbiAgY29uc3QgY29ob3J0cyA9IGRyaXZlci5jaHVua1ZhbHVlcyhyb290SWRzLCAoY2h1bmspID0+IHF1ZXJ5LmNsb25lKCkud2hlcmUoe1twcmltYXJ5S2V5XTogY2h1bmt9KS50b1NxbCgpKVxuXG4gIGZvciAoY29uc3QgY29ob3J0IG9mIGNvaG9ydHMpIHtcbiAgICBjb25zdCBjb2hvcnRRdWVyeSA9IHF1ZXJ5LmNsb25lKCkud2hlcmUoe1twcmltYXJ5S2V5XTogY29ob3J0fSlcblxuICAgIGF3YWl0IGV4ZWN1dGVFbnRyeVF1ZXJ5KHtwcmltYXJ5S2V5LCBxdWVyeTogY29ob3J0UXVlcnksIHJvb3RNb2RlbHN9KVxuICB9XG59XG4iXX0=
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9xdWVyeS1kYXRhLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFFN0M7Ozs7O0dBS0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRTtJQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFM0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4Qjs7c0NBRThCO1FBQzlCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUVsQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUMvQyxTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssTUFBTSxNQUFNLElBQUksc0JBQXNCLENBQUMsNENBQTRDLENBQUMsQ0FBQyxJ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QUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBRTFHLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUUvRCxNQUFNLGlCQUFpQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtJQUN2RSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gXCJpcy1wbGFpbi1vYmplY3RcIlxuXG4vKipcbiAqIFF1ZXJ5RGF0YUVudHJ5IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVyeURhdGFFbnRyeVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY2hhaW4gLSBSZWxhdGlvbnNoaXAgY2hhaW4gZnJvbSB0aGUgcm9vdCBtb2RlbCB0byB0aGUgbW9kZWwgdGhhdCBkZWNsYXJlcyB0aGUgZm4uIEVtcHR5IGZvciBhIHJvb3QtbGV2ZWwgZW50cnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm5OYW1lIC0gSWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUgZm4gaXMgcmVnaXN0ZXJlZCBvbiB0aGUgZGVjbGFyaW5nIG1vZGVsLlxuICovXG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+PiB8IHtba2V5OiBzdHJpbmddOiB0cnVlIHwgZmFsc2UgfCBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IFF1ZXJ5RGF0YVNwZWNcbiAqL1xuXG4vKipcbiAqIFF1ZXJ5RGF0YUNhbGxiYWNrQXJncyB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlcnlEYXRhQ2FsbGJhY2tBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIE5hbWUgdW5kZXIgd2hpY2ggdGhlIGZuIHdhcyByZWdpc3RlcmVkLiBDb252ZW5pZW50IHdoZW4gYSBmbiBpcyByZXVzZWQgYWNyb3NzIGFsaWFzZXMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkcml2ZXIgLSBBY3RpdmUgZGF0YWJhc2UgZHJpdmVyLCBmb3IgcXVvdGluZyBoZWxwZXJzIGFuZCB0eXBlLXNwZWNpZmljIFNRTC5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdGhlIGZuIGlzIHJlZ2lzdGVyZWQgb24gKHRoZSBjaGFpbidzIHRhcmdldCkuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZyB8IG51bWJlcj59IHBhcmVudElkcyAtIFByaW1hcnkta2V5IHZhbHVlcyBvZiB0aGUgbG9hZGVkIHJvb3QgcmVjb3Jkcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBxdWVyeSAtIEdyb3VwZWQgcXVlcnkgYWxyZWFkeSBqb2luZWQgZG93biB0aGUgY2hhaW4sIGZpbHRlcmVkIGJ5IGBwYXJlbnRJZHNgLCB3aXRoIGBwYXJlbnRfaWRgIHByZS1zZWxlY3RlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBVbnF1b3RlZCB0YWJsZSByZWZlcmVuY2UgKGFsaWFzIG9yIHRhYmxlIG5hbWUpIGZvciB0aGUgY2hhaW4ncyB0YXJnZXQsIHJlYWR5IHRvIHBhc3RlIGludG8gU1FMLlxuICovXG5cbi8qKlxuICogUXVlcnlEYXRhRm4gdHlwZS5cbiAqIEB0eXBlZGVmIHsoYXJnczogUXVlcnlEYXRhQ2FsbGJhY2tBcmdzKSA9PiB2b2lkIHwgaW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBRdWVyeURhdGFGblxuICovXG5cbi8qKlxuICogTm9ybWFsaXplIGEgdXNlci1zdXBwbGllZCBxdWVyeURhdGEgc3BlYyBpbnRvIGEgZmxhdCBsaXN0IG9mIGVudHJpZXNcbiAqIHRoZSBydW5uZXIgY2FuIGNvbnN1bWUuIFRoZSBzcGVjIG1pcnJvcnMgdGhlIHNoYXBlIG9mIGBwcmVsb2FkYCwgd2l0aFxuICogdGhlIGltcG9ydGFudCBkaXN0aW5jdGlvbiB0aGF0ICoqbGVhZiBzdHJpbmdzIGFyZSBmbiBuYW1lcyoqLCBub3RcbiAqIGZ1cnRoZXIgcmVsYXRpb25zaGlwIHNlZ21lbnRzLiBOZXN0ZWQga2V5cyBhcmUgcmVsYXRpb25zaGlwIG5hbWVzXG4gKiBhbG9uZyB0aGUgam9pbiBjaGFpbiBmcm9tIHRoZSByb290IG1vZGVsIHRvIHRoZSBkZWNsYXJpbmcgbW9kZWwuXG4gKlxuICogQWNjZXB0ZWQgc2hhcGVzIChhbGwgeWllbGQgdGhlIHNhbWUgZmxhdCBlbnRyaWVzKTpcbiAqICAgXCJmb29cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtdLCBmbk5hbWU6IFwiZm9vXCJ9XVxuICogICBbXCJmb29cIiwgXCJiYXJcIl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBbe2NoYWluOiBbXSwgZm5OYW1lOiBcImZvb1wifSwge2NoYWluOiBbXSwgZm5OYW1lOiBcImJhclwifV1cbiAqICAge2ZvbzogdHJ1ZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBbe2NoYWluOiBbXSwgZm5OYW1lOiBcImZvb1wifV1cbiAqICAge3Byb2plY3RzOiBbXCJ0YXNrc0NvdW50XCJdfSAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtcInByb2plY3RzXCJdLCBmbk5hbWU6IFwidGFza3NDb3VudFwifV1cbiAqICAge3Byb2plY3RzOiB7dGFza3M6IFtcInRyYW5zcG9ydFNlY29uZHNTdW1cIiwge3RpbWVsb2dzOiBbXCJ0aW1lU2Vjb25kc1N1bVwiXX1dfX1cbiAqICAgICDihpIgW3tjaGFpbjogW1wicHJvamVjdHNcIixcInRhc2tzXCJdLCBmbk5hbWU6IFwidHJhbnNwb3J0U2Vjb25kc1N1bVwifSxcbiAqICAgICAgICB7Y2hhaW46IFtcInByb2plY3RzXCIsXCJ0YXNrc1wiLFwidGltZWxvZ3NcIl0sIGZuTmFtZTogXCJ0aW1lU2Vjb25kc1N1bVwifV1cbiAqIEBwYXJhbSB7UXVlcnlEYXRhU3BlY30gc3BlYyAtIFVzZXItc3VwcGxpZWQgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjaGFpbl0gLSBDdXJyZW50IGNoYWluIChpbnRlcm5hbCByZWN1cnNpb24pLlxuICogQHJldHVybnMge1F1ZXJ5RGF0YUVudHJ5W119IC0gRmxhdCBsaXN0IG9mIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVRdWVyeURhdGFTcGVjKHNwZWMsIGNoYWluID0gW10pIHtcbiAgaWYgKHNwZWMgPT0gbnVsbCkgcmV0dXJuIFtdXG5cbiAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFt7Y2hhaW46IFsuLi5jaGFpbl0sIGZuTmFtZTogc3BlY31dXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgIC8qKlxuICAgICAqIEVudHJpZXMuXG4gICAgICogQHR5cGUge1F1ZXJ5RGF0YUVudHJ5W119ICovXG4gICAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3BlYykge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7Y2hhaW46IFsuLi5jaGFpbl0sIGZuTmFtZTogaXRlbX0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIG5vcm1hbGl6ZVF1ZXJ5RGF0YVNwZWMoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGl0ZW0pLCBjaGFpbikpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2gobmVzdGVkKVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBxdWVyeURhdGEgYXJyYXkgZW50cnk6ICR7dHlwZW9mIGl0ZW19YClcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3Qoc3BlYykpIHtcbiAgICAvKipcbiAgICAgKiBFbnRyaWVzLlxuICAgICAqIEB0eXBlIHtRdWVyeURhdGFFbnRyeVtdfSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BlYykpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goe2NoYWluOiBbLi4uY2hhaW5dLCBmbk5hbWU6IGtleX0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIGNvbnRpbnVlXG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBuZXN0ZWQgb2Ygbm9ybWFsaXplUXVlcnlEYXRhU3BlYygvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAodmFsdWUpLCBbLi4uY2hhaW4sIGtleV0pKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKG5lc3RlZClcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHZhbHVlIGZvciBcIiR7a2V5fVwiOiAke3R5cGVvZiB2YWx1ZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHNwZWM6ICR7dHlwZW9mIHNwZWN9YClcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbmVzdGVkIGBqb2lucyguLi4pYCBkZXNjcmlwdG9yIGZvciBhIGNoYWluIG9mIHJlbGF0aW9uc2hpcCBuYW1lcy5cbiAqIGBbXCJwcm9qZWN0c1wiLCBcInRhc2tzXCJdYCDihpIgYHtwcm9qZWN0czoge3Rhc2tzOiB0cnVlfX1gLiBVc2VkIGludGVybmFsbHkgc29cbiAqIHRoZSBydW5uZXIgY2FuIHJldXNlIHRoZSBleGlzdGluZyBgam9pbnNgIHBhdGgtcmVnaXN0cmF0aW9uIG1hY2hpbmVyeVxuICogKEpvaW5UcmFja2VyLCBhbGlhcyBnZW5lcmF0aW9uLCBzY29wZSBhcHBsaWNhdGlvbikuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBjaGFpbiAtIFJlbGF0aW9uc2hpcCBjaGFpbi5cbiAqIEByZXR1cm5zIHt0cnVlIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIE5lc3RlZCBqb2luIGRlc2NyaXB0b3IsIG9yIGB0cnVlYCB3aGVuIHRoZSBjaGFpbiBpcyBlbXB0eS5cbiAqL1xuZnVuY3Rpb24gYnVpbGROZXN0ZWRKb2luRGVzY3JpcHRvcihjaGFpbikge1xuICBpZiAoY2hhaW4ubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZVxuXG4gIC8qKlxuICAgKiBPYmouXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gIGNvbnN0IG9iaiA9IHt9XG4gIGxldCBjdXJzb3IgPSBvYmpcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3Qgc2VnID0gY2hhaW5baV1cbiAgICBjb25zdCBpc0xhc3QgPSBpID09PSBjaGFpbi5sZW5ndGggLSAxXG5cbiAgICBjdXJzb3Jbc2VnXSA9IGlzTGFzdCA/IHRydWUgOiB7fVxuXG4gICAgaWYgKCFpc0xhc3QpIGN1cnNvciA9IGN1cnNvcltzZWddXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICogV2FsayBhIHJlbGF0aW9uc2hpcCBjaGFpbiBmcm9tIHRoZSByb290IG1vZGVsIGFuZCByZXR1cm4gdGhlIG1vZGVsXG4gKiBjbGFzcyBhdCBpdHMgdGFpbC4gVGhyb3dzIHdpdGggYSBjbGVhciBtZXNzYWdlIHdoZW4gYW55IHNlZ21lbnQgaXNcbiAqIHVua25vd24uXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gcm9vdE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gY2hhaW4gLSBSZWxhdGlvbnNoaXAgY2hhaW4uXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRhcmdldE1vZGVsQ2xhc3Mocm9vdE1vZGVsQ2xhc3MsIGNoYWluKSB7XG4gIGxldCBtb2RlbENsYXNzID0gcm9vdE1vZGVsQ2xhc3NcblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgY2hhaW4pIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShzZWdtZW50KVxuICAgIGNvbnN0IHJhd1RhcmdldCA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgIGlmICghcmF3VGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHF1ZXJ5RGF0YTogY291bGQgbm90IHJlc29sdmUgdGFyZ2V0IG1vZGVsIGZvciAke21vZGVsQ2xhc3MubmFtZX0jJHtzZWdtZW50fWApXG4gICAgfVxuXG4gICAgbW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3MuYmluZFJlY29yZE1ldGFkYXRhTW9kZWxDbGFzcyhyYXdUYXJnZXQpXG4gIH1cblxuICByZXR1cm4gbW9kZWxDbGFzc1xufVxuXG4vKipcbiAqIFJ1biBldmVyeSBxdWVyeURhdGEgZW50cnkgYWdhaW5zdCB0aGUgbG9hZGVkIHJvb3QgcmVjb3JkcywgYXR0YWNoaW5nXG4gKiB0aGUgcmVzdWx0aW5nIHZhbHVlcyBhcyBxdWVyeURhdGEgZW50cmllcyBvbiBlYWNoIHJvb3QgcmVjb3JkLlxuICpcbiAqIE9uZSBncm91cGVkIHF1ZXJ5IHBlciBlbnRyeTogdGhlIHJ1bm5lciBidWlsZHMgYSBmcmVzaCBxdWVyeSBvdmVyIHRoZVxuICogcm9vdCBtb2RlbCwgam9pbnMgZG93biB0aGUgY2hhaW4sIGdyb3VwcyBieSB0aGUgcm9vdCB0YWJsZSdzIHByaW1hcnlcbiAqIGtleSwgYW5kIGludm9rZXMgdGhlIHJlZ2lzdGVyZWQgZm4gdG8gYWRkIGl0cyBvd24gU0VMRUNUIChhbmQgYW55XG4gKiBhZGRpdGlvbmFsIGpvaW5zL3doZXJlKS4gUmVzdWx0cyBhcmUgbWFwcGVkIGJhY2sgdG8gcm9vdCBtb2RlbHMgYnlcbiAqIHByaW1hcnkga2V5IGFuZCBhdHRhY2hlZCB2aWEgYF9zZXRRdWVyeURhdGEobmFtZSwgdmFsdWUpYCBmb3IgZXZlcnlcbiAqIHNlbGVjdGVkIGFsaWFzIChleGNlcHQgdGhlIHJlc2VydmVkIGBwYXJlbnRfaWRgKS4gUm93cyBtaXNzaW5nIGZyb21cbiAqIHRoZSByZXN1bHQga2VlcCBgbnVsbGAg4oCUIG1hdGNoZXMgdGhlIGZlYXR1cmUncyBkb2N1bWVudGVkIGRlZmF1bHQuXG4gKlxuICogTWlycm9ycyB0aGUgc2hhcGUgb2YgYHJ1bldpdGhDb3VudGA6IG9uZSBxdWVyeSBwZXIgZW50cnksIGEgc2VwYXJhdGVcbiAqIHN0b3JhZ2UgbWFwIG9uIHRoZSByZWNvcmQsIG5ldmVyIHRvdWNoZXMgYF9hdHRyaWJ1dGVzYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLnJvb3RNb2RlbENsYXNzIC0gUm9vdCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5yb290TW9kZWxzIC0gTG9hZGVkIHJvb3QgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7UXVlcnlEYXRhRW50cnlbXX0gYXJncy5lbnRyaWVzIC0gTm9ybWFsaXplZCBxdWVyeURhdGEgZW50cmllcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuUXVlcnlEYXRhKHtyb290TW9kZWxDbGFzcywgcm9vdE1vZGVscywgZW50cmllc30pIHtcbiAgaWYgKHJvb3RNb2RlbHMubGVuZ3RoID09PSAwIHx8IGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBjb25zdCBwcmltYXJ5S2V5ID0gcm9vdE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gIGNvbnN0IHJvb3RJZHMgPSByb290TW9kZWxzLm1hcCgobW9kZWwpID0+IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAobW9kZWwucmVhZENvbHVtbihwcmltYXJ5S2V5KSkpXG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gcm9vdE1vZGVsc1swXVxuICBjb25zdCBwcmVwYXJlZEVudHJpZXMgPSBlbnRyaWVzLm1hcCgoZW50cnksIGVudHJ5SW5kZXgpID0+IHByZXBhcmVFbnRyeSh7XG4gICAgZW50cnksXG4gICAgZW50cnlJbmRleCxcbiAgICBwcmltYXJ5S2V5LFxuICAgIHJvb3RJZHMsXG4gICAgcm9vdE1vZGVsQ2xhc3MsXG4gICAgc291cmNlTW9kZWxcbiAgfSkpXG4gIC8qKlxuICAgKiBDb21wYXRpYmxlIHF1ZXJ5IGdyb3Vwcy5cbiAgICogQHR5cGUge0FycmF5PHthbGlhc2VzOiBTZXQ8c3RyaW5nPiwgcXVlcnk6IGltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCwgc2lnbmF0dXJlOiBzdHJpbmd9Pn0gKi9cbiAgY29uc3QgcXVlcnlHcm91cHMgPSBbXVxuXG4gIGZvciAoY29uc3QgcHJlcGFyZWRFbnRyeSBvZiBwcmVwYXJlZEVudHJpZXMpIHtcbiAgICBjb25zdCBjb21wYXRpYmxlR3JvdXAgPSBxdWVyeUdyb3Vwcy5maW5kKChncm91cCwgZ3JvdXBJbmRleCkgPT4ge1xuICAgICAgaWYgKGdyb3VwLnNpZ25hdHVyZSAhPT0gcHJlcGFyZWRFbnRyeS5zaWduYXR1cmUpIHJldHVybiBmYWxzZVxuICAgICAgaWYgKHF1ZXJ5R3JvdXBzLnNsaWNlKGdyb3VwSW5kZXggKyAxKS5zb21lKChpbnRlcnZlbmluZ0dyb3VwKSA9PiAoXG4gICAgICAgIHByZXBhcmVkRW50cnkuYWxpYXNlcy5zb21lKChhbGlhcykgPT4gaW50ZXJ2ZW5pbmdHcm91cC5hbGlhc2VzLmhhcyhhbGlhcykpXG4gICAgICApKSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIHJldHVybiBwcmVwYXJlZEVudHJ5LmFsaWFzZXMuZXZlcnkoKGFsaWFzKSA9PiAhZ3JvdXAuYWxpYXNlcy5oYXMoYWxpYXMpKVxuICAgIH0pXG5cbiAgICBpZiAoY29tcGF0aWJsZUdyb3VwKSB7XG4gICAgICBjb21wYXRpYmxlR3JvdXAucXVlcnkuc2VsZWN0KHByZXBhcmVkRW50cnkucXVlcnkuZ2V0U2VsZWN0cygpLnNsaWNlKDEpKVxuICAgICAgZm9yIChjb25zdCBhbGlhcyBvZiBwcmVwYXJlZEVudHJ5LmFsaWFzZXMpIGNvbXBhdGlibGVHcm91cC5hbGlhc2VzLmFkZChhbGlhcylcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnlHcm91cHMucHVzaCh7XG4gICAgICAgIGFsaWFzZXM6IG5ldyBTZXQocHJlcGFyZWRFbnRyeS5hbGlhc2VzKSxcbiAgICAgICAgcXVlcnk6IHByZXBhcmVkRW50cnkucXVlcnksXG4gICAgICAgIHNpZ25hdHVyZTogcHJlcGFyZWRFbnRyeS5zaWduYXR1cmVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCB7cXVlcnl9IG9mIHF1ZXJ5R3JvdXBzKSB7XG4gICAgYXdhaXQgZXhlY3V0ZUNodW5rZWRFbnRyeVF1ZXJ5KHtwcmltYXJ5S2V5LCBxdWVyeSwgcm9vdElkcywgcm9vdE1vZGVsc30pXG4gIH1cbn1cblxuLyoqXG4gKiBQcmVwYXJlcyBvbmUgcXVlcnlEYXRhIGVudHJ5IGFuZCBpdHMgY29tcGF0aWJpbGl0eSBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UXVlcnlEYXRhRW50cnl9IGFyZ3MuZW50cnkgLSBFbnRyeSBiZWluZyBldmFsdWF0ZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5lbnRyeUluZGV4IC0gU3RhYmxlIHBvc2l0aW9uIHVzZWQgdG8gaXNvbGF0ZSBvcGFxdWUgcHJvamVjdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcmltYXJ5S2V5IC0gUm9vdCBtb2RlbCBwcmltYXJ5IGtleSBjb2x1bW4uXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlcj59IGFyZ3Mucm9vdElkcyAtIFJvb3QgcHJpbWFyeS1rZXkgdmFsdWVzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3Mucm9vdE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5zb3VyY2VNb2RlbCAtIExvYWRlZCBvcGVyYXRpb24gb3duZXIuXG4gKiBAcmV0dXJucyB7e2FsaWFzZXM6IHN0cmluZ1tdLCBxdWVyeTogaW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0LCBzaWduYXR1cmU6IHN0cmluZ319IC0gUHJlcGFyZWQgZW50cnkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVFbnRyeSh7ZW50cnksIGVudHJ5SW5kZXgsIHByaW1hcnlLZXksIHJvb3RJZHMsIHJvb3RNb2RlbENsYXNzLCBzb3VyY2VNb2RlbH0pIHtcbiAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlc29sdmVUYXJnZXRNb2RlbENsYXNzKHJvb3RNb2RlbENsYXNzLCBlbnRyeS5jaGFpbilcbiAgY29uc3QgZm4gPSB0YXJnZXRNb2RlbENsYXNzLmdldFF1ZXJ5RGF0YUJ5TmFtZShlbnRyeS5mbk5hbWUpXG5cbiAgaWYgKCFmbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgcXVlcnlEYXRhOiAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX0gaGFzIG5vIGVudHJ5IHJlZ2lzdGVyZWQgYXMgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5mbk5hbWUpfS4gYCArXG4gICAgICBgRGVjbGFyZSBpdCB3aXRoICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfS5xdWVyeURhdGEoJHtKU09OLnN0cmluZ2lmeShlbnRyeS5mbk5hbWUpfSwgKHtxdWVyeSwgdGFibGVOYW1lfSkgPT4gcXVlcnkuc2VsZWN0KC4uLikpYClcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5ID0gc291cmNlTW9kZWwucXVlcnlGb3JNb2RlbChyb290TW9kZWxDbGFzcylcblxuICAvLyBFbXB0eSBvdXQgYW55IGRlZmF1bHRzIHRoZSBxdWVyeSBmYWN0b3J5IGFkZGVkIOKAlCBxdWVyeURhdGEgcnVuc1xuICAvLyBhIGJhcmUgYWdncmVnYXRlLCBub3QgYSBmdWxsIG1vZGVsIGxvYWQuXG4gIHF1ZXJ5LnJlc2VsZWN0KClcbiAgcXVlcnkuX3ByZWxvYWQgPSB7fVxuXG4gIC8vIEZvcmNlIHRoZSByb290IFdIRVJFIHRvIHF1YWxpZnkgYnkgdGFibGUgbmFtZSBzbyBpdCBzdXJ2aXZlcyB0aGVcbiAgLy8gam9pbnMgdGhlIGZuIG1heSBhZGQgbGF0ZXIgKG90aGVyd2lzZSBhIGNoaWxkIHRhYmxlIHNoYXJpbmcgdGhlXG4gIC8vIHJvb3QgUEsgY29sdW1uIG5hbWUsIGUuZy4gYGlkYCwgbWFrZXMgdGhlIGNsYXVzZSBhbWJpZ3VvdXMpLlxuICBxdWVyeS5fZm9yY2VRdWFsaWZ5QmFzZVRhYmxlID0gdHJ1ZVxuXG4gIGNvbnN0IGRyaXZlciA9IHF1ZXJ5LmRyaXZlclxuICBjb25zdCByb290VGFibGUgPSByb290TW9kZWxDbGFzcy50YWJsZU5hbWUoKVxuICBjb25zdCByb290UGtTcWwgPSBgJHtkcml2ZXIucXVvdGVUYWJsZShyb290VGFibGUpfS4ke2RyaXZlci5xdW90ZUNvbHVtbihwcmltYXJ5S2V5KX1gXG5cbiAgY29uc3Qgam9pbkRlc2NyaXB0b3IgPSBidWlsZE5lc3RlZEpvaW5EZXNjcmlwdG9yKGVudHJ5LmNoYWluKVxuXG4gIGlmIChqb2luRGVzY3JpcHRvciAhPT0gdHJ1ZSkge1xuICAgIHF1ZXJ5LmpvaW5zKGpvaW5EZXNjcmlwdG9yKVxuICB9XG5cbiAgcXVlcnkuZ3JvdXAocm9vdFBrU3FsKVxuICBxdWVyeS5zZWxlY3QoYCR7cm9vdFBrU3FsfSBBUyBwYXJlbnRfaWRgKVxuXG4gIGNvbnN0IHRhcmdldFRhYmxlUmVmID0gZW50cnkuY2hhaW4ubGVuZ3RoID09PSAwXG4gICAgPyByb290VGFibGVcbiAgICA6IHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbiguLi5lbnRyeS5jaGFpbilcblxuICAvLyBOQjogd2UgaW50ZW50aW9uYWxseSBsZWF2ZSBgX2pvaW5CYXNlUGF0aGAgYXQgW10gc28gdGhlIG91dGVyIGNoYWluXG4gIC8vIGpvaW5zIGNvbnRpbnVlIHRvIHJlc29sdmUgZnJvbSB0aGUgcm9vdCBtb2RlbCBhdCByZW5kZXIgdGltZS4gVGhlXG4gIC8vIGZuIGdldHMgYHRhYmxlTmFtZWAgZm9yIHNlbGYtcmVmZXJlbmNlOyBhZGRpdGlvbmFsIGpvaW5zIGZyb21cbiAgLy8gbmVzdGVkIGxldmVscyBzaG91bGQgdXNlIGZ1bGwgcGF0aHMgZnJvbSB0aGUgcm9vdC5cbiAgZm4oe1xuICAgIGF0dHJpYnV0ZU5hbWU6IGVudHJ5LmZuTmFtZSxcbiAgICBkcml2ZXIsXG4gICAgbW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcyxcbiAgICBwYXJlbnRJZHM6IHJvb3RJZHMsXG4gICAgcXVlcnksXG4gICAgdGFibGVOYW1lOiB0YXJnZXRUYWJsZVJlZlxuICB9KVxuXG4gIGNvbnN0IGFsaWFzZXMgPSBzZWxlY3RlZEFsaWFzZXMocXVlcnkpXG4gIGNvbnN0IHNpZ25hdHVyZVF1ZXJ5ID0gcXVlcnkuY2xvbmUoKVxuICBzaWduYXR1cmVRdWVyeS5yZXNlbGVjdChzaWduYXR1cmVRdWVyeS5nZXRTZWxlY3RzKCkuc2xpY2UoMCwgMSkpXG5cbiAgcmV0dXJuIHtcbiAgICBhbGlhc2VzOiBhbGlhc2VzIHx8IFtdLFxuICAgIHF1ZXJ5LFxuICAgIHNpZ25hdHVyZTogYWxpYXNlcyA/IHNpZ25hdHVyZVF1ZXJ5LnRvU3FsKCkgOiBgb3BhcXVlOiR7ZW50cnlJbmRleH1gXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGV4cGxpY2l0IGFsaWFzZXMgc2VsZWN0ZWQgYWZ0ZXIgdGhlIHJlc2VydmVkIHBhcmVudCBpZC5cbiAqIEVudHJpZXMgd2l0aCBhbiBvcGFxdWUgc2VsZWN0IHN0YXkgaXNvbGF0ZWQgYnkgcmVjZWl2aW5nIGEgdW5pcXVlIGNvbXBhdGliaWxpdHkgYWxpYXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gcXVlcnkgLSBQcmVwYXJlZCBxdWVyeURhdGEgcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nW10gfCBudWxsfSAtIFNlbGVjdGVkIGFsaWFzZXMsIG9yIG51bGwgZm9yIGFuIG9wYXF1ZSBwcm9qZWN0aW9uLlxuICovXG5mdW5jdGlvbiBzZWxlY3RlZEFsaWFzZXMocXVlcnkpIHtcbiAgY29uc3QgYWxpYXNlcyA9IFtdXG5cbiAgZm9yIChjb25zdCBzZWxlY3Qgb2YgcXVlcnkuZ2V0U2VsZWN0cygpLnNsaWNlKDEpKSB7XG4gICAgY29uc3Qgc3FsID0gc2VsZWN0LnRvU3FsKClcbiAgICBjb25zdCBtYXRjaCA9IHNxbC5tYXRjaCgvXFxzQVNcXHMrKFteXFxzXSspXFxzKiQvaXUpXG5cbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbFxuXG4gICAgYWxpYXNlcy5wdXNoKG1hdGNoWzFdLnJlcGxhY2UoL15bXCJbYF18W1wiYFxcXV0kL2d1LCBcIlwiKSlcbiAgfVxuXG4gIHJldHVybiBhbGlhc2VzXG59XG5cbi8qKlxuICogRXhlY3V0ZXMgb25lIGNvbXBhdGlibGUgcXVlcnlEYXRhIGdyb3VwIGFuZCBhdHRhY2hlcyBldmVyeSBzZWxlY3RlZCBhbGlhcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByaW1hcnlLZXkgLSBSb290IG1vZGVsIHByaW1hcnkga2V5IGNvbHVtbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBhcmdzLnF1ZXJ5IC0gUHJlcGFyZWQgZ3JvdXBlZCBxdWVyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5yb290TW9kZWxzIC0gTG9hZGVkIHJvb3QgcmVjb3Jkcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRW50cnlRdWVyeSh7cHJpbWFyeUtleSwgcXVlcnksIHJvb3RNb2RlbHN9KSB7XG4gIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59ICovIChhd2FpdCBxdWVyeS5fZXhlY3V0ZVF1ZXJ5KCkpXG4gIGNvbnN0IGJ5UGFyZW50ID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGNvbnN0IHBhcmVudElkID0gcm93LnBhcmVudF9pZFxuXG4gICAgaWYgKHBhcmVudElkID09IG51bGwpIGNvbnRpbnVlXG5cbiAgICBieVBhcmVudC5zZXQocGFyZW50SWQsIHJvdylcbiAgfVxuXG4gIGZvciAoY29uc3QgbW9kZWwgb2Ygcm9vdE1vZGVscykge1xuICAgIGNvbnN0IG1vZGVsSWQgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKG1vZGVsLnJlYWRDb2x1bW4ocHJpbWFyeUtleSkpXG4gICAgLy8gRHJpdmVyLXR5cGUgdG9sZXJhbmNlOiBNeVNRTCBjYW4gcmV0dXJuIFBLcyBhcyBzdHJpbmdzIGV2ZW4gd2hlblxuICAgIC8vIHRoZSBjb2x1bW4gaXMgbnVtZXJpYy4gRmFsbCBiYWNrIHRvIGEgc3RyaW5nIGxvb2t1cCBzbyByZXN1bHRzXG4gICAgLy8gc3RpbGwgbGFuZCBvbiB0aGUgcmlnaHQgbW9kZWwuXG4gICAgY29uc3Qgcm93ID0gYnlQYXJlbnQuaGFzKG1vZGVsSWQpXG4gICAgICA/IGJ5UGFyZW50LmdldChtb2RlbElkKVxuICAgICAgOiBieVBhcmVudC5nZXQoU3RyaW5nKG1vZGVsSWQpKVxuXG4gICAgaWYgKCFyb3cpIGNvbnRpbnVlXG5cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW5OYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocm93KSkge1xuICAgICAgaWYgKGNvbHVtbk5hbWUgPT09IFwicGFyZW50X2lkXCIpIGNvbnRpbnVlXG5cbiAgICAgIG1vZGVsLl9zZXRRdWVyeURhdGEoY29sdW1uTmFtZSwgdmFsdWUpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgb25lIGNvbXBhdGlibGUgcXVlcnlEYXRhIGdyb3VwIGluIGNvaG9ydHMgc28gdGhlIHJvb3QgSUQgSU4tbGlzdFxuICogc3RheXMgd2l0aGluIGRyaXZlciBsaW1pdHMsIGF0dGFjaGluZyBlYWNoIHNlbGVjdGVkIGFsaWFzIHRvIHRoZSBtYXRjaGluZ1xuICogcm9vdCByZWNvcmQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcmltYXJ5S2V5IC0gUm9vdCBtb2RlbCBwcmltYXJ5IGtleSBjb2x1bW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFByZXBhcmVkIGdyb3VwZWQgcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlcj59IGFyZ3Mucm9vdElkcyAtIFJvb3QgcHJpbWFyeS1rZXkgdmFsdWVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSBhcmdzLnJvb3RNb2RlbHMgLSBMb2FkZWQgcm9vdCByZWNvcmRzLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaHVua2VkRW50cnlRdWVyeSh7cHJpbWFyeUtleSwgcXVlcnksIHJvb3RJZHMsIHJvb3RNb2RlbHN9KSB7XG4gIGNvbnN0IGRyaXZlciA9IHF1ZXJ5LmRyaXZlclxuICBjb25zdCBjb2hvcnRzID0gZHJpdmVyLmNodW5rVmFsdWVzKHJvb3RJZHMsIChjaHVuaykgPT4gcXVlcnkuY2xvbmUoKS53aGVyZSh7W3ByaW1hcnlLZXldOiBjaHVua30pLnRvU3FsKCkpXG5cbiAgZm9yIChjb25zdCBjb2hvcnQgb2YgY29ob3J0cykge1xuICAgIGNvbnN0IGNvaG9ydFF1ZXJ5ID0gcXVlcnkuY2xvbmUoKS53aGVyZSh7W3ByaW1hcnlLZXldOiBjb2hvcnR9KVxuXG4gICAgYXdhaXQgZXhlY3V0ZUVudHJ5UXVlcnkoe3ByaW1hcnlLZXksIHF1ZXJ5OiBjb2hvcnRRdWVyeSwgcm9vdE1vZGVsc30pXG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"where-model-class-hash.d.ts","sourceRoot":"","sources":["../../../../src/database/query/where-model-class-hash.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"where-model-class-hash.d.ts","sourceRoot":"","sources":["../../../../src/database/query/where-model-class-hash.js"],"names":[],"mappings":"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"}
@@ -356,9 +356,10 @@ export default class VelociousDatabaseQueryWhereModelClassHash extends WhereBase
356
356
  if (relationship && tuples) {
357
357
  if (index > 0)
358
358
  sql += " AND ";
359
- const targetModelClass = relationship.getTargetModelClass();
360
- if (!targetModelClass)
359
+ const rawTargetModelClass = relationship.getTargetModelClass();
360
+ if (!rawTargetModelClass)
361
361
  throw new Error(`Relationship "${whereKey}" for ${modelClass.name} has no target model class`);
362
+ const targetModelClass = modelClass.bindRecordMetadataModelClass(rawTargetModelClass);
362
363
  const nestedPath = path.concat([whereKey]);
363
364
  const nestedTableName = modelQuery.getTableReferenceForJoin(...nestedPath);
364
365
  sql += this._whereSQLFromRelationshipWhereOperatorTuples({
@@ -385,9 +386,10 @@ export default class VelociousDatabaseQueryWhereModelClassHash extends WhereBase
385
386
  if (!relationship) {
386
387
  throw new Error(`Unknown relationship "${whereKey}" for ${modelClass.name}`);
387
388
  }
388
- const targetModelClass = relationship.getTargetModelClass();
389
- if (!targetModelClass)
389
+ const rawTargetModelClass = relationship.getTargetModelClass();
390
+ if (!rawTargetModelClass)
390
391
  throw new Error(`Relationship "${whereKey}" for ${modelClass.name} has no target model class`);
392
+ const targetModelClass = modelClass.bindRecordMetadataModelClass(rawTargetModelClass);
391
393
  const nestedHash = /** @type {WhereHash} */ (whereValue);
392
394
  const nestedPath = path.concat([whereKey]);
393
395
  const nestedTableName = modelQuery.getTableReferenceForJoin(...nestedPath);
@@ -439,4 +441,4 @@ export default class VelociousDatabaseQueryWhereModelClassHash extends WhereBase
439
441
  return sql;
440
442
  }
441
443
  }
442
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUtbW9kZWwtY2xhc3MtaGFzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS93aGVyZS1tb2RlbC1jbGFzcy1oYXNoLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDN0MsT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUE7QUFFdkM7OztHQUdHO0FBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBQ25DLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUVySDs7OztHQUlHO0FBQ0gsU0FBUyxrQ0FBa0MsQ0FBQyxRQUFRO0lBQ2xELE1BQU0sZUFBZSxHQUFHO1FBQ3RCLEdBQUcsRUFBRSxJQUFJO1FBQ1QsSUFBSSxFQUFFLE1BQU07UUFDWixHQUFHLEVBQUUsSUFBSTtRQUNULElBQUksRUFBRSxNQUFNO0tBQ2IsQ0FBQTtJQUVELE9BQU8sc0VBQXNFLENBQUMsQ0FDNUUsZUFBZSxFQUFDLHNDQUF1QyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUMvRSxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8seUNBQTBDLFNBQVEsU0FBUztJQUM5RTs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixHQUFHLEtBQUssRUFBQztRQUM3RCxLQUFLLEVBQUUsQ0FBQTtRQUNQ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O2dCQUVoQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsR0FBRyxJQUFJLFFBQVEsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFBO2dCQUM5RSxDQUFDO3FCQUFNLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUMvQixHQUFHLElBQUksVUFBVSxDQUFBO2dCQUNuQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sR0FBRyxJQUFJLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFBO2dCQUMxQyxDQUFDO1lBQ0gsQ0FBQztZQUVELEtBQUssRUFBRSxDQUFBO1FBQ1QsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tIFwiaXMtcGxhaW4tb2JqZWN0XCJcbmltcG9ydCBXaGVyZUJhc2UgZnJvbSBcIi4vd2hlcmUtYmFzZS5qc1wiXG5cbi8qKlxuICogTm8gbWF0Y2guXG4gKiBAdHlwZWRlZiB7e1trZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw+IHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gV2hlcmVIYXNoXG4gKi9cblxuY29uc3QgTk9fTUFUQ0ggPSBTeW1ib2woXCJuby1tYXRjaFwiKVxuY29uc3QgcmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvcnMgPSBuZXcgU2V0KFtcImVxXCIsIFwibm90RXFcIiwgXCJndFwiLCBcImd0ZXFcIiwgXCJsdFwiLCBcImx0ZXFcIiwgXCJsaWtlXCIsIFwiPlwiLCBcIj49XCIsIFwiPFwiLCBcIjw9XCJdKVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHJlbGF0aW9uc2hpcCB3aGVyZSBvcGVyYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIFJhdyByZWxhdGlvbnNoaXAgd2hlcmUgb3BlcmF0b3IuXG4gKiBAcmV0dXJucyB7XCJlcVwiIHwgXCJub3RFcVwiIHwgXCJndFwiIHwgXCJndGVxXCIgfCBcImx0XCIgfCBcImx0ZXFcIiB8IFwibGlrZVwifSAtIE5vcm1hbGl6ZWQgb3BlcmF0b3IuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlbGF0aW9uc2hpcFdoZXJlT3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgY29uc3Qgb3BlcmF0b3JBbGlhc2VzID0ge1xuICAgIFwiPFwiOiBcImx0XCIsXG4gICAgXCI8PVwiOiBcImx0ZXFcIixcbiAgICBcIj5cIjogXCJndFwiLFxuICAgIFwiPj1cIjogXCJndGVxXCJcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge1wiZXFcIiB8IFwibm90RXFcIiB8IFwiZ3RcIiB8IFwiZ3RlcVwiIHwgXCJsdFwiIHwgXCJsdGVxXCIgfCBcImxpa2VcIn0gKi8gKFxuICAgIG9wZXJhdG9yQWxpYXNlc1svKiogQHR5cGUge1wiPFwiIHwgXCI8PVwiIHwgXCI+XCIgfCBcIj49XCJ9ICovIChvcGVyYXRvcildIHx8IG9wZXJhdG9yXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VRdWVyeVdoZXJlTW9kZWxDbGFzc0hhc2ggZXh0ZW5kcyBXaGVyZUJhc2Uge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtXaGVyZUhhc2h9IGFyZ3MuaGFzaCAtIEhhc2guXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5xdWFsaWZ5QmFzZVRhYmxlXSAtIFdoZXRoZXIgdG8gcXVhbGlmeSBiYXNlIHRhYmxlIGNvbHVtbnMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7cXVlcnksIGhhc2gsIG1vZGVsQ2xhc3MsIHF1YWxpZnlCYXNlVGFibGUgPSBmYWxzZX0pIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5oYXNoID0gaGFzaFxuICAgIHRoaXMubW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcbiAgICB0aGlzLnF1YWxpZnlCYXNlVGFibGUgPSBxdWFsaWZ5QmFzZVRhYmxlXG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5XG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IC0gVGhlIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgZ2V0TW9kZWxDbGFzcygpIHtcbiAgICBpZiAoIXRoaXMubW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKFwibW9kZWxDbGFzcyBub3Qgc2V0XCIpXG5cbiAgICByZXR1cm4gdGhpcy5tb2RlbENsYXNzXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBzcWwuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIHRvU3FsKCkge1xuICAgIGxldCBzcWwgPSBcIihcIlxuXG4gICAgY29uc3QgbW9kZWxRdWVyeSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5xdWVyeSlcbiAgICBjb25zdCBiYXNlVGFibGVOYW1lID0gdGhpcy5xdWFsaWZ5QmFzZVRhYmxlXG4gICAgICA/IG1vZGVsUXVlcnkuZ2V0VGFibGVSZWZlcmVuY2VGb3JKb2luKClcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBzcWwgKz0gdGhpcy5fd2hlcmVTUUxGcm9tSGFzaCh0aGlzLmhhc2gsIHRoaXMuZ2V0TW9kZWxDbGFzcygpLCBbXSwgYmFzZVRhYmxlTmFtZSlcbiAgICBzcWwgKz0gXCIpXCJcblxuICAgIHJldHVybiBzcWxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgY29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBBdHRyaWJ1dGUgb3IgY29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIHJlc29sdmVkIGNvbHVtbiBuYW1lLlxuICAgKi9cbiAgX3Jlc29sdmVDb2x1bW5OYW1lKG1vZGVsQ2xhc3MsIGtleSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU1hcCA9IG1vZGVsQ2xhc3MuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpXG5cbiAgICBpZiAoYXR0cmlidXRlTWFwW2tleV0pIHJldHVybiBhdHRyaWJ1dGVNYXBba2V5XVxuXG4gICAgY29uc3QgY29sdW1uTWFwID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwKClcbiAgICBjb25zdCB1bmRlcnNjb3JlZCA9IGluZmxlY3Rpb24udW5kZXJzY29yZShrZXkpXG5cbiAgICBpZiAoY29sdW1uTWFwW2tleV0pIHJldHVybiBrZXlcbiAgICBpZiAoY29sdW1uTWFwW3VuZGVyc2NvcmVkXSkgcmV0dXJuIHVuZGVyc2NvcmVkXG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgcmVsYXRpb25zaGlwLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vcmVjb3JkL3JlbGF0aW9uc2hpcHMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFRoZSByZWxhdGlvbnNoaXAuXG4gICAqL1xuICBfZ2V0UmVsYXRpb25zaGlwKG1vZGVsQ2xhc3MsIHJlbGF0aW9uc2hpcE5hbWUpIHtcbiAgICByZXR1cm4gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBzTWFwKClbcmVsYXRpb25zaGlwTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIHJlbGF0aW9uc2hpcCB3aGVyZSBvcGVyYXRvciB0dXBsZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdHVwbGVWYWx1ZSAtIENhbmRpZGF0ZSB0dXBsZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGlzIGlzIGEgcmVsYXRpb25zaGlwIHdoZXJlIHR1cGxlLlxuICAgKi9cbiAgX2lzUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvclR1cGxlKHR1cGxlVmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodHVwbGVWYWx1ZSkgfHwgdHVwbGVWYWx1ZS5sZW5ndGggPCAzKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIHR1cGxlVmFsdWVbMF0gPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIHR5cGVvZiB0dXBsZVZhbHVlWzFdID09PSBcInN0cmluZ1wiICYmXG4gICAgICByZWxhdGlvbnNoaXBXaGVyZU9wZXJhdG9ycy5oYXModHVwbGVWYWx1ZVsxXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG5vcm1hbGl6ZSByZWxhdGlvbnNoaXAgd2hlcmUgb3BlcmF0b3IgdHVwbGVzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIENhbmRpZGF0ZSByZWxhdGlvbnNoaXAgd2hlcmUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtBcnJheTxbc3RyaW5nLCBcImVxXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCJsaWtlXCIsIHVua25vd25dPn0gLSBOb3JtYWxpemVkIHR1cGxlcy5cbiAgICovXG4gIF9ub3JtYWxpemVSZWxhdGlvbnNoaXBXaGVyZU9wZXJhdG9yVHVwbGVzKHZhbHVlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlbGF0aW9uc2hpcCB3aGVyZSB0dXBsZSBjb250YWluZXIgdHlwZTogJHt0eXBlb2YgdmFsdWV9YClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxbc3RyaW5nLCBcImVxXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCJsaWtlXCIsIHVua25vd25dPn0gKi9cbiAgICBjb25zdCBub3JtYWxpemVkID0gW11cbiAgICAvKipcbiAgICAgKiBBZGQgY29uZGl0aW9uLlxuICAgICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGNvbmRpdGlvblZhbHVlIC0gQ2FuZGlkYXRlIG5lc3RlZCBjb25kaXRpb24uXG4gICAgICovXG4gICAgY29uc3QgYWRkQ29uZGl0aW9uID0gKGNvbmRpdGlvblZhbHVlKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNSZWxhdGlvbnNoaXBXaGVyZU9wZXJhdG9yVHVwbGUoY29uZGl0aW9uVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHR1cGxlID0gLyoqIEB0eXBlIHtbc3RyaW5nLCBcImVxXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCJsaWtlXCIgfCBcIj5cIiB8IFwiPj1cIiB8IFwiPFwiIHwgXCI8PVwiLCB1bmtub3duLCAuLi5BcnJheTx1bmtub3duPl19ICovIChjb25kaXRpb25WYWx1ZSlcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE9wZXJhdG9yID0gbm9ybWFsaXplUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvcih0dXBsZVsxXSlcblxuICAgICAgICBub3JtYWxpemVkLnB1c2goW1xuICAgICAgICAgIHR1cGxlWzBdLFxuICAgICAgICAgIG5vcm1hbGl6ZWRPcGVyYXRvcixcbiAgICAgICAgICB0dXBsZVsyXVxuICAgICAgICBdKVxuXG4gICAgICAgIGlmICh0dXBsZS5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAzOyBpbmRleCA8IHR1cGxlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgICAgYWRkQ29uZGl0aW9uKHR1cGxlW2luZGV4XSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmRpdGlvblZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWxhdGlvbnNoaXAgd2hlcmUgY29uZGl0aW9ucyBtdXN0IGJlIHR1cGxlc1wiKVxuICAgICAgfVxuXG4gICAgICBjb25kaXRpb25WYWx1ZS5mb3JFYWNoKChuZXN0ZWRDb25kaXRpb25WYWx1ZSkgPT4ge1xuICAgICAgICBhZGRDb25kaXRpb24obmVzdGVkQ29uZGl0aW9uVmFsdWUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGFkZENvbmRpdGlvbih2YWx1ZSlcblxuICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlbGF0aW9uc2hpcCB3aGVyZSB0dXBsZSBjb250YWluZXIgY2Fubm90IGJlIGVtcHR5XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIHJlbGF0aW9uc2hpcCB3aGVyZSBvcGVyYXRvciB0dXBsZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIHJlbGF0aW9uc2hpcCB3aGVyZSB2YWx1ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZSBjYW4gYmUgbm9ybWFsaXplZCB0byByZWxhdGlvbnNoaXAgdHVwbGVzLlxuICAgKi9cbiAgX2lzUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvclR1cGxlQ29udGFpbmVyKHZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX25vcm1hbGl6ZVJlbGF0aW9uc2hpcFdoZXJlT3BlcmF0b3JUdXBsZXModmFsdWUpXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aGVyZSBzcWxmcm9tIHJlbGF0aW9uc2hpcCB3aGVyZSBvcGVyYXRvciB0dXBsZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVsYXRpb25zaGlwIHdoZXJlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBSZWxhdGlvbnNoaXAgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhYmxlTmFtZSAtIFJlbGF0aW9uc2hpcCB0YWJsZSByZWZlcmVuY2UgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTxbc3RyaW5nLCBcImVxXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCJsaWtlXCIsIHVua25vd25dPn0gYXJncy50dXBsZXMgLSBPcGVyYXRvciB0dXBsZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHdoZXJlIGZyYWdtZW50LlxuICAgKi9cbiAgX3doZXJlU1FMRnJvbVJlbGF0aW9uc2hpcFdoZXJlT3BlcmF0b3JUdXBsZXMoe21vZGVsQ2xhc3MsIHRhYmxlTmFtZSwgdHVwbGVzfSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKVxuICAgIGxldCBzcWwgPSBcIlwiXG4gICAgbGV0IGluZGV4ID0gMFxuXG4gICAgdHVwbGVzLmZvckVhY2goKFthdHRyaWJ1dGVOYW1lLCBvcGVyYXRvciwgd2hlcmVWYWx1ZV0pID0+IHtcbiAgICAgIGlmIChpbmRleCA+IDApIHNxbCArPSBcIiBBTkQgXCJcblxuICAgICAgY29uc3QgY29sdW1uTmFtZSA9IHRoaXMuX3Jlc29sdmVDb2x1bW5OYW1lKG1vZGVsQ2xhc3MsIGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAgIGlmICghY29sdW1uTmFtZSkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGF0dHJpYnV0ZSBcIiR7YXR0cmlidXRlTmFtZX1cIiBmb3IgJHttb2RlbENsYXNzLm5hbWV9YClcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdGhpcy5fbm9ybWFsaXplU3FsaXRlQm9vbGVhblZhbHVlKHtcbiAgICAgICAgY29sdW1uTmFtZSxcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgdmFsdWU6IHdoZXJlVmFsdWVcbiAgICAgIH0pXG4gICAgICBjb25zdCB0eXBlZFZhbHVlID0gdGhpcy5fbm9ybWFsaXplVmFsdWVGb3JDb2x1bW5UeXBlKHtcbiAgICAgICAgY29sdW1uTmFtZSxcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZVxuICAgICAgfSlcbiAgICAgIGNvbnN0IGNvbHVtblR5cGUgPSBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUoY29sdW1uTmFtZSlcbiAgICAgIGNvbnN0IGRyaXZlclR5cGUgPSB0aGlzLmdldFF1ZXJ5KCkuZHJpdmVyLmdldFR5cGUoKVxuXG4gICAgICBpZiAodHlwZWRWYWx1ZSA9PT0gTk9fTUFUQ0gpIHtcbiAgICAgICAgaWYgKG9wZXJhdG9yID09PSBcIm5vdEVxXCIpIHtcbiAgICAgICAgICBzcWwgKz0gXCIxPTFcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNxbCArPSBcIjE9MFwiXG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbGV0IGNvbHVtblNxbCA9IGAke29wdGlvbnMucXVvdGVUYWJsZU5hbWUodGFibGVOYW1lKX0uJHtvcHRpb25zLnF1b3RlQ29sdW1uTmFtZShjb2x1bW5OYW1lKX1gXG5cbiAgICAgIGlmIChkcml2ZXJUeXBlID09IFwibXNzcWxcIiAmJiB0eXBlb2Ygd2hlcmVWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2x1bW5UeXBlPy50b0xvd2VyQ2FzZSgpID09IFwidGV4dFwiKSB7XG4gICAgICAgIGNvbHVtblNxbCA9IGBDQVNUKCR7Y29sdW1uU3FsfSBBUyBOVkFSQ0hBUihNQVgpKWBcbiAgICAgIH1cblxuICAgICAgaWYgKG9wZXJhdG9yID09PSBcImVxXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZWRWYWx1ZSkpIHtcbiAgICAgICAgICBpZiAodHlwZWRWYWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICBzcWwgKz0gXCIxPTBcIlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcWwgKz0gYCR7Y29sdW1uU3FsfSBJTiAoJHt0eXBlZFZhbHVlLm1hcCgodmFsdWUpID0+IG9wdGlvbnMucXVvdGUodmFsdWUpKS5qb2luKFwiLCBcIil9KWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZWRWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHNxbCArPSBgJHtjb2x1bW5TcWx9IElTIE5VTExgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3FsICs9IGAke2NvbHVtblNxbH0gPSAke29wdGlvbnMucXVvdGUodHlwZWRWYWx1ZSl9YFxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKG9wZXJhdG9yID09PSBcIm5vdEVxXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZWRWYWx1ZSkpIHtcbiAgICAgICAgICBpZiAodHlwZWRWYWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICBzcWwgKz0gXCIxPTFcIlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcWwgKz0gYCR7Y29sdW1uU3FsfSBOT1QgSU4gKCR7dHlwZWRWYWx1ZS5tYXAoKHZhbHVlKSA9PiBvcHRpb25zLnF1b3RlKHZhbHVlKSkuam9pbihcIiwgXCIpfSlgXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVkVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBzcWwgKz0gYCR7Y29sdW1uU3FsfSBJUyBOT1QgTlVMTGBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcWwgKz0gYCR7Y29sdW1uU3FsfSAhPSAke29wdGlvbnMucXVvdGUodHlwZWRWYWx1ZSl9YFxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZWRWYWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciBcIiR7b3BlcmF0b3J9XCIgZG9lcyBub3Qgc3VwcG9ydCBhcnJheSB2YWx1ZXMgZm9yICR7bW9kZWxDbGFzcy5uYW1lfS4ke2F0dHJpYnV0ZU5hbWV9YClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVkVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciBcIiR7b3BlcmF0b3J9XCIgZG9lcyBub3Qgc3VwcG9ydCBudWxsIHZhbHVlcyBmb3IgJHttb2RlbENsYXNzLm5hbWV9LiR7YXR0cmlidXRlTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvcGVyYXRvck1hcCA9IHtcbiAgICAgICAgZ3Q6IFwiPlwiLFxuICAgICAgICBndGVxOiBcIj49XCIsXG4gICAgICAgIGxpa2U6IFwiTElLRVwiLFxuICAgICAgICBsdDogXCI8XCIsXG4gICAgICAgIGx0ZXE6IFwiPD1cIlxuICAgICAgfVxuXG4gICAgICBzcWwgKz0gYCR7Y29sdW1uU3FsfSAke29wZXJhdG9yTWFwW29wZXJhdG9yXX0gJHtvcHRpb25zLnF1b3RlKHR5cGVkVmFsdWUpfWBcbiAgICAgIGluZGV4ICs9IDFcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNxbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbm9ybWFsaXplIHNxbGl0ZSBib29sZWFuIHZhbHVlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy52YWx1ZSAtIFZhbHVlIHRvIG5vcm1hbGl6ZS5cbiAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIE5vcm1hbGl6ZWQgdmFsdWUuXG4gICAqL1xuICBfbm9ybWFsaXplU3FsaXRlQm9vbGVhblZhbHVlKHttb2RlbENsYXNzLCBjb2x1bW5OYW1lLCB2YWx1ZX0pIHtcbiAgICBpZiAobW9kZWxDbGFzcy5nZXREYXRhYmFzZVR5cGUoKSAhPSBcInNxbGl0ZVwiKSByZXR1cm4gdmFsdWVcblxuICAgIGNvbnN0IGNvbHVtblR5cGUgPSBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUoY29sdW1uTmFtZSlcblxuICAgIGlmICghY29sdW1uVHlwZSkgcmV0dXJuIHZhbHVlXG4gICAgaWYgKGNvbHVtblR5cGUudG9Mb3dlckNhc2UoKSAhPT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplLlxuICAgICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGVudHJ5IC0gVmFsdWUgdG8gbm9ybWFsaXplLlxuICAgICAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBTUUxpdGUgcHJlZGljYXRlIHZhbHVlIHdpdGggYm9vbGVhbnMgZW5jb2RlZCBhcyAxIG9yIDAuXG4gICAgICovXG4gICAgY29uc3Qgbm9ybWFsaXplID0gKGVudHJ5KSA9PiB7XG4gICAgICBpZiAoZW50cnkgPT09IHRydWUpIHJldHVybiAxXG4gICAgICBpZiAoZW50cnkgPT09IGZhbHNlKSByZXR1cm4gMFxuICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKChlbnRyeSkgPT4gbm9ybWFsaXplKGVudHJ5KSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplKHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbm9ybWFsaXplIHZhbHVlIGZvciBjb2x1bW4gdHlwZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MudmFsdWUgLSBWYWx1ZSB0byBub3JtYWxpemUuXG4gICAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBOb3JtYWxpemVkIHZhbHVlLlxuICAgKi9cbiAgX25vcm1hbGl6ZVZhbHVlRm9yQ29sdW1uVHlwZSh7bW9kZWxDbGFzcywgY29sdW1uTmFtZSwgdmFsdWV9KSB7XG4gICAgY29uc3QgY29sdW1uVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgaWYgKCFjb2x1bW5UeXBlKSByZXR1cm4gdmFsdWVcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gY29sdW1uVHlwZS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3Qgc3RyaW5nVHlwZXMgPSBuZXcgU2V0KFtcImNoYXJcIiwgXCJ2YXJjaGFyXCIsIFwibnZhcmNoYXJcIiwgXCJzdHJpbmdcIiwgXCJlbnVtXCIsIFwianNvblwiLCBcImpzb25iXCIsIFwiY2l0ZXh0XCIsIFwiYmluYXJ5XCIsIFwidmFyYmluYXJ5XCJdKVxuICAgIGNvbnN0IGlzVXVpZFR5cGUgPSBub3JtYWxpemVkVHlwZS5pbmNsdWRlcyhcInV1aWRcIilcbiAgICBjb25zdCBzaG91bGRDb2VyY2VUb1N0cmluZyA9IG5vcm1hbGl6ZWRUeXBlLmluY2x1ZGVzKFwidXVpZFwiKSB8fFxuICAgICAgbm9ybWFsaXplZFR5cGUuaW5jbHVkZXMoXCJ0ZXh0XCIpIHx8XG4gICAgICBzdHJpbmdUeXBlcy5oYXMobm9ybWFsaXplZFR5cGUpXG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUuXG4gICAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gZW50cnkgLSBWYWx1ZSB0byBub3JtYWxpemUuXG4gICAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIENvbHVtbi1jb21wYXRpYmxlIHByZWRpY2F0ZSB2YWx1ZSwgb3IgdGhlIG5vLW1hdGNoIHNlbnRpbmVsIGZvciBudW1lcmljIFVVSURzLlxuICAgICAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZSA9IChlbnRyeSkgPT4ge1xuICAgICAgaWYgKGlzVXVpZFR5cGUgJiYgdHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSByZXR1cm4gTk9fTUFUQ0hcbiAgICAgIGlmICghc2hvdWxkQ29lcmNlVG9TdHJpbmcgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm51bWJlclwiKSByZXR1cm4gZW50cnlcblxuICAgICAgcmV0dXJuIFN0cmluZyhlbnRyeSlcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS5tYXAoKGVudHJ5KSA9PiBub3JtYWxpemUoZW50cnkpKS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gTk9fTUFUQ0gpXG5cbiAgICAgIGlmIChpc1V1aWRUeXBlICYmIG5vcm1hbGl6ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gTk9fTUFUQ0hcblxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplKHZhbHVlKVxuXG4gICAgaWYgKG5vcm1hbGl6ZWQgPT09IE5PX01BVENIKSByZXR1cm4gTk9fTUFUQ0hcblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aGVyZSBzcWxmcm9tIGhhc2guXG4gICAqIEBwYXJhbSB7V2hlcmVIYXNofSBoYXNoIC0gSGFzaC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIEpvaW4gcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0YWJsZU5hbWVdIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gSW5kZXggdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIF93aGVyZVNRTEZyb21IYXNoKGhhc2gsIG1vZGVsQ2xhc3MsIHBhdGgsIHRhYmxlTmFtZSwgaW5kZXggPSAwKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpXG4gICAgY29uc3QgbW9kZWxRdWVyeSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5xdWVyeSlcbiAgICBsZXQgc3FsID0gXCJcIlxuXG4gICAgZm9yIChjb25zdCB3aGVyZUtleSBpbiBoYXNoKSB7XG4gICAgICBjb25zdCB3aGVyZVZhbHVlID0gaGFzaFt3aGVyZUtleV1cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHRoaXMuX2dldFJlbGF0aW9uc2hpcChtb2RlbENsYXNzLCB3aGVyZUtleSlcbiAgICAgIGNvbnN0IHR1cGxlcyA9IHRoaXMuX2lzUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvclR1cGxlQ29udGFpbmVyKHdoZXJlVmFsdWUpXG4gICAgICAgID8gdGhpcy5fbm9ybWFsaXplUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvclR1cGxlcyh3aGVyZVZhbHVlKVxuICAgICAgICA6IG51bGxcbiAgICAgIGNvbnN0IHJlc29sdmVkQ29sdW1uTmFtZSA9IHRoaXMuX3Jlc29sdmVDb2x1bW5OYW1lKG1vZGVsQ2xhc3MsIHdoZXJlS2V5KVxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwICYmIHR1cGxlcykge1xuICAgICAgICBpZiAoaW5kZXggPiAwKSBzcWwgKz0gXCIgQU5EIFwiXG5cbiAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgICAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgUmVsYXRpb25zaGlwIFwiJHt3aGVyZUtleX1cIiBmb3IgJHttb2RlbENsYXNzLm5hbWV9IGhhcyBubyB0YXJnZXQgbW9kZWwgY2xhc3NgKVxuXG4gICAgICAgIGNvbnN0IG5lc3RlZFBhdGggPSBwYXRoLmNvbmNhdChbd2hlcmVLZXldKVxuICAgICAgICBjb25zdCBuZXN0ZWRUYWJsZU5hbWUgPSBtb2RlbFF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbiguLi5uZXN0ZWRQYXRoKVxuXG4gICAgICAgIHNxbCArPSB0aGlzLl93aGVyZVNRTEZyb21SZWxhdGlvbnNoaXBXaGVyZU9wZXJhdG9yVHVwbGVzKHtcbiAgICAgICAgICBtb2RlbENsYXNzOiB0YXJnZXRNb2RlbENsYXNzLFxuICAgICAgICAgIHRhYmxlTmFtZTogbmVzdGVkVGFibGVOYW1lLFxuICAgICAgICAgIHR1cGxlc1xuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChyZXNvbHZlZENvbHVtbk5hbWUgJiYgdHVwbGVzKSB7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHNxbCArPSBcIiBBTkQgXCJcblxuICAgICAgICBzcWwgKz0gdGhpcy5fd2hlcmVTUUxGcm9tUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvclR1cGxlcyh7XG4gICAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgICB0YWJsZU5hbWU6IHRhYmxlTmFtZSB8fCBtb2RlbFF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbiguLi5wYXRoKSxcbiAgICAgICAgICB0dXBsZXNcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh3aGVyZVZhbHVlKSAmJiB3aGVyZVZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAoaW5kZXggPiAwKSBzcWwgKz0gXCIgQU5EIFwiXG4gICAgICAgIHNxbCArPSBcIjE9MFwiXG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qod2hlcmVWYWx1ZSkpIHtcbiAgICAgICAgaWYgKCFyZWxhdGlvbnNoaXApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVsYXRpb25zaGlwIFwiJHt3aGVyZUtleX1cIiBmb3IgJHttb2RlbENsYXNzLm5hbWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICAgICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSB0aHJvdyBuZXcgRXJyb3IoYFJlbGF0aW9uc2hpcCBcIiR7d2hlcmVLZXl9XCIgZm9yICR7bW9kZWxDbGFzcy5uYW1lfSBoYXMgbm8gdGFyZ2V0IG1vZGVsIGNsYXNzYClcblxuICAgICAgICBjb25zdCBuZXN0ZWRIYXNoID0gLyoqIEB0eXBlIHtXaGVyZUhhc2h9ICovICh3aGVyZVZhbHVlKVxuICAgICAgICBjb25zdCBuZXN0ZWRQYXRoID0gcGF0aC5jb25jYXQoW3doZXJlS2V5XSlcbiAgICAgICAgY29uc3QgbmVzdGVkVGFibGVOYW1lID0gbW9kZWxRdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oLi4ubmVzdGVkUGF0aClcblxuICAgICAgICBzcWwgKz0gdGhpcy5fd2hlcmVTUUxGcm9tSGFzaChuZXN0ZWRIYXNoLCB0YXJnZXRNb2RlbENsYXNzLCBuZXN0ZWRQYXRoLCBuZXN0ZWRUYWJsZU5hbWUsIGluZGV4KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGluZGV4ID4gMCkgc3FsICs9IFwiIEFORCBcIlxuXG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLl9yZXNvbHZlQ29sdW1uTmFtZShtb2RlbENsYXNzLCB3aGVyZUtleSlcblxuICAgICAgICBpZiAoIWNvbHVtbk5hbWUpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhdHRyaWJ1dGUgXCIke3doZXJlS2V5fVwiIGZvciAke21vZGVsQ2xhc3MubmFtZX1gKVxuXG4gICAgICAgIGNvbnN0IGNvbHVtblR5cGUgPSBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUoY29sdW1uTmFtZSlcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSB0aGlzLl9ub3JtYWxpemVTcWxpdGVCb29sZWFuVmFsdWUoe1xuICAgICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgICB2YWx1ZTogd2hlcmVWYWx1ZVxuICAgICAgICB9KVxuICAgICAgICBjb25zdCB0eXBlZFZhbHVlID0gdGhpcy5fbm9ybWFsaXplVmFsdWVGb3JDb2x1bW5UeXBlKHtcbiAgICAgICAgICBjb2x1bW5OYW1lLFxuICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0eXBlZFZhbHVlID09PSBOT19NQVRDSCkge1xuICAgICAgICAgIHNxbCArPSBcIjE9MFwiXG4gICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29sdW1uU3FsID0gYCR7b3B0aW9ucy5xdW90ZUNvbHVtbk5hbWUoY29sdW1uTmFtZSl9YFxuXG4gICAgICAgIGlmICh0YWJsZU5hbWUpIHtcbiAgICAgICAgICBjb2x1bW5TcWwgPSBgJHtvcHRpb25zLnF1b3RlVGFibGVOYW1lKHRhYmxlTmFtZSl9LiR7Y29sdW1uU3FsfWBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRyaXZlclR5cGUgPSB0aGlzLmdldFF1ZXJ5KCkuZHJpdmVyLmdldFR5cGUoKVxuXG4gICAgICAgIGlmIChkcml2ZXJUeXBlID09IFwibXNzcWxcIiAmJiB0eXBlb2Ygd2hlcmVWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2x1bW5UeXBlPy50b0xvd2VyQ2FzZSgpID09IFwidGV4dFwiKSB7XG4gICAgICAgICAgY29sdW1uU3FsID0gYENBU1QoJHtjb2x1bW5TcWx9IEFTIE5WQVJDSEFSKE1BWCkpYFxuICAgICAgICB9XG5cbiAgICAgICAgc3FsICs9IGNvbHVtblNxbFxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGVkVmFsdWUpKSB7XG4gICAgICAgICAgc3FsICs9IGAgSU4gKCR7dHlwZWRWYWx1ZS5tYXAoKHZhbHVlKSA9PiBvcHRpb25zLnF1b3RlKHZhbHVlKSkuam9pbihcIiwgXCIpfSlgXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZWRWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHNxbCArPSBcIiBJUyBOVUxMXCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcWwgKz0gYCA9ICR7b3B0aW9ucy5xdW90ZSh0eXBlZFZhbHVlKX1gXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaW5kZXgrK1xuICAgIH1cblxuICAgIHJldHVybiBzcWxcbiAgfVxufVxuIl19
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUtbW9kZWwtY2xhc3MtaGFzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS93aGVyZS1tb2RlbC1jbGFzcy1oYXNoLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDN0MsT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUE7QUFFdkM7OztHQUdHO0FBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBQ25DLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUVySDs7OztHQUlHO0FBQ0gsU0FBUyxrQ0FBa0MsQ0FBQyxRQUFRO0lBQ2xELE1BQU0sZUFBZSxHQUFHO1FBQ3RCLEdBQUcsRUFBRSxJQUFJO1FBQ1QsSUFBSSxFQUFFLE1BQU07UUFDWixHQUFHLEVBQUUsSUFBSTtRQUNULElBQUksRUFBRSxNQUFNO0tBQ2IsQ0FBQTtJQUVELE9BQU8sc0VBQXNFLENBQUMsQ0FDNUUsZUFBZSxFQUFDLHNDQUF1QyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUMvRSxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8seUNBQTBDLFNBQVEsU0FBUztJQUM5RTs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixHQUFHLEtBQUssRUFBQztRQUM3RCxLQUFLLEVBQUUsQ0FBQTtRQUNQ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UUFBUSxJQUFJLFVBQVUsRUFBRSxXQUFXLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDbkcsU0FBUyxHQUFHLFFBQVEsU0FBUyxvQkFBb0IsQ0FBQTtnQkFDbkQsQ0FBQztnQkFFRCxHQUFHLElBQUksU0FBUyxDQUFBO2dCQUVoQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsR0FBRyxJQUFJLFFBQVEsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFBO2dCQUM5RSxDQUFDO3FCQUFNLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUMvQixHQUFHLElBQUksVUFBVSxDQUFBO2dCQUNuQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sR0FBRyxJQUFJLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFBO2dCQUMxQyxDQUFDO1lBQ0gsQ0FBQztZQUVELEtBQUssRUFBRSxDQUFBO1FBQ1QsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tIFwiaXMtcGxhaW4tb2JqZWN0XCJcbmltcG9ydCBXaGVyZUJhc2UgZnJvbSBcIi4vd2hlcmUtYmFzZS5qc1wiXG5cbi8qKlxuICogTm8gbWF0Y2guXG4gKiBAdHlwZWRlZiB7e1trZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw+IHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gV2hlcmVIYXNoXG4gKi9cblxuY29uc3QgTk9fTUFUQ0ggPSBTeW1ib2woXCJuby1tYXRjaFwiKVxuY29uc3QgcmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvcnMgPSBuZXcgU2V0KFtcImVxXCIsIFwibm90RXFcIiwgXCJndFwiLCBcImd0ZXFcIiwgXCJsdFwiLCBcImx0ZXFcIiwgXCJsaWtlXCIsIFwiPlwiLCBcIj49XCIsIFwiPFwiLCBcIjw9XCJdKVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHJlbGF0aW9uc2hpcCB3aGVyZSBvcGVyYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIFJhdyByZWxhdGlvbnNoaXAgd2hlcmUgb3BlcmF0b3IuXG4gKiBAcmV0dXJucyB7XCJlcVwiIHwgXCJub3RFcVwiIHwgXCJndFwiIHwgXCJndGVxXCIgfCBcImx0XCIgfCBcImx0ZXFcIiB8IFwibGlrZVwifSAtIE5vcm1hbGl6ZWQgb3BlcmF0b3IuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlbGF0aW9uc2hpcFdoZXJlT3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgY29uc3Qgb3BlcmF0b3JBbGlhc2VzID0ge1xuICAgIFwiPFwiOiBcImx0XCIsXG4gICAgXCI8PVwiOiBcImx0ZXFcIixcbiAgICBcIj5cIjogXCJndFwiLFxuICAgIFwiPj1cIjogXCJndGVxXCJcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge1wiZXFcIiB8IFwibm90RXFcIiB8IFwiZ3RcIiB8IFwiZ3RlcVwiIHwgXCJsdFwiIHwgXCJsdGVxXCIgfCBcImxpa2VcIn0gKi8gKFxuICAgIG9wZXJhdG9yQWxpYXNlc1svKiogQHR5cGUge1wiPFwiIHwgXCI8PVwiIHwgXCI+XCIgfCBcIj49XCJ9ICovIChvcGVyYXRvcildIHx8IG9wZXJhdG9yXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VRdWVyeVdoZXJlTW9kZWxDbGFzc0hhc2ggZXh0ZW5kcyBXaGVyZUJhc2Uge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtXaGVyZUhhc2h9IGFyZ3MuaGFzaCAtIEhhc2guXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5xdWFsaWZ5QmFzZVRhYmxlXSAtIFdoZXRoZXIgdG8gcXVhbGlmeSBiYXNlIHRhYmxlIGNvbHVtbnMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7cXVlcnksIGhhc2gsIG1vZGVsQ2xhc3MsIHF1YWxpZnlCYXNlVGFibGUgPSBmYWxzZX0pIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5oYXNoID0gaGFzaFxuICAgIHRoaXMubW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcbiAgICB0aGlzLnF1YWxpZnlCYXNlVGFibGUgPSBxdWFsaWZ5QmFzZVRhYmxlXG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5XG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IC0gVGhlIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgZ2V0TW9kZWxDbGFzcygpIHtcbiAgICBpZiAoIXRoaXMubW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKFwibW9kZWxDbGFzcyBub3Qgc2V0XCIpXG5cbiAgICByZXR1cm4gdGhpcy5tb2RlbENsYXNzXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBzcWwuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIHRvU3FsKCkge1xuICAgIGxldCBzcWwgPSBcIihcIlxuXG4gICAgY29uc3QgbW9kZWxRdWVyeSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5xdWVyeSlcbiAgICBjb25zdCBiYXNlVGFibGVOYW1lID0gdGhpcy5xdWFsaWZ5QmFzZVRhYmxlXG4gICAgICA/IG1vZGVsUXVlcnkuZ2V0VGFibGVSZWZlcmVuY2VGb3JKb2luKClcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBzcWwgKz0gdGhpcy5fd2hlcmVTUUxGcm9tSGFzaCh0aGlzLmhhc2gsIHRoaXMuZ2V0TW9kZWxDbGFzcygpLCBbXSwgYmFzZVRhYmxlTmFtZSlcbiAgICBzcWwgKz0gXCIpXCJcblxuICAgIHJldHVybiBzcWxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgY29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBBdHRyaWJ1dGUgb3IgY29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIHJlc29sdmVkIGNvbHVtbiBuYW1lLlxuICAgKi9cbiAgX3Jlc29sdmVDb2x1bW5OYW1lKG1vZGVsQ2xhc3MsIGtleSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU1hcCA9IG1vZGVsQ2xhc3MuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpXG5cbiAgICBpZiAoYXR0cmlidXRlTWFwW2tleV0pIHJldHVybiBhdHRyaWJ1dGVNYXBba2V5XVxuXG4gICAgY29uc3QgY29sdW1uTWFwID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwKClcbiAgICBjb25zdCB1bmRlcnNjb3JlZCA9IGluZmxlY3Rpb24udW5kZXJzY29yZShrZXkpXG5cbiAgICBpZiAoY29sdW1uTWFwW2tleV0pIHJldHVybiBrZXlcbiAgICBpZiAoY29sdW1uTWFwW3VuZGVyc2NvcmVkXSkgcmV0dXJuIHVuZGVyc2NvcmVkXG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgcmVsYXRpb25zaGlwLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vcmVjb3JkL3JlbGF0aW9uc2hpcHMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFRoZSByZWxhdGlvbnNoaXAuXG4gICAqL1xuICBfZ2V0UmVsYXRpb25zaGlwKG1vZGVsQ2xhc3MsIHJlbGF0aW9uc2hpcE5hbWUpIHtcbiAgICByZXR1cm4gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBzTWFwKClbcmVsYXRpb25zaGlwTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIHJlbGF0aW9uc2hpcCB3aGVyZSBvcGVyYXRvciB0dXBsZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdHVwbGVWYWx1ZSAtIENhbmRpZGF0ZSB0dXBsZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGlzIGlzIGEgcmVsYXRpb25zaGlwIHdoZXJlIHR1cGxlLlxuICAgKi9cbiAgX2lzUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvclR1cGxlKHR1cGxlVmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodHVwbGVWYWx1ZSkgfHwgdHVwbGVWYWx1ZS5sZW5ndGggPCAzKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIHR1cGxlVmFsdWVbMF0gPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIHR5cGVvZiB0dXBsZVZhbHVlWzFdID09PSBcInN0cmluZ1wiICYmXG4gICAgICByZWxhdGlvbnNoaXBXaGVyZU9wZXJhdG9ycy5oYXModHVwbGVWYWx1ZVsxXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG5vcm1hbGl6ZSByZWxhdGlvbnNoaXAgd2hlcmUgb3BlcmF0b3IgdHVwbGVzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIENhbmRpZGF0ZSByZWxhdGlvbnNoaXAgd2hlcmUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtBcnJheTxbc3RyaW5nLCBcImVxXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCJsaWtlXCIsIHVua25vd25dPn0gLSBOb3JtYWxpemVkIHR1cGxlcy5cbiAgICovXG4gIF9ub3JtYWxpemVSZWxhdGlvbnNoaXBXaGVyZU9wZXJhdG9yVHVwbGVzKHZhbHVlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlbGF0aW9uc2hpcCB3aGVyZSB0dXBsZSBjb250YWluZXIgdHlwZTogJHt0eXBlb2YgdmFsdWV9YClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxbc3RyaW5nLCBcImVxXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCJsaWtlXCIsIHVua25vd25dPn0gKi9cbiAgICBjb25zdCBub3JtYWxpemVkID0gW11cbiAgICAvKipcbiAgICAgKiBBZGQgY29uZGl0aW9uLlxuICAgICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGNvbmRpdGlvblZhbHVlIC0gQ2FuZGlkYXRlIG5lc3RlZCBjb25kaXRpb24uXG4gICAgICovXG4gICAgY29uc3QgYWRkQ29uZGl0aW9uID0gKGNvbmRpdGlvblZhbHVlKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNSZWxhdGlvbnNoaXBXaGVyZU9wZXJhdG9yVHVwbGUoY29uZGl0aW9uVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHR1cGxlID0gLyoqIEB0eXBlIHtbc3RyaW5nLCBcImVxXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCJsaWtlXCIgfCBcIj5cIiB8IFwiPj1cIiB8IFwiPFwiIHwgXCI8PVwiLCB1bmtub3duLCAuLi5BcnJheTx1bmtub3duPl19ICovIChjb25kaXRpb25WYWx1ZSlcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE9wZXJhdG9yID0gbm9ybWFsaXplUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvcih0dXBsZVsxXSlcblxuICAgICAgICBub3JtYWxpemVkLnB1c2goW1xuICAgICAgICAgIHR1cGxlWzBdLFxuICAgICAgICAgIG5vcm1hbGl6ZWRPcGVyYXRvcixcbiAgICAgICAgICB0dXBsZVsyXVxuICAgICAgICBdKVxuXG4gICAgICAgIGlmICh0dXBsZS5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAzOyBpbmRleCA8IHR1cGxlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgICAgYWRkQ29uZGl0aW9uKHR1cGxlW2luZGV4XSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmRpdGlvblZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWxhdGlvbnNoaXAgd2hlcmUgY29uZGl0aW9ucyBtdXN0IGJlIHR1cGxlc1wiKVxuICAgICAgfVxuXG4gICAgICBjb25kaXRpb25WYWx1ZS5mb3JFYWNoKChuZXN0ZWRDb25kaXRpb25WYWx1ZSkgPT4ge1xuICAgICAgICBhZGRDb25kaXRpb24obmVzdGVkQ29uZGl0aW9uVmFsdWUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGFkZENvbmRpdGlvbih2YWx1ZSlcblxuICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlbGF0aW9uc2hpcCB3aGVyZSB0dXBsZSBjb250YWluZXIgY2Fubm90IGJlIGVtcHR5XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIHJlbGF0aW9uc2hpcCB3aGVyZSBvcGVyYXRvciB0dXBsZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIHJlbGF0aW9uc2hpcCB3aGVyZSB2YWx1ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZSBjYW4gYmUgbm9ybWFsaXplZCB0byByZWxhdGlvbnNoaXAgdHVwbGVzLlxuICAgKi9cbiAgX2lzUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvclR1cGxlQ29udGFpbmVyKHZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX25vcm1hbGl6ZVJlbGF0aW9uc2hpcFdoZXJlT3BlcmF0b3JUdXBsZXModmFsdWUpXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aGVyZSBzcWxmcm9tIHJlbGF0aW9uc2hpcCB3aGVyZSBvcGVyYXRvciB0dXBsZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVsYXRpb25zaGlwIHdoZXJlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBSZWxhdGlvbnNoaXAgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhYmxlTmFtZSAtIFJlbGF0aW9uc2hpcCB0YWJsZSByZWZlcmVuY2UgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTxbc3RyaW5nLCBcImVxXCIgfCBcIm5vdEVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCJsaWtlXCIsIHVua25vd25dPn0gYXJncy50dXBsZXMgLSBPcGVyYXRvciB0dXBsZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHdoZXJlIGZyYWdtZW50LlxuICAgKi9cbiAgX3doZXJlU1FMRnJvbVJlbGF0aW9uc2hpcFdoZXJlT3BlcmF0b3JUdXBsZXMoe21vZGVsQ2xhc3MsIHRhYmxlTmFtZSwgdHVwbGVzfSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKVxuICAgIGxldCBzcWwgPSBcIlwiXG4gICAgbGV0IGluZGV4ID0gMFxuXG4gICAgdHVwbGVzLmZvckVhY2goKFthdHRyaWJ1dGVOYW1lLCBvcGVyYXRvciwgd2hlcmVWYWx1ZV0pID0+IHtcbiAgICAgIGlmIChpbmRleCA+IDApIHNxbCArPSBcIiBBTkQgXCJcblxuICAgICAgY29uc3QgY29sdW1uTmFtZSA9IHRoaXMuX3Jlc29sdmVDb2x1bW5OYW1lKG1vZGVsQ2xhc3MsIGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAgIGlmICghY29sdW1uTmFtZSkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGF0dHJpYnV0ZSBcIiR7YXR0cmlidXRlTmFtZX1cIiBmb3IgJHttb2RlbENsYXNzLm5hbWV9YClcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdGhpcy5fbm9ybWFsaXplU3FsaXRlQm9vbGVhblZhbHVlKHtcbiAgICAgICAgY29sdW1uTmFtZSxcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgdmFsdWU6IHdoZXJlVmFsdWVcbiAgICAgIH0pXG4gICAgICBjb25zdCB0eXBlZFZhbHVlID0gdGhpcy5fbm9ybWFsaXplVmFsdWVGb3JDb2x1bW5UeXBlKHtcbiAgICAgICAgY29sdW1uTmFtZSxcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZVxuICAgICAgfSlcbiAgICAgIGNvbnN0IGNvbHVtblR5cGUgPSBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUoY29sdW1uTmFtZSlcbiAgICAgIGNvbnN0IGRyaXZlclR5cGUgPSB0aGlzLmdldFF1ZXJ5KCkuZHJpdmVyLmdldFR5cGUoKVxuXG4gICAgICBpZiAodHlwZWRWYWx1ZSA9PT0gTk9fTUFUQ0gpIHtcbiAgICAgICAgaWYgKG9wZXJhdG9yID09PSBcIm5vdEVxXCIpIHtcbiAgICAgICAgICBzcWwgKz0gXCIxPTFcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNxbCArPSBcIjE9MFwiXG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbGV0IGNvbHVtblNxbCA9IGAke29wdGlvbnMucXVvdGVUYWJsZU5hbWUodGFibGVOYW1lKX0uJHtvcHRpb25zLnF1b3RlQ29sdW1uTmFtZShjb2x1bW5OYW1lKX1gXG5cbiAgICAgIGlmIChkcml2ZXJUeXBlID09IFwibXNzcWxcIiAmJiB0eXBlb2Ygd2hlcmVWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2x1bW5UeXBlPy50b0xvd2VyQ2FzZSgpID09IFwidGV4dFwiKSB7XG4gICAgICAgIGNvbHVtblNxbCA9IGBDQVNUKCR7Y29sdW1uU3FsfSBBUyBOVkFSQ0hBUihNQVgpKWBcbiAgICAgIH1cblxuICAgICAgaWYgKG9wZXJhdG9yID09PSBcImVxXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZWRWYWx1ZSkpIHtcbiAgICAgICAgICBpZiAodHlwZWRWYWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICBzcWwgKz0gXCIxPTBcIlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcWwgKz0gYCR7Y29sdW1uU3FsfSBJTiAoJHt0eXBlZFZhbHVlLm1hcCgodmFsdWUpID0+IG9wdGlvbnMucXVvdGUodmFsdWUpKS5qb2luKFwiLCBcIil9KWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZWRWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHNxbCArPSBgJHtjb2x1bW5TcWx9IElTIE5VTExgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3FsICs9IGAke2NvbHVtblNxbH0gPSAke29wdGlvbnMucXVvdGUodHlwZWRWYWx1ZSl9YFxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKG9wZXJhdG9yID09PSBcIm5vdEVxXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZWRWYWx1ZSkpIHtcbiAgICAgICAgICBpZiAodHlwZWRWYWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICBzcWwgKz0gXCIxPTFcIlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcWwgKz0gYCR7Y29sdW1uU3FsfSBOT1QgSU4gKCR7dHlwZWRWYWx1ZS5tYXAoKHZhbHVlKSA9PiBvcHRpb25zLnF1b3RlKHZhbHVlKSkuam9pbihcIiwgXCIpfSlgXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVkVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBzcWwgKz0gYCR7Y29sdW1uU3FsfSBJUyBOT1QgTlVMTGBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcWwgKz0gYCR7Y29sdW1uU3FsfSAhPSAke29wdGlvbnMucXVvdGUodHlwZWRWYWx1ZSl9YFxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZWRWYWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciBcIiR7b3BlcmF0b3J9XCIgZG9lcyBub3Qgc3VwcG9ydCBhcnJheSB2YWx1ZXMgZm9yICR7bW9kZWxDbGFzcy5uYW1lfS4ke2F0dHJpYnV0ZU5hbWV9YClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVkVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciBcIiR7b3BlcmF0b3J9XCIgZG9lcyBub3Qgc3VwcG9ydCBudWxsIHZhbHVlcyBmb3IgJHttb2RlbENsYXNzLm5hbWV9LiR7YXR0cmlidXRlTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvcGVyYXRvck1hcCA9IHtcbiAgICAgICAgZ3Q6IFwiPlwiLFxuICAgICAgICBndGVxOiBcIj49XCIsXG4gICAgICAgIGxpa2U6IFwiTElLRVwiLFxuICAgICAgICBsdDogXCI8XCIsXG4gICAgICAgIGx0ZXE6IFwiPD1cIlxuICAgICAgfVxuXG4gICAgICBzcWwgKz0gYCR7Y29sdW1uU3FsfSAke29wZXJhdG9yTWFwW29wZXJhdG9yXX0gJHtvcHRpb25zLnF1b3RlKHR5cGVkVmFsdWUpfWBcbiAgICAgIGluZGV4ICs9IDFcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNxbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbm9ybWFsaXplIHNxbGl0ZSBib29sZWFuIHZhbHVlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy52YWx1ZSAtIFZhbHVlIHRvIG5vcm1hbGl6ZS5cbiAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIE5vcm1hbGl6ZWQgdmFsdWUuXG4gICAqL1xuICBfbm9ybWFsaXplU3FsaXRlQm9vbGVhblZhbHVlKHttb2RlbENsYXNzLCBjb2x1bW5OYW1lLCB2YWx1ZX0pIHtcbiAgICBpZiAobW9kZWxDbGFzcy5nZXREYXRhYmFzZVR5cGUoKSAhPSBcInNxbGl0ZVwiKSByZXR1cm4gdmFsdWVcblxuICAgIGNvbnN0IGNvbHVtblR5cGUgPSBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUoY29sdW1uTmFtZSlcblxuICAgIGlmICghY29sdW1uVHlwZSkgcmV0dXJuIHZhbHVlXG4gICAgaWYgKGNvbHVtblR5cGUudG9Mb3dlckNhc2UoKSAhPT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplLlxuICAgICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGVudHJ5IC0gVmFsdWUgdG8gbm9ybWFsaXplLlxuICAgICAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBTUUxpdGUgcHJlZGljYXRlIHZhbHVlIHdpdGggYm9vbGVhbnMgZW5jb2RlZCBhcyAxIG9yIDAuXG4gICAgICovXG4gICAgY29uc3Qgbm9ybWFsaXplID0gKGVudHJ5KSA9PiB7XG4gICAgICBpZiAoZW50cnkgPT09IHRydWUpIHJldHVybiAxXG4gICAgICBpZiAoZW50cnkgPT09IGZhbHNlKSByZXR1cm4gMFxuICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKChlbnRyeSkgPT4gbm9ybWFsaXplKGVudHJ5KSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplKHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbm9ybWFsaXplIHZhbHVlIGZvciBjb2x1bW4gdHlwZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MudmFsdWUgLSBWYWx1ZSB0byBub3JtYWxpemUuXG4gICAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBOb3JtYWxpemVkIHZhbHVlLlxuICAgKi9cbiAgX25vcm1hbGl6ZVZhbHVlRm9yQ29sdW1uVHlwZSh7bW9kZWxDbGFzcywgY29sdW1uTmFtZSwgdmFsdWV9KSB7XG4gICAgY29uc3QgY29sdW1uVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgaWYgKCFjb2x1bW5UeXBlKSByZXR1cm4gdmFsdWVcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gY29sdW1uVHlwZS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3Qgc3RyaW5nVHlwZXMgPSBuZXcgU2V0KFtcImNoYXJcIiwgXCJ2YXJjaGFyXCIsIFwibnZhcmNoYXJcIiwgXCJzdHJpbmdcIiwgXCJlbnVtXCIsIFwianNvblwiLCBcImpzb25iXCIsIFwiY2l0ZXh0XCIsIFwiYmluYXJ5XCIsIFwidmFyYmluYXJ5XCJdKVxuICAgIGNvbnN0IGlzVXVpZFR5cGUgPSBub3JtYWxpemVkVHlwZS5pbmNsdWRlcyhcInV1aWRcIilcbiAgICBjb25zdCBzaG91bGRDb2VyY2VUb1N0cmluZyA9IG5vcm1hbGl6ZWRUeXBlLmluY2x1ZGVzKFwidXVpZFwiKSB8fFxuICAgICAgbm9ybWFsaXplZFR5cGUuaW5jbHVkZXMoXCJ0ZXh0XCIpIHx8XG4gICAgICBzdHJpbmdUeXBlcy5oYXMobm9ybWFsaXplZFR5cGUpXG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUuXG4gICAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gZW50cnkgLSBWYWx1ZSB0byBub3JtYWxpemUuXG4gICAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIENvbHVtbi1jb21wYXRpYmxlIHByZWRpY2F0ZSB2YWx1ZSwgb3IgdGhlIG5vLW1hdGNoIHNlbnRpbmVsIGZvciBudW1lcmljIFVVSURzLlxuICAgICAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZSA9IChlbnRyeSkgPT4ge1xuICAgICAgaWYgKGlzVXVpZFR5cGUgJiYgdHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSByZXR1cm4gTk9fTUFUQ0hcbiAgICAgIGlmICghc2hvdWxkQ29lcmNlVG9TdHJpbmcgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm51bWJlclwiKSByZXR1cm4gZW50cnlcblxuICAgICAgcmV0dXJuIFN0cmluZyhlbnRyeSlcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS5tYXAoKGVudHJ5KSA9PiBub3JtYWxpemUoZW50cnkpKS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gTk9fTUFUQ0gpXG5cbiAgICAgIGlmIChpc1V1aWRUeXBlICYmIG5vcm1hbGl6ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gTk9fTUFUQ0hcblxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplKHZhbHVlKVxuXG4gICAgaWYgKG5vcm1hbGl6ZWQgPT09IE5PX01BVENIKSByZXR1cm4gTk9fTUFUQ0hcblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aGVyZSBzcWxmcm9tIGhhc2guXG4gICAqIEBwYXJhbSB7V2hlcmVIYXNofSBoYXNoIC0gSGFzaC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIEpvaW4gcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0YWJsZU5hbWVdIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gSW5kZXggdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIF93aGVyZVNRTEZyb21IYXNoKGhhc2gsIG1vZGVsQ2xhc3MsIHBhdGgsIHRhYmxlTmFtZSwgaW5kZXggPSAwKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpXG4gICAgY29uc3QgbW9kZWxRdWVyeSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5xdWVyeSlcbiAgICBsZXQgc3FsID0gXCJcIlxuXG4gICAgZm9yIChjb25zdCB3aGVyZUtleSBpbiBoYXNoKSB7XG4gICAgICBjb25zdCB3aGVyZVZhbHVlID0gaGFzaFt3aGVyZUtleV1cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHRoaXMuX2dldFJlbGF0aW9uc2hpcChtb2RlbENsYXNzLCB3aGVyZUtleSlcbiAgICAgIGNvbnN0IHR1cGxlcyA9IHRoaXMuX2lzUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvclR1cGxlQ29udGFpbmVyKHdoZXJlVmFsdWUpXG4gICAgICAgID8gdGhpcy5fbm9ybWFsaXplUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvclR1cGxlcyh3aGVyZVZhbHVlKVxuICAgICAgICA6IG51bGxcbiAgICAgIGNvbnN0IHJlc29sdmVkQ29sdW1uTmFtZSA9IHRoaXMuX3Jlc29sdmVDb2x1bW5OYW1lKG1vZGVsQ2xhc3MsIHdoZXJlS2V5KVxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwICYmIHR1cGxlcykge1xuICAgICAgICBpZiAoaW5kZXggPiAwKSBzcWwgKz0gXCIgQU5EIFwiXG5cbiAgICAgICAgY29uc3QgcmF3VGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgICAgICBpZiAoIXJhd1RhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgUmVsYXRpb25zaGlwIFwiJHt3aGVyZUtleX1cIiBmb3IgJHttb2RlbENsYXNzLm5hbWV9IGhhcyBubyB0YXJnZXQgbW9kZWwgY2xhc3NgKVxuXG4gICAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzLmJpbmRSZWNvcmRNZXRhZGF0YU1vZGVsQ2xhc3MocmF3VGFyZ2V0TW9kZWxDbGFzcylcblxuICAgICAgICBjb25zdCBuZXN0ZWRQYXRoID0gcGF0aC5jb25jYXQoW3doZXJlS2V5XSlcbiAgICAgICAgY29uc3QgbmVzdGVkVGFibGVOYW1lID0gbW9kZWxRdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oLi4ubmVzdGVkUGF0aClcblxuICAgICAgICBzcWwgKz0gdGhpcy5fd2hlcmVTUUxGcm9tUmVsYXRpb25zaGlwV2hlcmVPcGVyYXRvclR1cGxlcyh7XG4gICAgICAgICAgbW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcyxcbiAgICAgICAgICB0YWJsZU5hbWU6IG5lc3RlZFRhYmxlTmFtZSxcbiAgICAgICAgICB0dXBsZXNcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZWRDb2x1bW5OYW1lICYmIHR1cGxlcykge1xuICAgICAgICBpZiAoaW5kZXggPiAwKSBzcWwgKz0gXCIgQU5EIFwiXG5cbiAgICAgICAgc3FsICs9IHRoaXMuX3doZXJlU1FMRnJvbVJlbGF0aW9uc2hpcFdoZXJlT3BlcmF0b3JUdXBsZXMoe1xuICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgdGFibGVOYW1lOiB0YWJsZU5hbWUgfHwgbW9kZWxRdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oLi4ucGF0aCksXG4gICAgICAgICAgdHVwbGVzXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkod2hlcmVWYWx1ZSkgJiYgd2hlcmVWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKGluZGV4ID4gMCkgc3FsICs9IFwiIEFORCBcIlxuICAgICAgICBzcWwgKz0gXCIxPTBcIlxuICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHdoZXJlVmFsdWUpKSB7XG4gICAgICAgIGlmICghcmVsYXRpb25zaGlwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJlbGF0aW9uc2hpcCBcIiR7d2hlcmVLZXl9XCIgZm9yICR7bW9kZWxDbGFzcy5uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXdUYXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICAgIGlmICghcmF3VGFyZ2V0TW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKGBSZWxhdGlvbnNoaXAgXCIke3doZXJlS2V5fVwiIGZvciAke21vZGVsQ2xhc3MubmFtZX0gaGFzIG5vIHRhcmdldCBtb2RlbCBjbGFzc2ApXG5cbiAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3MuYmluZFJlY29yZE1ldGFkYXRhTW9kZWxDbGFzcyhyYXdUYXJnZXRNb2RlbENsYXNzKVxuXG4gICAgICAgIGNvbnN0IG5lc3RlZEhhc2ggPSAvKiogQHR5cGUge1doZXJlSGFzaH0gKi8gKHdoZXJlVmFsdWUpXG4gICAgICAgIGNvbnN0IG5lc3RlZFBhdGggPSBwYXRoLmNvbmNhdChbd2hlcmVLZXldKVxuICAgICAgICBjb25zdCBuZXN0ZWRUYWJsZU5hbWUgPSBtb2RlbFF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbiguLi5uZXN0ZWRQYXRoKVxuXG4gICAgICAgIHNxbCArPSB0aGlzLl93aGVyZVNRTEZyb21IYXNoKG5lc3RlZEhhc2gsIHRhcmdldE1vZGVsQ2xhc3MsIG5lc3RlZFBhdGgsIG5lc3RlZFRhYmxlTmFtZSwgaW5kZXgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5kZXggPiAwKSBzcWwgKz0gXCIgQU5EIFwiXG5cbiAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IHRoaXMuX3Jlc29sdmVDb2x1bW5OYW1lKG1vZGVsQ2xhc3MsIHdoZXJlS2V5KVxuXG4gICAgICAgIGlmICghY29sdW1uTmFtZSkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGF0dHJpYnV0ZSBcIiR7d2hlcmVLZXl9XCIgZm9yICR7bW9kZWxDbGFzcy5uYW1lfWApXG5cbiAgICAgICAgY29uc3QgY29sdW1uVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHRoaXMuX25vcm1hbGl6ZVNxbGl0ZUJvb2xlYW5WYWx1ZSh7XG4gICAgICAgICAgY29sdW1uTmFtZSxcbiAgICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICAgIHZhbHVlOiB3aGVyZVZhbHVlXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHR5cGVkVmFsdWUgPSB0aGlzLl9ub3JtYWxpemVWYWx1ZUZvckNvbHVtblR5cGUoe1xuICAgICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgICB2YWx1ZTogbm9ybWFsaXplZFZhbHVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT09IE5PX01BVENIKSB7XG4gICAgICAgICAgc3FsICs9IFwiMT0wXCJcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb2x1bW5TcWwgPSBgJHtvcHRpb25zLnF1b3RlQ29sdW1uTmFtZShjb2x1bW5OYW1lKX1gXG5cbiAgICAgICAgaWYgKHRhYmxlTmFtZSkge1xuICAgICAgICAgIGNvbHVtblNxbCA9IGAke29wdGlvbnMucXVvdGVUYWJsZU5hbWUodGFibGVOYW1lKX0uJHtjb2x1bW5TcWx9YFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHJpdmVyVHlwZSA9IHRoaXMuZ2V0UXVlcnkoKS5kcml2ZXIuZ2V0VHlwZSgpXG5cbiAgICAgICAgaWYgKGRyaXZlclR5cGUgPT0gXCJtc3NxbFwiICYmIHR5cGVvZiB3aGVyZVZhbHVlID09PSBcInN0cmluZ1wiICYmIGNvbHVtblR5cGU/LnRvTG93ZXJDYXNlKCkgPT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICBjb2x1bW5TcWwgPSBgQ0FTVCgke2NvbHVtblNxbH0gQVMgTlZBUkNIQVIoTUFYKSlgXG4gICAgICAgIH1cblxuICAgICAgICBzcWwgKz0gY29sdW1uU3FsXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZWRWYWx1ZSkpIHtcbiAgICAgICAgICBzcWwgKz0gYCBJTiAoJHt0eXBlZFZhbHVlLm1hcCgodmFsdWUpID0+IG9wdGlvbnMucXVvdGUodmFsdWUpKS5qb2luKFwiLCBcIil9KWBcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlZFZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgc3FsICs9IFwiIElTIE5VTExcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNxbCArPSBgID0gJHtvcHRpb25zLnF1b3RlKHR5cGVkVmFsdWUpfWBcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpbmRleCsrXG4gICAgfVxuXG4gICAgcmV0dXJuIHNxbFxuICB9XG59XG4iXX0=