sliftutils 1.7.134 → 1.7.136

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliftutils",
3
- "version": "1.7.134",
3
+ "version": "1.7.136",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -99,8 +99,15 @@ async function ensureSourceRepo(repoURL) {
99
99
  }
100
100
  }
101
101
  /** Returns what changed, so the caller can report it. A rewritten history is called out
102
- separately - it means the remote no longer contains the commits we already had. */
103
- async function syncRepo(repoURL) {
102
+ separately - it means the remote no longer contains the commits we already had.
103
+
104
+ forceUpdate forces the working tree back to the remote even when the remote has not moved, which
105
+ is what heals a checkout left dirty - an edited or half-written file that no longer matches its
106
+ signature. It would be maddening to a developer editing the repo in place, since it stashes their
107
+ uncommitted work; but make sure nothing that answers this checkout is running on the machine you
108
+ edit on. If the checkout went dirty because a machine connection triggered a revocation, kill the
109
+ services on that machine before you touch the trusted machines, or they will just dirty it again. */
110
+ async function syncRepo(repoURL, options) {
104
111
  await ensureSourceRepo(repoURL);
105
112
  let repoPath = (0, sources_1.sourceRepoPath)(repoURL);
106
113
  let keyPath = await (0, sources_1.findSourceKey)(repoURL) || (0, sources_1.sourceKeyPath)(repoURL);
@@ -113,7 +120,7 @@ async function syncRepo(repoURL) {
113
120
  if (!remoteSha) {
114
121
  throw new Error(`Expected origin to report a sha for ${branch}, listed ${listing.slice(0, paths_1.MAX_ERROR_BODY_LENGTH)}`);
115
122
  }
116
- if (remoteSha === localSha && remoteSha === (0, state_1.sourceState)(repoURL).lastSha) {
123
+ if (!(options === null || options === void 0 ? void 0 : options.forceUpdate) && remoteSha === localSha && remoteSha === (0, state_1.sourceState)(repoURL).lastSha) {
117
124
  return { changed: false, historyRewritten: false, remoteSha, previousSha: localSha };
118
125
  }
119
126
  // The remote has moved, or we have not applied it yet, so force the checkout to it.
@@ -135,5 +142,5 @@ async function syncRepo(repoURL) {
135
142
  return { changed: true, historyRewritten, remoteSha, previousSha };
136
143
  }
137
144
  exports.syncRepo = syncRepo;
138
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJEQUE2QjtBQUM3QixnREFBd0I7QUFDeEIsK0NBQW1EO0FBQ25ELHdDQUEwRTtBQUMxRSxtQ0FBNkQ7QUFDN0QsbUNBQXNDO0FBRXRDLEtBQUssVUFBVSxVQUFVLENBQUMsUUFBZ0I7SUFDdEMsSUFBSSxDQUFDO1FBQ0QsTUFBTSxrQkFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNULE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDO0FBRUQsOEZBQThGO0FBQ3ZGLEtBQUssVUFBVSxNQUFNLENBQUMsTUFBaUY7SUFDMUcsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNsRCxJQUFJLFVBQVUsR0FBRyxVQUFVLE9BQU8sNkVBQTZFLENBQUM7SUFDaEgsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFBLG9CQUFZLEVBQUM7UUFDNUIsT0FBTyxFQUFFLEtBQUs7UUFDZCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLFVBQVUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3RELEdBQUc7UUFDSCxXQUFXLEVBQUUsbUJBQVc7S0FDM0IsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMs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QUFDO1FBQzNDLDBGQUEwRjtRQUMxRixrQ0FBa0M7UUFDbEMsSUFBSSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUM7WUFDeEIsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDO1lBQzdELEdBQUcsRUFBRSxRQUFRO1lBQ2IsT0FBTztZQUNQLFlBQVksRUFBRSxJQUFJO1NBQ3JCLENBQUMsQ0FBQztRQUNILGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFDdkUsQ0FBQztBQXBDRCw0QkFvQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgc3Bhd25Qcm9taXNlIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvc3Bhd25cIjtcbmltcG9ydCB7IGZpbmRTb3VyY2VLZXksIHNvdXJjZUtleVBhdGgsIHNvdXJjZVJlcG9QYXRoIH0gZnJvbSBcIi4uL3NvdXJjZXNcIjtcbmltcG9ydCB7IEdJVF9USU1FT1VULCBNQVhfRVJST1JfQk9EWV9MRU5HVEggfSBmcm9tIFwiLi9wYXRoc1wiO1xuaW1wb3J0IHsgc291cmNlU3RhdGUgfSBmcm9tIFwiLi9zdGF0ZVwiO1xuXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKiBjb3JlLnNzaENvbW1hbmQga2VlcHMgdGhlIGtleSBzZWxlY3Rpb24gd2l0aCB0aGUgY29tbWFuZCBpbnN0ZWFkIG9mIGluIHRoZSBlbnZpcm9ubWVudC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5HaXQoY29uZmlnOiB7IGFyZ3M6IHN0cmluZ1tdOyBjd2Q/OiBzdHJpbmc7IGtleVBhdGg6IHN0cmluZzsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbiB9KSB7XG4gICAgbGV0IHsgYXJncywgY3dkLCBrZXlQYXRoLCBhbGxvd0ZhaWx1cmUgfSA9IGNvbmZpZztcbiAgICBsZXQgc3NoQ29tbWFuZCA9IGBzc2ggLWkgJHtrZXlQYXRofSAtbyBJZGVudGl0aWVzT25seT15ZXMgLW8gQmF0Y2hNb2RlPXllcyAtbyBTdHJpY3RIb3N0S2V5Q2hlY2tpbmc9YWNjZXB0LW5ld2A7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHNwYXduUHJvbWlzZSh7XG4gICAgICAgIGNvbW1hbmQ6IFwiZ2l0XCIsXG4gICAgICAgIGFyZ3M6IFtcIi1jXCIsIGBjb3JlLnNzaENvbW1hbmQ9JHtzc2hDb21tYW5kfWAsIC4uLmFyZ3NdLFxuICAgICAgICBjd2QsXG4gICAgICAgIHRpbWVvdXRUaW1lOiBHSVRfVElNRU9VVCxcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZ2l0ICR7YXJncy5qb2luKFwiIFwiKX0gdG8gcnVuLCBmYWlsZWQgd2l0aCAke3Jlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCAmJiAhYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBnaXQgJHthcmdzLmpvaW4oXCIgXCIpfSB0byBleGl0IDAsIHdhcyAke3Jlc3VsdC5zdGF0dXN9LiBgXG4gICAgICAgICAgICArIGAkeyhyZXN1bHQuc3Rkb3V0ICsgcmVzdWx0LnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwb0lzVXNhYmxlKGNvbmZpZzogeyByZXBvUGF0aDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IHJlcG9QYXRoLCBrZXlQYXRoIH0gPSBjb25maWc7XG4gICAgaWYgKCFhd2FpdCBwYXRoRXhpc3RzKHBhdGguam9pbihyZXBvUGF0aCwgXCIuZ2l0XCIpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJyZXYtcGFyc2VcIiwgXCItLWdpdC1kaXJcIl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGgsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVwbyBhdCAke3JlcG9QYXRofSBpcyBub3QgdXNhYmxlLiAkeyhyZXN1bHQuc3Rkb3V0ICsgcmVzdWx0LnN0ZGVycikudHJpbSgpfWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKiogQ2xvbmVkIGJlc2lkZSB0aGUgb2xkIGNoZWNrb3V0IGFuZCBzd2FwcGVkIGluLCBzbyBhIGNsb25lIHRoYXQgZmFpbHMgbGVhdmVzIHRoZSBjb3B5IHdlIGFyZVxuICAgIGFscmVhZHkgdXNpbmcgdW50b3VjaGVkIHJhdGhlciB0aGFuIGRlbGV0aW5nIHRoZSBvbmx5IGtleXMgd2UgaGF2ZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9uZVJlcG8oY29uZmlnOiB7IHJlcG9VUkw6IHN0cmluZzsgcmVwb1BhdGg6IHN0cmluZzsga2V5UGF0aDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyByZXBvVVJMLCByZXBvUGF0aCwga2V5UGF0aCB9ID0gY29uZmlnO1xuICAgIGxldCBpbmNvbWluZ1BhdGggPSBgJHtyZXBvUGF0aH0uaW5jb21pbmdgO1xuICAgIGF3YWl0IGZzLnJtKGluY29taW5nUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShyZXBvUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcImNsb25lXCIsIHJlcG9VUkwsIGluY29taW5nUGF0aF0sIGtleVBhdGggfSk7XG4gICAgYXdhaXQgZnMucm0ocmVwb1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5yZW5hbWUoaW5jb21pbmdQYXRoLCByZXBvUGF0aCk7XG4gICAgY29uc29sZS5sb2coYENsb25lZCAke3JlcG9VUkx9IGludG8gJHtyZXBvUGF0aH1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGN1cnJlbnRCcmFuY2goY29uZmlnOiB7IHJlcG9QYXRoOiBzdHJpbmc7IGtleVBhdGg6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIChhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJyZXYtcGFyc2VcIiwgXCItLWFiYnJldi1yZWZcIiwgXCJIRUFEXCJdLCAuLi5jb25maWcgfSkpLnN0ZG91dC50cmltKCk7XG59XG5cbi8qKiBGb3JjZXMgYSBjaGVja291dCdzIHdvcmtpbmcgdHJlZSB0byBhIHJlZi4gQW55dGhpbmcgbG9jYWwgLSBhbiBlZGl0ZWQgZmlsZSwgb3IgYSBzdHJheSB1bnRyYWNrZWRcbiAgICBvbmUgLSBpcyBzdGFnZWQgYW5kIHN0YXNoZWQgcmF0aGVyIHRoYW4gZGVsZXRlZCwgc28gdGhlIHRyZWUgY29tZXMgb3V0IGNsZWFuIGJ1dCBub3RoaW5nIGlzIGxvc3RcbiAgICBmb3IgZ29vZDogaXQgc2l0cyBpbiBhIHN0YXNoIGlmIGl0IGlzIGV2ZXIgd2FudGVkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldEdpdFJlZihjb25maWc6IHsgcmVwb1BhdGg6IHN0cmluZzsgZ2l0UmVmOiBzdHJpbmc7IGtleVBhdGg6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgcmVwb1BhdGgsIGdpdFJlZiwga2V5UGF0aCB9ID0gY29uZmlnO1xuICAgIC8vIFN0YWdpbmcgdGhlIHVudHJhY2tlZCBmaWxlcyBmaXJzdCBpcyB3aGF0IGxldHMgdGhlIHN0YXNoIGNhcnJ5IHRoZW0gb2ZmLCBzbyB0aGUgcmVzZXQgbGFuZHNcbiAgICAvLyBvbiBhIGdlbnVpbmVseSBjbGVhbiB0cmVlLlxuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcImFkZFwiLCBcIi0tYWxsXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgLy8gQSBjaGVja291dCB3aXRoIG5vdGhpbmcgdG8gc3Rhc2ggbWFrZXMgZ2l0IHN0YXNoIGV4aXQgbm9uLXplcm8sIHdoaWNoIGlzIGhhcm1sZXNzIGhlcmUgLSB0aGVcbiAgICAvLyByZXNldCBiZWxvdyBpcyB3aGF0IGFjdHVhbGx5IGZvcmNlcyB0aGUgdHJlZS5cbiAgICBhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJzdGFzaFwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcImZldGNoXCIsIFwiLS1wcnVuZVwiLCBcIm9yaWdpblwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCB9KTtcbiAgICBhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJyZXNldFwiLCBcIi0taGFyZFwiLCBnaXRSZWZdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoIH0pO1xuICAgIC8vIERyb3BzIG9iamVjdHMgbm90aGluZyByZWZlcmVuY2VzIGFueSBtb3JlLCBzbyBhIGZpbGUgY29tbWl0dGVkIGJ5IG1pc3Rha2UgY2Fubm90IGJsb2F0IHRoZVxuICAgIC8vIGNoZWNrb3V0IGZvcmV2ZXIuIFJlZmxvZ3Mga2VlcCB0aGUganVzdC1yZXBsYWNlZCBjb21taXQgcmVhY2hhYmxlLCBzbyBhIGhpc3RvcnkgcmV3cml0ZSBpc1xuICAgIC8vIHN0aWxsIGRldGVjdGFibGUgcmlnaHQgYWZ0ZXIgdGhpcy5cbiAgICBhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJwcnVuZVwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVTb3VyY2VSZXBvKHJlcG9VUkw6IHN0cmluZykge1xuICAgIGxldCByZXBvUGF0aCA9IHNvdXJjZVJlcG9QYXRoKHJlcG9VUkwpO1xuICAgIGxldCBrZXlQYXRoID0gYXdhaXQgZmluZFNvdXJjZUtleShyZXBvVVJMKSB8fCBzb3VyY2VLZXlQYXRoKHJlcG9VUkwpO1xuICAgIGlmICghYXdhaXQgcmVwb0lzVXNhYmxlKHsgcmVwb1BhdGgsIGtleVBhdGggfSkpIHtcbiAgICAgICAgYXdhaXQgY2xvbmVSZXBvKHsgcmVwb1VSTCwgcmVwb1BhdGgsIGtleVBhdGggfSk7XG4gICAgfVxuICAgIGlmICghc291cmNlU3RhdGUocmVwb1VSTCkuYnJhbmNoKSB7XG4gICAgICAgIHNvdXJjZVN0YXRlKHJlcG9VUkwpLmJyYW5jaCA9IGF3YWl0IGN1cnJlbnRCcmFuY2goeyByZXBvUGF0aCwga2V5UGF0aCB9KTtcbiAgICB9XG59XG5cbi8qKiBSZXR1cm5zIHdoYXQgY2hhbmdlZCwgc28gdGhlIGNhbGxlciBjYW4gcmVwb3J0IGl0LiBBIHJld3JpdHRlbiBoaXN0b3J5IGlzIGNhbGxlZCBvdXRcbiAgICBzZXBhcmF0ZWx5IC0gaXQgbWVhbnMgdGhlIHJlbW90ZSBubyBsb25nZXIgY29udGFpbnMgdGhlIGNvbW1pdHMgd2UgYWxyZWFkeSBoYWQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3luY1JlcG8ocmVwb1VSTDogc3RyaW5nKSB7XG4gICAgYXdhaXQgZW5zdXJlU291cmNlUmVwbyhyZXBvVVJMKTtcbiAgICBsZXQgcmVwb1BhdGggPSBzb3VyY2VSZXBvUGF0aChyZXBvVVJMKTtcbiAgICBsZXQga2V5UGF0aCA9IGF3YWl0IGZpbmRTb3VyY2VLZXkocmVwb1VSTCkgfHwgc291cmNlS2V5UGF0aChyZXBvVVJMKTtcbiAgICBsZXQgYnJhbmNoID0gc291cmNlU3RhdGUocmVwb1VSTCkuYnJhbmNoO1xuICAgIGxldCBsb2NhbFNoYSA9IChhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJyZXYtcGFyc2VcIiwgXCJIRUFEXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoIH0pKS5zdGRvdXQudHJpbSgpO1xuXG4gICAgLy8gQSByZWYgbGlzdGluZyBpcyBhIGZldyBodW5kcmVkIGJ5dGVzIGFuZCBubyBvYmplY3RzLCBzbyB0aGUgdXN1YWwgY2FzZSBvZiBub3RoaW5nIGhhdmluZ1xuICAgIC8vIGNoYW5nZWQgY29zdHMgYWxtb3N0IG5vdGhpbmcgYW5kIHdlIG9ubHkgZmV0Y2ggd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZmV0Y2guXG4gICAgbGV0IGxpc3RpbmcgPSAoYXdhaXQgcnVuR2l0KHsgYXJnczogW1wibHMtcmVtb3RlXCIsIFwib3JpZ2luXCIsIGJyYW5jaF0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGggfSkpLnN0ZG91dDtcbiAgICBsZXQgcmVtb3RlU2hhID0gKGxpc3Rpbmcuc3BsaXQoL1xccysvKVswXSB8fCBcIlwiKS50cmltKCk7XG4gICAgaWYgKCFyZW1vdGVTaGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvcmlnaW4gdG8gcmVwb3J0IGEgc2hhIGZvciAke2JyYW5jaH0sIGxpc3RlZCAke2xpc3Rpbmcuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gKTtcbiAgICB9XG4gICAgaWYgKHJlbW90ZVNoYSA9PT0gbG9jYWxTaGEgJiYgcmVtb3RlU2hhID09PSBzb3VyY2VTdGF0ZShyZXBvVVJMKS5sYXN0U2hhKSB7XG4gICAgICAgIHJldHVybiB7IGNoYW5nZWQ6IGZhbHNlLCBoaXN0b3J5UmV3cml0dGVuOiBmYWxzZSwgcmVtb3RlU2hhLCBwcmV2aW91c1NoYTogbG9jYWxTaGEgfTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVtb3RlIGhhcyBtb3ZlZCwgb3Igd2UgaGF2ZSBub3QgYXBwbGllZCBpdCB5ZXQsIHNvIGZvcmNlIHRoZSBjaGVja291dCB0byBpdC5cbiAgICBsZXQgcHJldmlvdXNTaGEgPSBzb3VyY2VTdGF0ZShyZXBvVVJMKS5sYXN0U2hhIHx8IGxvY2FsU2hhO1xuICAgIGF3YWl0IHNldEdpdFJlZih7IHJlcG9QYXRoLCBnaXRSZWY6IGBvcmlnaW4vJHticmFuY2h9YCwga2V5UGF0aCB9KTtcbiAgICByZW1vdGVTaGEgPSAoYXdhaXQgcnVuR2l0KHsgYXJnczogW1wicmV2LXBhcnNlXCIsIGBvcmlnaW4vJHticmFuY2h9YF0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGggfSkpLnN0ZG91dC50cmltKCk7XG5cbiAgICBsZXQgaGlzdG9yeVJld3JpdHRlbiA9IGZhbHNlO1xuICAgIGlmIChwcmV2aW91c1NoYSAmJiBwcmV2aW91c1NoYSAhPT0gcmVtb3RlU2hhKSB7XG4gICAgICAgIC8vIElmIHdoYXQgd2UgYWxyZWFkeSBoYWQgaXMgbm8gbG9uZ2VyIGFuIGFuY2VzdG9yIG9mIHRoZSByZW1vdGUgdGlwLCBjb21taXRzIHdlcmUgcmVtb3ZlZFxuICAgICAgICAvLyBvciByZXdyaXR0ZW4gcmF0aGVyIHRoYW4gYWRkZWQuXG4gICAgICAgIGxldCBhbmNlc3RyeSA9IGF3YWl0IHJ1bkdpdCh7XG4gICAgICAgICAgICBhcmdzOiBbXCJtZXJnZS1iYXNlXCIsIFwiLS1pcy1hbmNlc3RvclwiLCBwcmV2aW91c1NoYSwgcmVtb3RlU2hhXSxcbiAgICAgICAgICAgIGN3ZDogcmVwb1BhdGgsXG4gICAgICAgICAgICBrZXlQYXRoLFxuICAgICAgICAgICAgYWxsb3dGYWlsdXJlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgaGlzdG9yeVJld3JpdHRlbiA9IGFuY2VzdHJ5LnN0YXR1cyAhPT0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHsgY2hhbmdlZDogdHJ1ZSwgaGlzdG9yeVJld3JpdHRlbiwgcmVtb3RlU2hhLCBwcmV2aW91c1NoYSB9O1xufVxuIl19
139
- /* _JS_SOURCE_HASH = "4f4ff9cbf9eedbfd584fbc954f980056d1c02203a3c0ea303a658b38966676c9"; */
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJEQUE2QjtBQUM3QixnREFBd0I7QUFDeEIsK0NBQW1EO0FBQ25ELHdDQUEwRTtBQUMxRSxtQ0FBNkQ7QUFDN0QsbUNBQXNDO0FBRXRDLEtBQUssVUFBVSxVQUFVLENBQUMsUUFBZ0I7SUFDdEMsSUFBSSxDQUFDO1FBQ0QsTUFBTSxrQkFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNULE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDO0FBRUQsOEZBQThGO0FBQ3ZGLEtBQUssVUFBVSxNQUFNLENBQUMsTUFBaUY7SUFDMUcsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNsRCxJQUFJLFVBQVUsR0FBRyxVQUFVLE9BQU8sNkVBQTZFLENBQUM7SUFDaEgsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFBLG9CQUFZLEVBQUM7UUFDNUIsT0FBTyxFQUFFLEtBQUs7UUFDZCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLFVBQVUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3RELEdBQUc7UUFDSCxXQUFXLEVBQUUsbUJBQVc7S0FDM0IsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMs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QUU5RyxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUM3QixJQUFJLFdBQVcsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDM0MsMEZBQTBGO1FBQzFGLGtDQUFrQztRQUNsQyxJQUFJLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQztZQUN4QixJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUM7WUFDN0QsR0FBRyxFQUFFLFFBQVE7WUFDYixPQUFPO1lBQ1AsWUFBWSxFQUFFLElBQUk7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUN2RSxDQUFDO0FBcENELDRCQW9DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBzcGF3blByb21pc2UgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9zcGF3blwiO1xuaW1wb3J0IHsgZmluZFNvdXJjZUtleSwgc291cmNlS2V5UGF0aCwgc291cmNlUmVwb1BhdGggfSBmcm9tIFwiLi4vc291cmNlc1wiO1xuaW1wb3J0IHsgR0lUX1RJTUVPVVQsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCB9IGZyb20gXCIuL3BhdGhzXCI7XG5pbXBvcnQgeyBzb3VyY2VTdGF0ZSB9IGZyb20gXCIuL3N0YXRlXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqIGNvcmUuc3NoQ29tbWFuZCBrZWVwcyB0aGUga2V5IHNlbGVjdGlvbiB3aXRoIHRoZSBjb21tYW5kIGluc3RlYWQgb2YgaW4gdGhlIGVudmlyb25tZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkdpdChjb25maWc6IHsgYXJnczogc3RyaW5nW107IGN3ZD86IHN0cmluZzsga2V5UGF0aDogc3RyaW5nOyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuIH0pIHtcbiAgICBsZXQgeyBhcmdzLCBjd2QsIGtleVBhdGgsIGFsbG93RmFpbHVyZSB9ID0gY29uZmlnO1xuICAgIGxldCBzc2hDb21tYW5kID0gYHNzaCAtaSAke2tleVBhdGh9IC1vIElkZW50aXRpZXNPbmx5PXllcyAtbyBCYXRjaE1vZGU9eWVzIC1vIFN0cmljdEhvc3RLZXlDaGVja2luZz1hY2NlcHQtbmV3YDtcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHtcbiAgICAgICAgY29tbWFuZDogXCJnaXRcIixcbiAgICAgICAgYXJnczogW1wiLWNcIiwgYGNvcmUuc3NoQ29tbWFuZD0ke3NzaENvbW1hbmR9YCwgLi4uYXJnc10sXG4gICAgICAgIGN3ZCxcbiAgICAgICAgdGltZW91dFRpbWU6IEdJVF9USU1FT1VULFxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBnaXQgJHthcmdzLmpvaW4oXCIgXCIpfSB0byBydW4sIGZhaWxlZCB3aXRoICR7cmVzdWx0LmVycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwICYmICFhbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIGdpdCAke2FyZ3Muam9pbihcIiBcIil9IHRvIGV4aXQgMCwgd2FzICR7cmVzdWx0LnN0YXR1c30uIGBcbiAgICAgICAgICAgICsgYCR7KHJlc3VsdC5zdGRvdXQgKyByZXN1bHQuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXBvSXNVc2FibGUoY29uZmlnOiB7IHJlcG9QYXRoOiBzdHJpbmc7IGtleVBhdGg6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgcmVwb1BhdGgsIGtleVBhdGggfSA9IGNvbmZpZztcbiAgICBpZiAoIWF3YWl0IHBhdGhFeGlzdHMocGF0aC5qb2luKHJlcG9QYXRoLCBcIi5naXRcIikpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcInJldi1wYXJzZVwiLCBcIi0tZ2l0LWRpclwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZXBvIGF0ICR7cmVwb1BhdGh9IGlzIG5vdCB1c2FibGUuICR7KHJlc3VsdC5zdGRvdXQgKyByZXN1bHQuc3RkZXJyKS50cmltKCl9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDbG9uZWQgYmVzaWRlIHRoZSBvbGQgY2hlY2tvdXQgYW5kIHN3YXBwZWQgaW4sIHNvIGEgY2xvbmUgdGhhdCBmYWlscyBsZWF2ZXMgdGhlIGNvcHkgd2UgYXJlXG4gICAgYWxyZWFkeSB1c2luZyB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gZGVsZXRpbmcgdGhlIG9ubHkga2V5cyB3ZSBoYXZlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb25lUmVwbyhjb25maWc6IHsgcmVwb1VSTDogc3RyaW5nOyByZXBvUGF0aDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IHJlcG9VUkwsIHJlcG9QYXRoLCBrZXlQYXRoIH0gPSBjb25maWc7XG4gICAgbGV0IGluY29taW5nUGF0aCA9IGAke3JlcG9QYXRofS5pbmNvbWluZ2A7XG4gICAgYXdhaXQgZnMucm0oaW5jb21pbmdQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHJlcG9QYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgcnVuR2l0KHsgYXJnczogW1wiY2xvbmVcIiwgcmVwb1VSTCwgaW5jb21pbmdQYXRoXSwga2V5UGF0aCB9KTtcbiAgICBhd2FpdCBmcy5ybShyZXBvUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnJlbmFtZShpbmNvbWluZ1BhdGgsIHJlcG9QYXRoKTtcbiAgICBjb25zb2xlLmxvZyhgQ2xvbmVkICR7cmVwb1VSTH0gaW50byAke3JlcG9QYXRofWApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3VycmVudEJyYW5jaChjb25maWc6IHsgcmVwb1BhdGg6IHN0cmluZzsga2V5UGF0aDogc3RyaW5nIH0pIHtcbiAgICByZXR1cm4gKGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcInJldi1wYXJzZVwiLCBcIi0tYWJicmV2LXJlZlwiLCBcIkhFQURcIl0sIC4uLmNvbmZpZyB9KSkuc3Rkb3V0LnRyaW0oKTtcbn1cblxuLyoqIEZvcmNlcyBhIGNoZWNrb3V0J3Mgd29ya2luZyB0cmVlIHRvIGEgcmVmLiBBbnl0aGluZyBsb2NhbCAtIGFuIGVkaXRlZCBmaWxlLCBvciBhIHN0cmF5IHVudHJhY2tlZFxuICAgIG9uZSAtIGlzIHN0YWdlZCBhbmQgc3Rhc2hlZCByYXRoZXIgdGhhbiBkZWxldGVkLCBzbyB0aGUgdHJlZSBjb21lcyBvdXQgY2xlYW4gYnV0IG5vdGhpbmcgaXMgbG9zdFxuICAgIGZvciBnb29kOiBpdCBzaXRzIGluIGEgc3Rhc2ggaWYgaXQgaXMgZXZlciB3YW50ZWQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0R2l0UmVmKGNvbmZpZzogeyByZXBvUGF0aDogc3RyaW5nOyBnaXRSZWY6IHN0cmluZzsga2V5UGF0aDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyByZXBvUGF0aCwgZ2l0UmVmLCBrZXlQYXRoIH0gPSBjb25maWc7XG4gICAgLy8gU3RhZ2luZyB0aGUgdW50cmFja2VkIGZpbGVzIGZpcnN0IGlzIHdoYXQgbGV0cyB0aGUgc3Rhc2ggY2FycnkgdGhlbSBvZmYsIHNvIHRoZSByZXNldCBsYW5kc1xuICAgIC8vIG9uIGEgZ2VudWluZWx5IGNsZWFuIHRyZWUuXG4gICAgYXdhaXQgcnVuR2l0KHsgYXJnczogW1wiYWRkXCIsIFwiLS1hbGxcIl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGgsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICAvLyBBIGNoZWNrb3V0IHdpdGggbm90aGluZyB0byBzdGFzaCBtYWtlcyBnaXQgc3Rhc2ggZXhpdCBub24temVybywgd2hpY2ggaXMgaGFybWxlc3MgaGVyZSAtIHRoZVxuICAgIC8vIHJlc2V0IGJlbG93IGlzIHdoYXQgYWN0dWFsbHkgZm9yY2VzIHRoZSB0cmVlLlxuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcInN0YXNoXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgYXdhaXQgcnVuR2l0KHsgYXJnczogW1wiZmV0Y2hcIiwgXCItLXBydW5lXCIsIFwib3JpZ2luXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoIH0pO1xuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcInJlc2V0XCIsIFwiLS1oYXJkXCIsIGdpdFJlZl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGggfSk7XG4gICAgLy8gRHJvcHMgb2JqZWN0cyBub3RoaW5nIHJlZmVyZW5jZXMgYW55IG1vcmUsIHNvIGEgZmlsZSBjb21taXR0ZWQgYnkgbWlzdGFrZSBjYW5ub3QgYmxvYXQgdGhlXG4gICAgLy8gY2hlY2tvdXQgZm9yZXZlci4gUmVmbG9ncyBrZWVwIHRoZSBqdXN0LXJlcGxhY2VkIGNvbW1pdCByZWFjaGFibGUsIHNvIGEgaGlzdG9yeSByZXdyaXRlIGlzXG4gICAgLy8gc3RpbGwgZGV0ZWN0YWJsZSByaWdodCBhZnRlciB0aGlzLlxuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcInBydW5lXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVNvdXJjZVJlcG8ocmVwb1VSTDogc3RyaW5nKSB7XG4gICAgbGV0IHJlcG9QYXRoID0gc291cmNlUmVwb1BhdGgocmVwb1VSTCk7XG4gICAgbGV0IGtleVBhdGggPSBhd2FpdCBmaW5kU291cmNlS2V5KHJlcG9VUkwpIHx8IHNvdXJjZUtleVBhdGgocmVwb1VSTCk7XG4gICAgaWYgKCFhd2FpdCByZXBvSXNVc2FibGUoeyByZXBvUGF0aCwga2V5UGF0aCB9KSkge1xuICAgICAgICBhd2FpdCBjbG9uZVJlcG8oeyByZXBvVVJMLCByZXBvUGF0aCwga2V5UGF0aCB9KTtcbiAgICB9XG4gICAgaWYgKCFzb3VyY2VTdGF0ZShyZXBvVVJMKS5icmFuY2gpIHtcbiAgICAgICAgc291cmNlU3RhdGUocmVwb1VSTCkuYnJhbmNoID0gYXdhaXQgY3VycmVudEJyYW5jaCh7IHJlcG9QYXRoLCBrZXlQYXRoIH0pO1xuICAgIH1cbn1cblxuLyoqIFJldHVybnMgd2hhdCBjaGFuZ2VkLCBzbyB0aGUgY2FsbGVyIGNhbiByZXBvcnQgaXQuIEEgcmV3cml0dGVuIGhpc3RvcnkgaXMgY2FsbGVkIG91dFxuICAgIHNlcGFyYXRlbHkgLSBpdCBtZWFucyB0aGUgcmVtb3RlIG5vIGxvbmdlciBjb250YWlucyB0aGUgY29tbWl0cyB3ZSBhbHJlYWR5IGhhZC5cblxuICAgIGZvcmNlVXBkYXRlIGZvcmNlcyB0aGUgd29ya2luZyB0cmVlIGJhY2sgdG8gdGhlIHJlbW90ZSBldmVuIHdoZW4gdGhlIHJlbW90ZSBoYXMgbm90IG1vdmVkLCB3aGljaFxuICAgIGlzIHdoYXQgaGVhbHMgYSBjaGVja291dCBsZWZ0IGRpcnR5IC0gYW4gZWRpdGVkIG9yIGhhbGYtd3JpdHRlbiBmaWxlIHRoYXQgbm8gbG9uZ2VyIG1hdGNoZXMgaXRzXG4gICAgc2lnbmF0dXJlLiBJdCB3b3VsZCBiZSBtYWRkZW5pbmcgdG8gYSBkZXZlbG9wZXIgZWRpdGluZyB0aGUgcmVwbyBpbiBwbGFjZSwgc2luY2UgaXQgc3Rhc2hlcyB0aGVpclxuICAgIHVuY29tbWl0dGVkIHdvcms7IGJ1dCBtYWtlIHN1cmUgbm90aGluZyB0aGF0IGFuc3dlcnMgdGhpcyBjaGVja291dCBpcyBydW5uaW5nIG9uIHRoZSBtYWNoaW5lIHlvdVxuICAgIGVkaXQgb24uIElmIHRoZSBjaGVja291dCB3ZW50IGRpcnR5IGJlY2F1c2UgYSBtYWNoaW5lIGNvbm5lY3Rpb24gdHJpZ2dlcmVkIGEgcmV2b2NhdGlvbiwga2lsbCB0aGVcbiAgICBzZXJ2aWNlcyBvbiB0aGF0IG1hY2hpbmUgYmVmb3JlIHlvdSB0b3VjaCB0aGUgdHJ1c3RlZCBtYWNoaW5lcywgb3IgdGhleSB3aWxsIGp1c3QgZGlydHkgaXQgYWdhaW4uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3luY1JlcG8ocmVwb1VSTDogc3RyaW5nLCBvcHRpb25zPzogeyBmb3JjZVVwZGF0ZT86IGJvb2xlYW4gfSkge1xuICAgIGF3YWl0IGVuc3VyZVNvdXJjZVJlcG8ocmVwb1VSTCk7XG4gICAgbGV0IHJlcG9QYXRoID0gc291cmNlUmVwb1BhdGgocmVwb1VSTCk7XG4gICAgbGV0IGtleVBhdGggPSBhd2FpdCBmaW5kU291cmNlS2V5KHJlcG9VUkwpIHx8IHNvdXJjZUtleVBhdGgocmVwb1VSTCk7XG4gICAgbGV0IGJyYW5jaCA9IHNvdXJjZVN0YXRlKHJlcG9VUkwpLmJyYW5jaDtcbiAgICBsZXQgbG9jYWxTaGEgPSAoYXdhaXQgcnVuR2l0KHsgYXJnczogW1wicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCB9KSkuc3Rkb3V0LnRyaW0oKTtcblxuICAgIC8vIEEgcmVmIGxpc3RpbmcgaXMgYSBmZXcgaHVuZHJlZCBieXRlcyBhbmQgbm8gb2JqZWN0cywgc28gdGhlIHVzdWFsIGNhc2Ugb2Ygbm90aGluZyBoYXZpbmdcbiAgICAvLyBjaGFuZ2VkIGNvc3RzIGFsbW9zdCBub3RoaW5nIGFuZCB3ZSBvbmx5IGZldGNoIHdoZW4gdGhlcmUgaXMgc29tZXRoaW5nIHRvIGZldGNoLlxuICAgIGxldCBsaXN0aW5nID0gKGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcImxzLXJlbW90ZVwiLCBcIm9yaWdpblwiLCBicmFuY2hdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoIH0pKS5zdGRvdXQ7XG4gICAgbGV0IHJlbW90ZVNoYSA9IChsaXN0aW5nLnNwbGl0KC9cXHMrLylbMF0gfHwgXCJcIikudHJpbSgpO1xuICAgIGlmICghcmVtb3RlU2hhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb3JpZ2luIHRvIHJlcG9ydCBhIHNoYSBmb3IgJHticmFuY2h9LCBsaXN0ZWQgJHtsaXN0aW5nLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YCk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucz8uZm9yY2VVcGRhdGUgJiYgcmVtb3RlU2hhID09PSBsb2NhbFNoYSAmJiByZW1vdGVTaGEgPT09IHNvdXJjZVN0YXRlKHJlcG9VUkwpLmxhc3RTaGEpIHtcbiAgICAgICAgcmV0dXJuIHsgY2hhbmdlZDogZmFsc2UsIGhpc3RvcnlSZXdyaXR0ZW46IGZhbHNlLCByZW1vdGVTaGEsIHByZXZpb3VzU2hhOiBsb2NhbFNoYSB9O1xuICAgIH1cblxuICAgIC8vIFRoZSByZW1vdGUgaGFzIG1vdmVkLCBvciB3ZSBoYXZlIG5vdCBhcHBsaWVkIGl0IHlldCwgc28gZm9yY2UgdGhlIGNoZWNrb3V0IHRvIGl0LlxuICAgIGxldCBwcmV2aW91c1NoYSA9IHNvdXJjZVN0YXRlKHJlcG9VUkwpLmxhc3RTaGEgfHwgbG9jYWxTaGE7XG4gICAgYXdhaXQgc2V0R2l0UmVmKHsgcmVwb1BhdGgsIGdpdFJlZjogYG9yaWdpbi8ke2JyYW5jaH1gLCBrZXlQYXRoIH0pO1xuICAgIHJlbW90ZVNoYSA9IChhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJyZXYtcGFyc2VcIiwgYG9yaWdpbi8ke2JyYW5jaH1gXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCB9KSkuc3Rkb3V0LnRyaW0oKTtcblxuICAgIGxldCBoaXN0b3J5UmV3cml0dGVuID0gZmFsc2U7XG4gICAgaWYgKHByZXZpb3VzU2hhICYmIHByZXZpb3VzU2hhICE9PSByZW1vdGVTaGEpIHtcbiAgICAgICAgLy8gSWYgd2hhdCB3ZSBhbHJlYWR5IGhhZCBpcyBubyBsb25nZXIgYW4gYW5jZXN0b3Igb2YgdGhlIHJlbW90ZSB0aXAsIGNvbW1pdHMgd2VyZSByZW1vdmVkXG4gICAgICAgIC8vIG9yIHJld3JpdHRlbiByYXRoZXIgdGhhbiBhZGRlZC5cbiAgICAgICAgbGV0IGFuY2VzdHJ5ID0gYXdhaXQgcnVuR2l0KHtcbiAgICAgICAgICAgIGFyZ3M6IFtcIm1lcmdlLWJhc2VcIiwgXCItLWlzLWFuY2VzdG9yXCIsIHByZXZpb3VzU2hhLCByZW1vdGVTaGFdLFxuICAgICAgICAgICAgY3dkOiByZXBvUGF0aCxcbiAgICAgICAgICAgIGtleVBhdGgsXG4gICAgICAgICAgICBhbGxvd0ZhaWx1cmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBoaXN0b3J5UmV3cml0dGVuID0gYW5jZXN0cnkuc3RhdHVzICE9PSAwO1xuICAgIH1cbiAgICByZXR1cm4geyBjaGFuZ2VkOiB0cnVlLCBoaXN0b3J5UmV3cml0dGVuLCByZW1vdGVTaGEsIHByZXZpb3VzU2hhIH07XG59XG4iXX0=
146
+ /* _JS_SOURCE_HASH = "62f9a483fdd197ea6df77cf5efeabfe4654e15b789d07e8ac036f002babc436b"; */
@@ -34,8 +34,17 @@ export declare function setGitRef(config: {
34
34
  keyPath: string;
35
35
  }): Promise<void>;
36
36
  /** Returns what changed, so the caller can report it. A rewritten history is called out
37
- separately - it means the remote no longer contains the commits we already had. */
38
- export declare function syncRepo(repoURL: string): Promise<{
37
+ separately - it means the remote no longer contains the commits we already had.
38
+
39
+ forceUpdate forces the working tree back to the remote even when the remote has not moved, which
40
+ is what heals a checkout left dirty - an edited or half-written file that no longer matches its
41
+ signature. It would be maddening to a developer editing the repo in place, since it stashes their
42
+ uncommitted work; but make sure nothing that answers this checkout is running on the machine you
43
+ edit on. If the checkout went dirty because a machine connection triggered a revocation, kill the
44
+ services on that machine before you touch the trusted machines, or they will just dirty it again. */
45
+ export declare function syncRepo(repoURL: string, options?: {
46
+ forceUpdate?: boolean;
47
+ }): Promise<{
39
48
  changed: boolean;
40
49
  historyRewritten: boolean;
41
50
  remoteSha: string;
@@ -97,8 +97,15 @@ async function ensureSourceRepo(repoURL: string) {
97
97
  }
98
98
 
99
99
  /** Returns what changed, so the caller can report it. A rewritten history is called out
100
- separately - it means the remote no longer contains the commits we already had. */
101
- export async function syncRepo(repoURL: string) {
100
+ separately - it means the remote no longer contains the commits we already had.
101
+
102
+ forceUpdate forces the working tree back to the remote even when the remote has not moved, which
103
+ is what heals a checkout left dirty - an edited or half-written file that no longer matches its
104
+ signature. It would be maddening to a developer editing the repo in place, since it stashes their
105
+ uncommitted work; but make sure nothing that answers this checkout is running on the machine you
106
+ edit on. If the checkout went dirty because a machine connection triggered a revocation, kill the
107
+ services on that machine before you touch the trusted machines, or they will just dirty it again. */
108
+ export async function syncRepo(repoURL: string, options?: { forceUpdate?: boolean }) {
102
109
  await ensureSourceRepo(repoURL);
103
110
  let repoPath = sourceRepoPath(repoURL);
104
111
  let keyPath = await findSourceKey(repoURL) || sourceKeyPath(repoURL);
@@ -112,7 +119,7 @@ export async function syncRepo(repoURL: string) {
112
119
  if (!remoteSha) {
113
120
  throw new Error(`Expected origin to report a sha for ${branch}, listed ${listing.slice(0, MAX_ERROR_BODY_LENGTH)}`);
114
121
  }
115
- if (remoteSha === localSha && remoteSha === sourceState(repoURL).lastSha) {
122
+ if (!options?.forceUpdate && remoteSha === localSha && remoteSha === sourceState(repoURL).lastSha) {
116
123
  return { changed: false, historyRewritten: false, remoteSha, previousSha: localSha };
117
124
  }
118
125
 
@@ -398,13 +398,17 @@ async function isMachineAccepted(config) {
398
398
  return verdict;
399
399
  }
400
400
  // Re-read the list at most once a minute, so a burst of bad callers cannot make us re-read on
401
- // every one of them, then take whatever the fresh look says as final.
401
+ // every one of them. Force the checkout back to the remote first, so a machine added and signed
402
+ // seconds ago is picked up even if the checkout was left dirty, then take the fresh look as
403
+ // final.
402
404
  if (Date.now() - lastMachinesInvalidation > MACHINES_INVALIDATION_INTERVAL) {
403
405
  lastMachinesInvalidation = Date.now();
406
+ let { sourceURL } = await (0, exports.keysRepo)();
407
+ await (0, git_1.syncRepo)(sourceURL, { forceUpdate: true }).catch(e => console.log(`Could not force update ${sourceURL}. ${e}`));
404
408
  trustedMachines.reset();
405
409
  }
406
410
  return (await evaluate()).verdict;
407
411
  }
408
412
  exports.isMachineAccepted = isMachineAccepted;
409
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjaGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNoaW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4Qix5REFBNkQ7QUFDN0Qsa0VBQStFO0FBQy9FLGtFQUErRTtBQUMvRSxvRUFBbUg7QUFDbkgsc0RBQXNEO0FBQ3RELGtFQUFxRTtBQUNyRSwwREFBZ0U7QUFDaEUsaUVBQStFO0FBQy9FLDREQUF5RDtBQUN6RCxzREFBdUk7QUFDdkksa0RBQWlJO0FBQ2pJLG9EQUFpRjtBQUNqRix5REFBbUQ7QUFDbkQsMkRBQStEO0FBRy9ELG1HQUFtRztBQUNuRyxpR0FBaUc7QUFDakcsZ0VBQWdFO0FBQ25ELFFBQUEsWUFBWSxHQUFHLFVBQVUsQ0FBQztBQUN2QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUM7QUFDdEMsTUFBTSxpQkFBaUIsR0FBRyw4Q0FBOEMsQ0FBQztBQUN6RSxnR0FBZ0c7QUFDaEcsbUNBQW1DO0FBQ25DLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN2Qyw2RkFBNkY7QUFDN0YsaUdBQWlHO0FBQ2pHLGtFQUFrRTtBQUNsRSxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUMsZ0dBQWdHO0FBQ2hHLGlHQUFpRztBQUNqRywwREFBMEQ7QUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQzFELGdHQUFnRztBQUNoRyxnR0FBZ0c7QUFDaEcsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2pELElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBU2pDLEtBQUssVUFBVSxVQUFVLENBQUMsUUFBZ0I7SUFDdEMsSUFBSSxDQUFDO1FBQ0QsTUFBTSxrQkFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNULE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsUUFBZ0IsRUFBRSxTQUFpQjtJQUN4RCxPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLG9CQUFZLEVBQUUsR0FBRyxTQUFTLE9BQU8sQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7O3VGQUd1RjtBQUMxRSxRQUFBLFFBQVEsR0FBRyxJQUFBLGNBQUksRUFBQyxLQUFLLElBQUksRUFBRTtJQUNwQyxJQUFJLE1BQU0sR0FBRyxJQUFBLDBCQUFlLEdBQUUsQ0FBQztJQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNkLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLENBQUMsQ0FBQyxDQUFDO0FBRUgsMEVBQTBFO0FBQ25FLEtBQUssVUFBVSxXQUFXLENBQUMsUUFBaUI7SUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLFlBQVksQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLElBQUEsZ0JBQVEsR0FBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFGRCxrQ0FFQztBQUVEOzttQkFFbUI7QUFDbkIsS0FBSyxVQUFVLG1CQUFtQjtJQUM5QixJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxJQUFBLGdCQUFRLEdBQUUsQ0FBQztJQUNwQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFBLHNCQUFjLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsSUFBSSxRQUFRLEdBQW1CLEVBQUUsQ0FBQztJQUNsQyxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLG9CQUFZLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsb0JBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoRCxTQUFTO1FBQ2IsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBQSxjQUFJLEVBQUMsS0FBSyxJQUFJLEVBQUU7SUFDcEMsSUFBSSxJQUFJLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztJQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sTUFBTSxJQUFJLENBQUM7QUFDdEIsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFFdkI7Ozs7aUdBSWlHO0FBQzFGLEtBQUssVUFBVSxrQkFBa0I7SUFDcEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2QsVUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFBLDBCQUFlLEVBQUMseUJBQXlCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEQsSUFBSSxDQUFDO2dCQUNELGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMscUVBQXFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUYsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNELE9BQU8sTUFBTSxlQUFlLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBWkQsZ0RBWUM7QUFFRDsrRkFDK0Y7QUFDeEYsS0FBSyxVQUFVLDBCQUEwQixDQUFDLElBQVksRUFBRSxNQUFjO0lBQ3pFLElBQUksUUFBUSxHQUFHLGNBQUksQ0FBQyxRQUFRLENBQUMsSUFBQSwrQkFBdUIsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzlELElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFBLHNCQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksa0RBQWtELENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFBLHNCQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxJQUFJLFFBQVEsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO0lBQ2pHLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3pCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBd0IsQ0FBQztRQUNoRSxPQUFPLElBQUEsb0JBQVksRUFBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBQSx3QkFBWSxFQUFDLElBQUksQ0FBQyx3QkFBd0IsTUFBTSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ25GLElBQUksU0FBUyxHQUFHLElBQUEsa0JBQVUsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxJQUFJLE1BQU0sR0FBd0I7UUFDOUIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO1FBQ3hCLE9BQU8sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDMUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztLQUMzQyxDQUFDO0lBQ0YsTUFBTSxJQUFBLDJCQUFlLEVBQUM7UUFDbEIsSUFBSTtRQUNKLFFBQVEsRUFBRSxHQUFHLElBQUksSUFBSSxRQUFRLEVBQUU7UUFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ2hDLFFBQVEsRUFBRSxLQUFLO1FBQ2YsYUFBYSxFQUFFLEtBQUs7S0FDdkIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxJQUFBLG9CQUFZLEVBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBMUJELGdFQTBCQztBQUVEOzs7Ozs7Ozs7c0JBU3NCO0FBQ2YsS0FBSyxVQUFVLFdBQVcsQ0FBQyxNQUdqQzs7SUFDRyxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQzFCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLElBQUEsZ0JBQVEsR0FBRSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQzlELHlEQUF5RDtJQUN6RCxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEIsSUFBSSxRQUFRLEdBQUcsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsSUFBSSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsb0JBQVksQ0FBQyxDQUFDO0lBQ2xELElBQUksT0FBTyxHQUFtQixFQUFFLENBQUM7SUFDakMsS0FBSyxJQUFJLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDWCwwQkFBMEIsT0FBTyxDQUFDLFNBQVMsdUNBQXVDO2tCQUNoRiw0RUFBNEUsQ0FDakYsQ0FBQztRQUNOLENBQUM7UUFDRCxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUNyRixJQUFJLEtBQUssR0FBaUI7WUFDdEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLGdGQUFnRjtZQUNoRixHQUFHO1lBQ0gsT0FBTyxFQUFFLENBQUEsTUFBQSxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsMENBQUUsT0FBTyxLQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ2hGLENBQUM7UUFDRixNQUFNLGtCQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sa0JBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzNHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxLQUFLLElBQUksU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzdELE1BQU0sa0JBQUUsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDbkIsQ0FBQztBQXhDRCxrQ0F3Q0M7QUFFRCxTQUFTLGdCQUFnQixDQUFDLElBQVksRUFBRSxRQUFnQjtJQUNwRCxJQUFJLENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7SUFDL0UsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0FBQ0wsQ0FBQztBQUVEO2dEQUNnRDtBQUNoRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCO0lBQ3hDLElBQUksUUFBUSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBQy9DLElBQUksU0FBUyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLG9CQUFZLENBQUMsQ0FBQztJQUNsRCxJQUFJLEtBQUssR0FBRyxNQUFNLGtCQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFjLENBQUMsQ0FBQztJQUNwRSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDMUIsU0FBUztRQUNiLENBQUM7UUFDRCxJQUFJLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxrQkFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQztBQUVELElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztBQUV2Qjs7d0JBRXdCO0FBQ3hCLEtBQUssVUFBVSxlQUFlLENBQUMsU0FBaUI7SUFDNUMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsY0FBYyxHQUFHLG9CQUFvQixFQUFFLENBQUM7UUFDckQsT0FBTztJQUNYLENBQUM7SUFDRCxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzVCLElBQUksQ0FBQztRQUNELE1BQU0sSUFBQSx5QkFBYSxFQUFDLElBQUEsc0JBQVUsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBQSw0QkFBYSxFQUFDLFNBQVMsQ0FBQyx5Q0FBeUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4RyxDQUFDO0FBQ0wsQ0FBQztBQUVELHlGQUF5RjtBQUN6RixLQUFLLFVBQVUsc0JBQXNCLENBQUMsU0FBaUI7SUFDbkQsSUFBSSxJQUFJLEdBQUcsSUFBQSxzQkFBVSxFQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pDLElBQUksV0FBVyxHQUE4RCxFQUFFLENBQUM7SUFDaEYsS0FBSyxJQUFJLElBQUksSUFBSSxNQUFNLElBQUEsdUJBQVcsRUFBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFCLFNBQVM7UUFDYixDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUEsd0JBQVksRUFBQyxJQUFJLEVBQUUsY0FBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxRixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDYixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7b0JBQ2hFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztvQkFDM0IsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRTtpQkFDdEIsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLFdBQVcsQ0FBQztBQUN2QixDQUFDO0FBRUQ7Ozs7O3FFQUtxRTtBQUNyRSxTQUFnQixpQkFBaUIsQ0FBQyxNQUEwRDtJQUN4RixJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDdkMsT0FBTyxxQ0FBcUMsTUFBTSxJQUFJLFVBQVUsSUFBSSxTQUFTLElBQUksRUFBRSxNQUFNLENBQUM7QUFDOUYsQ0FBQztBQUhELDhDQUdDO0FBRUQ7Ozs7O2dFQUtnRTtBQUNoRSxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsUUFBZ0IsRUFBRSxJQUFZO0lBQzFELElBQUksQ0FBQztRQUNELElBQUksQ0FBQyxJQUFBLDJDQUFpQyxHQUFFLEVBQUUsQ0FBQztZQUN2Qyx3RkFBd0Y7WUFDeEYseUVBQXlFO1lBQ3pFLE1BQU0sa0JBQUUsQ0FBQyxRQUFRLENBQUMsbUNBQXlCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDckQsTUFBTSxJQUFBLHVDQUE2QixFQUFDLEVBQUUsUUFBUSxFQUFFLG1DQUF5QixFQUFFLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsTUFBTSxJQUFBLGVBQU0sRUFBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLG9FQUFvRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7QUFDTCxDQUFDO0FBRUQ7O3lCQUV5QjtBQUN6QixLQUFLLFVBQVUsdUJBQXVCLENBQUMsTUFLdEM7SUFDRyxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ3JELElBQUksUUFBUSxHQUFHLElBQUEsNkJBQWMsRUFBQyxTQUFTLENBQUMsQ0FBQztJQUN6QyxJQUFJLE9BQU8sR0FBRyxNQUFNLElBQUEsMkJBQWUsRUFBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxJQUFJLFlBQVksR0FBRyxJQUFBLDRCQUFlLEVBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUMsSUFBSSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDckQsTUFBTSxrQkFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvQyxNQUFNLGtCQUFFLENBQUMsU0FBUyxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsWUFBWSxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVFLFlBQVk7UUFDWixTQUFTO1FBQ1QsRUFBRTtRQUNGLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtRQUNuQyxTQUFTLEVBQUUsU0FBUztRQUNwQixNQUFNLEVBQUUsaUJBQWlCO0tBQzVCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRXpCLE1BQU0sSUFBQSxZQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzlELE1BQU0sSUFBQSxZQUFNLEVBQUM7UUFDVCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsaUNBQWlDLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxZQUFZLEVBQUUsQ0FBQztRQUN2SCxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU87S0FDekIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxJQUFJLEdBQUcsTUFBTSxJQUFBLFlBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUcsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BCLDRGQUE0RjtRQUM1RixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxTQUFTLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9HLE9BQU87SUFDWCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLFNBQVMsU0FBUyxFQUFFLEtBQUssWUFBWSxFQUFFLENBQUMsQ0FBQztJQUVoRSw2RkFBNkY7SUFDN0YsMEZBQTBGO0lBQzFGLE1BQU0sZ0JBQWdCLENBQ2xCLGlCQUFpQixFQUFFLGtCQUFrQixTQUFTLEVBQUUsRUFDaEQsd0NBQXdDLEVBQUUsaURBQWlEO1VBQ3pGLHdGQUF3RjtVQUN4RixxQ0FBcUM7VUFDckMsMERBQTBEO1VBQzFELGdEQUFnRCxTQUFTLGtCQUFrQixTQUFTLFNBQVM7VUFDN0YsNkVBQTZFLEVBQUUsV0FBVztVQUMxRix5REFBeUQ7VUFDekQsa0JBQWtCLFNBQVMsSUFBSTtVQUMvQixrQkFBa0IsU0FBUyxJQUFJLENBQ3BDLENBQUM7QUFDTixDQUFDO0FBa0JNLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxNQUt2QztJQUNHLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUN2QyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBRUQsNkZBQTZGO0lBQzdGLGdHQUFnRztJQUNoRyw2RkFBNkY7SUFDN0Ysa0RBQWtEO0lBQ2xELElBQUksUUFBUSxHQUFHLEtBQUssSUFBMEQsRUFBRTtRQUM1RSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLEtBQUssSUFBQSx1QkFBZSxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDN0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBQSxnQkFBUSxHQUFFLENBQUM7UUFDckMsb0ZBQW9GO1FBQ3BGLElBQUksT0FBTyxHQUFHLENBQUMsTUFBTSxrQkFBa0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0NBQWdDLGlCQUFpQixDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbEosQ0FBQztRQUVELE1BQU0sZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksU0FBUyxHQUFHLE1BQU0sSUFBQSwwQkFBYSxFQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekcsMkZBQTJGO1FBQzNGLDhGQUE4RjtRQUM5RixvREFBb0Q7UUFDcEQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxXQUFDLE9BQUEsQ0FBQyxDQUFDLENBQUEsTUFBQSxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMENBQUUsTUFBTSxDQUFBLENBQUEsRUFBQSxDQUFDO1FBQ3pFLElBQUksV0FBVyxHQUFHLE1BQU0sc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsOEZBQThGO1FBQzlGLG1GQUFtRjtRQUNuRixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxJQUFJLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNqQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3JDLFNBQVM7WUFDYixDQUFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFBLG9CQUFPLEVBQUMsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuRixVQUFVLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUMvQixDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksVUFBVSxFQUFFLENBQUM7WUFDYixPQUFPO2dCQUNILE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLDRDQUE0QyxVQUFVLCtCQUErQixFQUFFO2dCQUMzSCxLQUFLLEVBQUUsS0FBSzthQUNmLENBQUM7UUFDTixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDckUsQ0FBQztRQUVELDRGQUE0RjtRQUM1Rix3RUFBd0U7UUFDeEUsSUFBSSxJQUFJLEdBQUcsSUFBQSxvQkFBTyxFQUFDLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELElBQUksZUFBZSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FDaEQsSUFBQSxvQkFBTyxFQUFDLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLHVCQUF1QixDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFlBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLG9DQUFvQyxFQUFFLGtDQUFrQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzNJLENBQUM7UUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsb0NBQW9DLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzVHLENBQUMsQ0FBQztJQUVGLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxRQUFRLEVBQUUsQ0FBQztJQUMxQyxnR0FBZ0c7SUFDaEcsK0ZBQStGO0lBQy9GLHdCQUF3QjtJQUN4QixJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7UUFDNUIsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUNELDhGQUE4RjtJQUM5RixzRUFBc0U7SUFDdEUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsd0JBQXdCLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztRQUN6RSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRCxPQUFPLENBQUMsTUFBTSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxDQUFDO0FBakZELDhDQWlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMva2V5c1JlcG9cIjtcbmltcG9ydCB7IHJldm9rZVJlcG8sIHN5bmNSZXBvRmlsZXMgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlcG9GaWxlc1wiO1xuaW1wb3J0IHsgbGlzdFJlcG9EaXIsIHJlYWRSZXBvRmlsZSB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVwb0ZpbGVzXCI7XG5pbXBvcnQgeyBuZXdSZXZvY2F0aW9uSWQsIHBhaXJLZXksIHJlYWRSZXZvY2F0aW9uRmlsZXMsIHJlYWRVbnJldm9rZXMgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3Jldm9jYXRpb25cIjtcbmltcG9ydCB7IHJ1bkdpdCB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vZ2l0XCI7XG5pbXBvcnQgeyBlbnN1cmVSZXZva2VLZXkgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlcG9GaWxlc1wiO1xuaW1wb3J0IHsgcmVhZFNpZ25lZFJlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3RydXN0XCI7XG5pbXBvcnQgeyByZXZva2VSZXBvUGF0aCwgcmV2b2tlUmVwb1VSTCB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9yZXZva2VTb3VyY2VcIjtcbmltcG9ydCB7IG5vdGlmeSB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vbm90aWZ5XCI7XG5pbXBvcnQgeyBhcmVEaXNjb3JkTm90aWZpY2F0aW9uc0NvbmZpZ3VyZWQsIGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zLCBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIIH0gZnJvbSBcIi4uL25vdGlmaWNhdGlvbnMvZGlzY29yZFwiO1xuaW1wb3J0IHsgREVWX2dldElkZW50aXR5RmlsZVBhdGgsIGdlbmVyYXRlQ0EsIGdldE1hY2hpbmVJZCwgZ2V0T3duTWFjaGluZUlkLCBJZGVudGl0eVN0b3JhZ2VUeXBlIH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvY2VydHNcIjtcbmltcG9ydCB7IGRlc2NyaWJlSG9zdCwgcnVuT3ZlclNTSCwgd3JpdGVSZW1vdGVGaWxlIH0gZnJvbSBcIi4uL2hlbHBlcnMvcmVtb3RlU1NIXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgcnVuSW5maW5pdGVQb2xsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IHNwYXduUHJvbWlzZSB9IGZyb20gXCIuLi9oZWxwZXJzL3NwYXduXCI7XG5cbi8vIFdoaWNoIG1hY2hpbmVzIHRoaXMgc3lzdGVtIHRhbGtzIHRvLCBrZXB0IGluIHRoZSBzYW1lIHJlcG8gYXMgdGhlIHNzaCBrZXlzLiBUaGF0IHJlcG8gaXMgYWxyZWFkeVxuLy8gc2lnbmVkLCBhbHJlYWR5IGRpc3RyaWJ1dGVkIHRvIGV2ZXJ5IG1hY2hpbmUsIGFuZCBhbHJlYWR5IGhhcyBzb21ld2hlcmUgdG8gcmVjb3JkIGEgcmVqZWN0aW9uLFxuLy8gc28gYSBzZWNvbmQgb25lIHdvdWxkIG9ubHkgYmUgYSBzZWNvbmQgdGhpbmcgdG8ga2VlcCBpbiBzdGVwLlxuZXhwb3J0IGNvbnN0IE1BQ0hJTkVTX0RJUiA9IFwibWFjaGluZXNcIjtcbmNvbnN0IFJFVk9DQVRJT05TX0RJUiA9IFwicmV2b2NhdGlvbnNcIjtcbmNvbnN0IFJFVk9DQVRJT05fUkVBU09OID0gXCJhIG1hY2hpbmUgdGFsa2VkIHRvIHVzIGZyb20gYW4gdW5hcHByb3ZlZCBJUFwiO1xuLy8gVGhlIHJldm9rZSByZXBvIGlzIHB1bGxlZCBhdCBtb3N0IHRoaXMgb2Z0ZW4uIEEgY2hlY2sgaGFwcGVucyBwZXIgcmVxdWVzdCwgYW5kIGEgcmVxdWVzdCBtdXN0XG4vLyBub3QgY29zdCBhIHJvdW5kIHRyaXAgdG8gZ2l0aHViLlxuY29uc3QgUkVWT0tFX1NZTkNfSU5URVJWQUwgPSA2MCAqIDEwMDA7XG4vLyBBbmQgdGhlIG1hY2hpbmUgbGlzdCBpcyByZS1yZWFkIGZyb20gdGhlIGNoZWNrb3V0IG9uIHRoaXMgaW50ZXJ2YWwsIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGVcbi8vIGNoZWNrb3V0IGl0c2VsZiBvbmx5IG1vdmVzIHdoZW4gdGhlIGRhZW1vbiBwdWxscyBpdCwgd2hpY2ggaXMgb24gdGhlIHNhbWUgc29ydCBvZiBpbnRlcnZhbCwgc29cbi8vIHJlYWRpbmcgbW9yZSBvZnRlbiB0aGFuIHRoaXMgd291bGQgb25seSByZS1yZWFkIHRoZSBzYW1lIGJ5dGVzLlxuY29uc3QgTUFDSElORVNfUkVGUkVTSF9JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIEhvdyBsb25nIGEgZmFpbHVyZSB0byBmaW5kIHRoZSBrZXlzIHJlcG8gaXMgcmVtZW1iZXJlZC4gQSBsb25nIGxpdmVkIHByb2Nlc3MgbWF5IHN0YXJ0IGJlZm9yZVxuLy8gdGhlIG1hY2hpbmUgaXMgc2V0IHVwLCBhbmQgc2hvdWxkIHBpY2sgaXQgdXAgb25jZSBpdCBpcywgd2l0aG91dCBiZWluZyByZXN0YXJ0ZWQgLSBidXQgaXQgbXVzdFxuLy8gbm90IHBheSBmb3IgcmVzb2x2aW5nIHRoZSByZXBvIG9uIGV2ZXJ5IHJlcXVlc3QgZWl0aGVyLlxuY29uc3QgUkVQT19SRVRSWV9ERUxBWSA9IDE1ICogMTAwMDtcbmNvbnN0IExPT1BCQUNLID0gW1wiMTI3LjAuMC4xXCIsIFwiOjoxXCIsIFwiOjpmZmZmOjEyNy4wLjAuMVwiXTtcbi8vIFRoZSB0cnVzdGVkIG1hY2hpbmUgbGlzdCBpcyByZS1yZWFkIGF0IG1vc3QgdGhpcyBvZnRlbiB3aGVuIGEgY2hlY2sgcmVqZWN0cywgc28gYSBjYWxsZXIgdGhhdFxuLy8gd2FzIGp1c3QgYWRkZWQgaXMgcGlja2VkIHVwIHF1aWNrbHkgd2l0aG91dCBsZXR0aW5nIGEgZmxvb2Qgb2YgcmVqZWN0aW9ucyByZS1yZWFkIGV2ZXJ5IHRpbWUuXG5jb25zdCBNQUNISU5FU19JTlZBTElEQVRJT05fSU5URVJWQUwgPSA2MCAqIDEwMDA7XG5sZXQgbGFzdE1hY2hpbmVzSW52YWxpZGF0aW9uID0gMDtcblxuLyoqIE9uZSBtYWNoaW5lIHdlIGFyZSB3aWxsaW5nIHRvIHRhbGsgdG8sIGFuZCB0aGUgYWRkcmVzc2VzIGl0IG1heSB0YWxrIHRvIHVzIGZyb20uICovXG5leHBvcnQgdHlwZSBNYWNoaW5lU3RhdGUgPSB7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXBzOiBzdHJpbmdbXTtcbiAgICBhZGRlZEF0OiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hY2hpbmVGaWxlUGF0aChyZXBvUGF0aDogc3RyaW5nLCBtYWNoaW5lSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4ocmVwb1BhdGgsIE1BQ0hJTkVTX0RJUiwgYCR7bWFjaGluZUlkfS5qc29uYCk7XG59XG5cbi8qKiBUaGlzIG1hY2hpbmUncyBrZXlzIHJlcG8sIHdvcmtlZCBvdXQgb25jZSBhbmQgdGhlbiByZW1lbWJlcmVkLlxuXG4gICAgQSBmYWlsdXJlIGlzIHJlbWVtYmVyZWQgdG9vLCBidXQgb25seSBicmllZmx5OiBhIHNlcnZlciBtYXkgd2VsbCBzdGFydCBiZWZvcmUgdGhlIG1hY2hpbmUgaGFzXG4gICAgYmVlbiBzZXQgdXAsIGFuZCBzaG91bGQgc3RhcnQgd29ya2luZyB3aGVuIGl0IGlzLCByYXRoZXIgdGhhbiBuZWVkaW5nIGEgcmVzdGFydC4gKi9cbmV4cG9ydCBjb25zdCBrZXlzUmVwbyA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBsb29rdXAgPSByZXNvbHZlS2V5c1JlcG8oKTtcbiAgICBsb29rdXAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGtleXNSZXBvLnJlc2V0KCksIFJFUE9fUkVUUllfREVMQVkpLnVucmVmKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IGxvb2t1cDtcbn0pO1xuXG4vKiogRXZlcnkgbWFjaGluZSBhIGNoZWNrb3V0IGxpc3RzLiBXaXRob3V0IGEgcmVwbywgdGhpcyBtYWNoaW5lJ3Mgb3duLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1hY2hpbmVzKHJlcG9QYXRoPzogc3RyaW5nKTogUHJvbWlzZTxNYWNoaW5lU3RhdGVbXT4ge1xuICAgIHJldHVybiBbLi4uKGF3YWl0IHJlYWRNYWNoaW5lcyhyZXBvUGF0aCB8fCAoYXdhaXQga2V5c1JlcG8oKSkucmVwb1BhdGgpKS52YWx1ZXMoKV07XG59XG5cbi8qKiBUaGUgbWFjaGluZXMgdGhlIHNpZ25lZCBmaWxlcyB2b3VjaCBmb3IuIE9ubHkgdGhlIG1hY2hpbmUgZmlsZXMgY292ZXJlZCBieSB0aGUgc2lnbmF0dXJlIGFyZVxuICAgIHJlYWQgLSBhbiB1bnNpZ25lZCBtYWNoaW5lcy8qLmpzb24gaXMgbm90IGV2aWRlbmNlIG9mIGFueXRoaW5nLCBzbyByZWFkU2lnbmVkUmVwbyBoYXMgYWxyZWFkeVxuICAgIGxlZnQgaXQgb3V0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFRydXN0ZWRNYWNoaW5lcygpIHtcbiAgICBsZXQgeyByZXBvUGF0aCB9ID0gYXdhaXQga2V5c1JlcG8oKTtcbiAgICBsZXQgeyBmaWxlcyB9ID0gYXdhaXQgcmVhZFNpZ25lZFJlcG8ocmVwb1BhdGgpO1xuICAgIGxldCBtYWNoaW5lczogTWFjaGluZVN0YXRlW10gPSBbXTtcbiAgICBmb3IgKGxldCBbZmlsZVBhdGgsIGNvbnRlbnRzXSBvZiBmaWxlcykge1xuICAgICAgICBsZXQgbmFtZSA9IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7TUFDSElORVNfRElSfS9gKSAmJiBmaWxlUGF0aC5zbGljZShNQUNISU5FU19ESVIubGVuZ3RoICsgMSkgfHwgXCJcIjtcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikgfHwgbmFtZS5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYWNoaW5lID0gcGFyc2VNYWNoaW5lRmlsZShuYW1lLCBjb250ZW50cy50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgICAgICBpZiAobWFjaGluZSkge1xuICAgICAgICAgICAgbWFjaGluZXMucHVzaChtYWNoaW5lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZXM7XG59XG5cbmNvbnN0IHRydXN0ZWRNYWNoaW5lcyA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZWFkID0gcmVhZFRydXN0ZWRNYWNoaW5lcygpO1xuICAgIHJlYWQuY2F0Y2goKCkgPT4gdHJ1c3RlZE1hY2hpbmVzLnJlc2V0KCkpO1xuICAgIHJldHVybiBhd2FpdCByZWFkO1xufSk7XG5cbmxldCByZWZyZXNoaW5nID0gZmFsc2U7XG5cbi8qKiBUaGUgbWFjaGluZXMgdGhpcyBzeXN0ZW0gdHJ1c3RzLCBhcyB0aGUgc2lnbmVkIHJlcG8gbGlzdHMgdGhlbS5cblxuICAgIEhlbGQgcmF0aGVyIHRoYW4gcmVhZCBwZXIgY2FsbCwgYW5kIHJlZnJlc2hlZCBpbiB0aGUgYmFja2dyb3VuZCwgc28gbm9ib2R5IGFza2luZyB3aGV0aGVyIGFcbiAgICBtYWNoaW5lIGlzIHRydXN0ZWQgd2FpdHMgZm9yIGEgZGlyZWN0b3J5IG9mIGZpbGVzIHRvIGJlIHJlYWQgYW5kIGEgc2lnbmF0dXJlIHRvIGJlIGNoZWNrZWQuIEFcbiAgICByZWZyZXNoIHRoYXQgZmFpbHMgbGVhdmVzIHRoZSBsaXN0IHdlIGFscmVhZHkgaGF2ZTogdGhlIGNoZWNrb3V0IGlzIG9ubHkgc3RhbGUsIG5vdCB3cm9uZy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRUcnVzdGVkTWFjaGluZXMoKTogUHJvbWlzZTxNYWNoaW5lU3RhdGVbXT4ge1xuICAgIGlmICghcmVmcmVzaGluZykge1xuICAgICAgICByZWZyZXNoaW5nID0gdHJ1ZTtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKE1BQ0hJTkVTX1JFRlJFU0hfSU5URVJWQUwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdHJ1c3RlZE1hY2hpbmVzLnNldChQcm9taXNlLnJlc29sdmUoYXdhaXQgcmVhZFRydXN0ZWRNYWNoaW5lcygpKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvdWxkIG5vdCByZS1yZWFkIHRoZSB0cnVzdGVkIG1hY2hpbmVzLCBrZWVwaW5nIHRoZSBvbmVzIHdlIGhhdmUuICR7ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0cnVzdGVkTWFjaGluZXMoKTtcbn1cblxuLyoqIFRoZSBtYWNoaW5lIGlkIG9mIGEgbWFjaGluZSByZWFjaGVkIG92ZXIgc3NoLCBnZW5lcmF0aW5nIGFuZCBpbnN0YWxsaW5nIGFuIGlkZW50aXR5IGZvciBpdCBpZlxuICAgIGl0IGhhcyBub25lIHVuZGVyIHRoaXMgZG9tYWluLiBUaGUgcHJpdmF0ZSBrZXkgZW5kcyB1cCBvbiB0aGF0IG1hY2hpbmUgYW5kIG5vd2hlcmUgZWxzZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZVJlbW90ZU1hY2hpbmVJZChob3N0OiBzdHJpbmcsIGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKERFVl9nZXRJZGVudGl0eUZpbGVQYXRoKGRvbWFpbikpO1xuICAgIGxldCBob21lID0gKGF3YWl0IHJ1bk92ZXJTU0goeyBob3N0LCBzY3JpcHQ6IGBlY2hvICRIT01FYCB9KSkuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAoIWhvbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2hvc3R9IHRvIHJlcG9ydCBhIGhvbWUgZGlyZWN0b3J5LCBpdCByZXBvcnRlZCBub3RoaW5nYCk7XG4gICAgfVxuICAgIGxldCBjb250ZW50cyA9IGF3YWl0IHJ1bk92ZXJTU0goeyBob3N0LCBzY3JpcHQ6IGBjYXQgJHtob21lfS8ke2ZpbGVOYW1lfSAyPi9kZXYvbnVsbCB8fCB0cnVlYCB9KTtcbiAgICBpZiAoY29udGVudHMuc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgICBsZXQgc3RvcmVkID0gSlNPTi5wYXJzZShjb250ZW50cy5zdGRvdXQpIGFzIElkZW50aXR5U3RvcmFnZVR5cGU7XG4gICAgICAgIHJldHVybiBnZXRNYWNoaW5lSWQoc3RvcmVkLmRvbWFpbiwgZG9tYWluKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYCR7ZGVzY3JpYmVIb3N0KGhvc3QpfSBoYXMgbm8gaWRlbnRpdHkgZm9yICR7ZG9tYWlufSwgZ2VuZXJhdGluZyBvbmVgKTtcbiAgICBsZXQgZ2VuZXJhdGVkID0gZ2VuZXJhdGVDQShkb21haW4pO1xuICAgIGxldCBzdG9yZWQ6IElkZW50aXR5U3RvcmFnZVR5cGUgPSB7XG4gICAgICAgIGRvbWFpbjogZ2VuZXJhdGVkLmRvbWFpbixcbiAgICAgICAgY2VydEI2NDogZ2VuZXJhdGVkLmNlcnQudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICAgIGtleUI2NDogZ2VuZXJhdGVkLmtleS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICB9O1xuICAgIGF3YWl0IHdyaXRlUmVtb3RlRmlsZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGZpbGVQYXRoOiBgJHtob21lfS8ke2ZpbGVOYW1lfWAsXG4gICAgICAgIGNvbnRlbnRzOiBKU09OLnN0cmluZ2lmeShzdG9yZWQpLFxuICAgICAgICBmaWxlTW9kZTogXCI2MDBcIixcbiAgICAgICAgZGlyZWN0b3J5TW9kZTogXCI3MDBcIixcbiAgICB9KTtcbiAgICByZXR1cm4gZ2V0TWFjaGluZUlkKGdlbmVyYXRlZC5kb21haW4sIGRvbWFpbik7XG59XG5cbi8qKiBNYWtlcyBhIGNoZWNrb3V0IGxpc3QgZXhhY3RseSB0aGVzZSBtYWNoaW5lczogdGhvc2UgbmFtZWQgYXJlIHdyaXR0ZW4gd2l0aCB0aGUgYWRkcmVzc2VzIGdpdmVuLFxuICAgIGFuZCBhbnl0aGluZyBub3QgbmFtZWQgaXMgcmVtb3ZlZC4gU28gcmVhZCB0aGVtLCBjaGFuZ2Ugd2hhdCB5b3Ugd2FudCwgYW5kIHdyaXRlIHRoZSByZXN1bHQuXG5cbiAgICBUaGUgYWRkcmVzc2VzIGFyZSBwYXJ0IG9mIHNldHRpbmcgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBzdGVwLCBiZWNhdXNlIGEgbWFjaGluZSB3aXRoIG5vXG4gICAgYWRkcmVzcyBpdCBtYXkgdGFsayBmcm9tIGlzIG5vdCBhIG1hY2hpbmUgdGhhdCB3b3VsZCBldmVyIGJlIGFjY2VwdGVkIC0gdGhlcmUgaXMgbm8gc3RhdGUgd2hlcmVcbiAgICBuYW1pbmcgb25lIHdpdGhvdXQgdGhlbSBtZWFucyBhbnl0aGluZy5cblxuICAgIE5vdGhpbmcgaGVyZSBzaWducyBvciBjb21taXRzLiBUaGUgc2lnbmF0dXJlIGlzIHdoYXQgZXZlcnkgb3RoZXIgbWFjaGluZSBjaGVja3MgYmVmb3JlXG4gICAgYmVsaWV2aW5nIGFueSBvZiB0aGlzLCBhbmQgaXQgdGFrZXMgdGhlIGhhcmR3YXJlIGtleSwgc28gYHlhcm4gc2lnbmZpbGVzIGdpdGAgaXMgc3RpbGwgeW91cnMgdG9cbiAgICBydW4gYWZ0ZXJ3YXJkcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRNYWNoaW5lcyhjb25maWc6IHtcbiAgICByZXBvUGF0aD86IHN0cmluZztcbiAgICBtYWNoaW5lczogeyBtYWNoaW5lSWQ6IHN0cmluZzsgaXBzOiBzdHJpbmdbXSB9W107XG59KTogUHJvbWlzZTxNYWNoaW5lU3RhdGVbXT4ge1xuICAgIGxldCB7IG1hY2hpbmVzIH0gPSBjb25maWc7XG4gICAgbGV0IHJlcG9QYXRoID0gY29uZmlnLnJlcG9QYXRoIHx8IChhd2FpdCBrZXlzUmVwbygpKS5yZXBvUGF0aDtcbiAgICAvLyBXaGF0ZXZlciB3YXMgaGVsZCBpcyBub3cgc3RhbGUsIHdob2V2ZXIgcmVhZHMgaXQgbmV4dC5cbiAgICB0cnVzdGVkTWFjaGluZXMucmVzZXQoKTtcbiAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCByZWFkTWFjaGluZXMocmVwb1BhdGgpO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIE1BQ0hJTkVTX0RJUik7XG4gICAgbGV0IHdyaXR0ZW46IE1hY2hpbmVTdGF0ZVtdID0gW107XG4gICAgZm9yIChsZXQgbWFjaGluZSBvZiBtYWNoaW5lcykge1xuICAgICAgICBpZiAoIW1hY2hpbmUubWFjaGluZUlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgbWFjaGluZUlkLCB3YXMgJHtKU09OLnN0cmluZ2lmeShtYWNoaW5lLm1hY2hpbmVJZCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtYWNoaW5lLmlwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgYWRkcmVzc2VzIGZvciAke21hY2hpbmUubWFjaGluZUlkfSwgd2FzIG5vbmUuIEEgbWFjaGluZSBpcyB0cnVzdGVkIGZyb21gXG4gICAgICAgICAgICAgICAgKyBgIHRoZSBhZGRyZXNzZXMgaXQgbWF5IHRhbGsgZnJvbSwgc28gbGVhdmUgaXQgb3V0IG9mIHRoZSBsaXN0IHRvIHJlbW92ZSBpdC5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpcHMgPSBtYWNoaW5lLmlwcy5maWx0ZXIoKGlwLCBpbmRleCkgPT4gaXAgJiYgbWFjaGluZS5pcHMuaW5kZXhPZihpcCkgPT09IGluZGV4KTtcbiAgICAgICAgbGV0IHN0YXRlOiBNYWNoaW5lU3RhdGUgPSB7XG4gICAgICAgICAgICBtYWNoaW5lSWQ6IG1hY2hpbmUubWFjaGluZUlkLFxuICAgICAgICAgICAgLy8gSW4gdGhlIG9yZGVyIGdpdmVuLCB3aXRob3V0IGR1cGxpY2F0ZXMsIHNvIHRoZSBmaWxlIHJlYWRzIHRoZSB3YXkgaXQgd2FzIHNldC5cbiAgICAgICAgICAgIGlwcyxcbiAgICAgICAgICAgIGFkZGVkQXQ6IGV4aXN0aW5nLmdldChtYWNoaW5lLm1hY2hpbmVJZCk/LmFkZGVkQXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBmcy5ta2RpcihkaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUobWFjaGluZUZpbGVQYXRoKHJlcG9QYXRoLCBzdGF0ZS5tYWNoaW5lSWQpLCBKU09OLnN0cmluZ2lmeShzdGF0ZSwgdW5kZWZpbmVkLCA0KSArIFwiXFxuXCIpO1xuICAgICAgICB3cml0dGVuLnB1c2goc3RhdGUpO1xuICAgIH1cblxuICAgIC8vIFdoYXRldmVyIHRoZSByZXBvIGhhZCBhbmQgdGhlIGNhbGxlciBkaWQgbm90IG5hbWUgaXMgbm8gbG9uZ2VyIHRydXN0ZWQuXG4gICAgZm9yIChsZXQgbWFjaGluZUlkIG9mIGV4aXN0aW5nLmtleXMoKSkge1xuICAgICAgICBpZiAoIW1hY2hpbmVzLnNvbWUobWFjaGluZSA9PiBtYWNoaW5lLm1hY2hpbmVJZCA9PT0gbWFjaGluZUlkKSkge1xuICAgICAgICAgICAgYXdhaXQgZnMucm0obWFjaGluZUZpbGVQYXRoKHJlcG9QYXRoLCBtYWNoaW5lSWQpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3cml0dGVuO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1hY2hpbmVGaWxlKG5hbWU6IHN0cmluZywgY29udGVudHM6IHN0cmluZyk6IE1hY2hpbmVTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMpO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gcGFyc2VkLm1hY2hpbmVJZCB8fCBuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJcIik7XG4gICAgICAgIHJldHVybiB7IG1hY2hpbmVJZCwgaXBzOiBwYXJzZWQuaXBzIHx8IFtdLCBhZGRlZEF0OiBwYXJzZWQuYWRkZWRBdCB8fCBcIlwiIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgSWdub3JpbmcgdW5yZWFkYWJsZSBtYWNoaW5lIGZpbGUgJHtuYW1lfS4gJHtlfWApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cblxuLyoqIEV2ZXJ5IG1hY2hpbmUgZmlsZSBvbiBkaXNrLiBGb3IgZWRpdGluZyB0aGUgcmVwbywgbm90IGZvciBkZWNpZGluZyB0cnVzdCAtIHRydXN0IHJlYWRzIHRoZVxuICAgIHNpZ25lZCBmaWxlcyB0aHJvdWdoIHJlYWRUcnVzdGVkTWFjaGluZXMuICovXG5hc3luYyBmdW5jdGlvbiByZWFkTWFjaGluZXMocmVwb1BhdGg6IHN0cmluZykge1xuICAgIGxldCBtYWNoaW5lcyA9IG5ldyBNYXA8c3RyaW5nLCBNYWNoaW5lU3RhdGU+KCk7XG4gICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgTUFDSElORVNfRElSKTtcbiAgICBsZXQgbmFtZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcmVjdG9yeSkuY2F0Y2goKCkgPT4gW10gYXMgc3RyaW5nW10pO1xuICAgIGZvciAobGV0IG5hbWUgb2YgbmFtZXMuc29ydCgpKSB7XG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWFjaGluZSA9IHBhcnNlTWFjaGluZUZpbGUobmFtZSwgYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKGRpcmVjdG9yeSwgbmFtZSksIFwidXRmOFwiKS5jYXRjaCgoKSA9PiBcIlwiKSk7XG4gICAgICAgIGlmIChtYWNoaW5lKSB7XG4gICAgICAgICAgICBtYWNoaW5lcy5zZXQobWFjaGluZS5tYWNoaW5lSWQsIG1hY2hpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYWNoaW5lcztcbn1cblxubGV0IGxhc3RSZXZva2VTeW5jID0gMDtcblxuLyoqIFB1bGxlZCBhdCBtb3N0IG9uY2UgYSBSRVZPS0VfU1lOQ19JTlRFUlZBTCwgYmVjYXVzZSB0aGlzIGlzIGFza2VkIHBlciByZXF1ZXN0LiBBIHN5bmMgdGhhdFxuICAgIGZhaWxzIGxlYXZlcyB0aGUgY2hlY2tvdXQgd2UgYWxyZWFkeSBoYXZlLCB3aGljaCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IHJldm9jYXRpb25zIHdlIGtub3dcbiAgICBhYm91dCBzdGF5IGtub3duLiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luY1Jldm9jYXRpb25zKHNvdXJjZVVSTDogc3RyaW5nKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0UmV2b2tlU3luYyA8IFJFVk9LRV9TWU5DX0lOVEVSVkFMKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdFJldm9rZVN5bmMgPSBEYXRlLm5vdygpO1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN5bmNSZXBvRmlsZXMocmV2b2tlUmVwbyhzb3VyY2VVUkwpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3QgcmVhZCAke3Jldm9rZVJlcG9VUkwoc291cmNlVVJMKX0sIHVzaW5nIHRoZSByZXZvY2F0aW9ucyBhbHJlYWR5IGhlcmUuICR7ZX1gKTtcbiAgICB9XG59XG5cbi8qKiBNYWNoaW5lIHJldm9jYXRpb25zLCByZWFkIG91dCBvZiB0aGUgcmV2b2tlIHJlcG8gdGhlIHNhbWUgd2F5IGtleSByZXZvY2F0aW9ucyBhcmUuICovXG5hc3luYyBmdW5jdGlvbiByZWFkTWFjaGluZVJldm9jYXRpb25zKHNvdXJjZVVSTDogc3RyaW5nKSB7XG4gICAgbGV0IHJlcG8gPSByZXZva2VSZXBvKHNvdXJjZVVSTCk7XG4gICAgbGV0IHJldm9jYXRpb25zOiB7IHJldm9jYXRpb25JZDogc3RyaW5nOyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZyB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGF3YWl0IGxpc3RSZXBvRGlyKHJlcG8sIFJFVk9DQVRJT05TX0RJUikpIHtcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcGFyc2VkID0gSlNPTi5wYXJzZShhd2FpdCByZWFkUmVwb0ZpbGUocmVwbywgcGF0aC5qb2luKFJFVk9DQVRJT05TX0RJUiwgbmFtZSkpIHx8IFwiXCIpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZC5tYWNoaW5lSWQpIHtcbiAgICAgICAgICAgICAgICByZXZvY2F0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcmV2b2NhdGlvbklkOiBwYXJzZWQucmV2b2NhdGlvbklkIHx8IG5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIlwiKSxcbiAgICAgICAgICAgICAgICAgICAgbWFjaGluZUlkOiBwYXJzZWQubWFjaGluZUlkLFxuICAgICAgICAgICAgICAgICAgICBpcDogcGFyc2VkLmlwIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyB1bnJlYWRhYmxlIHJldm9jYXRpb24gJHtuYW1lfS4gJHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXZvY2F0aW9ucztcbn1cblxuLyoqIFdoYXQgdG8gcnVuIHRvIHRydXN0IGEgbWFjaGluZSB0aGF0IGhhcyBqdXN0IGJlZW4gcmVmdXNlZC5cblxuICAgIEV2ZXJ5dGhpbmcgaW4gaXQgaXMgYWxyZWFkeSBrbm93biB0byB3aG9ldmVyIGlzIGJlaW5nIHJlZnVzZWQ6IHRoZWlyIG1hY2hpbmUgaWQsIHRoZSBhZGRyZXNzIHdlXG4gICAgc2F3IHRoZW0gYXQsIGFuZCB0aGUgZG9tYWluIHRoZXkganVzdCB0YWxrZWQgdG8uIEhhbmRpbmcgaXQgYmFjayBzYXZlcyB0aGVtIHdvcmtpbmcgb3V0IHRoZVxuICAgIHBhcnRzIG9mIGEgY29tbWFuZCB0aGV5IGhhdmUgZXZlcnkgcmlnaHQgdG8ga25vdy4gUnVubmluZyBpdCBzdGlsbCB0YWtlcyB0aGUgaGFyZHdhcmUga2V5IG9uXG4gICAgdGhlIG1hY2hpbmUgdGhhdCBvd25zIHRoZSByZXBvLCBzbyB0ZWxsaW5nIHRoZW0gY29zdHMgbm90aGluZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRNYWNoaW5lQ29tbWFuZChjb25maWc6IHsgbWFjaGluZUlkOiBzdHJpbmc7IGlwOiBzdHJpbmc7IGRvbWFpbj86IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgbWFjaGluZUlkLCBpcCwgZG9tYWluIH0gPSBjb25maWc7XG4gICAgcmV0dXJuIGBUbyB0cnVzdCBpdCwgcnVuOiB5YXJuIGFkZG1hY2hpbmUgJHtkb21haW4gfHwgXCI8ZG9tYWluPlwifSAke21hY2hpbmVJZH0gJHtpcH0gZ2l0YDtcbn1cblxuLyoqIFNlbmRzIHRoZSBvbmUgbm90aWZpY2F0aW9uIHRoaXMgZmlsZSBpcyBhbGxvd2VkIHRvIHNlbmQsIHdoZW4gaXQgY2FuLlxuXG4gICAgVGhlIGRhZW1vbiBjb25maWd1cmVzIG5vdGlmaWNhdGlvbnMgb24gc3RhcnR1cCBhbmQgd291bGQgc2ltcGx5IHNlbmQuIFRoaXMgY2FuIGFsc28gcnVuIGluIHNvbWVcbiAgICBvdGhlciBwcm9jZXNzLCB3aGljaCBoYXMgbm90LCBzbyB0aGUgd2ViaG9vayBpcyBwaWNrZWQgdXAgaGVyZSBpZiBpdCBpcyByZWFkYWJsZS4gQSBtYWNoaW5lXG4gICAgd2l0aCBubyB3ZWJob29rIHNldCB1cCBzdGlsbCByZWNvcmRzIHRoZSByZXZvY2F0aW9uIC0gYmVpbmcgdW5hYmxlIHRvIHRlbGwgYW55b25lIGlzIG5vdCBhXG4gICAgcmVhc29uIHRvIGtlZXAgYWNjZXB0aW5nIGEgbWFjaGluZSB0aGF0IGlzIGJlaW5nIG1pc3VzZWQuICovXG5hc3luYyBmdW5jdGlvbiBub3RpZnlCZXN0RWZmb3J0KGhlYWRsaW5lOiBzdHJpbmcsIGJvZHk6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICghYXJlRGlzY29yZE5vdGlmaWNhdGlvbnNDb25maWd1cmVkKCkpIHtcbiAgICAgICAgICAgIC8vIFJlYWQgZmlyc3Q6IGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zIGV4aXRzIHRoZSBwcm9jZXNzIHdoZW4gdGhlIGZpbGUgaXMgbWlzc2luZyxcbiAgICAgICAgICAgIC8vIHdoaWNoIGlzIHJpZ2h0IGZvciB0aGUgZGFlbW9uIGF0IHN0YXJ0dXAgYW5kIHdyb25nIGZvciBhIGxpYnJhcnkgY2FsbC5cbiAgICAgICAgICAgIGF3YWl0IGZzLnJlYWRGaWxlKERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEgsIFwidXRmOFwiKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zKHsgZmlsZVBhdGg6IERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEggfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbm90aWZ5KGhlYWRsaW5lLCBib2R5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3Qgc2VuZCBhIG5vdGlmaWNhdGlvbiBhYm91dCB0aGlzLCBpdCBpcyBvbmx5IGluIHRoZSBsb2cuICR7ZX1gKTtcbiAgICB9XG59XG5cbi8qKiBSZWNvcmRzIHRoYXQgYSBtYWNoaW5lIHdlIGFjY2VwdCB0YWxrZWQgdG8gdXMgZnJvbSBhbiBhZGRyZXNzIGl0IGlzIG5vdCBhbGxvd2VkIGZyb20uIE9uZSBwZXJcbiAgICBtYWNoaW5lIGFuZCBhZGRyZXNzLCBzbyBhIHNlY29uZCBhZGRyZXNzIGlzIGEgc2Vjb25kIHJldm9jYXRpb24gYW5kIGFuIHVucmV2b2tlIG9mIHRoZSBmaXJzdFxuICAgIGRvZXMgbm90IGNvdmVyIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkTWFjaGluZVJldm9jYXRpb24oY29uZmlnOiB7XG4gICAgc291cmNlVVJMOiBzdHJpbmc7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXA6IHN0cmluZztcbiAgICBob3N0TGFiZWw6IHN0cmluZztcbn0pIHtcbiAgICBsZXQgeyBzb3VyY2VVUkwsIG1hY2hpbmVJZCwgaXAsIGhvc3RMYWJlbCB9ID0gY29uZmlnO1xuICAgIGxldCByZXBvUGF0aCA9IHJldm9rZVJlcG9QYXRoKHNvdXJjZVVSTCk7XG4gICAgbGV0IGtleVBhdGggPSBhd2FpdCBlbnN1cmVSZXZva2VLZXkoc291cmNlVVJMKTtcbiAgICBsZXQgcmV2b2NhdGlvbklkID0gbmV3UmV2b2NhdGlvbklkKG1hY2hpbmVJZCk7XG4gICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgUkVWT0NBVElPTlNfRElSKTtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LCBgJHtyZXZvY2F0aW9uSWR9Lmpzb25gKSwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICByZXZvY2F0aW9uSWQsXG4gICAgICAgIG1hY2hpbmVJZCxcbiAgICAgICAgaXAsXG4gICAgICAgIHJldm9rZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICByZXZva2VkQnk6IGhvc3RMYWJlbCxcbiAgICAgICAgcmVhc29uOiBSRVZPQ0FUSU9OX1JFQVNPTixcbiAgICB9LCB1bmRlZmluZWQsIDQpICsgXCJcXG5cIik7XG5cbiAgICBhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJhZGRcIiwgXCItQVwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCB9KTtcbiAgICBhd2FpdCBydW5HaXQoe1xuICAgICAgICBhcmdzOiBbXCItY1wiLCBcInVzZXIuZW1haWw9cG9ydHNlY3VyZUBsb2NhbGhvc3RcIiwgXCItY1wiLCBcInVzZXIubmFtZT1wb3J0c2VjdXJlXCIsIFwiY29tbWl0XCIsIFwiLW1cIiwgYHJldm9rZSAke3Jldm9jYXRpb25JZH1gXSxcbiAgICAgICAgY3dkOiByZXBvUGF0aCwga2V5UGF0aCxcbiAgICB9KTtcbiAgICBsZXQgcHVzaCA9IGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcInB1c2hcIiwgXCJvcmlnaW5cIiwgXCJIRUFEXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKHB1c2guc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIC8vIEFub3RoZXIgbWFjaGluZSBtb3N0IGxpa2VseSByZWNvcmRlZCB0aGUgc2FtZSB0aGluZyBmaXJzdCwgYW5kIHRoZSBuZXh0IHJlYWQgcGlja3MgaXQgdXAuXG4gICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3QgcHVzaCB0aGUgcmV2b2NhdGlvbiBvZiAke21hY2hpbmVJZH0gZnJvbSAke2lwfS4gJHsocHVzaC5zdGRvdXQgKyBwdXNoLnN0ZGVycikudHJpbSgpfWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBSZXZva2VkICR7bWFjaGluZUlkfSBmcm9tICR7aXB9LCAke3Jldm9jYXRpb25JZH1gKTtcblxuICAgIC8vIFNhaWQgYnkgd2hvZXZlciB3cm90ZSB0aGUgcmV2b2NhdGlvbiwgb25jZSwgdGhlIHNhbWUgYXMgZm9yIGFuIHNzaCBrZXkuIE1hY2hpbmVzIHRoYXQgb25seVxuICAgIC8vIHJlYWQgaXQgbGF0ZXIgc2F5IG5vdGhpbmcsIG9yIG9uZSBldmVudCB3b3VsZCBiZSByZXBvcnRlZCBieSBldmVyeSBtYWNoaW5lIHRoYXQgc2F3IGl0LlxuICAgIGF3YWl0IG5vdGlmeUJlc3RFZmZvcnQoXG4gICAgICAgIGBTVVNQSUNJT1VTIElQICR7aXB9IEZST1pFIE1BQ0hJTkUgJHttYWNoaW5lSWR9YCxcbiAgICAgICAgYEEgbWFjaGluZSB3ZSB0cnVzdCB0YWxrZWQgdG8gdXMgZnJvbSAke2lwfSwgd2hpY2ggaXMgbm90IGFuIGFkZHJlc3MgaXQgaXMgYWxsb3dlZCB0byB0YWxrYFxuICAgICAgICArIGAgZnJvbS4gSXQgcHJvdmVkIGl0IGhvbGRzIHRoYXQgbWFjaGluZSdzIGtleSwgc28gZWl0aGVyIHNvbWVvbmUgZWxzZSBoYXMgYSBjb3B5IG9mIGl0LGBcbiAgICAgICAgKyBgIG9yIHRoYXQgbWFjaGluZSdzIGFkZHJlc3MgY2hhbmdlZC5gXG4gICAgICAgICsgYFxcblxcbkl0IGlzIGZyb3plbiBldmVyeXdoZXJlIG5vdywgYW5kIG5vdGhpbmcgYWNjZXB0cyBpdC5gXG4gICAgICAgICsgYFxcblxcbklmIHRoaXMgd2FzIGFuIGF0dGFjaywgcmVtb3ZlIFxcYG1hY2hpbmVzLyR7bWFjaGluZUlkfS5qc29uXFxgIGZyb20gXFxgJHtzb3VyY2VVUkx9XFxgIG5vdy5gXG4gICAgICAgICsgYFxcbklmIGl0IHdhcyBsZWdpdGltYXRlLCBydW4gXFxgeWFybiB1bnJldm9rZSBnaXRcXGAgaW4gdGhhdCByZXBvLiBJdCBhbGxvd3MgJHtpcH0gZm9yIHRoYXRgXG4gICAgICAgICsgYCBtYWNoaW5lLCBhbmQgdGFrZXMgZWZmZWN0IGFzIGVhY2ggbWFjaGluZSBwaWNrcyBpdCB1cC5gXG4gICAgICAgICsgYFxcblxcbm1hY2hpbmU6IFxcYCR7bWFjaGluZUlkfVxcYGBcbiAgICAgICAgKyBgXFxuZnJvemVuIGJ5OiBcXGAke2hvc3RMYWJlbH1cXGBgXG4gICAgKTtcbn1cblxuLyoqIFdoZXRoZXIgd2Ugd2lsbCB0YWxrIHRvIHRoaXMgbWFjaGluZSwgY29taW5nIGZyb20gdGhpcyBhZGRyZXNzLlxuXG4gICAgQm90aCBoYWx2ZXMgYXJlIHJlcXVpcmVkIGFuZCBuZWl0aGVyIGlzIGEgZ3Vlc3M6IHRoZSBjYWxsZXIga25vd3MgdGhlIG1hY2hpbmUgaWQgYmVjYXVzZSB0aGVcbiAgICBjb25uZWN0aW9uIHByb3ZlZCBpdCwgYW5kIGtub3dzIHRoZSBhZGRyZXNzIGJlY2F1c2UgdGhlIHBhY2tldHMgY2FtZSBmcm9tIHRoZXJlLiBBIG1hY2hpbmUgd2VcbiAgICBkbyBub3QgbGlzdCBpcyBzaW1wbHkgbm90IGFjY2VwdGVkLiBBIG1hY2hpbmUgd2UgZG8gbGlzdCwgYXJyaXZpbmcgZnJvbSBhbiBhZGRyZXNzIGl0IGRvZXMgbm90XG4gICAgaGF2ZSwgaXMgdHJlYXRlZCBhcyB0aGUgc2FtZSBraW5kIG9mIGV2ZW50IGFzIGEgc3RvbGVuIHNzaCBrZXkgLSBpdCBpcyByZXZva2VkIGV2ZXJ5d2hlcmUsIGFuZFxuICAgIHN0YXlzIHJldm9rZWQgdW50aWwgYW4gdW5yZXZva2UgYWxsb3dzIHRoYXQgbWFjaGluZSBmcm9tIHRoYXQgYWRkcmVzcy5cblxuICAgIFNheXMgd2h5IHdoZW4gdGhlIGFuc3dlciBpcyBubywgYmVjYXVzZSB0aGUgdGhyZWUgd2F5cyB0byBiZSByZWZ1c2VkIGFyZSBlbnRpcmVseSBkaWZmZXJlbnRcbiAgICB0aGluZ3MgdG8gYSBwZXJzb24gcmVhZGluZyBpdDogbmV2ZXIgdHJ1c3RlZCBhdCBhbGwsIHRydXN0ZWQgYnV0IGZyb3plbiwgb3IgdHJ1c3RlZCBhbmQgdGFsa2luZ1xuICAgIGZyb20gc29tZXdoZXJlIGl0IHNob3VsZCBub3QgYmUuXG5cbiAgICBUaHJvd3Mgd2hlbiB0aGUgcmVwbyBpdHNlbGYgY2Fubm90IGJlIHJlYWQgb3IgaXMgbm90IHNpZ25lZCwgcmF0aGVyIHRoYW4gYW5zd2VyaW5nIGZhbHNlOiB0aGF0XG4gICAgaXMgYSBicm9rZW4gaW5zdGFsbGF0aW9uLCBub3QgYSByZWplY3RlZCBtYWNoaW5lLCBhbmQgdGhlIHR3byBkZXNlcnZlIGRpZmZlcmVudCBoYW5kbGluZy4gKi9cbmV4cG9ydCB0eXBlIE1hY2hpbmVWZXJkaWN0ID0geyBhY2NlcHRlZDogYm9vbGVhbjsgcmVhc29uOiBzdHJpbmcgfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzTWFjaGluZUFjY2VwdGVkKGNvbmZpZzoge1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgLy8gVXNlZCBmb3IgbG9jYWwgbG9vcGJhY2sgYWNjZXB0YW5jZSwgYW5kIGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuXG4gICAgZG9tYWluPzogc3RyaW5nO1xufSk6IFByb21pc2U8TWFjaGluZVZlcmRpY3Q+IHtcbiAgICBsZXQgeyBtYWNoaW5lSWQsIGlwLCBkb21haW4gfSA9IGNvbmZpZztcbiAgICBpZiAoIW1hY2hpbmVJZCB8fCAhaXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIG1hY2hpbmVJZCBhbmQgYW4gaXAsIHdhcyAke0pTT04uc3RyaW5naWZ5KG1hY2hpbmVJZCl9IGFuZCAke0pTT04uc3RyaW5naWZ5KGlwKX1gKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgd2hvbGUgY2hlY2ssIHBsdXMgd2hldGhlciBpdCBmcm96ZSB0aGUgbWFjaGluZS4gQSByZWplY3Rpb24gdGhhdCBmcm96ZSBpdCBpcyBmaW5hbCwgc29cbiAgICAvLyB0aGVyZSBpcyBub3RoaW5nIHRvIGdhaW4gZnJvbSBsb29raW5nIGFnYWluLiBBbnkgb3RoZXIgcmVqZWN0aW9uIG1pZ2h0IGp1c3QgYmUgYSBzdGFsZSB2aWV3IC1cbiAgICAvLyBhIG1hY2hpbmUgYWRkZWQgc2Vjb25kcyBhZ28gdGhhdCBvdXIgY2FjaGVkIGxpc3QgaGFzIG5vdCBjYXVnaHQgdXAgdG8gLSBzbyBpdCBpcyB3b3J0aCBvbmVcbiAgICAvLyBmcmVzaCBsb29rLCB3aGljaCBpcyB3aGF0IHRoZSByZXRyeSBiZWxvdyBkb2VzLlxuICAgIGxldCBldmFsdWF0ZSA9IGFzeW5jICgpOiBQcm9taXNlPHsgdmVyZGljdDogTWFjaGluZVZlcmRpY3Q7IGZyb3plOiBib29sZWFuIH0+ID0+IHtcbiAgICAgICAgaWYgKExPT1BCQUNLLmluY2x1ZGVzKGlwKSAmJiAhIWRvbWFpbiAmJiBtYWNoaW5lSWQgPT09IGdldE93bk1hY2hpbmVJZChkb21haW4pKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiB0cnVlLCByZWFzb246IFwiXCIgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgc291cmNlVVJMIH0gPSBhd2FpdCBrZXlzUmVwbygpO1xuICAgICAgICAvLyBWZXJpZmllZCBiZWZvcmUgaXQgaXMgYmVsaWV2ZWQsIGFuZCBjYWNoZWQsIHNpbmNlIHRoaXMgaXMgYXNrZWQgb25jZSBwZXIgcmVxdWVzdC5cbiAgICAgICAgbGV0IG1hY2hpbmUgPSAoYXdhaXQgZ2V0VHJ1c3RlZE1hY2hpbmVzKCkpLmZpbmQoZW50cnkgPT4gZW50cnkubWFjaGluZUlkID09PSBtYWNoaW5lSWQpO1xuICAgICAgICBpZiAoIW1hY2hpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGB0aGF0IG1hY2hpbmUgaXMgbm90IHRydXN0ZWQuICR7YWRkTWFjaGluZUNvbW1hbmQoeyBtYWNoaW5lSWQsIGlwLCBkb21haW4gfSl9YCB9LCBmcm96ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHN5bmNSZXZvY2F0aW9ucyhzb3VyY2VVUkwpO1xuICAgICAgICBsZXQgdW5yZXZva2VzID0gYXdhaXQgcmVhZFVucmV2b2tlcyhzb3VyY2VVUkwpLmNhdGNoKCgpID0+ICh7IHBhaXJzOiBuZXcgTWFwKCksIGxlZ2FjeUlkczogbmV3IE1hcCgpIH0pKTtcbiAgICAgICAgLy8gQW4gdW5yZXZva2UgY291bnRzIGFzIHNvb24gYXMgaXQgaXMgc2Vlbi4gSXQgaXMgc2lnbmVkLCBzbyB3cml0aW5nIG9uZSBhbHJlYWR5IHRha2VzIHRoZVxuICAgICAgICAvLyBoYXJkd2FyZSBrZXksIGFuZCBhbnlvbmUgaG9sZGluZyB0aGF0IGNhbiBzaWduIGFueXRoaW5nIGF0IGFsbCAtIGEgd2FpdCBiZWZvcmUgaG9ub3VyaW5nIGl0XG4gICAgICAgIC8vIGd1YXJkcyBhZ2FpbnN0IGFuIGF0dGFja2VyIHdobyBoYXMgbm8gbmVlZCBvZiBpdC5cbiAgICAgICAgbGV0IGFsbG93ZWRBZ2FpbiA9IChwYWlyOiBzdHJpbmcpID0+ICEhdW5yZXZva2VzLnBhaXJzLmdldChwYWlyKT8ubGVuZ3RoO1xuICAgICAgICBsZXQgcmV2b2NhdGlvbnMgPSBhd2FpdCByZWFkTWFjaGluZVJldm9jYXRpb25zKHNvdXJjZVVSTCk7XG4gICAgICAgIC8vIEFueSByZXZvY2F0aW9uIG5vdGhpbmcgaGFzIHVuZG9uZSBrZWVwcyB0aGUgbWFjaGluZSBvdXQsIGZyb20gZXZlcnl3aGVyZSwgdGhlIHdheSBhIHJldm9rZWRcbiAgICAgICAgLy8gc3NoIGtleSBpcyBvdXQgZXZlcnl3aGVyZSByYXRoZXIgdGhhbiBvbmx5IGZyb20gdGhlIGFkZHJlc3MgaXQgd2FzIG1pc3VzZWQgZnJvbS5cbiAgICAgICAgbGV0IGZyb3plbkZyb20gPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCByZXZvY2F0aW9uIG9mIHJldm9jYXRpb25zKSB7XG4gICAgICAgICAgICBpZiAocmV2b2NhdGlvbi5tYWNoaW5lSWQgIT09IG1hY2hpbmVJZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhbGxvd2VkQWdhaW4ocGFpcktleSh7IGZpbmdlcnByaW50OiByZXZvY2F0aW9uLm1hY2hpbmVJZCwgaXA6IHJldm9jYXRpb24uaXAgfSkpKSB7XG4gICAgICAgICAgICAgICAgZnJvemVuRnJvbSA9IHJldm9jYXRpb24uaXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyb3plbkZyb20pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmVyZGljdDogeyBhY2NlcHRlZDogZmFsc2UsIHJlYXNvbjogYHRoYXQgbWFjaGluZSBpcyBmcm96ZW4sIGl0IHdhcyB1c2VkIGZyb20gJHtmcm96ZW5Gcm9tfSB3aGljaCBpdCBpcyBub3QgYWxsb3dlZCBmcm9tYCB9LFxuICAgICAgICAgICAgICAgIGZyb3plOiBmYWxzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFjaGluZS5pcHMuaW5jbHVkZXMoaXApKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiB0cnVlLCByZWFzb246IFwiXCIgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaXN0ZWQsIGJ1dCB0YWxraW5nIHRvIHVzIGZyb20gc29tZXdoZXJlIGl0IHNob3VsZCBub3QgYmUuIFJlY29yZGVkIG9uY2UgZm9yIHRoaXMgbWFjaGluZVxuICAgICAgICAvLyBhbmQgYWRkcmVzcywgc28gYmVpbmcgdGFsa2VkIHRvIHJlcGVhdGVkbHkgZG9lcyBub3Qgd3JpdGUgcmVwZWF0ZWRseS5cbiAgICAgICAgbGV0IHBhaXIgPSBwYWlyS2V5KHsgZmluZ2VycHJpbnQ6IG1hY2hpbmVJZCwgaXAgfSk7XG4gICAgICAgIGxldCBhbHJlYWR5UmVjb3JkZWQgPSByZXZvY2F0aW9ucy5zb21lKHJldm9jYXRpb24gPT5cbiAgICAgICAgICAgIHBhaXJLZXkoeyBmaW5nZXJwcmludDogcmV2b2NhdGlvbi5tYWNoaW5lSWQsIGlwOiByZXZvY2F0aW9uLmlwIH0pID09PSBwYWlyKTtcbiAgICAgICAgaWYgKCFhbHJlYWR5UmVjb3JkZWQgJiYgIWFsbG93ZWRBZ2FpbihwYWlyKSkge1xuICAgICAgICAgICAgYXdhaXQgcmVjb3JkTWFjaGluZVJldm9jYXRpb24oeyBzb3VyY2VVUkwsIG1hY2hpbmVJZCwgaXAsIGhvc3RMYWJlbDogb3MuaG9zdG5hbWUoKSB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGB0aGF0IG1hY2hpbmUgaXMgbm90IGFsbG93ZWQgZnJvbSAke2lwfSwgc28gaXQgaXMgbm93IGZyb3plbiBldmVyeXdoZXJlYCB9LCBmcm96ZTogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGB0aGF0IG1hY2hpbmUgaXMgbm90IGFsbG93ZWQgZnJvbSAke2lwfWAgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCB7IHZlcmRpY3QsIGZyb3plIH0gPSBhd2FpdCBldmFsdWF0ZSgpO1xuICAgIC8vIEFuIGFjY2VwdCwgb3IgYSByZWplY3Rpb24gdGhhdCBqdXN0IGZyb3plIHRoZSBtYWNoaW5lLCBpcyB0aGUgZmluYWwgd29yZC4gQW55IG90aGVyIHJlamVjdGlvblxuICAgIC8vIG1pZ2h0IGp1c3QgYmUgYSBzdGFsZSBsaXN0IC0gYSBtYWNoaW5lIGFkZGVkIHNlY29uZHMgYWdvIHdlIGhhdmUgbm90IGNhdWdodCB1cCB0byAtIHNvIGl0IGlzXG4gICAgLy8gd29ydGggb25lIGZyZXNoIGxvb2suXG4gICAgaWYgKHZlcmRpY3QuYWNjZXB0ZWQgfHwgZnJvemUpIHtcbiAgICAgICAgcmV0dXJuIHZlcmRpY3Q7XG4gICAgfVxuICAgIC8vIFJlLXJlYWQgdGhlIGxpc3QgYXQgbW9zdCBvbmNlIGEgbWludXRlLCBzbyBhIGJ1cnN0IG9mIGJhZCBjYWxsZXJzIGNhbm5vdCBtYWtlIHVzIHJlLXJlYWQgb25cbiAgICAvLyBldmVyeSBvbmUgb2YgdGhlbSwgdGhlbiB0YWtlIHdoYXRldmVyIHRoZSBmcmVzaCBsb29rIHNheXMgYXMgZmluYWwuXG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0TWFjaGluZXNJbnZhbGlkYXRpb24gPiBNQUNISU5FU19JTlZBTElEQVRJT05fSU5URVJWQUwpIHtcbiAgICAgICAgbGFzdE1hY2hpbmVzSW52YWxpZGF0aW9uID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdHJ1c3RlZE1hY2hpbmVzLnJlc2V0KCk7XG4gICAgfVxuICAgIHJldHVybiAoYXdhaXQgZXZhbHVhdGUoKSkudmVyZGljdDtcbn1cbiJdfQ==
410
- /* _JS_SOURCE_HASH = "79cc028dfb5d9a23af69fced52c46b66f6be689c0038645806555803e3599feb"; */
413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjaGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNoaW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4Qix5REFBNkQ7QUFDN0Qsa0VBQStFO0FBQy9FLGtFQUErRTtBQUMvRSxvRUFBbUg7QUFDbkgsc0RBQWdFO0FBQ2hFLGtFQUFxRTtBQUNyRSwwREFBZ0U7QUFDaEUsaUVBQStFO0FBQy9FLDREQUF5RDtBQUN6RCxzREFBdUk7QUFDdkksa0RBQWlJO0FBQ2pJLG9EQUFpRjtBQUNqRix5REFBbUQ7QUFDbkQsMkRBQStEO0FBRy9ELG1HQUFtRztBQUNuRyxpR0FBaUc7QUFDakcsZ0VBQWdFO0FBQ25ELFFBQUEsWUFBWSxHQUFHLFVBQVUsQ0FBQztBQUN2QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUM7QUFDdEMsTUFBTSxpQkFBaUIsR0FBRyw4Q0FBOEMsQ0FBQztBQUN6RSxnR0FBZ0c7QUFDaEcsbUNBQW1DO0FBQ25DLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN2Qyw2RkFBNkY7QUFDN0YsaUdBQWlHO0FBQ2pHLGtFQUFrRTtBQUNsRSxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUMsZ0dBQWdHO0FBQ2hHLGlHQUFpRztBQUNqRywwREFBMEQ7QUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQzFELGdHQUFnRztBQUNoRyxnR0FBZ0c7QUFDaEcsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2pELElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBU2pDLEtBQUssVUFBVSxVQUFVLENBQUMsUUFBZ0I7SUFDdEMsSUFB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QU8sQ0FBQyxRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7UUFDNUIsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUNELDhGQUE4RjtJQUM5RixnR0FBZ0c7SUFDaEcsNEZBQTRGO0lBQzVGLFNBQVM7SUFDVCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyx3QkFBd0IsR0FBRyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3pFLHdCQUF3QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFBLGdCQUFRLEdBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUEsY0FBUSxFQUFDLFNBQVMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLFNBQVMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEgsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRCxPQUFPLENBQUMsTUFBTSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxDQUFDO0FBckZELDhDQXFGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMva2V5c1JlcG9cIjtcbmltcG9ydCB7IHJldm9rZVJlcG8sIHN5bmNSZXBvRmlsZXMgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlcG9GaWxlc1wiO1xuaW1wb3J0IHsgbGlzdFJlcG9EaXIsIHJlYWRSZXBvRmlsZSB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVwb0ZpbGVzXCI7XG5pbXBvcnQgeyBuZXdSZXZvY2F0aW9uSWQsIHBhaXJLZXksIHJlYWRSZXZvY2F0aW9uRmlsZXMsIHJlYWRVbnJldm9rZXMgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3Jldm9jYXRpb25cIjtcbmltcG9ydCB7IHJ1bkdpdCwgc3luY1JlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL2dpdFwiO1xuaW1wb3J0IHsgZW5zdXJlUmV2b2tlS2V5IH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9yZXBvRmlsZXNcIjtcbmltcG9ydCB7IHJlYWRTaWduZWRSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi90cnVzdFwiO1xuaW1wb3J0IHsgcmV2b2tlUmVwb1BhdGgsIHJldm9rZVJlcG9VUkwgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvcmV2b2tlU291cmNlXCI7XG5pbXBvcnQgeyBub3RpZnkgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL25vdGlmeVwiO1xuaW1wb3J0IHsgYXJlRGlzY29yZE5vdGlmaWNhdGlvbnNDb25maWd1cmVkLCBjb25maWd1cmVEaXNjb3JkTm90aWZpY2F0aW9ucywgREVGQVVMVF9XRUJIT09LX0ZJTEVfUEFUSCB9IGZyb20gXCIuLi9ub3RpZmljYXRpb25zL2Rpc2NvcmRcIjtcbmltcG9ydCB7IERFVl9nZXRJZGVudGl0eUZpbGVQYXRoLCBnZW5lcmF0ZUNBLCBnZXRNYWNoaW5lSWQsIGdldE93bk1hY2hpbmVJZCwgSWRlbnRpdHlTdG9yYWdlVHlwZSB9IGZyb20gXCIuLi8uLi9taXNjL2h0dHBzL2NlcnRzXCI7XG5pbXBvcnQgeyBkZXNjcmliZUhvc3QsIHJ1bk92ZXJTU0gsIHdyaXRlUmVtb3RlRmlsZSB9IGZyb20gXCIuLi9oZWxwZXJzL3JlbW90ZVNTSFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBzcGF3blByb21pc2UgfSBmcm9tIFwiLi4vaGVscGVycy9zcGF3blwiO1xuXG4vLyBXaGljaCBtYWNoaW5lcyB0aGlzIHN5c3RlbSB0YWxrcyB0bywga2VwdCBpbiB0aGUgc2FtZSByZXBvIGFzIHRoZSBzc2gga2V5cy4gVGhhdCByZXBvIGlzIGFscmVhZHlcbi8vIHNpZ25lZCwgYWxyZWFkeSBkaXN0cmlidXRlZCB0byBldmVyeSBtYWNoaW5lLCBhbmQgYWxyZWFkeSBoYXMgc29tZXdoZXJlIHRvIHJlY29yZCBhIHJlamVjdGlvbixcbi8vIHNvIGEgc2Vjb25kIG9uZSB3b3VsZCBvbmx5IGJlIGEgc2Vjb25kIHRoaW5nIHRvIGtlZXAgaW4gc3RlcC5cbmV4cG9ydCBjb25zdCBNQUNISU5FU19ESVIgPSBcIm1hY2hpbmVzXCI7XG5jb25zdCBSRVZPQ0FUSU9OU19ESVIgPSBcInJldm9jYXRpb25zXCI7XG5jb25zdCBSRVZPQ0FUSU9OX1JFQVNPTiA9IFwiYSBtYWNoaW5lIHRhbGtlZCB0byB1cyBmcm9tIGFuIHVuYXBwcm92ZWQgSVBcIjtcbi8vIFRoZSByZXZva2UgcmVwbyBpcyBwdWxsZWQgYXQgbW9zdCB0aGlzIG9mdGVuLiBBIGNoZWNrIGhhcHBlbnMgcGVyIHJlcXVlc3QsIGFuZCBhIHJlcXVlc3QgbXVzdFxuLy8gbm90IGNvc3QgYSByb3VuZCB0cmlwIHRvIGdpdGh1Yi5cbmNvbnN0IFJFVk9LRV9TWU5DX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuLy8gQW5kIHRoZSBtYWNoaW5lIGxpc3QgaXMgcmUtcmVhZCBmcm9tIHRoZSBjaGVja291dCBvbiB0aGlzIGludGVydmFsLCBpbiB0aGUgYmFja2dyb3VuZC4gVGhlXG4vLyBjaGVja291dCBpdHNlbGYgb25seSBtb3ZlcyB3aGVuIHRoZSBkYWVtb24gcHVsbHMgaXQsIHdoaWNoIGlzIG9uIHRoZSBzYW1lIHNvcnQgb2YgaW50ZXJ2YWwsIHNvXG4vLyByZWFkaW5nIG1vcmUgb2Z0ZW4gdGhhbiB0aGlzIHdvdWxkIG9ubHkgcmUtcmVhZCB0aGUgc2FtZSBieXRlcy5cbmNvbnN0IE1BQ0hJTkVTX1JFRlJFU0hfSU5URVJWQUwgPSA2MCAqIDEwMDA7XG4vLyBIb3cgbG9uZyBhIGZhaWx1cmUgdG8gZmluZCB0aGUga2V5cyByZXBvIGlzIHJlbWVtYmVyZWQuIEEgbG9uZyBsaXZlZCBwcm9jZXNzIG1heSBzdGFydCBiZWZvcmVcbi8vIHRoZSBtYWNoaW5lIGlzIHNldCB1cCwgYW5kIHNob3VsZCBwaWNrIGl0IHVwIG9uY2UgaXQgaXMsIHdpdGhvdXQgYmVpbmcgcmVzdGFydGVkIC0gYnV0IGl0IG11c3Rcbi8vIG5vdCBwYXkgZm9yIHJlc29sdmluZyB0aGUgcmVwbyBvbiBldmVyeSByZXF1ZXN0IGVpdGhlci5cbmNvbnN0IFJFUE9fUkVUUllfREVMQVkgPSAxNSAqIDEwMDA7XG5jb25zdCBMT09QQkFDSyA9IFtcIjEyNy4wLjAuMVwiLCBcIjo6MVwiLCBcIjo6ZmZmZjoxMjcuMC4wLjFcIl07XG4vLyBUaGUgdHJ1c3RlZCBtYWNoaW5lIGxpc3QgaXMgcmUtcmVhZCBhdCBtb3N0IHRoaXMgb2Z0ZW4gd2hlbiBhIGNoZWNrIHJlamVjdHMsIHNvIGEgY2FsbGVyIHRoYXRcbi8vIHdhcyBqdXN0IGFkZGVkIGlzIHBpY2tlZCB1cCBxdWlja2x5IHdpdGhvdXQgbGV0dGluZyBhIGZsb29kIG9mIHJlamVjdGlvbnMgcmUtcmVhZCBldmVyeSB0aW1lLlxuY29uc3QgTUFDSElORVNfSU5WQUxJREFUSU9OX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xubGV0IGxhc3RNYWNoaW5lc0ludmFsaWRhdGlvbiA9IDA7XG5cbi8qKiBPbmUgbWFjaGluZSB3ZSBhcmUgd2lsbGluZyB0byB0YWxrIHRvLCBhbmQgdGhlIGFkZHJlc3NlcyBpdCBtYXkgdGFsayB0byB1cyBmcm9tLiAqL1xuZXhwb3J0IHR5cGUgTWFjaGluZVN0YXRlID0ge1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwczogc3RyaW5nW107XG4gICAgYWRkZWRBdDogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gcGF0aEV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtYWNoaW5lRmlsZVBhdGgocmVwb1BhdGg6IHN0cmluZywgbWFjaGluZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHJlcG9QYXRoLCBNQUNISU5FU19ESVIsIGAke21hY2hpbmVJZH0uanNvbmApO1xufVxuXG4vKiogVGhpcyBtYWNoaW5lJ3Mga2V5cyByZXBvLCB3b3JrZWQgb3V0IG9uY2UgYW5kIHRoZW4gcmVtZW1iZXJlZC5cblxuICAgIEEgZmFpbHVyZSBpcyByZW1lbWJlcmVkIHRvbywgYnV0IG9ubHkgYnJpZWZseTogYSBzZXJ2ZXIgbWF5IHdlbGwgc3RhcnQgYmVmb3JlIHRoZSBtYWNoaW5lIGhhc1xuICAgIGJlZW4gc2V0IHVwLCBhbmQgc2hvdWxkIHN0YXJ0IHdvcmtpbmcgd2hlbiBpdCBpcywgcmF0aGVyIHRoYW4gbmVlZGluZyBhIHJlc3RhcnQuICovXG5leHBvcnQgY29uc3Qga2V5c1JlcG8gPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgbG9va3VwID0gcmVzb2x2ZUtleXNSZXBvKCk7XG4gICAgbG9va3VwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBrZXlzUmVwby5yZXNldCgpLCBSRVBPX1JFVFJZX0RFTEFZKS51bnJlZigpO1xuICAgIH0pO1xuICAgIHJldHVybiBhd2FpdCBsb29rdXA7XG59KTtcblxuLyoqIEV2ZXJ5IG1hY2hpbmUgYSBjaGVja291dCBsaXN0cy4gV2l0aG91dCBhIHJlcG8sIHRoaXMgbWFjaGluZSdzIG93bi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNYWNoaW5lcyhyZXBvUGF0aD86IHN0cmluZyk6IFByb21pc2U8TWFjaGluZVN0YXRlW10+IHtcbiAgICByZXR1cm4gWy4uLihhd2FpdCByZWFkTWFjaGluZXMocmVwb1BhdGggfHwgKGF3YWl0IGtleXNSZXBvKCkpLnJlcG9QYXRoKSkudmFsdWVzKCldO1xufVxuXG4vKiogVGhlIG1hY2hpbmVzIHRoZSBzaWduZWQgZmlsZXMgdm91Y2ggZm9yLiBPbmx5IHRoZSBtYWNoaW5lIGZpbGVzIGNvdmVyZWQgYnkgdGhlIHNpZ25hdHVyZSBhcmVcbiAgICByZWFkIC0gYW4gdW5zaWduZWQgbWFjaGluZXMvKi5qc29uIGlzIG5vdCBldmlkZW5jZSBvZiBhbnl0aGluZywgc28gcmVhZFNpZ25lZFJlcG8gaGFzIGFscmVhZHlcbiAgICBsZWZ0IGl0IG91dC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRUcnVzdGVkTWFjaGluZXMoKSB7XG4gICAgbGV0IHsgcmVwb1BhdGggfSA9IGF3YWl0IGtleXNSZXBvKCk7XG4gICAgbGV0IHsgZmlsZXMgfSA9IGF3YWl0IHJlYWRTaWduZWRSZXBvKHJlcG9QYXRoKTtcbiAgICBsZXQgbWFjaGluZXM6IE1hY2hpbmVTdGF0ZVtdID0gW107XG4gICAgZm9yIChsZXQgW2ZpbGVQYXRoLCBjb250ZW50c10gb2YgZmlsZXMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWxlUGF0aC5zdGFydHNXaXRoKGAke01BQ0hJTkVTX0RJUn0vYCkgJiYgZmlsZVBhdGguc2xpY2UoTUFDSElORVNfRElSLmxlbmd0aCArIDEpIHx8IFwiXCI7XG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpIHx8IG5hbWUuaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWFjaGluZSA9IHBhcnNlTWFjaGluZUZpbGUobmFtZSwgY29udGVudHMudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgaWYgKG1hY2hpbmUpIHtcbiAgICAgICAgICAgIG1hY2hpbmVzLnB1c2gobWFjaGluZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hY2hpbmVzO1xufVxuXG5jb25zdCB0cnVzdGVkTWFjaGluZXMgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgcmVhZCA9IHJlYWRUcnVzdGVkTWFjaGluZXMoKTtcbiAgICByZWFkLmNhdGNoKCgpID0+IHRydXN0ZWRNYWNoaW5lcy5yZXNldCgpKTtcbiAgICByZXR1cm4gYXdhaXQgcmVhZDtcbn0pO1xuXG5sZXQgcmVmcmVzaGluZyA9IGZhbHNlO1xuXG4vKiogVGhlIG1hY2hpbmVzIHRoaXMgc3lzdGVtIHRydXN0cywgYXMgdGhlIHNpZ25lZCByZXBvIGxpc3RzIHRoZW0uXG5cbiAgICBIZWxkIHJhdGhlciB0aGFuIHJlYWQgcGVyIGNhbGwsIGFuZCByZWZyZXNoZWQgaW4gdGhlIGJhY2tncm91bmQsIHNvIG5vYm9keSBhc2tpbmcgd2hldGhlciBhXG4gICAgbWFjaGluZSBpcyB0cnVzdGVkIHdhaXRzIGZvciBhIGRpcmVjdG9yeSBvZiBmaWxlcyB0byBiZSByZWFkIGFuZCBhIHNpZ25hdHVyZSB0byBiZSBjaGVja2VkLiBBXG4gICAgcmVmcmVzaCB0aGF0IGZhaWxzIGxlYXZlcyB0aGUgbGlzdCB3ZSBhbHJlYWR5IGhhdmU6IHRoZSBjaGVja291dCBpcyBvbmx5IHN0YWxlLCBub3Qgd3JvbmcuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VHJ1c3RlZE1hY2hpbmVzKCk6IFByb21pc2U8TWFjaGluZVN0YXRlW10+IHtcbiAgICBpZiAoIXJlZnJlc2hpbmcpIHtcbiAgICAgICAgcmVmcmVzaGluZyA9IHRydWU7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChNQUNISU5FU19SRUZSRVNIX0lOVEVSVkFMLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRydXN0ZWRNYWNoaW5lcy5zZXQoUHJvbWlzZS5yZXNvbHZlKGF3YWl0IHJlYWRUcnVzdGVkTWFjaGluZXMoKSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3QgcmUtcmVhZCB0aGUgdHJ1c3RlZCBtYWNoaW5lcywga2VlcGluZyB0aGUgb25lcyB3ZSBoYXZlLiAke2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdHJ1c3RlZE1hY2hpbmVzKCk7XG59XG5cbi8qKiBUaGUgbWFjaGluZSBpZCBvZiBhIG1hY2hpbmUgcmVhY2hlZCBvdmVyIHNzaCwgZ2VuZXJhdGluZyBhbmQgaW5zdGFsbGluZyBhbiBpZGVudGl0eSBmb3IgaXQgaWZcbiAgICBpdCBoYXMgbm9uZSB1bmRlciB0aGlzIGRvbWFpbi4gVGhlIHByaXZhdGUga2V5IGVuZHMgdXAgb24gdGhhdCBtYWNoaW5lIGFuZCBub3doZXJlIGVsc2UuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVSZW1vdGVNYWNoaW5lSWQoaG9zdDogc3RyaW5nLCBkb21haW46IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShERVZfZ2V0SWRlbnRpdHlGaWxlUGF0aChkb21haW4pKTtcbiAgICBsZXQgaG9tZSA9IChhd2FpdCBydW5PdmVyU1NIKHsgaG9zdCwgc2NyaXB0OiBgZWNobyAkSE9NRWAgfSkpLnN0ZG91dC50cmltKCk7XG4gICAgaWYgKCFob21lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtob3N0fSB0byByZXBvcnQgYSBob21lIGRpcmVjdG9yeSwgaXQgcmVwb3J0ZWQgbm90aGluZ2ApO1xuICAgIH1cbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCBydW5PdmVyU1NIKHsgaG9zdCwgc2NyaXB0OiBgY2F0ICR7aG9tZX0vJHtmaWxlTmFtZX0gMj4vZGV2L251bGwgfHwgdHJ1ZWAgfSk7XG4gICAgaWYgKGNvbnRlbnRzLnN0ZG91dC50cmltKCkpIHtcbiAgICAgICAgbGV0IHN0b3JlZCA9IEpTT04ucGFyc2UoY29udGVudHMuc3Rkb3V0KSBhcyBJZGVudGl0eVN0b3JhZ2VUeXBlO1xuICAgICAgICByZXR1cm4gZ2V0TWFjaGluZUlkKHN0b3JlZC5kb21haW4sIGRvbWFpbik7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gaGFzIG5vIGlkZW50aXR5IGZvciAke2RvbWFpbn0sIGdlbmVyYXRpbmcgb25lYCk7XG4gICAgbGV0IGdlbmVyYXRlZCA9IGdlbmVyYXRlQ0EoZG9tYWluKTtcbiAgICBsZXQgc3RvcmVkOiBJZGVudGl0eVN0b3JhZ2VUeXBlID0ge1xuICAgICAgICBkb21haW46IGdlbmVyYXRlZC5kb21haW4sXG4gICAgICAgIGNlcnRCNjQ6IGdlbmVyYXRlZC5jZXJ0LnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICBrZXlCNjQ6IGdlbmVyYXRlZC5rZXkudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgfTtcbiAgICBhd2FpdCB3cml0ZVJlbW90ZUZpbGUoe1xuICAgICAgICBob3N0LFxuICAgICAgICBmaWxlUGF0aDogYCR7aG9tZX0vJHtmaWxlTmFtZX1gLFxuICAgICAgICBjb250ZW50czogSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjAwXCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIGdldE1hY2hpbmVJZChnZW5lcmF0ZWQuZG9tYWluLCBkb21haW4pO1xufVxuXG4vKiogTWFrZXMgYSBjaGVja291dCBsaXN0IGV4YWN0bHkgdGhlc2UgbWFjaGluZXM6IHRob3NlIG5hbWVkIGFyZSB3cml0dGVuIHdpdGggdGhlIGFkZHJlc3NlcyBnaXZlbixcbiAgICBhbmQgYW55dGhpbmcgbm90IG5hbWVkIGlzIHJlbW92ZWQuIFNvIHJlYWQgdGhlbSwgY2hhbmdlIHdoYXQgeW91IHdhbnQsIGFuZCB3cml0ZSB0aGUgcmVzdWx0LlxuXG4gICAgVGhlIGFkZHJlc3NlcyBhcmUgcGFydCBvZiBzZXR0aW5nIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgc3RlcCwgYmVjYXVzZSBhIG1hY2hpbmUgd2l0aCBub1xuICAgIGFkZHJlc3MgaXQgbWF5IHRhbGsgZnJvbSBpcyBub3QgYSBtYWNoaW5lIHRoYXQgd291bGQgZXZlciBiZSBhY2NlcHRlZCAtIHRoZXJlIGlzIG5vIHN0YXRlIHdoZXJlXG4gICAgbmFtaW5nIG9uZSB3aXRob3V0IHRoZW0gbWVhbnMgYW55dGhpbmcuXG5cbiAgICBOb3RoaW5nIGhlcmUgc2lnbnMgb3IgY29tbWl0cy4gVGhlIHNpZ25hdHVyZSBpcyB3aGF0IGV2ZXJ5IG90aGVyIG1hY2hpbmUgY2hlY2tzIGJlZm9yZVxuICAgIGJlbGlldmluZyBhbnkgb2YgdGhpcywgYW5kIGl0IHRha2VzIHRoZSBoYXJkd2FyZSBrZXksIHNvIGB5YXJuIHNpZ25maWxlcyBnaXRgIGlzIHN0aWxsIHlvdXJzIHRvXG4gICAgcnVuIGFmdGVyd2FyZHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0TWFjaGluZXMoY29uZmlnOiB7XG4gICAgcmVwb1BhdGg/OiBzdHJpbmc7XG4gICAgbWFjaGluZXM6IHsgbWFjaGluZUlkOiBzdHJpbmc7IGlwczogc3RyaW5nW10gfVtdO1xufSk6IFByb21pc2U8TWFjaGluZVN0YXRlW10+IHtcbiAgICBsZXQgeyBtYWNoaW5lcyB9ID0gY29uZmlnO1xuICAgIGxldCByZXBvUGF0aCA9IGNvbmZpZy5yZXBvUGF0aCB8fCAoYXdhaXQga2V5c1JlcG8oKSkucmVwb1BhdGg7XG4gICAgLy8gV2hhdGV2ZXIgd2FzIGhlbGQgaXMgbm93IHN0YWxlLCB3aG9ldmVyIHJlYWRzIGl0IG5leHQuXG4gICAgdHJ1c3RlZE1hY2hpbmVzLnJlc2V0KCk7XG4gICAgbGV0IGV4aXN0aW5nID0gYXdhaXQgcmVhZE1hY2hpbmVzKHJlcG9QYXRoKTtcbiAgICBsZXQgZGlyZWN0b3J5ID0gcGF0aC5qb2luKHJlcG9QYXRoLCBNQUNISU5FU19ESVIpO1xuICAgIGxldCB3cml0dGVuOiBNYWNoaW5lU3RhdGVbXSA9IFtdO1xuICAgIGZvciAobGV0IG1hY2hpbmUgb2YgbWFjaGluZXMpIHtcbiAgICAgICAgaWYgKCFtYWNoaW5lLm1hY2hpbmVJZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIG1hY2hpbmVJZCwgd2FzICR7SlNPTi5zdHJpbmdpZnkobWFjaGluZS5tYWNoaW5lSWQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWFjaGluZS5pcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIGFkZHJlc3NlcyBmb3IgJHttYWNoaW5lLm1hY2hpbmVJZH0sIHdhcyBub25lLiBBIG1hY2hpbmUgaXMgdHJ1c3RlZCBmcm9tYFxuICAgICAgICAgICAgICAgICsgYCB0aGUgYWRkcmVzc2VzIGl0IG1heSB0YWxrIGZyb20sIHNvIGxlYXZlIGl0IG91dCBvZiB0aGUgbGlzdCB0byByZW1vdmUgaXQuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaXBzID0gbWFjaGluZS5pcHMuZmlsdGVyKChpcCwgaW5kZXgpID0+IGlwICYmIG1hY2hpbmUuaXBzLmluZGV4T2YoaXApID09PSBpbmRleCk7XG4gICAgICAgIGxldCBzdGF0ZTogTWFjaGluZVN0YXRlID0ge1xuICAgICAgICAgICAgbWFjaGluZUlkOiBtYWNoaW5lLm1hY2hpbmVJZCxcbiAgICAgICAgICAgIC8vIEluIHRoZSBvcmRlciBnaXZlbiwgd2l0aG91dCBkdXBsaWNhdGVzLCBzbyB0aGUgZmlsZSByZWFkcyB0aGUgd2F5IGl0IHdhcyBzZXQuXG4gICAgICAgICAgICBpcHMsXG4gICAgICAgICAgICBhZGRlZEF0OiBleGlzdGluZy5nZXQobWFjaGluZS5tYWNoaW5lSWQpPy5hZGRlZEF0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKG1hY2hpbmVGaWxlUGF0aChyZXBvUGF0aCwgc3RhdGUubWFjaGluZUlkKSwgSlNPTi5zdHJpbmdpZnkoc3RhdGUsIHVuZGVmaW5lZCwgNCkgKyBcIlxcblwiKTtcbiAgICAgICAgd3JpdHRlbi5wdXNoKHN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBXaGF0ZXZlciB0aGUgcmVwbyBoYWQgYW5kIHRoZSBjYWxsZXIgZGlkIG5vdCBuYW1lIGlzIG5vIGxvbmdlciB0cnVzdGVkLlxuICAgIGZvciAobGV0IG1hY2hpbmVJZCBvZiBleGlzdGluZy5rZXlzKCkpIHtcbiAgICAgICAgaWYgKCFtYWNoaW5lcy5zb21lKG1hY2hpbmUgPT4gbWFjaGluZS5tYWNoaW5lSWQgPT09IG1hY2hpbmVJZCkpIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnJtKG1hY2hpbmVGaWxlUGF0aChyZXBvUGF0aCwgbWFjaGluZUlkKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd3JpdHRlbjtcbn1cblxuZnVuY3Rpb24gcGFyc2VNYWNoaW5lRmlsZShuYW1lOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpOiBNYWNoaW5lU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzKTtcbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IHBhcnNlZC5tYWNoaW5lSWQgfHwgbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4geyBtYWNoaW5lSWQsIGlwczogcGFyc2VkLmlwcyB8fCBbXSwgYWRkZWRBdDogcGFyc2VkLmFkZGVkQXQgfHwgXCJcIiB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nIHVucmVhZGFibGUgbWFjaGluZSBmaWxlICR7bmFtZX0uICR7ZX1gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbi8qKiBFdmVyeSBtYWNoaW5lIGZpbGUgb24gZGlzay4gRm9yIGVkaXRpbmcgdGhlIHJlcG8sIG5vdCBmb3IgZGVjaWRpbmcgdHJ1c3QgLSB0cnVzdCByZWFkcyB0aGVcbiAgICBzaWduZWQgZmlsZXMgdGhyb3VnaCByZWFkVHJ1c3RlZE1hY2hpbmVzLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZE1hY2hpbmVzKHJlcG9QYXRoOiBzdHJpbmcpIHtcbiAgICBsZXQgbWFjaGluZXMgPSBuZXcgTWFwPHN0cmluZywgTWFjaGluZVN0YXRlPigpO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIE1BQ0hJTkVTX0RJUik7XG4gICAgbGV0IG5hbWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJlY3RvcnkpLmNhdGNoKCgpID0+IFtdIGFzIHN0cmluZ1tdKTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIG5hbWVzLnNvcnQoKSkge1xuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hY2hpbmUgPSBwYXJzZU1hY2hpbmVGaWxlKG5hbWUsIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpLCBcInV0ZjhcIikuY2F0Y2goKCkgPT4gXCJcIikpO1xuICAgICAgICBpZiAobWFjaGluZSkge1xuICAgICAgICAgICAgbWFjaGluZXMuc2V0KG1hY2hpbmUubWFjaGluZUlkLCBtYWNoaW5lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZXM7XG59XG5cbmxldCBsYXN0UmV2b2tlU3luYyA9IDA7XG5cbi8qKiBQdWxsZWQgYXQgbW9zdCBvbmNlIGEgUkVWT0tFX1NZTkNfSU5URVJWQUwsIGJlY2F1c2UgdGhpcyBpcyBhc2tlZCBwZXIgcmVxdWVzdC4gQSBzeW5jIHRoYXRcbiAgICBmYWlscyBsZWF2ZXMgdGhlIGNoZWNrb3V0IHdlIGFscmVhZHkgaGF2ZSwgd2hpY2ggaXMgdGhlIHNhZmUgZGlyZWN0aW9uOiByZXZvY2F0aW9ucyB3ZSBrbm93XG4gICAgYWJvdXQgc3RheSBrbm93bi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN5bmNSZXZvY2F0aW9ucyhzb3VyY2VVUkw6IHN0cmluZykge1xuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdFJldm9rZVN5bmMgPCBSRVZPS0VfU1lOQ19JTlRFUlZBTCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RSZXZva2VTeW5jID0gRGF0ZS5ub3coKTtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBzeW5jUmVwb0ZpbGVzKHJldm9rZVJlcG8oc291cmNlVVJMKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ291bGQgbm90IHJlYWQgJHtyZXZva2VSZXBvVVJMKHNvdXJjZVVSTCl9LCB1c2luZyB0aGUgcmV2b2NhdGlvbnMgYWxyZWFkeSBoZXJlLiAke2V9YCk7XG4gICAgfVxufVxuXG4vKiogTWFjaGluZSByZXZvY2F0aW9ucywgcmVhZCBvdXQgb2YgdGhlIHJldm9rZSByZXBvIHRoZSBzYW1lIHdheSBrZXkgcmV2b2NhdGlvbnMgYXJlLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZE1hY2hpbmVSZXZvY2F0aW9ucyhzb3VyY2VVUkw6IHN0cmluZykge1xuICAgIGxldCByZXBvID0gcmV2b2tlUmVwbyhzb3VyY2VVUkwpO1xuICAgIGxldCByZXZvY2F0aW9uczogeyByZXZvY2F0aW9uSWQ6IHN0cmluZzsgbWFjaGluZUlkOiBzdHJpbmc7IGlwOiBzdHJpbmcgfVtdID0gW107XG4gICAgZm9yIChsZXQgbmFtZSBvZiBhd2FpdCBsaXN0UmVwb0RpcihyZXBvLCBSRVZPQ0FUSU9OU19ESVIpKSB7XG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZFJlcG9GaWxlKHJlcG8sIHBhdGguam9pbihSRVZPQ0FUSU9OU19ESVIsIG5hbWUpKSB8fCBcIlwiKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQubWFjaGluZUlkKSB7XG4gICAgICAgICAgICAgICAgcmV2b2NhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHJldm9jYXRpb25JZDogcGFyc2VkLnJldm9jYXRpb25JZCB8fCBuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJcIiksXG4gICAgICAgICAgICAgICAgICAgIG1hY2hpbmVJZDogcGFyc2VkLm1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgaXA6IHBhcnNlZC5pcCB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgSWdub3JpbmcgdW5yZWFkYWJsZSByZXZvY2F0aW9uICR7bmFtZX0uICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV2b2NhdGlvbnM7XG59XG5cbi8qKiBXaGF0IHRvIHJ1biB0byB0cnVzdCBhIG1hY2hpbmUgdGhhdCBoYXMganVzdCBiZWVuIHJlZnVzZWQuXG5cbiAgICBFdmVyeXRoaW5nIGluIGl0IGlzIGFscmVhZHkga25vd24gdG8gd2hvZXZlciBpcyBiZWluZyByZWZ1c2VkOiB0aGVpciBtYWNoaW5lIGlkLCB0aGUgYWRkcmVzcyB3ZVxuICAgIHNhdyB0aGVtIGF0LCBhbmQgdGhlIGRvbWFpbiB0aGV5IGp1c3QgdGFsa2VkIHRvLiBIYW5kaW5nIGl0IGJhY2sgc2F2ZXMgdGhlbSB3b3JraW5nIG91dCB0aGVcbiAgICBwYXJ0cyBvZiBhIGNvbW1hbmQgdGhleSBoYXZlIGV2ZXJ5IHJpZ2h0IHRvIGtub3cuIFJ1bm5pbmcgaXQgc3RpbGwgdGFrZXMgdGhlIGhhcmR3YXJlIGtleSBvblxuICAgIHRoZSBtYWNoaW5lIHRoYXQgb3ducyB0aGUgcmVwbywgc28gdGVsbGluZyB0aGVtIGNvc3RzIG5vdGhpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTWFjaGluZUNvbW1hbmQoY29uZmlnOiB7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nOyBkb21haW4/OiBzdHJpbmcgfSkge1xuICAgIGxldCB7IG1hY2hpbmVJZCwgaXAsIGRvbWFpbiB9ID0gY29uZmlnO1xuICAgIHJldHVybiBgVG8gdHJ1c3QgaXQsIHJ1bjogeWFybiBhZGRtYWNoaW5lICR7ZG9tYWluIHx8IFwiPGRvbWFpbj5cIn0gJHttYWNoaW5lSWR9ICR7aXB9IGdpdGA7XG59XG5cbi8qKiBTZW5kcyB0aGUgb25lIG5vdGlmaWNhdGlvbiB0aGlzIGZpbGUgaXMgYWxsb3dlZCB0byBzZW5kLCB3aGVuIGl0IGNhbi5cblxuICAgIFRoZSBkYWVtb24gY29uZmlndXJlcyBub3RpZmljYXRpb25zIG9uIHN0YXJ0dXAgYW5kIHdvdWxkIHNpbXBseSBzZW5kLiBUaGlzIGNhbiBhbHNvIHJ1biBpbiBzb21lXG4gICAgb3RoZXIgcHJvY2Vzcywgd2hpY2ggaGFzIG5vdCwgc28gdGhlIHdlYmhvb2sgaXMgcGlja2VkIHVwIGhlcmUgaWYgaXQgaXMgcmVhZGFibGUuIEEgbWFjaGluZVxuICAgIHdpdGggbm8gd2ViaG9vayBzZXQgdXAgc3RpbGwgcmVjb3JkcyB0aGUgcmV2b2NhdGlvbiAtIGJlaW5nIHVuYWJsZSB0byB0ZWxsIGFueW9uZSBpcyBub3QgYVxuICAgIHJlYXNvbiB0byBrZWVwIGFjY2VwdGluZyBhIG1hY2hpbmUgdGhhdCBpcyBiZWluZyBtaXN1c2VkLiAqL1xuYXN5bmMgZnVuY3Rpb24gbm90aWZ5QmVzdEVmZm9ydChoZWFkbGluZTogc3RyaW5nLCBib2R5OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoIWFyZURpc2NvcmROb3RpZmljYXRpb25zQ29uZmlndXJlZCgpKSB7XG4gICAgICAgICAgICAvLyBSZWFkIGZpcnN0OiBjb25maWd1cmVEaXNjb3JkTm90aWZpY2F0aW9ucyBleGl0cyB0aGUgcHJvY2VzcyB3aGVuIHRoZSBmaWxlIGlzIG1pc3NpbmcsXG4gICAgICAgICAgICAvLyB3aGljaCBpcyByaWdodCBmb3IgdGhlIGRhZW1vbiBhdCBzdGFydHVwIGFuZCB3cm9uZyBmb3IgYSBsaWJyYXJ5IGNhbGwuXG4gICAgICAgICAgICBhd2FpdCBmcy5yZWFkRmlsZShERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRILCBcInV0ZjhcIik7XG4gICAgICAgICAgICBhd2FpdCBjb25maWd1cmVEaXNjb3JkTm90aWZpY2F0aW9ucyh7IGZpbGVQYXRoOiBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIIH0pO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IG5vdGlmeShoZWFkbGluZSwgYm9keSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ291bGQgbm90IHNlbmQgYSBub3RpZmljYXRpb24gYWJvdXQgdGhpcywgaXQgaXMgb25seSBpbiB0aGUgbG9nLiAke2V9YCk7XG4gICAgfVxufVxuXG4vKiogUmVjb3JkcyB0aGF0IGEgbWFjaGluZSB3ZSBhY2NlcHQgdGFsa2VkIHRvIHVzIGZyb20gYW4gYWRkcmVzcyBpdCBpcyBub3QgYWxsb3dlZCBmcm9tLiBPbmUgcGVyXG4gICAgbWFjaGluZSBhbmQgYWRkcmVzcywgc28gYSBzZWNvbmQgYWRkcmVzcyBpcyBhIHNlY29uZCByZXZvY2F0aW9uIGFuZCBhbiB1bnJldm9rZSBvZiB0aGUgZmlyc3RcbiAgICBkb2VzIG5vdCBjb3ZlciBpdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZE1hY2hpbmVSZXZvY2F0aW9uKGNvbmZpZzoge1xuICAgIHNvdXJjZVVSTDogc3RyaW5nO1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgaG9zdExhYmVsOiBzdHJpbmc7XG59KSB7XG4gICAgbGV0IHsgc291cmNlVVJMLCBtYWNoaW5lSWQsIGlwLCBob3N0TGFiZWwgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVwb1BhdGggPSByZXZva2VSZXBvUGF0aChzb3VyY2VVUkwpO1xuICAgIGxldCBrZXlQYXRoID0gYXdhaXQgZW5zdXJlUmV2b2tlS2V5KHNvdXJjZVVSTCk7XG4gICAgbGV0IHJldm9jYXRpb25JZCA9IG5ld1Jldm9jYXRpb25JZChtYWNoaW5lSWQpO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIFJFVk9DQVRJT05TX0RJUik7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGRpcmVjdG9yeSwgYCR7cmV2b2NhdGlvbklkfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcmV2b2NhdGlvbklkLFxuICAgICAgICBtYWNoaW5lSWQsXG4gICAgICAgIGlwLFxuICAgICAgICByZXZva2VkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgcmV2b2tlZEJ5OiBob3N0TGFiZWwsXG4gICAgICAgIHJlYXNvbjogUkVWT0NBVElPTl9SRUFTT04sXG4gICAgfSwgdW5kZWZpbmVkLCA0KSArIFwiXFxuXCIpO1xuXG4gICAgYXdhaXQgcnVuR2l0KHsgYXJnczogW1wiYWRkXCIsIFwiLUFcIl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGggfSk7XG4gICAgYXdhaXQgcnVuR2l0KHtcbiAgICAgICAgYXJnczogW1wiLWNcIiwgXCJ1c2VyLmVtYWlsPXBvcnRzZWN1cmVAbG9jYWxob3N0XCIsIFwiLWNcIiwgXCJ1c2VyLm5hbWU9cG9ydHNlY3VyZVwiLCBcImNvbW1pdFwiLCBcIi1tXCIsIGByZXZva2UgJHtyZXZvY2F0aW9uSWR9YF0sXG4gICAgICAgIGN3ZDogcmVwb1BhdGgsIGtleVBhdGgsXG4gICAgfSk7XG4gICAgbGV0IHB1c2ggPSBhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJwdXNoXCIsIFwib3JpZ2luXCIsIFwiSEVBRFwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmIChwdXNoLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAvLyBBbm90aGVyIG1hY2hpbmUgbW9zdCBsaWtlbHkgcmVjb3JkZWQgdGhlIHNhbWUgdGhpbmcgZmlyc3QsIGFuZCB0aGUgbmV4dCByZWFkIHBpY2tzIGl0IHVwLlxuICAgICAgICBjb25zb2xlLmxvZyhgQ291bGQgbm90IHB1c2ggdGhlIHJldm9jYXRpb24gb2YgJHttYWNoaW5lSWR9IGZyb20gJHtpcH0uICR7KHB1c2guc3Rkb3V0ICsgcHVzaC5zdGRlcnIpLnRyaW0oKX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgUmV2b2tlZCAke21hY2hpbmVJZH0gZnJvbSAke2lwfSwgJHtyZXZvY2F0aW9uSWR9YCk7XG5cbiAgICAvLyBTYWlkIGJ5IHdob2V2ZXIgd3JvdGUgdGhlIHJldm9jYXRpb24sIG9uY2UsIHRoZSBzYW1lIGFzIGZvciBhbiBzc2gga2V5LiBNYWNoaW5lcyB0aGF0IG9ubHlcbiAgICAvLyByZWFkIGl0IGxhdGVyIHNheSBub3RoaW5nLCBvciBvbmUgZXZlbnQgd291bGQgYmUgcmVwb3J0ZWQgYnkgZXZlcnkgbWFjaGluZSB0aGF0IHNhdyBpdC5cbiAgICBhd2FpdCBub3RpZnlCZXN0RWZmb3J0KFxuICAgICAgICBgU1VTUElDSU9VUyBJUCAke2lwfSBGUk9aRSBNQUNISU5FICR7bWFjaGluZUlkfWAsXG4gICAgICAgIGBBIG1hY2hpbmUgd2UgdHJ1c3QgdGFsa2VkIHRvIHVzIGZyb20gJHtpcH0sIHdoaWNoIGlzIG5vdCBhbiBhZGRyZXNzIGl0IGlzIGFsbG93ZWQgdG8gdGFsa2BcbiAgICAgICAgKyBgIGZyb20uIEl0IHByb3ZlZCBpdCBob2xkcyB0aGF0IG1hY2hpbmUncyBrZXksIHNvIGVpdGhlciBzb21lb25lIGVsc2UgaGFzIGEgY29weSBvZiBpdCxgXG4gICAgICAgICsgYCBvciB0aGF0IG1hY2hpbmUncyBhZGRyZXNzIGNoYW5nZWQuYFxuICAgICAgICArIGBcXG5cXG5JdCBpcyBmcm96ZW4gZXZlcnl3aGVyZSBub3csIGFuZCBub3RoaW5nIGFjY2VwdHMgaXQuYFxuICAgICAgICArIGBcXG5cXG5JZiB0aGlzIHdhcyBhbiBhdHRhY2ssIHJlbW92ZSBcXGBtYWNoaW5lcy8ke21hY2hpbmVJZH0uanNvblxcYCBmcm9tIFxcYCR7c291cmNlVVJMfVxcYCBub3cuYFxuICAgICAgICArIGBcXG5JZiBpdCB3YXMgbGVnaXRpbWF0ZSwgcnVuIFxcYHlhcm4gdW5yZXZva2UgZ2l0XFxgIGluIHRoYXQgcmVwby4gSXQgYWxsb3dzICR7aXB9IGZvciB0aGF0YFxuICAgICAgICArIGAgbWFjaGluZSwgYW5kIHRha2VzIGVmZmVjdCBhcyBlYWNoIG1hY2hpbmUgcGlja3MgaXQgdXAuYFxuICAgICAgICArIGBcXG5cXG5tYWNoaW5lOiBcXGAke21hY2hpbmVJZH1cXGBgXG4gICAgICAgICsgYFxcbmZyb3plbiBieTogXFxgJHtob3N0TGFiZWx9XFxgYFxuICAgICk7XG59XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgdGFsayB0byB0aGlzIG1hY2hpbmUsIGNvbWluZyBmcm9tIHRoaXMgYWRkcmVzcy5cblxuICAgIEJvdGggaGFsdmVzIGFyZSByZXF1aXJlZCBhbmQgbmVpdGhlciBpcyBhIGd1ZXNzOiB0aGUgY2FsbGVyIGtub3dzIHRoZSBtYWNoaW5lIGlkIGJlY2F1c2UgdGhlXG4gICAgY29ubmVjdGlvbiBwcm92ZWQgaXQsIGFuZCBrbm93cyB0aGUgYWRkcmVzcyBiZWNhdXNlIHRoZSBwYWNrZXRzIGNhbWUgZnJvbSB0aGVyZS4gQSBtYWNoaW5lIHdlXG4gICAgZG8gbm90IGxpc3QgaXMgc2ltcGx5IG5vdCBhY2NlcHRlZC4gQSBtYWNoaW5lIHdlIGRvIGxpc3QsIGFycml2aW5nIGZyb20gYW4gYWRkcmVzcyBpdCBkb2VzIG5vdFxuICAgIGhhdmUsIGlzIHRyZWF0ZWQgYXMgdGhlIHNhbWUga2luZCBvZiBldmVudCBhcyBhIHN0b2xlbiBzc2gga2V5IC0gaXQgaXMgcmV2b2tlZCBldmVyeXdoZXJlLCBhbmRcbiAgICBzdGF5cyByZXZva2VkIHVudGlsIGFuIHVucmV2b2tlIGFsbG93cyB0aGF0IG1hY2hpbmUgZnJvbSB0aGF0IGFkZHJlc3MuXG5cbiAgICBTYXlzIHdoeSB3aGVuIHRoZSBhbnN3ZXIgaXMgbm8sIGJlY2F1c2UgdGhlIHRocmVlIHdheXMgdG8gYmUgcmVmdXNlZCBhcmUgZW50aXJlbHkgZGlmZmVyZW50XG4gICAgdGhpbmdzIHRvIGEgcGVyc29uIHJlYWRpbmcgaXQ6IG5ldmVyIHRydXN0ZWQgYXQgYWxsLCB0cnVzdGVkIGJ1dCBmcm96ZW4sIG9yIHRydXN0ZWQgYW5kIHRhbGtpbmdcbiAgICBmcm9tIHNvbWV3aGVyZSBpdCBzaG91bGQgbm90IGJlLlxuXG4gICAgVGhyb3dzIHdoZW4gdGhlIHJlcG8gaXRzZWxmIGNhbm5vdCBiZSByZWFkIG9yIGlzIG5vdCBzaWduZWQsIHJhdGhlciB0aGFuIGFuc3dlcmluZyBmYWxzZTogdGhhdFxuICAgIGlzIGEgYnJva2VuIGluc3RhbGxhdGlvbiwgbm90IGEgcmVqZWN0ZWQgbWFjaGluZSwgYW5kIHRoZSB0d28gZGVzZXJ2ZSBkaWZmZXJlbnQgaGFuZGxpbmcuICovXG5leHBvcnQgdHlwZSBNYWNoaW5lVmVyZGljdCA9IHsgYWNjZXB0ZWQ6IGJvb2xlYW47IHJlYXNvbjogc3RyaW5nIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc01hY2hpbmVBY2NlcHRlZChjb25maWc6IHtcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIC8vIFVzZWQgZm9yIGxvY2FsIGxvb3BiYWNrIGFjY2VwdGFuY2UsIGFuZCBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLlxuICAgIGRvbWFpbj86IHN0cmluZztcbn0pOiBQcm9taXNlPE1hY2hpbmVWZXJkaWN0PiB7XG4gICAgbGV0IHsgbWFjaGluZUlkLCBpcCwgZG9tYWluIH0gPSBjb25maWc7XG4gICAgaWYgKCFtYWNoaW5lSWQgfHwgIWlwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBtYWNoaW5lSWQgYW5kIGFuIGlwLCB3YXMgJHtKU09OLnN0cmluZ2lmeShtYWNoaW5lSWQpfSBhbmQgJHtKU09OLnN0cmluZ2lmeShpcCl9YCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHdob2xlIGNoZWNrLCBwbHVzIHdoZXRoZXIgaXQgZnJvemUgdGhlIG1hY2hpbmUuIEEgcmVqZWN0aW9uIHRoYXQgZnJvemUgaXQgaXMgZmluYWwsIHNvXG4gICAgLy8gdGhlcmUgaXMgbm90aGluZyB0byBnYWluIGZyb20gbG9va2luZyBhZ2Fpbi4gQW55IG90aGVyIHJlamVjdGlvbiBtaWdodCBqdXN0IGJlIGEgc3RhbGUgdmlldyAtXG4gICAgLy8gYSBtYWNoaW5lIGFkZGVkIHNlY29uZHMgYWdvIHRoYXQgb3VyIGNhY2hlZCBsaXN0IGhhcyBub3QgY2F1Z2h0IHVwIHRvIC0gc28gaXQgaXMgd29ydGggb25lXG4gICAgLy8gZnJlc2ggbG9vaywgd2hpY2ggaXMgd2hhdCB0aGUgcmV0cnkgYmVsb3cgZG9lcy5cbiAgICBsZXQgZXZhbHVhdGUgPSBhc3luYyAoKTogUHJvbWlzZTx7IHZlcmRpY3Q6IE1hY2hpbmVWZXJkaWN0OyBmcm96ZTogYm9vbGVhbiB9PiA9PiB7XG4gICAgICAgIGlmIChMT09QQkFDSy5pbmNsdWRlcyhpcCkgJiYgISFkb21haW4gJiYgbWFjaGluZUlkID09PSBnZXRPd25NYWNoaW5lSWQoZG9tYWluKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogdHJ1ZSwgcmVhc29uOiBcIlwiIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHNvdXJjZVVSTCB9ID0gYXdhaXQga2V5c1JlcG8oKTtcbiAgICAgICAgLy8gVmVyaWZpZWQgYmVmb3JlIGl0IGlzIGJlbGlldmVkLCBhbmQgY2FjaGVkLCBzaW5jZSB0aGlzIGlzIGFza2VkIG9uY2UgcGVyIHJlcXVlc3QuXG4gICAgICAgIGxldCBtYWNoaW5lID0gKGF3YWl0IGdldFRydXN0ZWRNYWNoaW5lcygpKS5maW5kKGVudHJ5ID0+IGVudHJ5Lm1hY2hpbmVJZCA9PT0gbWFjaGluZUlkKTtcbiAgICAgICAgaWYgKCFtYWNoaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiBmYWxzZSwgcmVhc29uOiBgdGhhdCBtYWNoaW5lIGlzIG5vdCB0cnVzdGVkLiAke2FkZE1hY2hpbmVDb21tYW5kKHsgbWFjaGluZUlkLCBpcCwgZG9tYWluIH0pfWAgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzeW5jUmV2b2NhdGlvbnMoc291cmNlVVJMKTtcbiAgICAgICAgbGV0IHVucmV2b2tlcyA9IGF3YWl0IHJlYWRVbnJldm9rZXMoc291cmNlVVJMKS5jYXRjaCgoKSA9PiAoeyBwYWlyczogbmV3IE1hcCgpLCBsZWdhY3lJZHM6IG5ldyBNYXAoKSB9KSk7XG4gICAgICAgIC8vIEFuIHVucmV2b2tlIGNvdW50cyBhcyBzb29uIGFzIGl0IGlzIHNlZW4uIEl0IGlzIHNpZ25lZCwgc28gd3JpdGluZyBvbmUgYWxyZWFkeSB0YWtlcyB0aGVcbiAgICAgICAgLy8gaGFyZHdhcmUga2V5LCBhbmQgYW55b25lIGhvbGRpbmcgdGhhdCBjYW4gc2lnbiBhbnl0aGluZyBhdCBhbGwgLSBhIHdhaXQgYmVmb3JlIGhvbm91cmluZyBpdFxuICAgICAgICAvLyBndWFyZHMgYWdhaW5zdCBhbiBhdHRhY2tlciB3aG8gaGFzIG5vIG5lZWQgb2YgaXQuXG4gICAgICAgIGxldCBhbGxvd2VkQWdhaW4gPSAocGFpcjogc3RyaW5nKSA9PiAhIXVucmV2b2tlcy5wYWlycy5nZXQocGFpcik/Lmxlbmd0aDtcbiAgICAgICAgbGV0IHJldm9jYXRpb25zID0gYXdhaXQgcmVhZE1hY2hpbmVSZXZvY2F0aW9ucyhzb3VyY2VVUkwpO1xuICAgICAgICAvLyBBbnkgcmV2b2NhdGlvbiBub3RoaW5nIGhhcyB1bmRvbmUga2VlcHMgdGhlIG1hY2hpbmUgb3V0LCBmcm9tIGV2ZXJ5d2hlcmUsIHRoZSB3YXkgYSByZXZva2VkXG4gICAgICAgIC8vIHNzaCBrZXkgaXMgb3V0IGV2ZXJ5d2hlcmUgcmF0aGVyIHRoYW4gb25seSBmcm9tIHRoZSBhZGRyZXNzIGl0IHdhcyBtaXN1c2VkIGZyb20uXG4gICAgICAgIGxldCBmcm96ZW5Gcm9tID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgcmV2b2NhdGlvbiBvZiByZXZvY2F0aW9ucykge1xuICAgICAgICAgICAgaWYgKHJldm9jYXRpb24ubWFjaGluZUlkICE9PSBtYWNoaW5lSWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYWxsb3dlZEFnYWluKHBhaXJLZXkoeyBmaW5nZXJwcmludDogcmV2b2NhdGlvbi5tYWNoaW5lSWQsIGlwOiByZXZvY2F0aW9uLmlwIH0pKSkge1xuICAgICAgICAgICAgICAgIGZyb3plbkZyb20gPSByZXZvY2F0aW9uLmlwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmcm96ZW5Gcm9tKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGB0aGF0IG1hY2hpbmUgaXMgZnJvemVuLCBpdCB3YXMgdXNlZCBmcm9tICR7ZnJvemVuRnJvbX0gd2hpY2ggaXQgaXMgbm90IGFsbG93ZWQgZnJvbWAgfSxcbiAgICAgICAgICAgICAgICBmcm96ZTogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hY2hpbmUuaXBzLmluY2x1ZGVzKGlwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogdHJ1ZSwgcmVhc29uOiBcIlwiIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGlzdGVkLCBidXQgdGFsa2luZyB0byB1cyBmcm9tIHNvbWV3aGVyZSBpdCBzaG91bGQgbm90IGJlLiBSZWNvcmRlZCBvbmNlIGZvciB0aGlzIG1hY2hpbmVcbiAgICAgICAgLy8gYW5kIGFkZHJlc3MsIHNvIGJlaW5nIHRhbGtlZCB0byByZXBlYXRlZGx5IGRvZXMgbm90IHdyaXRlIHJlcGVhdGVkbHkuXG4gICAgICAgIGxldCBwYWlyID0gcGFpcktleSh7IGZpbmdlcnByaW50OiBtYWNoaW5lSWQsIGlwIH0pO1xuICAgICAgICBsZXQgYWxyZWFkeVJlY29yZGVkID0gcmV2b2NhdGlvbnMuc29tZShyZXZvY2F0aW9uID0+XG4gICAgICAgICAgICBwYWlyS2V5KHsgZmluZ2VycHJpbnQ6IHJldm9jYXRpb24ubWFjaGluZUlkLCBpcDogcmV2b2NhdGlvbi5pcCB9KSA9PT0gcGFpcik7XG4gICAgICAgIGlmICghYWxyZWFkeVJlY29yZGVkICYmICFhbGxvd2VkQWdhaW4ocGFpcikpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlY29yZE1hY2hpbmVSZXZvY2F0aW9uKHsgc291cmNlVVJMLCBtYWNoaW5lSWQsIGlwLCBob3N0TGFiZWw6IG9zLmhvc3RuYW1lKCkgfSk7XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiBmYWxzZSwgcmVhc29uOiBgdGhhdCBtYWNoaW5lIGlzIG5vdCBhbGxvd2VkIGZyb20gJHtpcH0sIHNvIGl0IGlzIG5vdyBmcm96ZW4gZXZlcnl3aGVyZWAgfSwgZnJvemU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiBmYWxzZSwgcmVhc29uOiBgdGhhdCBtYWNoaW5lIGlzIG5vdCBhbGxvd2VkIGZyb20gJHtpcH1gIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgIH07XG5cbiAgICBsZXQgeyB2ZXJkaWN0LCBmcm96ZSB9ID0gYXdhaXQgZXZhbHVhdGUoKTtcbiAgICAvLyBBbiBhY2NlcHQsIG9yIGEgcmVqZWN0aW9uIHRoYXQganVzdCBmcm96ZSB0aGUgbWFjaGluZSwgaXMgdGhlIGZpbmFsIHdvcmQuIEFueSBvdGhlciByZWplY3Rpb25cbiAgICAvLyBtaWdodCBqdXN0IGJlIGEgc3RhbGUgbGlzdCAtIGEgbWFjaGluZSBhZGRlZCBzZWNvbmRzIGFnbyB3ZSBoYXZlIG5vdCBjYXVnaHQgdXAgdG8gLSBzbyBpdCBpc1xuICAgIC8vIHdvcnRoIG9uZSBmcmVzaCBsb29rLlxuICAgIGlmICh2ZXJkaWN0LmFjY2VwdGVkIHx8IGZyb3plKSB7XG4gICAgICAgIHJldHVybiB2ZXJkaWN0O1xuICAgIH1cbiAgICAvLyBSZS1yZWFkIHRoZSBsaXN0IGF0IG1vc3Qgb25jZSBhIG1pbnV0ZSwgc28gYSBidXJzdCBvZiBiYWQgY2FsbGVycyBjYW5ub3QgbWFrZSB1cyByZS1yZWFkIG9uXG4gICAgLy8gZXZlcnkgb25lIG9mIHRoZW0uIEZvcmNlIHRoZSBjaGVja291dCBiYWNrIHRvIHRoZSByZW1vdGUgZmlyc3QsIHNvIGEgbWFjaGluZSBhZGRlZCBhbmQgc2lnbmVkXG4gICAgLy8gc2Vjb25kcyBhZ28gaXMgcGlja2VkIHVwIGV2ZW4gaWYgdGhlIGNoZWNrb3V0IHdhcyBsZWZ0IGRpcnR5LCB0aGVuIHRha2UgdGhlIGZyZXNoIGxvb2sgYXNcbiAgICAvLyBmaW5hbC5cbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RNYWNoaW5lc0ludmFsaWRhdGlvbiA+IE1BQ0hJTkVTX0lOVkFMSURBVElPTl9JTlRFUlZBTCkge1xuICAgICAgICBsYXN0TWFjaGluZXNJbnZhbGlkYXRpb24gPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgeyBzb3VyY2VVUkwgfSA9IGF3YWl0IGtleXNSZXBvKCk7XG4gICAgICAgIGF3YWl0IHN5bmNSZXBvKHNvdXJjZVVSTCwgeyBmb3JjZVVwZGF0ZTogdHJ1ZSB9KS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGBDb3VsZCBub3QgZm9yY2UgdXBkYXRlICR7c291cmNlVVJMfS4gJHtlfWApKTtcbiAgICAgICAgdHJ1c3RlZE1hY2hpbmVzLnJlc2V0KCk7XG4gICAgfVxuICAgIHJldHVybiAoYXdhaXQgZXZhbHVhdGUoKSkudmVyZGljdDtcbn1cbiJdfQ==
414
+ /* _JS_SOURCE_HASH = "41fe5e6472ab16f346319d5e5731c05c7642fb68d98e5b378ccf1693bf79f3d9"; */
@@ -12,19 +12,11 @@ export type MachineState = {
12
12
  export declare const keysRepo: {
13
13
  (): Promise<{
14
14
  repoPath: string;
15
- /** This machine's keys repo, worked out once and then remembered.
16
-
17
- A failure is remembered too, but only briefly: a server may well start before the machine has
18
- been set up, and should start working when it is, rather than needing a restart. */
19
15
  sourceURL: string;
20
16
  }>;
21
17
  reset(): void;
22
18
  set(newValue: Promise<{
23
19
  repoPath: string;
24
- /** This machine's keys repo, worked out once and then remembered.
25
-
26
- A failure is remembered too, but only briefly: a server may well start before the machine has
27
- been set up, and should start working when it is, rather than needing a restart. */
28
20
  sourceURL: string;
29
21
  }>): void;
30
22
  };
@@ -5,7 +5,7 @@ import { resolveKeysRepo } from "../authorizedKeys/keysRepo";
5
5
  import { revokeRepo, syncRepoFiles } from "../authorizedKeys/daemon/repoFiles";
6
6
  import { listRepoDir, readRepoFile } from "../authorizedKeys/daemon/repoFiles";
7
7
  import { newRevocationId, pairKey, readRevocationFiles, readUnrevokes } from "../authorizedKeys/daemon/revocation";
8
- import { runGit } from "../authorizedKeys/daemon/git";
8
+ import { runGit, syncRepo } from "../authorizedKeys/daemon/git";
9
9
  import { ensureRevokeKey } from "../authorizedKeys/daemon/repoFiles";
10
10
  import { readSignedRepo } from "../authorizedKeys/daemon/trust";
11
11
  import { revokeRepoPath, revokeRepoURL } from "../authorizedKeys/revokeSource";
@@ -451,9 +451,13 @@ export async function isMachineAccepted(config: {
451
451
  return verdict;
452
452
  }
453
453
  // Re-read the list at most once a minute, so a burst of bad callers cannot make us re-read on
454
- // every one of them, then take whatever the fresh look says as final.
454
+ // every one of them. Force the checkout back to the remote first, so a machine added and signed
455
+ // seconds ago is picked up even if the checkout was left dirty, then take the fresh look as
456
+ // final.
455
457
  if (Date.now() - lastMachinesInvalidation > MACHINES_INVALIDATION_INTERVAL) {
456
458
  lastMachinesInvalidation = Date.now();
459
+ let { sourceURL } = await keysRepo();
460
+ await syncRepo(sourceURL, { forceUpdate: true }).catch(e => console.log(`Could not force update ${sourceURL}. ${e}`));
457
461
  trustedMachines.reset();
458
462
  }
459
463
  return (await evaluate()).verdict;