velocious 1.0.165 → 1.0.166

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.
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/test.js"],"names":[],"mappings":"AA6FA;IACE,yBA8CC;CACF;wBA3IuB,iCAAiC"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/test.js"],"names":[],"mappings":"AA6FA;IACE,yBAgEC;CACF;wBA7JuB,iCAAiC"}
@@ -93,6 +93,24 @@ export default class VelociousCliCommandsTest extends BaseCommand {
93
93
  const testFilesFinder = new TestFilesFinder({ directory, directories, processArgs: filteredProcessArgs });
94
94
  const testFiles = await testFilesFinder.findTestFiles();
95
95
  const testRunner = new TestRunner({ configuration: this.getConfiguration(), excludeTags, includeTags, testFiles });
96
+ let signalHandled = false;
97
+ const handleSignal = async (signal) => {
98
+ if (signalHandled)
99
+ return;
100
+ signalHandled = true;
101
+ console.error(`\nReceived ${signal}, running afterAll hooks before exit...`);
102
+ try {
103
+ await testRunner.runAfterAllsForActiveScopes();
104
+ }
105
+ catch (error) {
106
+ console.error("Failed while running afterAll hooks:", error);
107
+ }
108
+ finally {
109
+ process.exit(130);
110
+ }
111
+ };
112
+ process.once("SIGINT", () => { void handleSignal("SIGINT"); });
113
+ process.once("SIGTERM", () => { void handleSignal("SIGTERM"); });
96
114
  await testRunner.prepare();
97
115
  if (testRunner.getTestsCount() === 0) {
98
116
  throw new Error(`${testRunner.getTestsCount()} tests was found in ${testFiles.length} file(s)`);
@@ -117,4 +135,4 @@ export default class VelociousCliCommandsTest extends BaseCommand {
117
135
  }
118
136
  }
119
137
  }
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN6RCxPQUFPLGVBQWUsTUFBTSwwQ0FBMEMsQ0FBQTtBQUN0RSxPQUFPLFVBQVUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUUzRCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQ25FLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7QUFFeEU7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBSztJQUN0QixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRXJCLE9BQU8sS0FBSztTQUNULEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN4QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLFdBQVc7SUFDbEMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO0lBQ3RCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQTtJQUN0QixNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDMUUsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFB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Q0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixVQUFVLENBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQTtZQUM1RixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEJhc2VDb21tYW5kIGZyb20gXCIuLi8uLi8uLi8uLi9jbGkvYmFzZS1jb21tYW5kLmpzXCJcbmltcG9ydCBUZXN0RmlsZXNGaW5kZXIgZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1maWxlcy1maW5kZXIuanNcIlxuaW1wb3J0IFRlc3RSdW5uZXIgZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1ydW5uZXIuanNcIlxuXG5jb25zdCBJTkNMVURFX1RBR19GTEFHUyA9IG5ldyBTZXQoW1wiLS10YWdcIiwgXCItLWluY2x1ZGUtdGFnXCIsIFwiLXRcIl0pXG5jb25zdCBFWENMVURFX1RBR19GTEFHUyA9IG5ldyBTZXQoW1wiLS1leGNsdWRlLXRhZ1wiLCBcIi0tc2tpcC10YWdcIiwgXCIteFwiXSlcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUYWcgYXJndW1lbnQgdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gVGFncyBsaXN0LlxuICovXG5mdW5jdGlvbiBzcGxpdFRhZ3ModmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdXG5cbiAgcmV0dXJuIHZhbHVlXG4gICAgLnNwbGl0KFwiLFwiKVxuICAgIC5tYXAoKHRhZykgPT4gdGFnLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvY2Vzc0FyZ3MgLSBQcm9jZXNzIGFyZ3MuXG4gKiBAcmV0dXJucyB7e2luY2x1ZGVUYWdzOiBzdHJpbmdbXSwgZXhjbHVkZVRhZ3M6IHN0cmluZ1tdLCBmaWx0ZXJlZFByb2Nlc3NBcmdzOiBzdHJpbmdbXX19IC0gUGFyc2VkIHRhZ3MgYW5kIHByb2Nlc3MgYXJncy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VUYWdGaWx0ZXJzKHByb2Nlc3NBcmdzKSB7XG4gIGNvbnN0IGluY2x1ZGVUYWdzID0gW11cbiAgY29uc3QgZXhjbHVkZVRhZ3MgPSBbXVxuICBjb25zdCBmaWx0ZXJlZFByb2Nlc3NBcmdzID0gcHJvY2Vzc0FyZ3MubGVuZ3RoID4gMCA/IFtwcm9jZXNzQXJnc1swXV0gOiBbXVxuICBsZXQgaW5SZXN0QXJncyA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9jZXNzQXJncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IHByb2Nlc3NBcmdzW2ldXG5cbiAgICBpZiAoYXJnID09PSBcIi0tXCIpIHtcbiAgICAgIGluUmVzdEFyZ3MgPSB0cnVlXG4gICAgICBmaWx0ZXJlZFByb2Nlc3NBcmdzLnB1c2goYXJnKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIWluUmVzdEFyZ3MpIHtcbiAgICAgIGlmIChJTkNMVURFX1RBR19GTEFHUy5oYXMoYXJnKSkge1xuICAgICAgICBjb25zdCBuZXh0VmFsdWUgPSBwcm9jZXNzQXJnc1tpICsgMV1cblxuICAgICAgICBpZiAobmV4dFZhbHVlICYmICFuZXh0VmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBpbmNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhuZXh0VmFsdWUpKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChFWENMVURFX1RBR19GTEFHUy5oYXMoYXJnKSkge1xuICAgICAgICBjb25zdCBuZXh0VmFsdWUgPSBwcm9jZXNzQXJnc1tpICsgMV1cblxuICAgICAgICBpZiAobmV4dFZhbHVlICYmICFuZXh0VmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBleGNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhuZXh0VmFsdWUpKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tdGFnPVwiKSkge1xuICAgICAgICBpbmNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhhcmcuc2xpY2UoXCItLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1pbmNsdWRlLXRhZz1cIikpIHtcbiAgICAgICAgaW5jbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1pbmNsdWRlLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1leGNsdWRlLXRhZz1cIikpIHtcbiAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1leGNsdWRlLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1za2lwLXRhZz1cIikpIHtcbiAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1za2lwLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWx0ZXJlZFByb2Nlc3NBcmdzLnB1c2goYXJnKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpbmNsdWRlVGFnczogQXJyYXkuZnJvbShuZXcgU2V0KGluY2x1ZGVUYWdzKSksXG4gICAgZXhjbHVkZVRhZ3M6IEFycmF5LmZyb20obmV3IFNldChleGNsdWRlVGFncykpLFxuICAgIGZpbHRlcmVkUHJvY2Vzc0FyZ3NcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNDbGlDb21tYW5kc1Rlc3QgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuc2V0RW52aXJvbm1lbnQoXCJ0ZXN0XCIpXG5cbiAgICBsZXQgZGlyZWN0b3J5XG4gICAgY29uc3QgZGlyZWN0b3JpZXMgPSBbXVxuXG4gICAgaWYgKHByb2Nlc3MuZW52LlZFTE9DSU9VU19URVNUX0RJUikge1xuICAgICAgZGlyZWN0b3J5ID0gcHJvY2Vzcy5lbnYuVkVMT0NJT1VTX1RFU1RfRElSXG4gICAgICBkaXJlY3Rvcmllcy5wdXNoKHByb2Nlc3MuZW52LlZFTE9DSU9VU19URVNUX0RJUilcbiAgICB9IGVsc2Uge1xuICAgICAgZGlyZWN0b3J5ID0gdGhpcy5kaXJlY3RvcnkoKVxuICAgICAgZGlyZWN0b3JpZXMucHVzaChgJHt0aGlzLmRpcmVjdG9yeSgpfS9fX3Rlc3RzX19gKVxuICAgICAgZGlyZWN0b3JpZXMucHVzaChgJHt0aGlzLmRpcmVjdG9yeSgpfS90ZXN0c2ApXG4gICAgICBkaXJlY3Rvcmllcy5wdXNoKGAke3RoaXMuZGlyZWN0b3J5KCl9L3NwZWNgKVxuICAgIH1cblxuICAgIGNvbnN0IHtpbmNsdWRlVGFncywgZXhjbHVkZVRhZ3MsIGZpbHRlcmVkUHJvY2Vzc0FyZ3N9ID0gcGFyc2VUYWdGaWx0ZXJzKHRoaXMucHJvY2Vzc0FyZ3MgfHwgW10pXG4gICAgY29uc3QgdGVzdEZpbGVzRmluZGVyID0gbmV3IFRlc3RGaWxlc0ZpbmRlcih7ZGlyZWN0b3J5LCBkaXJlY3RvcmllcywgcHJvY2Vzc0FyZ3M6IGZpbHRlcmVkUHJvY2Vzc0FyZ3N9KVxuICAgIGNvbnN0IHRlc3RGaWxlcyA9IGF3YWl0IHRlc3RGaWxlc0ZpbmRlci5maW5kVGVzdEZpbGVzKClcbiAgICBjb25zdCB0ZXN0UnVubmVyID0gbmV3IFRlc3RSdW5uZXIoe2NvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLCBleGNsdWRlVGFncywgaW5jbHVkZVRhZ3MsIHRlc3RGaWxlc30pXG5cbiAgICBhd2FpdCB0ZXN0UnVubmVyLnByZXBhcmUoKVxuXG4gICAgaWYgKHRlc3RSdW5uZXIuZ2V0VGVzdHNDb3VudCgpID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGVzdFJ1bm5lci5nZXRUZXN0c0NvdW50KCl9IHRlc3RzIHdhcyBmb3VuZCBpbiAke3Rlc3RGaWxlcy5sZW5ndGh9IGZpbGUocylgKVxuICAgIH1cblxuICAgIGF3YWl0IHRlc3RSdW5uZXIucnVuKClcblxuICAgIGNvbnN0IGV4ZWN1dGVkVGVzdHMgPSB0ZXN0UnVubmVyLmdldEV4ZWN1dGVkVGVzdHNDb3VudCgpXG5cbiAgICBpZiAoKGluY2x1ZGVUYWdzLmxlbmd0aCA+IDAgfHwgZXhjbHVkZVRhZ3MubGVuZ3RoID4gMCkgJiYgZXhlY3V0ZWRUZXN0cyA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcIlxcbk5vIHRlc3RzIG1hdGNoZWQgdGhlIHByb3ZpZGVkIHRhZyBmaWx0ZXJzXCIpXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG5cbiAgICBpZiAodGVzdFJ1bm5lci5pc0ZhaWxlZCgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBcXG5UZXN0IHJ1biBmYWlsZWQgd2l0aCAke3Rlc3RSdW5uZXIuZ2V0RmFpbGVkVGVzdHMoKX0gZmFpbGVkIHRlc3RzIGFuZCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWxsYClcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH0gZWxzZSBpZiAodGVzdFJ1bm5lci5hcmVBbnlUZXN0c0ZvY3Vzc2VkKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbkZvY3Vzc2VkIHJ1biB3aXRoICR7dGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0cygpfSBmYWlsZWQgdGVzdHMgYW5kICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bGxgKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGBcXG5UZXN0IHJ1biBzdWNjZWVkZWQgd2l0aCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWwgdGVzdHNgKVxuICAgICAgcHJvY2Vzcy5leGl0KDApXG4gICAgfVxuICB9XG59XG4iXX0=
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN6RCxPQUFPLGVBQWUsTUFBTSwwQ0FBMEMsQ0FBQTtBQUN0RSxPQUFPLFVBQVUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUUzRCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQ25FLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7QUFFeEU7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBSztJQUN0QixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRXJCLE9BQU8sS0FBSztTQUNULEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN4QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLFdBQVc7SUFDbEMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO0lBQ3RCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQTtJQUN0QixNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDMUUsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFB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QU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1FBRXhELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5RSxPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7WUFDNUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqQixDQUFDO1FBRUQsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixVQUFVLENBQUMsY0FBYyxFQUFFLHFCQUFxQixVQUFVLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLENBQUE7WUFDdEksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqQixDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLFVBQVUsQ0FBQyxjQUFjLEVBQUUscUJBQXFCLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQTtZQUNuSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsVUFBVSxDQUFDLGtCQUFrQixFQUFFLG1CQUFtQixDQUFDLENBQUE7WUFDNUYsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCYXNlQ29tbWFuZCBmcm9tIFwiLi4vLi4vLi4vLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgVGVzdEZpbGVzRmluZGVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtZmlsZXMtZmluZGVyLmpzXCJcbmltcG9ydCBUZXN0UnVubmVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtcnVubmVyLmpzXCJcblxuY29uc3QgSU5DTFVERV9UQUdfRkxBR1MgPSBuZXcgU2V0KFtcIi0tdGFnXCIsIFwiLS1pbmNsdWRlLXRhZ1wiLCBcIi10XCJdKVxuY29uc3QgRVhDTFVERV9UQUdfRkxBR1MgPSBuZXcgU2V0KFtcIi0tZXhjbHVkZS10YWdcIiwgXCItLXNraXAtdGFnXCIsIFwiLXhcIl0pXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gVGFnIGFyZ3VtZW50IHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIFRhZ3MgbGlzdC5cbiAqL1xuZnVuY3Rpb24gc3BsaXRUYWdzKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXVxuXG4gIHJldHVybiB2YWx1ZVxuICAgIC5zcGxpdChcIixcIilcbiAgICAubWFwKCh0YWcpID0+IHRhZy50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb2Nlc3NBcmdzIC0gUHJvY2VzcyBhcmdzLlxuICogQHJldHVybnMge3tpbmNsdWRlVGFnczogc3RyaW5nW10sIGV4Y2x1ZGVUYWdzOiBzdHJpbmdbXSwgZmlsdGVyZWRQcm9jZXNzQXJnczogc3RyaW5nW119fSAtIFBhcnNlZCB0YWdzIGFuZCBwcm9jZXNzIGFyZ3MuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVGFnRmlsdGVycyhwcm9jZXNzQXJncykge1xuICBjb25zdCBpbmNsdWRlVGFncyA9IFtdXG4gIGNvbnN0IGV4Y2x1ZGVUYWdzID0gW11cbiAgY29uc3QgZmlsdGVyZWRQcm9jZXNzQXJncyA9IHByb2Nlc3NBcmdzLmxlbmd0aCA+IDAgPyBbcHJvY2Vzc0FyZ3NbMF1dIDogW11cbiAgbGV0IGluUmVzdEFyZ3MgPSBmYWxzZVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcHJvY2Vzc0FyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBwcm9jZXNzQXJnc1tpXVxuXG4gICAgaWYgKGFyZyA9PT0gXCItLVwiKSB7XG4gICAgICBpblJlc3RBcmdzID0gdHJ1ZVxuICAgICAgZmlsdGVyZWRQcm9jZXNzQXJncy5wdXNoKGFyZylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFpblJlc3RBcmdzKSB7XG4gICAgICBpZiAoSU5DTFVERV9UQUdfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgaW5jbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MobmV4dFZhbHVlKSlcbiAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoRVhDTFVERV9UQUdfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MobmV4dFZhbHVlKSlcbiAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLXRhZz1cIikpIHtcbiAgICAgICAgaW5jbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0taW5jbHVkZS10YWc9XCIpKSB7XG4gICAgICAgIGluY2x1ZGVUYWdzLnB1c2goLi4uc3BsaXRUYWdzKGFyZy5zbGljZShcIi0taW5jbHVkZS10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tZXhjbHVkZS10YWc9XCIpKSB7XG4gICAgICAgIGV4Y2x1ZGVUYWdzLnB1c2goLi4uc3BsaXRUYWdzKGFyZy5zbGljZShcIi0tZXhjbHVkZS10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tc2tpcC10YWc9XCIpKSB7XG4gICAgICAgIGV4Y2x1ZGVUYWdzLnB1c2goLi4uc3BsaXRUYWdzKGFyZy5zbGljZShcIi0tc2tpcC10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgZmlsdGVyZWRQcm9jZXNzQXJncy5wdXNoKGFyZylcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW5jbHVkZVRhZ3M6IEFycmF5LmZyb20obmV3IFNldChpbmNsdWRlVGFncykpLFxuICAgIGV4Y2x1ZGVUYWdzOiBBcnJheS5mcm9tKG5ldyBTZXQoZXhjbHVkZVRhZ3MpKSxcbiAgICBmaWx0ZXJlZFByb2Nlc3NBcmdzXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzQ2xpQ29tbWFuZHNUZXN0IGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnNldEVudmlyb25tZW50KFwidGVzdFwiKVxuXG4gICAgbGV0IGRpcmVjdG9yeVxuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gW11cblxuICAgIGlmIChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIpIHtcbiAgICAgIGRpcmVjdG9yeSA9IHByb2Nlc3MuZW52LlZFTE9DSU9VU19URVNUX0RJUlxuICAgICAgZGlyZWN0b3JpZXMucHVzaChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdG9yeSA9IHRoaXMuZGlyZWN0b3J5KClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vX190ZXN0c19fYClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vdGVzdHNgKVxuICAgICAgZGlyZWN0b3JpZXMucHVzaChgJHt0aGlzLmRpcmVjdG9yeSgpfS9zcGVjYClcbiAgICB9XG5cbiAgICBjb25zdCB7aW5jbHVkZVRhZ3MsIGV4Y2x1ZGVUYWdzLCBmaWx0ZXJlZFByb2Nlc3NBcmdzfSA9IHBhcnNlVGFnRmlsdGVycyh0aGlzLnByb2Nlc3NBcmdzIHx8IFtdKVxuICAgIGNvbnN0IHRlc3RGaWxlc0ZpbmRlciA9IG5ldyBUZXN0RmlsZXNGaW5kZXIoe2RpcmVjdG9yeSwgZGlyZWN0b3JpZXMsIHByb2Nlc3NBcmdzOiBmaWx0ZXJlZFByb2Nlc3NBcmdzfSlcbiAgICBjb25zdCB0ZXN0RmlsZXMgPSBhd2FpdCB0ZXN0RmlsZXNGaW5kZXIuZmluZFRlc3RGaWxlcygpXG4gICAgY29uc3QgdGVzdFJ1bm5lciA9IG5ldyBUZXN0UnVubmVyKHtjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSwgZXhjbHVkZVRhZ3MsIGluY2x1ZGVUYWdzLCB0ZXN0RmlsZXN9KVxuICAgIGxldCBzaWduYWxIYW5kbGVkID0gZmFsc2VcblxuICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9IGFzeW5jIChzaWduYWwpID0+IHtcbiAgICAgIGlmIChzaWduYWxIYW5kbGVkKSByZXR1cm5cbiAgICAgIHNpZ25hbEhhbmRsZWQgPSB0cnVlXG4gICAgICBjb25zb2xlLmVycm9yKGBcXG5SZWNlaXZlZCAke3NpZ25hbH0sIHJ1bm5pbmcgYWZ0ZXJBbGwgaG9va3MgYmVmb3JlIGV4aXQuLi5gKVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0ZXN0UnVubmVyLnJ1bkFmdGVyQWxsc0ZvckFjdGl2ZVNjb3BlcygpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHdoaWxlIHJ1bm5pbmcgYWZ0ZXJBbGwgaG9va3M6XCIsIGVycm9yKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEzMClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzLm9uY2UoXCJTSUdJTlRcIiwgKCkgPT4geyB2b2lkIGhhbmRsZVNpZ25hbChcIlNJR0lOVFwiKSB9KVxuICAgIHByb2Nlc3Mub25jZShcIlNJR1RFUk1cIiwgKCkgPT4geyB2b2lkIGhhbmRsZVNpZ25hbChcIlNJR1RFUk1cIikgfSlcblxuICAgIGF3YWl0IHRlc3RSdW5uZXIucHJlcGFyZSgpXG5cbiAgICBpZiAodGVzdFJ1bm5lci5nZXRUZXN0c0NvdW50KCkgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0ZXN0UnVubmVyLmdldFRlc3RzQ291bnQoKX0gdGVzdHMgd2FzIGZvdW5kIGluICR7dGVzdEZpbGVzLmxlbmd0aH0gZmlsZShzKWApXG4gICAgfVxuXG4gICAgYXdhaXQgdGVzdFJ1bm5lci5ydW4oKVxuXG4gICAgY29uc3QgZXhlY3V0ZWRUZXN0cyA9IHRlc3RSdW5uZXIuZ2V0RXhlY3V0ZWRUZXN0c0NvdW50KClcblxuICAgIGlmICgoaW5jbHVkZVRhZ3MubGVuZ3RoID4gMCB8fCBleGNsdWRlVGFncy5sZW5ndGggPiAwKSAmJiBleGVjdXRlZFRlc3RzID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiXFxuTm8gdGVzdHMgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgdGFnIGZpbHRlcnNcIilcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIGlmICh0ZXN0UnVubmVyLmlzRmFpbGVkKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcblRlc3QgcnVuIGZhaWxlZCB3aXRoICR7dGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0cygpfSBmYWlsZWQgdGVzdHMgYW5kICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bGxgKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfSBlbHNlIGlmICh0ZXN0UnVubmVyLmFyZUFueVRlc3RzRm9jdXNzZWQoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgXFxuRm9jdXNzZWQgcnVuIHdpdGggJHt0ZXN0UnVubmVyLmdldEZhaWxlZFRlc3RzKCl9IGZhaWxlZCB0ZXN0cyBhbmQgJHt0ZXN0UnVubmVyLmdldFN1Y2Nlc3NmdWxUZXN0cygpfSBzdWNjZXNzZnVsbGApXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYFxcblRlc3QgcnVuIHN1Y2NlZWRlZCB3aXRoICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bCB0ZXN0c2ApXG4gICAgICBwcm9jZXNzLmV4aXQoMClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -64,6 +64,7 @@ export default class TestRunner {
64
64
  _failedTests: number;
65
65
  _successfulTests: number;
66
66
  _testsCount: number;
67
+ _activeAfterAllScopes: any[];
67
68
  /**
68
69
  * @returns {import("../configuration.js").default} - The configuration.
69
70
  */
@@ -145,6 +146,10 @@ export default class TestRunner {
145
146
  * @returns {Promise<void>} - Resolves when complete.
146
147
  */
147
148
  run(): Promise<void>;
149
+ /**
150
+ * @returns {Promise<void>} - Resolves when cleanup hooks finish.
151
+ */
152
+ runAfterAllsForActiveScopes(): Promise<void>;
148
153
  /**
149
154
  * @param {TestsArgument} tests - Tests.
150
155
  * @returns {{anyTestsFocussed: boolean}} - Whether any tests in the tree are focused.
@@ -168,6 +173,14 @@ export default class TestRunner {
168
173
  descriptions: string[];
169
174
  indentLevel: number;
170
175
  }): Promise<void>;
176
+ /**
177
+ * @param {{tests: TestsArgument, afterAllsRun: boolean}} scopeEntry - Scope entry.
178
+ * @returns {Promise<void>} - Resolves when scope cleanup finishes.
179
+ */
180
+ runAfterAllsForScope(scopeEntry: {
181
+ tests: TestsArgument;
182
+ afterAllsRun: boolean;
183
+ }): Promise<void>;
171
184
  }
172
185
  export type TestArgs = {
173
186
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../../src/testing/test-runner.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../../src/testing/test-runner.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AAEH;;GAEG;AAEH;;;GAGG;AAEH;;GAEG;AAEH;;;GAGG;AAEH;;;;;;;;;;GAUG;AAEH;IACE;;;;;;OAMG;IACH,iFALG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACZ,WAAW,GAApC,MAAM,EAAE,GAAG,MAAM;QACQ,WAAW,GAApC,MAAM,EAAE,GAAG,MAAM;QACG,SAAS,EAA7B,KAAK,CAAC,MAAM,CAAC;KACvB,EAiBA;IAXC,sDAAmC;IACnC,uBAAmD;IACnD,4BAAgD;IAChD,uBAAmD;IACnD,4BAAgD;IAChD,qBAA2B;IAE3B,qBAAqB;IACrB,yBAAyB;IACzB,oBAAoB;IACpB,6BAA+B;IAGjC;;OAEG;IACH,oBAFa,OAAO,qBAAqB,EAAE,OAAO,CAED;IAEjD;;OAEG;IACH,gBAFa,MAAM,EAAE,CAEoB;IAEzC;;;OAGG;IACH,oBAHW,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,GAC3B,MAAM,EAAE,CAqBpB;IAED;;OAEG;IACH,oBAFa,GAAG,CAAC,MAAM,CAAC,CAMvB;IAED;;;;OAIG;IACH,yBAJW,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,UAC7B,GAAG,CAAC,MAAM,CAAC,GACT,OAAO,CAYnB;IAED;;;OAGG;IACH,wBAHW,aAAa,GACX,OAAO,CAqBnB;IAED;;;OAGG;IACH,yBAHW,QAAQ,GACN,OAAO,CAUnB;IAED;;OAEG;IACH,eAFa,OAAO,CAAC,WAAW,CAAC,CAehC;IAXG,0BAIE;IASN;;OAEG;IACH,iBAFa,OAAO,CAAC,aAAa,CAAC,CAQlC;IAJG,8BAAyC;IAM7C;;OAEG;IACH,mBAFa,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;OAEG;IACH,YAFa,OAAO,CAE0D;IAE9E;;OAEG;IACH,kBAFa,MAAM,CAMlB;IAED;;OAEG;IACH,sBAFa,MAAM,CAMlB;IAED;;OAEG;IACH,iBAFa,MAAM,CAMlB;IAED;;OAEG;IACH,yBAFa,MAAM,CAQlB;IAED;;OAEG;IACH,WAFa,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAbC,0BAA6B;IAM7B,uBAA0C;IAS5C;;OAEG;IACH,uBAFa,OAAO,CAQnB;IAED;;OAEG;IACH,OAFa,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;OAEG;IACH,+BAFa,OAAO,CAAC,IAAI,CAAC,CAUzB;IAED;;;OAGG;IACH,oBAHW,aAAa,GACX;QAAC,gBAAgB,EAAE,OAAO,CAAA;KAAC,CA6BvC;IAED;;;;;;;;OAQG;IACH,0EAPG;QAAuD,WAAW,EAA1D,KAAK,CAAC,iCAAiC,CAAC;QACO,YAAY,EAA3D,KAAK,CAAC,iCAAiC,CAAC;QACpB,KAAK,EAAzB,aAAa;QACE,YAAY,EAA3B,MAAM,EAAE;QACK,WAAW,EAAxB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CA8HzB;IAED;;;OAGG;IACH,iCAHW;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAUzB;CACF;;;;;kBA5ea,WAAW;;;;aACX,aAAa;;;;uBAExB;QAAsC,WAAW,GAAtC,OAAO;QACoB,QAAQ,GAAnC,OAAO;KAClB;;;;YAAW,OAAO;;;;eACP,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;;;;YAC1B,MAAM;;;;WACN,MAAM,EAAE,GAAG,MAAM;;;;WACjB,MAAM;;;;;;UAKN,QAAQ;;;;cACR,CAAS,IAAQ,EAAR,QAAQ,KAAI,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;;0CAI1C,CAAS,IAA8F,EAA9F;IAAC,aAAa,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAC,KAAI,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;;;;;cAK9H,2BAA2B;;yCAI5B,CAAS,IAAsD,EAAtD;IAAC,aAAa,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;CAAC,KAAI,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;;;;;cAKtF,0BAA0B;;;;;;UAK1B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;;;;uBACxB,OAAO;;;;iBACP,iCAAiC,EAAE;;;;eACnC,gCAAgC,EAAE;;;;gBAClC,gCAAgC,EAAE;;;;kBAClC,iCAAiC,EAAE;;;;WACnC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;;;;UACxB,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;;wBArDnB,0BAA0B;0BAExB,qBAAqB"}
@@ -69,6 +69,7 @@ export default class TestRunner {
69
69
  this._failedTests = 0;
70
70
  this._successfulTests = 0;
71
71
  this._testsCount = 0;
72
+ this._activeAfterAllScopes = [];
72
73
  }
73
74
  /**
74
75
  * @returns {import("../configuration.js").default} - The configuration.
@@ -263,6 +264,16 @@ export default class TestRunner {
263
264
  });
264
265
  });
265
266
  }
267
+ /**
268
+ * @returns {Promise<void>} - Resolves when cleanup hooks finish.
269
+ */
270
+ async runAfterAllsForActiveScopes() {
271
+ const scopes = [...this._activeAfterAllScopes].reverse();
272
+ for (const scope of scopes) {
273
+ await this.runAfterAllsForScope(scope);
274
+ }
275
+ this._activeAfterAllScopes = [];
276
+ }
266
277
  /**
267
278
  * @param {TestsArgument} tests - Tests.
268
279
  * @returns {{anyTestsFocussed: boolean}} - Whether any tests in the tree are focused.
@@ -304,101 +315,122 @@ export default class TestRunner {
304
315
  const shouldRunAnyTests = this.hasRunnableTests(tests);
305
316
  if (!shouldRunAnyTests)
306
317
  return;
307
- for (const beforeAllData of tests.beforeAlls || []) {
308
- await beforeAllData.callback({ configuration: this.getConfiguration() });
309
- }
310
- for (const testDescription in tests.tests) {
311
- const testData = tests.tests[testDescription];
312
- const testArgs = /** @type {TestArgs} */ (Object.assign({}, testData.args));
313
- if (this._onlyFocussed && !testArgs.focus)
314
- continue;
315
- if (this.shouldSkipTest(testArgs))
316
- continue;
317
- if (testArgs.type == "model" || testArgs.type == "request") {
318
- testArgs.application = await this.application();
319
- }
320
- if (testArgs.type == "request") {
321
- testArgs.client = await this.requestClient();
318
+ /** @type {{tests: TestsArgument, afterAllsRun: boolean}} */
319
+ const scopeEntry = { tests, afterAllsRun: false };
320
+ this._activeAfterAllScopes.push(scopeEntry);
321
+ try {
322
+ for (const beforeAllData of tests.beforeAlls || []) {
323
+ await beforeAllData.callback({ configuration: this.getConfiguration() });
322
324
  }
323
- console.log(`${leftPadding}it ${testDescription}`);
324
- const retryCount = typeof testArgs.retry === "number" && Number.isFinite(testArgs.retry)
325
- ? Math.max(0, Math.floor(testArgs.retry))
326
- : 0;
327
- let retriesUsed = 0;
328
- while (true) {
329
- let shouldRetry = false;
330
- /** @type {unknown} */
331
- let failedError;
332
- try {
333
- for (const beforeEachData of newBeforeEaches) {
334
- await beforeEachData.callback({ configuration: this.getConfiguration(), testArgs, testData });
335
- }
336
- await testData.function(testArgs);
337
- this._successfulTests++;
325
+ for (const testDescription in tests.tests) {
326
+ const testData = tests.tests[testDescription];
327
+ const testArgs = /** @type {TestArgs} */ (Object.assign({}, testData.args));
328
+ if (this._onlyFocussed && !testArgs.focus)
329
+ continue;
330
+ if (this.shouldSkipTest(testArgs))
331
+ continue;
332
+ if (testArgs.type == "model" || testArgs.type == "request") {
333
+ testArgs.application = await this.application();
334
+ }
335
+ if (testArgs.type == "request") {
336
+ testArgs.client = await this.requestClient();
338
337
  }
339
- catch (error) {
340
- if (retriesUsed < retryCount) {
341
- retriesUsed++;
342
- shouldRetry = true;
338
+ console.log(`${leftPadding}it ${testDescription}`);
339
+ const retryCount = typeof testArgs.retry === "number" && Number.isFinite(testArgs.retry)
340
+ ? Math.max(0, Math.floor(testArgs.retry))
341
+ : 0;
342
+ let retriesUsed = 0;
343
+ while (true) {
344
+ let shouldRetry = false;
345
+ /** @type {unknown} */
346
+ let failedError;
347
+ try {
348
+ for (const beforeEachData of newBeforeEaches) {
349
+ await beforeEachData.callback({ configuration: this.getConfiguration(), testArgs, testData });
350
+ }
351
+ await testData.function(testArgs);
352
+ this._successfulTests++;
343
353
  }
344
- else {
345
- failedError = error;
354
+ catch (error) {
355
+ if (retriesUsed < retryCount) {
356
+ retriesUsed++;
357
+ shouldRetry = true;
358
+ }
359
+ else {
360
+ failedError = error;
361
+ }
346
362
  }
347
- }
348
- finally {
349
- for (const afterEachData of newAfterEaches) {
350
- await afterEachData.callback({ configuration: this.getConfiguration(), testArgs, testData });
363
+ finally {
364
+ for (const afterEachData of newAfterEaches) {
365
+ await afterEachData.callback({ configuration: this.getConfiguration(), testArgs, testData });
366
+ }
351
367
  }
352
- }
353
- if (shouldRetry)
354
- continue;
355
- if (failedError) {
356
- this._failedTests++;
357
- if (failedError instanceof Error) {
358
- console.error(`${leftPadding} Test failed:`, failedError.message);
359
- addTrackedStackToError(failedError);
360
- const backtraceCleaner = new BacktraceCleaner(failedError);
361
- const cleanedStack = backtraceCleaner.getCleanedStack();
362
- const stackLines = cleanedStack?.split("\n");
363
- if (stackLines) {
364
- for (const stackLine of stackLines) {
365
- console.error(`${leftPadding} ${stackLine}`);
368
+ if (shouldRetry)
369
+ continue;
370
+ if (failedError) {
371
+ this._failedTests++;
372
+ if (failedError instanceof Error) {
373
+ console.error(`${leftPadding} Test failed:`, failedError.message);
374
+ addTrackedStackToError(failedError);
375
+ const backtraceCleaner = new BacktraceCleaner(failedError);
376
+ const cleanedStack = backtraceCleaner.getCleanedStack();
377
+ const stackLines = cleanedStack?.split("\n");
378
+ if (stackLines) {
379
+ for (const stackLine of stackLines) {
380
+ console.error(`${leftPadding} ${stackLine}`);
381
+ }
366
382
  }
367
383
  }
384
+ else {
385
+ console.error(`${leftPadding} Test failed with a ${typeof failedError}:`, failedError);
386
+ }
387
+ testEvents.emit("testFailed", {
388
+ configuration: this.getConfiguration(),
389
+ descriptions,
390
+ error: failedError,
391
+ testArgs,
392
+ testData,
393
+ testDescription,
394
+ testRunner: this
395
+ });
368
396
  }
369
- else {
370
- console.error(`${leftPadding} Test failed with a ${typeof failedError}:`, failedError);
371
- }
372
- testEvents.emit("testFailed", {
373
- configuration: this.getConfiguration(),
374
- descriptions,
375
- error: failedError,
376
- testArgs,
377
- testData,
378
- testDescription,
379
- testRunner: this
397
+ break;
398
+ }
399
+ }
400
+ for (const subDescription in tests.subs) {
401
+ const subTest = tests.subs[subDescription];
402
+ const newDecriptions = descriptions.concat([subDescription]);
403
+ if (!this._onlyFocussed || subTest.anyTestsFocussed) {
404
+ console.log(`${leftPadding}${subDescription}`);
405
+ await this.runTests({
406
+ afterEaches: newAfterEaches,
407
+ beforeEaches: newBeforeEaches,
408
+ tests: subTest,
409
+ descriptions: newDecriptions,
410
+ indentLevel: indentLevel + 1
380
411
  });
381
412
  }
382
- break;
383
413
  }
384
414
  }
385
- for (const subDescription in tests.subs) {
386
- const subTest = tests.subs[subDescription];
387
- const newDecriptions = descriptions.concat([subDescription]);
388
- if (!this._onlyFocussed || subTest.anyTestsFocussed) {
389
- console.log(`${leftPadding}${subDescription}`);
390
- await this.runTests({
391
- afterEaches: newAfterEaches,
392
- beforeEaches: newBeforeEaches,
393
- tests: subTest,
394
- descriptions: newDecriptions,
395
- indentLevel: indentLevel + 1
396
- });
415
+ finally {
416
+ await this.runAfterAllsForScope(scopeEntry);
417
+ const scopeIndex = this._activeAfterAllScopes.indexOf(scopeEntry);
418
+ if (scopeIndex >= 0) {
419
+ this._activeAfterAllScopes.splice(scopeIndex, 1);
397
420
  }
398
421
  }
399
- for (const afterAllData of tests.afterAlls || []) {
422
+ }
423
+ /**
424
+ * @param {{tests: TestsArgument, afterAllsRun: boolean}} scopeEntry - Scope entry.
425
+ * @returns {Promise<void>} - Resolves when scope cleanup finishes.
426
+ */
427
+ async runAfterAllsForScope(scopeEntry) {
428
+ if (scopeEntry.afterAllsRun)
429
+ return;
430
+ scopeEntry.afterAllsRun = true;
431
+ for (const afterAllData of scopeEntry.tests.afterAlls || []) {
400
432
  await afterAllData.callback({ configuration: this.getConfiguration() });
401
433
  }
402
434
  }
403
435
  }
404
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy90ZXN0LXJ1bm5lci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sZ0NBQWdDLENBQUE7QUFDckUsT0FBTyxXQUFXLE1BQU0sMEJBQTBCLENBQUE7QUFDbEQsT0FBTyxnQkFBZ0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUM1RCxPQUFPLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQTtBQUMvQyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFFdkQ7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7R0FJRztBQUVIOztHQUVHO0FBRUg7OztHQUdHO0FBRUg7O0dBRUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUgsTUFBTSxDQUFDLE9BQU8sT0FBTyxVQUFVO0lBQzdCOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDM0UsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLElBQUksQ0FBQyxhQUFhO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO1FBRWhFLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFBO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNuRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxD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Y0FBYztvQkFDM0IsWUFBWSxFQUFFLGVBQWU7b0JBQzdCLEtBQUssRUFBRSxPQUFPO29CQUNkLFlBQVksRUFBRSxjQUFjO29CQUM1QixXQUFXLEVBQUUsV0FBVyxHQUFHLENBQUM7aUJBQzdCLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxNQUFNLFlBQVksSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2pELE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBQyxDQUFDLENBQUE7UUFDdkUsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2FkZFRyYWNrZWRTdGFja1RvRXJyb3J9IGZyb20gXCIuLi91dGlscy93aXRoLXRyYWNrZWQtc3RhY2suanNcIlxuaW1wb3J0IEFwcGxpY2F0aW9uIGZyb20gXCIuLi8uLi9zcmMvYXBwbGljYXRpb24uanNcIlxuaW1wb3J0IEJhY2t0cmFjZUNsZWFuZXIgZnJvbSBcIi4uL3V0aWxzL2JhY2t0cmFjZS1jbGVhbmVyLmpzXCJcbmltcG9ydCBSZXF1ZXN0Q2xpZW50IGZyb20gXCIuL3JlcXVlc3QtY2xpZW50LmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuaW1wb3J0IHt0ZXN0Q29uZmlnLCB0ZXN0RXZlbnRzLCB0ZXN0c30gZnJvbSBcIi4vdGVzdC5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGVzdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7QXBwbGljYXRpb259IFthcHBsaWNhdGlvbl0gLSBBcHBsaWNhdGlvbiBpbnN0YW5jZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKiBAcHJvcGVydHkge1JlcXVlc3RDbGllbnR9IFtjbGllbnRdIC0gSFRUUCBjbGllbnQgZm9yIHJlcXVlc3QgdGVzdHMuXG4gKiBAcHJvcGVydHkge29iamVjdH0gW2RhdGFiYXNlQ2xlYW5pbmddIC0gRGF0YWJhc2UgY2xlYW51cCBvcHRpb25zIGZvciB0ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RhdGFiYXNlQ2xlYW5pbmcudHJhbnNhY3Rpb25dIC0gVXNlIHRyYW5zYWN0aW9ucyB0byByb2xsYmFjayBiZXR3ZWVuIHRlc3RzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGF0YWJhc2VDbGVhbmluZy50cnVuY2F0ZV0gLSBUcnVuY2F0ZSB0YWJsZXMgYmV0d2VlbiB0ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzXSAtIFdoZXRoZXIgdGhpcyB0ZXN0IGlzIGZvY3VzZWQuXG4gKiBAcHJvcGVydHkgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSBbZnVuY3Rpb25dIC0gVGVzdCBjYWxsYmFjayBmdW5jdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmV0cnldIC0gTnVtYmVyIG9mIHJldHJpZXMgd2hlbiBhIHRlc3QgZmFpbHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdIHwgc3RyaW5nfSBbdGFnc10gLSBUYWdzIGZvciBmaWx0ZXJpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3R5cGVdIC0gVGVzdCB0eXBlIGlkZW50aWZpZXIuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUZXN0RGF0YVxuICogQHByb3BlcnR5IHtUZXN0QXJnc30gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHRlc3QuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKFRlc3RBcmdzKSA6ICh2b2lkfFByb21pc2U8dm9pZD4pfSBmdW5jdGlvbiAtIFRlc3QgY2FsbGJhY2sgdG8gZXhlY3V0ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCB0ZXN0QXJnczogVGVzdEFyZ3MsIHRlc3REYXRhOiBUZXN0RGF0YX0pIDogKHZvaWR8UHJvbWlzZTx2b2lkPil9IEFmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlXG4gKiBAcHJvcGVydHkge0FmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBIb29rIGNhbGxiYWNrIHRvIGV4ZWN1dGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pIDogKHZvaWR8UHJvbWlzZTx2b2lkPil9IEJlZm9yZUFmdGVyQWxsQ2FsbGJhY2tUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCZWZvcmVBZnRlckFsbENhbGxiYWNrT2JqZWN0VHlwZVxuICogQHByb3BlcnR5IHtCZWZvcmVBZnRlckFsbENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBIb29rIGNhbGxiYWNrIHRvIGV4ZWN1dGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUZXN0c0FyZ3VtZW50XG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFRlc3REYXRhPn0gYXJncyAtIEFyZ3VtZW50cyBrZXllZCBieSB0ZXN0IGRlc2NyaXB0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbYW55VGVzdHNGb2N1c3NlZF0gLSBXaGV0aGVyIGFueSB0ZXN0cyBpbiB0aGUgdHJlZSBhcmUgZm9jdXNlZC5cbiAqIEBwcm9wZXJ0eSB7QWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlW119IGFmdGVyRWFjaGVzIC0gQWZ0ZXItZWFjaCBob29rcyBmb3IgdGhpcyBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7QmVmb3JlQWZ0ZXJBbGxDYWxsYmFja09iamVjdFR5cGVbXX0gYWZ0ZXJBbGxzIC0gQWZ0ZXItYWxsIGhvb2tzIGZvciB0aGlzIHNjb3BlLlxuICogQHByb3BlcnR5IHtCZWZvcmVBZnRlckFsbENhbGxiYWNrT2JqZWN0VHlwZVtdfSBiZWZvcmVBbGxzIC0gQmVmb3JlLWFsbCBob29rcyBmb3IgdGhpcyBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7QWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlW119IGJlZm9yZUVhY2hlcyAtIEJlZm9yZS1lYWNoIGhvb2tzIGZvciB0aGlzIHNjb3BlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBUZXN0RGF0YT59IHRlc3RzIC0gQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG5vZGUuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFRlc3RzQXJndW1lbnQ+fSBzdWJzIC0gT3B0aW9uYWwgY2hpbGQgbm9kZXMuIEVhY2ggaXRlbSBpcyBhbm90aGVyIGBOb2RlYCwgYWxsb3dpbmcgcmVjdXJzaW9uLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RSdW5uZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmd9IFthcmdzLmV4Y2x1ZGVUYWdzXSAtIFRhZ3MgdG8gZXhjbHVkZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gW2FyZ3MuaW5jbHVkZVRhZ3NdIC0gVGFncyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFyZ3MudGVzdEZpbGVzIC0gVGVzdCBmaWxlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBleGNsdWRlVGFncywgaW5jbHVkZVRhZ3MsIHRlc3RGaWxlcywgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZFwiKVxuXG4gICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9leGNsdWRlVGFncyA9IHRoaXMubm9ybWFsaXplVGFncyhleGNsdWRlVGFncylcbiAgICB0aGlzLl9leGNsdWRlVGFnU2V0ID0gbmV3IFNldCh0aGlzLl9leGNsdWRlVGFncylcbiAgICB0aGlzLl9pbmNsdWRlVGFncyA9IHRoaXMubm9ybWFsaXplVGFncyhpbmNsdWRlVGFncylcbiAgICB0aGlzLl9pbmNsdWRlVGFnU2V0ID0gbmV3IFNldCh0aGlzLl9pbmNsdWRlVGFncylcbiAgICB0aGlzLl90ZXN0RmlsZXMgPSB0ZXN0RmlsZXNcblxuICAgIHRoaXMuX2ZhaWxlZFRlc3RzID0gMFxuICAgIHRoaXMuX3N1Y2Nlc3NmdWxUZXN0cyA9IDBcbiAgICB0aGlzLl90ZXN0c0NvdW50ID0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IC0gVGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBnZXRDb25maWd1cmF0aW9uKCkgeyByZXR1cm4gdGhpcy5fY29uZmlndXJhdGlvbiB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBUaGUgdGVzdCBmaWxlcy5cbiAgICovXG4gIGdldFRlc3RGaWxlcygpIHsgcmV0dXJuIHRoaXMuX3Rlc3RGaWxlcyB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWR9IHRhZ3MgLSBUYWdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gTm9ybWFsaXplZCB0YWdzLlxuICAgKi9cbiAgbm9ybWFsaXplVGFncyh0YWdzKSB7XG4gICAgaWYgKCF0YWdzKSByZXR1cm4gW11cblxuICAgIGNvbnN0IHZhbHVlcyA9IFtdXG4gICAgY29uc3QgcmF3VGFncyA9IEFycmF5LmlzQXJyYXkodGFncykgPyB0YWdzIDogW3RhZ3NdXG5cbiAgICBmb3IgKGNvbnN0IHJhd1RhZyBvZiByYXdUYWdzKSB7XG4gICAgICBpZiAocmF3VGFnID09PSB1bmRlZmluZWQgfHwgcmF3VGFnID09PSBudWxsKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBwYXJ0cyA9IFN0cmluZyhyYXdUYWcpLnNwbGl0KFwiLFwiKVxuXG4gICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IHBhcnQudHJpbSgpXG5cbiAgICAgICAgaWYgKHRyaW1tZWQpIHZhbHVlcy5wdXNoKHRyaW1tZWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gLSBFeGNsdWRlIHRhZyBzZXQuXG4gICAqL1xuICBnZXRFeGNsdWRlVGFnU2V0KCkge1xuICAgIGNvbnN0IGNvbmZpZ1RhZ3MgPSBBcnJheS5pc0FycmF5KHRlc3RDb25maWcuZXhjbHVkZVRhZ3MpID8gdGVzdENvbmZpZy5leGNsdWRlVGFncyA6IFtdXG5cbiAgICByZXR1cm4gbmV3IFNldChbLi4udGhpcy5fZXhjbHVkZVRhZ3MsIC4uLmNvbmZpZ1RhZ3NdKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWR9IHRlc3RUYWdzIC0gVGVzdCB0YWdzLlxuICAgKiBAcGFyYW0ge1NldDxzdHJpbmc+fSB0YWdTZXQgLSBUYWcgc2V0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFueSB0YWdzIG1hdGNoLlxuICAgKi9cbiAgaGFzTWF0Y2hpbmdUYWcodGVzdFRhZ3MsIHRhZ1NldCkge1xuICAgIGlmICghdGFnU2V0LnNpemUpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplVGFncyh0ZXN0VGFncylcblxuICAgIGZvciAoY29uc3QgdGFnIG9mIG5vcm1hbGl6ZWQpIHtcbiAgICAgIGlmICh0YWdTZXQuaGFzKHRhZykpIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtUZXN0c0FyZ3VtZW50fSB0ZXN0cyAtIFRlc3RzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFueSB0ZXN0cyBpbiB0aGlzIHNjb3BlIHdpbGwgcnVuLlxuICAgKi9cbiAgaGFzUnVubmFibGVUZXN0cyh0ZXN0cykge1xuICAgIGZvciAoY29uc3QgdGVzdERlc2NyaXB0aW9uIGluIHRlc3RzLnRlc3RzKSB7XG4gICAgICBjb25zdCB0ZXN0RGF0YSA9IHRlc3RzLnRlc3RzW3Rlc3REZXNjcmlwdGlvbl1cbiAgICAgIGNvbnN0IHRlc3RBcmdzID0gLyoqIEB0eXBlIHtUZXN0QXJnc30gKi8gKE9iamVjdC5hc3NpZ24oe30sIHRlc3REYXRhLmFyZ3MpKVxuXG4gICAgICBpZiAodGhpcy5fb25seUZvY3Vzc2VkICYmICF0ZXN0QXJncy5mb2N1cykgY29udGludWVcbiAgICAgIGlmICh0aGlzLnNob3VsZFNraXBUZXN0KHRlc3RBcmdzKSkgY29udGludWVcblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN1YkRlc2NyaXB0aW9uIGluIHRlc3RzLnN1YnMpIHtcbiAgICAgIGNvbnN0IHN1YlRlc3QgPSB0ZXN0cy5zdWJzW3N1YkRlc2NyaXB0aW9uXVxuXG4gICAgICBpZiAodGhpcy5fb25seUZvY3Vzc2VkICYmICFzdWJUZXN0LmFueVRlc3RzRm9jdXNzZWQpIGNvbnRpbnVlXG4gICAgICBpZiAodGhpcy5oYXNSdW5uYWJsZVRlc3RzKHN1YlRlc3QpKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VGVzdEFyZ3N9IHRlc3RBcmdzIC0gVGVzdCBhcmdzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBiZSBza2lwcGVkLlxuICAgKi9cbiAgc2hvdWxkU2tpcFRlc3QodGVzdEFyZ3MpIHtcbiAgICBpZiAodGhpcy5oYXNNYXRjaGluZ1RhZyh0ZXN0QXJncy50YWdzLCB0aGlzLmdldEV4Y2x1ZGVUYWdTZXQoKSkpIHJldHVybiB0cnVlXG5cbiAgICBpZiAodGhpcy5faW5jbHVkZVRhZ1NldC5zaXplID4gMCAmJiAhdGVzdEFyZ3MuZm9jdXMpIHtcbiAgICAgIGlmICghdGhpcy5oYXNNYXRjaGluZ1RhZyh0ZXN0QXJncy50YWdzLCB0aGlzLl9pbmNsdWRlVGFnU2V0KSkgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcHBsaWNhdGlvbj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgYXBwbGljYXRpb24uXG4gICAqL1xuICBhc3luYyBhcHBsaWNhdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuX2FwcGxpY2F0aW9uKSB7XG4gICAgICB0aGlzLl9hcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbih7XG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLFxuICAgICAgICBodHRwU2VydmVyOiB7cG9ydDogMzEwMDZ9LFxuICAgICAgICB0eXBlOiBcInRlc3QtcnVubmVyXCJcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMuX2FwcGxpY2F0aW9uLmluaXRpYWxpemUoKVxuICAgICAgYXdhaXQgdGhpcy5fYXBwbGljYXRpb24uc3RhcnRIdHRwU2VydmVyKClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXF1ZXN0Q2xpZW50Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSByZXF1ZXN0IGNsaWVudC5cbiAgICovXG4gIGFzeW5jIHJlcXVlc3RDbGllbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9yZXF1ZXN0Q2xpZW50KSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0Q2xpZW50ID0gbmV3IFJlcXVlc3RDbGllbnQoKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2xpZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGltcG9ydFRlc3RGaWxlcygpIHtcbiAgICBhd2FpdCB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKS5pbXBvcnRUZXN0RmlsZXModGhpcy5nZXRUZXN0RmlsZXMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGZhaWxlZC5cbiAgICovXG4gIGlzRmFpbGVkKCkgeyByZXR1cm4gdGhpcy5fZmFpbGVkVGVzdHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9mYWlsZWRUZXN0cyA+IDAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSBmYWlsZWQgdGVzdHMuXG4gICAqL1xuICBnZXRGYWlsZWRUZXN0cygpIHtcbiAgICBpZiAodGhpcy5fZmFpbGVkVGVzdHMgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwiVGVzdHMgaGFzbid0IGJlZW4gcnVuIHlldFwiKVxuXG4gICAgcmV0dXJuIHRoaXMuX2ZhaWxlZFRlc3RzXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgc3VjY2Vzc2Z1bCB0ZXN0cy5cbiAgICovXG4gIGdldFN1Y2Nlc3NmdWxUZXN0cygpIHtcbiAgICBpZiAodGhpcy5fc3VjY2Vzc2Z1bFRlc3RzID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIlRlc3RzIGhhc24ndCBiZWVuIHJ1biB5ZXRcIilcblxuICAgIHJldHVybiB0aGlzLl9zdWNjZXNzZnVsVGVzdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSB0ZXN0cyBjb3VudC5cbiAgICovXG4gIGdldFRlc3RzQ291bnQoKSB7XG4gICAgaWYgKHRoaXMuX3Rlc3RzQ291bnQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwiVGVzdHMgaGFzbid0IGJlZW4gcnVuIHlldFwiKVxuXG4gICAgcmV0dXJuIHRoaXMuX3Rlc3RzQ291bnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSBleGVjdXRlZCB0ZXN0cyBjb3VudC5cbiAgICovXG4gIGdldEV4ZWN1dGVkVGVzdHNDb3VudCgpIHtcbiAgICBpZiAodGhpcy5fc3VjY2Vzc2Z1bFRlc3RzID09PSB1bmRlZmluZWQgfHwgdGhpcy5fZmFpbGVkVGVzdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGVzdHMgaGFzbid0IGJlZW4gcnVuIHlldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdWNjZXNzZnVsVGVzdHMgKyB0aGlzLl9mYWlsZWRUZXN0c1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBwcmVwYXJlKCkge1xuICAgIHRoaXMuYW55VGVzdHNGb2N1c3NlZCA9IGZhbHNlXG4gICAgdGhpcy5fZmFpbGVkVGVzdHMgPSAwXG4gICAgdGhpcy5fc3VjY2Vzc2Z1bFRlc3RzID0gMFxuICAgIHRoaXMuX3Rlc3RzQ291bnQgPSAwXG4gICAgYXdhaXQgdGhpcy5pbXBvcnRUZXN0RmlsZXMoKVxuICAgIGF3YWl0IHRoaXMuYW5hbHl6ZVRlc3RzKHRlc3RzKVxuICAgIHRoaXMuX29ubHlGb2N1c3NlZCA9IHRoaXMuYW55VGVzdHNGb2N1c3NlZFxuXG4gICAgY29uc3QgdGVzdGluZ0NvbmZpZ1BhdGggPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRUZXN0aW5nKClcblxuICAgIGlmICh0ZXN0aW5nQ29uZmlnUGF0aCkge1xuICAgICAgYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RW52aXJvbm1lbnRIYW5kbGVyKCkuaW1wb3J0VGVzdGluZ0NvbmZpZ1BhdGgoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFueSB0ZXN0cyBmb2N1c3NlZC5cbiAgICovXG4gIGFyZUFueVRlc3RzRm9jdXNzZWQoKSB7XG4gICAgaWYgKHRoaXMuYW55VGVzdHNGb2N1c3NlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIYXNuJ3QgYmVlbiBkZXRlY3RlZCB5ZXRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hbnlUZXN0c0ZvY3Vzc2VkXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJ1bigpIHtcbiAgICBhd2FpdCB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5lbnN1cmVDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnJ1blRlc3RzKHtcbiAgICAgICAgYWZ0ZXJFYWNoZXM6IFtdLFxuICAgICAgICBiZWZvcmVFYWNoZXM6IFtdLFxuICAgICAgICB0ZXN0cyxcbiAgICAgICAgZGVzY3JpcHRpb25zOiBbXSxcbiAgICAgICAgaW5kZW50TGV2ZWw6IDBcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Rlc3RzQXJndW1lbnR9IHRlc3RzIC0gVGVzdHMuXG4gICAqIEByZXR1cm5zIHt7YW55VGVzdHNGb2N1c3NlZDogYm9vbGVhbn19IC0gV2hldGhlciBhbnkgdGVzdHMgaW4gdGhlIHRyZWUgYXJlIGZvY3VzZWQuXG4gICAqL1xuICBhbmFseXplVGVzdHModGVzdHMpIHtcbiAgICBsZXQgYW55VGVzdHNGb2N1c3NlZEZvdW5kID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgdGVzdERlc2NyaXB0aW9uIGluIHRlc3RzLnRlc3RzKSB7XG4gICAgICBjb25zdCB0ZXN0RGF0YSA9IHRlc3RzLnRlc3RzW3Rlc3REZXNjcmlwdGlvbl1cbiAgICAgIGNvbnN0IHRlc3RBcmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGVzdERhdGEuYXJncylcblxuICAgICAgdGhpcy5fdGVzdHNDb3VudCsrXG5cbiAgICAgIGlmICh0ZXN0QXJncy5mb2N1cykge1xuICAgICAgICBhbnlUZXN0c0ZvY3Vzc2VkRm91bmQgPSB0cnVlXG4gICAgICAgIHRoaXMuYW55VGVzdHNGb2N1c3NlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN1YkRlc2NyaXB0aW9uIGluIHRlc3RzLnN1YnMpIHtcbiAgICAgIGNvbnN0IHN1YlRlc3QgPSB0ZXN0cy5zdWJzW3N1YkRlc2NyaXB0aW9uXVxuICAgICAgY29uc3Qge2FueVRlc3RzRm9jdXNzZWR9ID0gdGhpcy5hbmFseXplVGVzdHMoc3ViVGVzdClcblxuICAgICAgaWYgKGFueVRlc3RzRm9jdXNzZWQpIHtcbiAgICAgICAgYW55VGVzdHNGb2N1c3NlZEZvdW5kID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBzdWJUZXN0LmFueVRlc3RzRm9jdXNzZWQgPSBhbnlUZXN0c0ZvY3Vzc2VkXG4gICAgfVxuXG4gICAgcmV0dXJuIHthbnlUZXN0c0ZvY3Vzc2VkOiBhbnlUZXN0c0ZvY3Vzc2VkRm91bmR9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtBcnJheTxBZnRlckJlZm9yZUVhY2hDYWxsYmFja09iamVjdFR5cGU+fSBhcmdzLmFmdGVyRWFjaGVzIC0gQWZ0ZXIgZWFjaGVzLlxuICAgKiBAcGFyYW0ge0FycmF5PEFmdGVyQmVmb3JlRWFjaENhbGxiYWNrT2JqZWN0VHlwZT59IGFyZ3MuYmVmb3JlRWFjaGVzIC0gQmVmb3JlIGVhY2hlcy5cbiAgICogQHBhcmFtIHtUZXN0c0FyZ3VtZW50fSBhcmdzLnRlc3RzIC0gVGVzdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MuZGVzY3JpcHRpb25zIC0gRGVzY3JpcHRpb25zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5pbmRlbnRMZXZlbCAtIEluZGVudCBsZXZlbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJ1blRlc3RzKHthZnRlckVhY2hlcywgYmVmb3JlRWFjaGVzLCB0ZXN0cywgZGVzY3JpcHRpb25zLCBpbmRlbnRMZXZlbH0pIHtcbiAgICBjb25zdCBsZWZ0UGFkZGluZyA9IFwiIFwiLnJlcGVhdChpbmRlbnRMZXZlbCAqIDIpXG4gICAgY29uc3QgbmV3QWZ0ZXJFYWNoZXMgPSBbLi4uYWZ0ZXJFYWNoZXMsIC4uLnRlc3RzLmFmdGVyRWFjaGVzXVxuICAgIGNvbnN0IG5ld0JlZm9yZUVhY2hlcyA9IFsuLi5iZWZvcmVFYWNoZXMsIC4uLnRlc3RzLmJlZm9yZUVhY2hlc11cbiAgICBjb25zdCBzaG91bGRSdW5BbnlUZXN0cyA9IHRoaXMuaGFzUnVubmFibGVUZXN0cyh0ZXN0cylcblxuICAgIGlmICghc2hvdWxkUnVuQW55VGVzdHMpIHJldHVyblxuXG4gICAgZm9yIChjb25zdCBiZWZvcmVBbGxEYXRhIG9mIHRlc3RzLmJlZm9yZUFsbHMgfHwgW10pIHtcbiAgICAgIGF3YWl0IGJlZm9yZUFsbERhdGEuY2FsbGJhY2soe2NvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpfSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRlc3REZXNjcmlwdGlvbiBpbiB0ZXN0cy50ZXN0cykge1xuICAgICAgY29uc3QgdGVzdERhdGEgPSB0ZXN0cy50ZXN0c1t0ZXN0RGVzY3JpcHRpb25dXG4gICAgICBjb25zdCB0ZXN0QXJncyA9IC8qKiBAdHlwZSB7VGVzdEFyZ3N9ICovIChPYmplY3QuYXNzaWduKHt9LCB0ZXN0RGF0YS5hcmdzKSlcblxuICAgICAgaWYgKHRoaXMuX29ubHlGb2N1c3NlZCAmJiAhdGVzdEFyZ3MuZm9jdXMpIGNvbnRpbnVlXG4gICAgICBpZiAodGhpcy5zaG91bGRTa2lwVGVzdCh0ZXN0QXJncykpIGNvbnRpbnVlXG5cbiAgICAgIGlmICh0ZXN0QXJncy50eXBlID09IFwibW9kZWxcIiB8fCB0ZXN0QXJncy50eXBlID09IFwicmVxdWVzdFwiKSB7XG4gICAgICAgIHRlc3RBcmdzLmFwcGxpY2F0aW9uID0gYXdhaXQgdGhpcy5hcHBsaWNhdGlvbigpXG4gICAgICB9XG5cbiAgICAgIGlmICh0ZXN0QXJncy50eXBlID09IFwicmVxdWVzdFwiKSB7XG4gICAgICAgIHRlc3RBcmdzLmNsaWVudCA9IGF3YWl0IHRoaXMucmVxdWVzdENsaWVudCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKGAke2xlZnRQYWRkaW5nfWl0ICR7dGVzdERlc2NyaXB0aW9ufWApXG5cbiAgICAgIGNvbnN0IHJldHJ5Q291bnQgPSB0eXBlb2YgdGVzdEFyZ3MucmV0cnkgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHRlc3RBcmdzLnJldHJ5KVxuICAgICAgICA/IE1hdGgubWF4KDAsIE1hdGguZmxvb3IodGVzdEFyZ3MucmV0cnkpKVxuICAgICAgICA6IDBcbiAgICAgIGxldCByZXRyaWVzVXNlZCA9IDBcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbGV0IHNob3VsZFJldHJ5ID0gZmFsc2VcbiAgICAgICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgICAgICBsZXQgZmFpbGVkRXJyb3JcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgYmVmb3JlRWFjaERhdGEgb2YgbmV3QmVmb3JlRWFjaGVzKSB7XG4gICAgICAgICAgICBhd2FpdCBiZWZvcmVFYWNoRGF0YS5jYWxsYmFjayh7Y29uZmlndXJhdGlvbjogdGhpcy5nZXRDb25maWd1cmF0aW9uKCksIHRlc3RBcmdzLCB0ZXN0RGF0YX0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGVzdERhdGEuZnVuY3Rpb24odGVzdEFyZ3MpXG4gICAgICAgICAgdGhpcy5fc3VjY2Vzc2Z1bFRlc3RzKytcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAocmV0cmllc1VzZWQgPCByZXRyeUNvdW50KSB7XG4gICAgICAgICAgICByZXRyaWVzVXNlZCsrXG4gICAgICAgICAgICBzaG91bGRSZXRyeSA9IHRydWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmFpbGVkRXJyb3IgPSBlcnJvclxuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGFmdGVyRWFjaERhdGEgb2YgbmV3QWZ0ZXJFYWNoZXMpIHtcbiAgICAgICAgICAgIGF3YWl0IGFmdGVyRWFjaERhdGEuY2FsbGJhY2soe2NvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLCB0ZXN0QXJncywgdGVzdERhdGF9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaG91bGRSZXRyeSkgY29udGludWVcblxuICAgICAgICBpZiAoZmFpbGVkRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9mYWlsZWRUZXN0cysrXG5cbiAgICAgICAgICBpZiAoZmFpbGVkRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtsZWZ0UGFkZGluZ30gIFRlc3QgZmFpbGVkOmAsIGZhaWxlZEVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICBhZGRUcmFja2VkU3RhY2tUb0Vycm9yKGZhaWxlZEVycm9yKVxuXG4gICAgICAgICAgICBjb25zdCBiYWNrdHJhY2VDbGVhbmVyID0gbmV3IEJhY2t0cmFjZUNsZWFuZXIoZmFpbGVkRXJyb3IpXG4gICAgICAgICAgICBjb25zdCBjbGVhbmVkU3RhY2sgPSBiYWNrdHJhY2VDbGVhbmVyLmdldENsZWFuZWRTdGFjaygpXG4gICAgICAgICAgICBjb25zdCBzdGFja0xpbmVzID0gY2xlYW5lZFN0YWNrPy5zcGxpdChcIlxcblwiKVxuXG4gICAgICAgICAgICBpZiAoc3RhY2tMaW5lcykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0YWNrTGluZSBvZiBzdGFja0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtsZWZ0UGFkZGluZ30gICR7c3RhY2tMaW5lfWApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtsZWZ0UGFkZGluZ30gIFRlc3QgZmFpbGVkIHdpdGggYSAke3R5cGVvZiBmYWlsZWRFcnJvcn06YCwgZmFpbGVkRXJyb3IpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGVzdEV2ZW50cy5lbWl0KFwidGVzdEZhaWxlZFwiLCB7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9ucyxcbiAgICAgICAgICAgIGVycm9yOiBmYWlsZWRFcnJvcixcbiAgICAgICAgICAgIHRlc3RBcmdzLFxuICAgICAgICAgICAgdGVzdERhdGEsXG4gICAgICAgICAgICB0ZXN0RGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0ZXN0UnVubmVyOiB0aGlzXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdWJEZXNjcmlwdGlvbiBpbiB0ZXN0cy5zdWJzKSB7XG4gICAgICBjb25zdCBzdWJUZXN0ID0gdGVzdHMuc3Vic1tzdWJEZXNjcmlwdGlvbl1cbiAgICAgIGNvbnN0IG5ld0RlY3JpcHRpb25zID0gZGVzY3JpcHRpb25zLmNvbmNhdChbc3ViRGVzY3JpcHRpb25dKVxuXG4gICAgICBpZiAoIXRoaXMuX29ubHlGb2N1c3NlZCB8fCBzdWJUZXN0LmFueVRlc3RzRm9jdXNzZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7bGVmdFBhZGRpbmd9JHtzdWJEZXNjcmlwdGlvbn1gKVxuICAgICAgICBhd2FpdCB0aGlzLnJ1blRlc3RzKHtcbiAgICAgICAgICBhZnRlckVhY2hlczogbmV3QWZ0ZXJFYWNoZXMsXG4gICAgICAgICAgYmVmb3JlRWFjaGVzOiBuZXdCZWZvcmVFYWNoZXMsXG4gICAgICAgICAgdGVzdHM6IHN1YlRlc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb25zOiBuZXdEZWNyaXB0aW9ucyxcbiAgICAgICAgICBpbmRlbnRMZXZlbDogaW5kZW50TGV2ZWwgKyAxXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhZnRlckFsbERhdGEgb2YgdGVzdHMuYWZ0ZXJBbGxzIHx8IFtdKSB7XG4gICAgICBhd2FpdCBhZnRlckFsbERhdGEuY2FsbGJhY2soe2NvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
436
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy90ZXN0LXJ1bm5lci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sZ0NBQWdDLENBQUE7QUFDckUsT0FBTyxXQUFXLE1BQU0sMEJBQTBCLENBQUE7QUFDbEQsT0FBTyxnQkFBZ0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUM1RCxPQUFPLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQTtBQUMvQyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFFdkQ7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7R0FJRztBQUVIOztHQUVHO0FBRUg7OztHQUdHO0FBRUg7O0dBRUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUgsTUFBTSxDQUFDLE9BQU8sT0FBTyxVQUFVO0lBQzdCOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDM0UsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLElBQUksQ0FBQyxhQUFhO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO1FBRWhFLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFBO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNuRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxD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VTtRQUNuQyxJQUFJLFVBQVUsQ0FBQyxZQUFZO1lBQUUsT0FBTTtRQUVuQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtRQUU5QixLQUFLLE1BQU0sWUFBWSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzVELE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBQyxDQUFDLENBQUE7UUFDdkUsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2FkZFRyYWNrZWRTdGFja1RvRXJyb3J9IGZyb20gXCIuLi91dGlscy93aXRoLXRyYWNrZWQtc3RhY2suanNcIlxuaW1wb3J0IEFwcGxpY2F0aW9uIGZyb20gXCIuLi8uLi9zcmMvYXBwbGljYXRpb24uanNcIlxuaW1wb3J0IEJhY2t0cmFjZUNsZWFuZXIgZnJvbSBcIi4uL3V0aWxzL2JhY2t0cmFjZS1jbGVhbmVyLmpzXCJcbmltcG9ydCBSZXF1ZXN0Q2xpZW50IGZyb20gXCIuL3JlcXVlc3QtY2xpZW50LmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuaW1wb3J0IHt0ZXN0Q29uZmlnLCB0ZXN0RXZlbnRzLCB0ZXN0c30gZnJvbSBcIi4vdGVzdC5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGVzdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7QXBwbGljYXRpb259IFthcHBsaWNhdGlvbl0gLSBBcHBsaWNhdGlvbiBpbnN0YW5jZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKiBAcHJvcGVydHkge1JlcXVlc3RDbGllbnR9IFtjbGllbnRdIC0gSFRUUCBjbGllbnQgZm9yIHJlcXVlc3QgdGVzdHMuXG4gKiBAcHJvcGVydHkge29iamVjdH0gW2RhdGFiYXNlQ2xlYW5pbmddIC0gRGF0YWJhc2UgY2xlYW51cCBvcHRpb25zIGZvciB0ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RhdGFiYXNlQ2xlYW5pbmcudHJhbnNhY3Rpb25dIC0gVXNlIHRyYW5zYWN0aW9ucyB0byByb2xsYmFjayBiZXR3ZWVuIHRlc3RzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGF0YWJhc2VDbGVhbmluZy50cnVuY2F0ZV0gLSBUcnVuY2F0ZSB0YWJsZXMgYmV0d2VlbiB0ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzXSAtIFdoZXRoZXIgdGhpcyB0ZXN0IGlzIGZvY3VzZWQuXG4gKiBAcHJvcGVydHkgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSBbZnVuY3Rpb25dIC0gVGVzdCBjYWxsYmFjayBmdW5jdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmV0cnldIC0gTnVtYmVyIG9mIHJldHJpZXMgd2hlbiBhIHRlc3QgZmFpbHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdIHwgc3RyaW5nfSBbdGFnc10gLSBUYWdzIGZvciBmaWx0ZXJpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3R5cGVdIC0gVGVzdCB0eXBlIGlkZW50aWZpZXIuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUZXN0RGF0YVxuICogQHByb3BlcnR5IHtUZXN0QXJnc30gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHRlc3QuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKFRlc3RBcmdzKSA6ICh2b2lkfFByb21pc2U8dm9pZD4pfSBmdW5jdGlvbiAtIFRlc3QgY2FsbGJhY2sgdG8gZXhlY3V0ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCB0ZXN0QXJnczogVGVzdEFyZ3MsIHRlc3REYXRhOiBUZXN0RGF0YX0pIDogKHZvaWR8UHJvbWlzZTx2b2lkPil9IEFmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlXG4gKiBAcHJvcGVydHkge0FmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBIb29rIGNhbGxiYWNrIHRvIGV4ZWN1dGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pIDogKHZvaWR8UHJvbWlzZTx2b2lkPil9IEJlZm9yZUFmdGVyQWxsQ2FsbGJhY2tUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCZWZvcmVBZnRlckFsbENhbGxiYWNrT2JqZWN0VHlwZVxuICogQHByb3BlcnR5IHtCZWZvcmVBZnRlckFsbENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBIb29rIGNhbGxiYWNrIHRvIGV4ZWN1dGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUZXN0c0FyZ3VtZW50XG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFRlc3REYXRhPn0gYXJncyAtIEFyZ3VtZW50cyBrZXllZCBieSB0ZXN0IGRlc2NyaXB0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbYW55VGVzdHNGb2N1c3NlZF0gLSBXaGV0aGVyIGFueSB0ZXN0cyBpbiB0aGUgdHJlZSBhcmUgZm9jdXNlZC5cbiAqIEBwcm9wZXJ0eSB7QWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlW119IGFmdGVyRWFjaGVzIC0gQWZ0ZXItZWFjaCBob29rcyBmb3IgdGhpcyBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7QmVmb3JlQWZ0ZXJBbGxDYWxsYmFja09iamVjdFR5cGVbXX0gYWZ0ZXJBbGxzIC0gQWZ0ZXItYWxsIGhvb2tzIGZvciB0aGlzIHNjb3BlLlxuICogQHByb3BlcnR5IHtCZWZvcmVBZnRlckFsbENhbGxiYWNrT2JqZWN0VHlwZVtdfSBiZWZvcmVBbGxzIC0gQmVmb3JlLWFsbCBob29rcyBmb3IgdGhpcyBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7QWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlW119IGJlZm9yZUVhY2hlcyAtIEJlZm9yZS1lYWNoIGhvb2tzIGZvciB0aGlzIHNjb3BlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBUZXN0RGF0YT59IHRlc3RzIC0gQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG5vZGUuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFRlc3RzQXJndW1lbnQ+fSBzdWJzIC0gT3B0aW9uYWwgY2hpbGQgbm9kZXMuIEVhY2ggaXRlbSBpcyBhbm90aGVyIGBOb2RlYCwgYWxsb3dpbmcgcmVjdXJzaW9uLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RSdW5uZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmd9IFthcmdzLmV4Y2x1ZGVUYWdzXSAtIFRhZ3MgdG8gZXhjbHVkZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gW2FyZ3MuaW5jbHVkZVRhZ3NdIC0gVGFncyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFyZ3MudGVzdEZpbGVzIC0gVGVzdCBmaWxlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBleGNsdWRlVGFncywgaW5jbHVkZVRhZ3MsIHRlc3RGaWxlcywgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZFwiKVxuXG4gICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9leGNsdWRlVGFncyA9IHRoaXMubm9ybWFsaXplVGFncyhleGNsdWRlVGFncylcbiAgICB0aGlzLl9leGNsdWRlVGFnU2V0ID0gbmV3IFNldCh0aGlzLl9leGNsdWRlVGFncylcbiAgICB0aGlzLl9pbmNsdWRlVGFncyA9IHRoaXMubm9ybWFsaXplVGFncyhpbmNsdWRlVGFncylcbiAgICB0aGlzLl9pbmNsdWRlVGFnU2V0ID0gbmV3IFNldCh0aGlzLl9pbmNsdWRlVGFncylcbiAgICB0aGlzLl90ZXN0RmlsZXMgPSB0ZXN0RmlsZXNcblxuICAgIHRoaXMuX2ZhaWxlZFRlc3RzID0gMFxuICAgIHRoaXMuX3N1Y2Nlc3NmdWxUZXN0cyA9IDBcbiAgICB0aGlzLl90ZXN0c0NvdW50ID0gMFxuICAgIHRoaXMuX2FjdGl2ZUFmdGVyQWxsU2NvcGVzID0gW11cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSAtIFRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvbigpIHsgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb24gfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gVGhlIHRlc3QgZmlsZXMuXG4gICAqL1xuICBnZXRUZXN0RmlsZXMoKSB7IHJldHVybiB0aGlzLl90ZXN0RmlsZXMgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nIHwgdW5kZWZpbmVkfSB0YWdzIC0gVGFncy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIE5vcm1hbGl6ZWQgdGFncy5cbiAgICovXG4gIG5vcm1hbGl6ZVRhZ3ModGFncykge1xuICAgIGlmICghdGFncykgcmV0dXJuIFtdXG5cbiAgICBjb25zdCB2YWx1ZXMgPSBbXVxuICAgIGNvbnN0IHJhd1RhZ3MgPSBBcnJheS5pc0FycmF5KHRhZ3MpID8gdGFncyA6IFt0YWdzXVxuXG4gICAgZm9yIChjb25zdCByYXdUYWcgb2YgcmF3VGFncykge1xuICAgICAgaWYgKHJhd1RhZyA9PT0gdW5kZWZpbmVkIHx8IHJhd1RhZyA9PT0gbnVsbCkgY29udGludWVcblxuICAgICAgY29uc3QgcGFydHMgPSBTdHJpbmcocmF3VGFnKS5zcGxpdChcIixcIilcblxuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBwYXJ0LnRyaW0oKVxuXG4gICAgICAgIGlmICh0cmltbWVkKSB2YWx1ZXMucHVzaCh0cmltbWVkKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IC0gRXhjbHVkZSB0YWcgc2V0LlxuICAgKi9cbiAgZ2V0RXhjbHVkZVRhZ1NldCgpIHtcbiAgICBjb25zdCBjb25maWdUYWdzID0gQXJyYXkuaXNBcnJheSh0ZXN0Q29uZmlnLmV4Y2x1ZGVUYWdzKSA/IHRlc3RDb25maWcuZXhjbHVkZVRhZ3MgOiBbXVxuXG4gICAgcmV0dXJuIG5ldyBTZXQoWy4uLnRoaXMuX2V4Y2x1ZGVUYWdzLCAuLi5jb25maWdUYWdzXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nIHwgdW5kZWZpbmVkfSB0ZXN0VGFncyAtIFRlc3QgdGFncy5cbiAgICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gdGFnU2V0IC0gVGFnIHNldC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhbnkgdGFncyBtYXRjaC5cbiAgICovXG4gIGhhc01hdGNoaW5nVGFnKHRlc3RUYWdzLCB0YWdTZXQpIHtcbiAgICBpZiAoIXRhZ1NldC5zaXplKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZVRhZ3ModGVzdFRhZ3MpXG5cbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBub3JtYWxpemVkKSB7XG4gICAgICBpZiAodGFnU2V0Lmhhcyh0YWcpKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VGVzdHNBcmd1bWVudH0gdGVzdHMgLSBUZXN0cy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhbnkgdGVzdHMgaW4gdGhpcyBzY29wZSB3aWxsIHJ1bi5cbiAgICovXG4gIGhhc1J1bm5hYmxlVGVzdHModGVzdHMpIHtcbiAgICBmb3IgKGNvbnN0IHRlc3REZXNjcmlwdGlvbiBpbiB0ZXN0cy50ZXN0cykge1xuICAgICAgY29uc3QgdGVzdERhdGEgPSB0ZXN0cy50ZXN0c1t0ZXN0RGVzY3JpcHRpb25dXG4gICAgICBjb25zdCB0ZXN0QXJncyA9IC8qKiBAdHlwZSB7VGVzdEFyZ3N9ICovIChPYmplY3QuYXNzaWduKHt9LCB0ZXN0RGF0YS5hcmdzKSlcblxuICAgICAgaWYgKHRoaXMuX29ubHlGb2N1c3NlZCAmJiAhdGVzdEFyZ3MuZm9jdXMpIGNvbnRpbnVlXG4gICAgICBpZiAodGhpcy5zaG91bGRTa2lwVGVzdCh0ZXN0QXJncykpIGNvbnRpbnVlXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdWJEZXNjcmlwdGlvbiBpbiB0ZXN0cy5zdWJzKSB7XG4gICAgICBjb25zdCBzdWJUZXN0ID0gdGVzdHMuc3Vic1tzdWJEZXNjcmlwdGlvbl1cblxuICAgICAgaWYgKHRoaXMuX29ubHlGb2N1c3NlZCAmJiAhc3ViVGVzdC5hbnlUZXN0c0ZvY3Vzc2VkKSBjb250aW51ZVxuICAgICAgaWYgKHRoaXMuaGFzUnVubmFibGVUZXN0cyhzdWJUZXN0KSkgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Rlc3RBcmdzfSB0ZXN0QXJncyAtIFRlc3QgYXJncy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgdGVzdCBzaG91bGQgYmUgc2tpcHBlZC5cbiAgICovXG4gIHNob3VsZFNraXBUZXN0KHRlc3RBcmdzKSB7XG4gICAgaWYgKHRoaXMuaGFzTWF0Y2hpbmdUYWcodGVzdEFyZ3MudGFncywgdGhpcy5nZXRFeGNsdWRlVGFnU2V0KCkpKSByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKHRoaXMuX2luY2x1ZGVUYWdTZXQuc2l6ZSA+IDAgJiYgIXRlc3RBcmdzLmZvY3VzKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzTWF0Y2hpbmdUYWcodGVzdEFyZ3MudGFncywgdGhpcy5faW5jbHVkZVRhZ1NldCkpIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8QXBwbGljYXRpb24+fSAtIFJlc29sdmVzIHdpdGggdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgYXN5bmMgYXBwbGljYXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLl9hcHBsaWNhdGlvbikge1xuICAgICAgdGhpcy5fYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb24oe1xuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSxcbiAgICAgICAgaHR0cFNlcnZlcjoge3BvcnQ6IDMxMDA2fSxcbiAgICAgICAgdHlwZTogXCJ0ZXN0LXJ1bm5lclwiXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLl9hcHBsaWNhdGlvbi5pbml0aWFsaXplKClcbiAgICAgIGF3YWl0IHRoaXMuX2FwcGxpY2F0aW9uLnN0YXJ0SHR0cFNlcnZlcigpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpY2F0aW9uXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVxdWVzdENsaWVudD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWVzdCBjbGllbnQuXG4gICAqL1xuICBhc3luYyByZXF1ZXN0Q2xpZW50KCkge1xuICAgIGlmICghdGhpcy5fcmVxdWVzdENsaWVudCkge1xuICAgICAgdGhpcy5fcmVxdWVzdENsaWVudCA9IG5ldyBSZXF1ZXN0Q2xpZW50KClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENsaWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbXBvcnRUZXN0RmlsZXMoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RW52aXJvbm1lbnRIYW5kbGVyKCkuaW1wb3J0VGVzdEZpbGVzKHRoaXMuZ2V0VGVzdEZpbGVzKCkpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBmYWlsZWQuXG4gICAqL1xuICBpc0ZhaWxlZCgpIHsgcmV0dXJuIHRoaXMuX2ZhaWxlZFRlc3RzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fZmFpbGVkVGVzdHMgPiAwIH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgZmFpbGVkIHRlc3RzLlxuICAgKi9cbiAgZ2V0RmFpbGVkVGVzdHMoKSB7XG4gICAgaWYgKHRoaXMuX2ZhaWxlZFRlc3RzID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIlRlc3RzIGhhc24ndCBiZWVuIHJ1biB5ZXRcIilcblxuICAgIHJldHVybiB0aGlzLl9mYWlsZWRUZXN0c1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIHN1Y2Nlc3NmdWwgdGVzdHMuXG4gICAqL1xuICBnZXRTdWNjZXNzZnVsVGVzdHMoKSB7XG4gICAgaWYgKHRoaXMuX3N1Y2Nlc3NmdWxUZXN0cyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoXCJUZXN0cyBoYXNuJ3QgYmVlbiBydW4geWV0XCIpXG5cbiAgICByZXR1cm4gdGhpcy5fc3VjY2Vzc2Z1bFRlc3RzXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgdGVzdHMgY291bnQuXG4gICAqL1xuICBnZXRUZXN0c0NvdW50KCkge1xuICAgIGlmICh0aGlzLl90ZXN0c0NvdW50ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIlRlc3RzIGhhc24ndCBiZWVuIHJ1biB5ZXRcIilcblxuICAgIHJldHVybiB0aGlzLl90ZXN0c0NvdW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgZXhlY3V0ZWQgdGVzdHMgY291bnQuXG4gICAqL1xuICBnZXRFeGVjdXRlZFRlc3RzQ291bnQoKSB7XG4gICAgaWYgKHRoaXMuX3N1Y2Nlc3NmdWxUZXN0cyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX2ZhaWxlZFRlc3RzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRlc3RzIGhhc24ndCBiZWVuIHJ1biB5ZXRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc3VjY2Vzc2Z1bFRlc3RzICsgdGhpcy5fZmFpbGVkVGVzdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZSgpIHtcbiAgICB0aGlzLmFueVRlc3RzRm9jdXNzZWQgPSBmYWxzZVxuICAgIHRoaXMuX2ZhaWxlZFRlc3RzID0gMFxuICAgIHRoaXMuX3N1Y2Nlc3NmdWxUZXN0cyA9IDBcbiAgICB0aGlzLl90ZXN0c0NvdW50ID0gMFxuICAgIGF3YWl0IHRoaXMuaW1wb3J0VGVzdEZpbGVzKClcbiAgICBhd2FpdCB0aGlzLmFuYWx5emVUZXN0cyh0ZXN0cylcbiAgICB0aGlzLl9vbmx5Rm9jdXNzZWQgPSB0aGlzLmFueVRlc3RzRm9jdXNzZWRcblxuICAgIGNvbnN0IHRlc3RpbmdDb25maWdQYXRoID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0VGVzdGluZygpXG5cbiAgICBpZiAodGVzdGluZ0NvbmZpZ1BhdGgpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldEVudmlyb25tZW50SGFuZGxlcigpLmltcG9ydFRlc3RpbmdDb25maWdQYXRoKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhbnkgdGVzdHMgZm9jdXNzZWQuXG4gICAqL1xuICBhcmVBbnlUZXN0c0ZvY3Vzc2VkKCkge1xuICAgIGlmICh0aGlzLmFueVRlc3RzRm9jdXNzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGFzbid0IGJlZW4gZGV0ZWN0ZWQgeWV0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYW55VGVzdHNGb2N1c3NlZFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBydW4oKSB7XG4gICAgYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZW5zdXJlQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5ydW5UZXN0cyh7XG4gICAgICAgIGFmdGVyRWFjaGVzOiBbXSxcbiAgICAgICAgYmVmb3JlRWFjaGVzOiBbXSxcbiAgICAgICAgdGVzdHMsXG4gICAgICAgIGRlc2NyaXB0aW9uczogW10sXG4gICAgICAgIGluZGVudExldmVsOiAwXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjbGVhbnVwIGhvb2tzIGZpbmlzaC5cbiAgICovXG4gIGFzeW5jIHJ1bkFmdGVyQWxsc0ZvckFjdGl2ZVNjb3BlcygpIHtcbiAgICBjb25zdCBzY29wZXMgPSBbLi4udGhpcy5fYWN0aXZlQWZ0ZXJBbGxTY29wZXNdLnJldmVyc2UoKVxuXG4gICAgZm9yIChjb25zdCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMucnVuQWZ0ZXJBbGxzRm9yU2NvcGUoc2NvcGUpXG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlQWZ0ZXJBbGxTY29wZXMgPSBbXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VGVzdHNBcmd1bWVudH0gdGVzdHMgLSBUZXN0cy5cbiAgICogQHJldHVybnMge3thbnlUZXN0c0ZvY3Vzc2VkOiBib29sZWFufX0gLSBXaGV0aGVyIGFueSB0ZXN0cyBpbiB0aGUgdHJlZSBhcmUgZm9jdXNlZC5cbiAgICovXG4gIGFuYWx5emVUZXN0cyh0ZXN0cykge1xuICAgIGxldCBhbnlUZXN0c0ZvY3Vzc2VkRm91bmQgPSBmYWxzZVxuXG4gICAgZm9yIChjb25zdCB0ZXN0RGVzY3JpcHRpb24gaW4gdGVzdHMudGVzdHMpIHtcbiAgICAgIGNvbnN0IHRlc3REYXRhID0gdGVzdHMudGVzdHNbdGVzdERlc2NyaXB0aW9uXVxuICAgICAgY29uc3QgdGVzdEFyZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0ZXN0RGF0YS5hcmdzKVxuXG4gICAgICB0aGlzLl90ZXN0c0NvdW50KytcblxuICAgICAgaWYgKHRlc3RBcmdzLmZvY3VzKSB7XG4gICAgICAgIGFueVRlc3RzRm9jdXNzZWRGb3VuZCA9IHRydWVcbiAgICAgICAgdGhpcy5hbnlUZXN0c0ZvY3Vzc2VkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3ViRGVzY3JpcHRpb24gaW4gdGVzdHMuc3Vicykge1xuICAgICAgY29uc3Qgc3ViVGVzdCA9IHRlc3RzLnN1YnNbc3ViRGVzY3JpcHRpb25dXG4gICAgICBjb25zdCB7YW55VGVzdHNGb2N1c3NlZH0gPSB0aGlzLmFuYWx5emVUZXN0cyhzdWJUZXN0KVxuXG4gICAgICBpZiAoYW55VGVzdHNGb2N1c3NlZCkge1xuICAgICAgICBhbnlUZXN0c0ZvY3Vzc2VkRm91bmQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIHN1YlRlc3QuYW55VGVzdHNGb2N1c3NlZCA9IGFueVRlc3RzRm9jdXNzZWRcbiAgICB9XG5cbiAgICByZXR1cm4ge2FueVRlc3RzRm9jdXNzZWQ6IGFueVRlc3RzRm9jdXNzZWRGb3VuZH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5PEFmdGVyQmVmb3JlRWFjaENhbGxiYWNrT2JqZWN0VHlwZT59IGFyZ3MuYWZ0ZXJFYWNoZXMgLSBBZnRlciBlYWNoZXMuXG4gICAqIEBwYXJhbSB7QXJyYXk8QWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlPn0gYXJncy5iZWZvcmVFYWNoZXMgLSBCZWZvcmUgZWFjaGVzLlxuICAgKiBAcGFyYW0ge1Rlc3RzQXJndW1lbnR9IGFyZ3MudGVzdHMgLSBUZXN0cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5kZXNjcmlwdGlvbnMgLSBEZXNjcmlwdGlvbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmluZGVudExldmVsIC0gSW5kZW50IGxldmVsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcnVuVGVzdHMoe2FmdGVyRWFjaGVzLCBiZWZvcmVFYWNoZXMsIHRlc3RzLCBkZXNjcmlwdGlvbnMsIGluZGVudExldmVsfSkge1xuICAgIGNvbnN0IGxlZnRQYWRkaW5nID0gXCIgXCIucmVwZWF0KGluZGVudExldmVsICogMilcbiAgICBjb25zdCBuZXdBZnRlckVhY2hlcyA9IFsuLi5hZnRlckVhY2hlcywgLi4udGVzdHMuYWZ0ZXJFYWNoZXNdXG4gICAgY29uc3QgbmV3QmVmb3JlRWFjaGVzID0gWy4uLmJlZm9yZUVhY2hlcywgLi4udGVzdHMuYmVmb3JlRWFjaGVzXVxuICAgIGNvbnN0IHNob3VsZFJ1bkFueVRlc3RzID0gdGhpcy5oYXNSdW5uYWJsZVRlc3RzKHRlc3RzKVxuXG4gICAgaWYgKCFzaG91bGRSdW5BbnlUZXN0cykgcmV0dXJuXG5cbiAgICAvKiogQHR5cGUge3t0ZXN0czogVGVzdHNBcmd1bWVudCwgYWZ0ZXJBbGxzUnVuOiBib29sZWFufX0gKi9cbiAgICBjb25zdCBzY29wZUVudHJ5ID0ge3Rlc3RzLCBhZnRlckFsbHNSdW46IGZhbHNlfVxuICAgIHRoaXMuX2FjdGl2ZUFmdGVyQWxsU2NvcGVzLnB1c2goc2NvcGVFbnRyeSlcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGJlZm9yZUFsbERhdGEgb2YgdGVzdHMuYmVmb3JlQWxscyB8fCBbXSkge1xuICAgICAgICBhd2FpdCBiZWZvcmVBbGxEYXRhLmNhbGxiYWNrKHtjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKX0pXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgdGVzdERlc2NyaXB0aW9uIGluIHRlc3RzLnRlc3RzKSB7XG4gICAgICAgIGNvbnN0IHRlc3REYXRhID0gdGVzdHMudGVzdHNbdGVzdERlc2NyaXB0aW9uXVxuICAgICAgICBjb25zdCB0ZXN0QXJncyA9IC8qKiBAdHlwZSB7VGVzdEFyZ3N9ICovIChPYmplY3QuYXNzaWduKHt9LCB0ZXN0RGF0YS5hcmdzKSlcblxuICAgICAgICBpZiAodGhpcy5fb25seUZvY3Vzc2VkICYmICF0ZXN0QXJncy5mb2N1cykgY29udGludWVcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkU2tpcFRlc3QodGVzdEFyZ3MpKSBjb250aW51ZVxuXG4gICAgICAgIGlmICh0ZXN0QXJncy50eXBlID09IFwibW9kZWxcIiB8fCB0ZXN0QXJncy50eXBlID09IFwicmVxdWVzdFwiKSB7XG4gICAgICAgICAgdGVzdEFyZ3MuYXBwbGljYXRpb24gPSBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXN0QXJncy50eXBlID09IFwicmVxdWVzdFwiKSB7XG4gICAgICAgICAgdGVzdEFyZ3MuY2xpZW50ID0gYXdhaXQgdGhpcy5yZXF1ZXN0Q2xpZW50KClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xlZnRQYWRkaW5nfWl0ICR7dGVzdERlc2NyaXB0aW9ufWApXG5cbiAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHR5cGVvZiB0ZXN0QXJncy5yZXRyeSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodGVzdEFyZ3MucmV0cnkpXG4gICAgICAgICAgPyBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHRlc3RBcmdzLnJldHJ5KSlcbiAgICAgICAgICA6IDBcbiAgICAgICAgbGV0IHJldHJpZXNVc2VkID0gMFxuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgbGV0IHNob3VsZFJldHJ5ID0gZmFsc2VcbiAgICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgICAgICAgbGV0IGZhaWxlZEVycm9yXG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBiZWZvcmVFYWNoRGF0YSBvZiBuZXdCZWZvcmVFYWNoZXMpIHtcbiAgICAgICAgICAgICAgYXdhaXQgYmVmb3JlRWFjaERhdGEuY2FsbGJhY2soe2NvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLCB0ZXN0QXJncywgdGVzdERhdGF9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0ZXN0RGF0YS5mdW5jdGlvbih0ZXN0QXJncylcbiAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3NmdWxUZXN0cysrXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChyZXRyaWVzVXNlZCA8IHJldHJ5Q291bnQpIHtcbiAgICAgICAgICAgICAgcmV0cmllc1VzZWQrK1xuICAgICAgICAgICAgICBzaG91bGRSZXRyeSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZhaWxlZEVycm9yID0gZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhZnRlckVhY2hEYXRhIG9mIG5ld0FmdGVyRWFjaGVzKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGFmdGVyRWFjaERhdGEuY2FsbGJhY2soe2NvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLCB0ZXN0QXJncywgdGVzdERhdGF9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRSZXRyeSkgY29udGludWVcblxuICAgICAgICAgIGlmIChmYWlsZWRFcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fZmFpbGVkVGVzdHMrK1xuXG4gICAgICAgICAgICBpZiAoZmFpbGVkRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2xlZnRQYWRkaW5nfSAgVGVzdCBmYWlsZWQ6YCwgZmFpbGVkRXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgYWRkVHJhY2tlZFN0YWNrVG9FcnJvcihmYWlsZWRFcnJvcilcblxuICAgICAgICAgICAgICBjb25zdCBiYWNrdHJhY2VDbGVhbmVyID0gbmV3IEJhY2t0cmFjZUNsZWFuZXIoZmFpbGVkRXJyb3IpXG4gICAgICAgICAgICAgIGNvbnN0IGNsZWFuZWRTdGFjayA9IGJhY2t0cmFjZUNsZWFuZXIuZ2V0Q2xlYW5lZFN0YWNrKClcbiAgICAgICAgICAgICAgY29uc3Qgc3RhY2tMaW5lcyA9IGNsZWFuZWRTdGFjaz8uc3BsaXQoXCJcXG5cIilcblxuICAgICAgICAgICAgICBpZiAoc3RhY2tMaW5lcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RhY2tMaW5lIG9mIHN0YWNrTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bGVmdFBhZGRpbmd9ICAke3N0YWNrTGluZX1gKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtsZWZ0UGFkZGluZ30gIFRlc3QgZmFpbGVkIHdpdGggYSAke3R5cGVvZiBmYWlsZWRFcnJvcn06YCwgZmFpbGVkRXJyb3IpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRlc3RFdmVudHMuZW1pdChcInRlc3RGYWlsZWRcIiwge1xuICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb25zLFxuICAgICAgICAgICAgICBlcnJvcjogZmFpbGVkRXJyb3IsXG4gICAgICAgICAgICAgIHRlc3RBcmdzLFxuICAgICAgICAgICAgICB0ZXN0RGF0YSxcbiAgICAgICAgICAgICAgdGVzdERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB0ZXN0UnVubmVyOiB0aGlzXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBzdWJEZXNjcmlwdGlvbiBpbiB0ZXN0cy5zdWJzKSB7XG4gICAgICAgIGNvbnN0IHN1YlRlc3QgPSB0ZXN0cy5zdWJzW3N1YkRlc2NyaXB0aW9uXVxuICAgICAgICBjb25zdCBuZXdEZWNyaXB0aW9ucyA9IGRlc2NyaXB0aW9ucy5jb25jYXQoW3N1YkRlc2NyaXB0aW9uXSlcblxuICAgICAgICBpZiAoIXRoaXMuX29ubHlGb2N1c3NlZCB8fCBzdWJUZXN0LmFueVRlc3RzRm9jdXNzZWQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgJHtsZWZ0UGFkZGluZ30ke3N1YkRlc2NyaXB0aW9ufWApXG4gICAgICAgICAgYXdhaXQgdGhpcy5ydW5UZXN0cyh7XG4gICAgICAgICAgICBhZnRlckVhY2hlczogbmV3QWZ0ZXJFYWNoZXMsXG4gICAgICAgICAgICBiZWZvcmVFYWNoZXM6IG5ld0JlZm9yZUVhY2hlcyxcbiAgICAgICAgICAgIHRlc3RzOiBzdWJUZXN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb25zOiBuZXdEZWNyaXB0aW9ucyxcbiAgICAgICAgICAgIGluZGVudExldmVsOiBpbmRlbnRMZXZlbCArIDFcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMucnVuQWZ0ZXJBbGxzRm9yU2NvcGUoc2NvcGVFbnRyeSlcbiAgICAgIGNvbnN0IHNjb3BlSW5kZXggPSB0aGlzLl9hY3RpdmVBZnRlckFsbFNjb3Blcy5pbmRleE9mKHNjb3BlRW50cnkpXG5cbiAgICAgIGlmIChzY29wZUluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlQWZ0ZXJBbGxTY29wZXMuc3BsaWNlKHNjb3BlSW5kZXgsIDEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e3Rlc3RzOiBUZXN0c0FyZ3VtZW50LCBhZnRlckFsbHNSdW46IGJvb2xlYW59fSBzY29wZUVudHJ5IC0gU2NvcGUgZW50cnkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gc2NvcGUgY2xlYW51cCBmaW5pc2hlcy5cbiAgICovXG4gIGFzeW5jIHJ1bkFmdGVyQWxsc0ZvclNjb3BlKHNjb3BlRW50cnkpIHtcbiAgICBpZiAoc2NvcGVFbnRyeS5hZnRlckFsbHNSdW4pIHJldHVyblxuXG4gICAgc2NvcGVFbnRyeS5hZnRlckFsbHNSdW4gPSB0cnVlXG5cbiAgICBmb3IgKGNvbnN0IGFmdGVyQWxsRGF0YSBvZiBzY29wZUVudHJ5LnRlc3RzLmFmdGVyQWxscyB8fCBbXSkge1xuICAgICAgYXdhaXQgYWZ0ZXJBbGxEYXRhLmNhbGxiYWNrKHtjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKX0pXG4gICAgfVxuICB9XG59XG4iXX0=
@@ -131,6 +131,11 @@ declare class Expect extends BaseExpect {
131
131
  * @returns {void} - No return value.
132
132
  */
133
133
  toMatch(regex: RegExp): void;
134
+ /**
135
+ * @param {Record<string, any> | any[]} expected - Expected partial object.
136
+ * @returns {void} - No return value.
137
+ */
138
+ toMatchObject(expected: Record<string, any> | any[]): void;
134
139
  /**
135
140
  * @template T extends Error
136
141
  * @param {string|T} expectedError - Expected error.
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/testing/test.js"],"names":[],"mappings":"AAiHA;;;GAGG;AACH,mCAHW,OAAO,kBAAkB,EAAE,0BAA0B,GACnD,IAAI,CAMhB;AAlBD;;;GAGG;AACH,oCAHW,OAAO,kBAAkB,EAAE,2BAA2B,GACpD,IAAI,CAMhB;AAlBD;;;GAGG;AACH,oCAHW,OAAO,kBAAkB,EAAE,0BAA0B,GACnD,IAAI,CAMhB;AAlBD;;;GAGG;AACH,qCAHW,OAAO,kBAAkB,EAAE,2BAA2B,GACpD,IAAI,CAMhB;AAnCD;;;;GAIG;AACH,iDAHG;IAAiC,WAAW,GAApC,MAAM,EAAE,GAAG,MAAM;CACzB,GAAU,IAAI,CAIhB;AAoeD;;;;;GAKG;AACH,sCALW,MAAM,QACN,MAAM,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SACnC,SAAS,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAgCzB;AAED;;;GAGG;AACH,4BAHW,GAAG,GACD,MAAM,CAIlB;AA8BD;;;;;GAKG;AACH,iCALW,MAAM,QACN,MAAM,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SACnC,SAAS,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GACpC,IAAI,CAmBhB;AAnDD;;;;;GAKG;AACH,gCALW,MAAM,QACN,MAAM,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SACnC,SAAS,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GACpC,IAAI,CAsBhB;;;;AAplBD,oFAAqC;AAhBrC,uDAAuD;AACvD,oBADW,OAAO,kBAAkB,EAAE,aAAa,CAclD;AAoKD;IACE;;OAEG;IACH,oBAFW,GAAG,EAQb;IAJC,aAAqB;IAErB,6CAA6C;IAC7C,cADW,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC,CACnB;IAGxB;;;OAGG;IACH,0BAHW,MAAY,OAAO,CAAC,MAAM,CAAC,GACzB,cAAc,CAI1B;IAED;;OAEG;IACH,WAFa,IAAI,CAMhB;IAHC,cAAgB;IAKlB;;;OAGG;IACH,aAHW,GAAG,GACD,IAAI,CAkBhB;IAED;;;OAGG;IACH,4BAHW,MAAM,GACJ,IAAI,CAsBhB;IAED;;OAEG;IACH,eAFa,IAAI,CAgBhB;IAED;;;OAGG;IACH,sBAHW,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GACjC,IAAI,CAQhB;IAED;;OAEG;IACH,aAFa,IAAI,CAIhB;IAED;;OAEG;IACH,YAFa,IAAI,CAIhB;IAED;;OAEG;IACH,iBAFa,IAAI,CAIhB;IAED;;OAEG;IACH,YAFa,IAAI,CAIhB;IAED;;;OAGG;IACH,yBAHW,MAAY,OAAO,CAAC,MAAM,CAAC,GACzB,cAAc,CAU1B;IAED;;;OAGG;IACH,0BAHW,GAAG,GACD,IAAI,CA6BhB;IAED;;;OAGG;IACH,gBAHW,GAAG,GACD,IAAI,CAqDhB;IAED;;;OAGG;IACH,eAHW,MAAM,GACJ,IAAI,CAmBhB;IAED;;;;OAIG;IACH,aAJa,CAAC,iBACH,MAAM,GAAC,CAAC,GACN,OAAO,CAAC,IAAI,CAAC,CAwCzB;IAED;;OAEG;IACH,WAFa,OAAO,CAAC,GAAG,CAAC,CAsBxB;IAED;;;OAGG;IACH,yBAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,IAAI,CAwBhB;CACF;AAtaD;IACE;;;OAGG;IACH,aAFa,OAAO,CAAC,IAAI,CAAC,CAEY;IAEtC;;;OAGG;IACH,YAFa,OAAO,CAAC,IAAI,CAAC,CAEW;CACtC;AAED;IACE;;;;OAIG;IACH,qDAHG;QAA0C,cAAc,EAAhD,MAAY,OAAO,CAAC,MAAM,CAAC;QACd,MAAM,EAAnB,MAAM;KAChB,EAOA;IAFC,eAAoB;IACpB,sBARqB,OAAO,CAAC,MAAM,CAAC,CAQA;IAGtC;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAMlB;IAHC,cAAkB;IAMlB,iBAA2C;IAI3C,iBAA2C;IAG7C;;OAEG;IACH,WAFa,OAAO,CAAC,IAAI,CAAC,CAYzB;CACF"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/testing/test.js"],"names":[],"mappings":"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"}
@@ -379,6 +379,27 @@ class Expect extends BaseExpect {
379
379
  }
380
380
  }
381
381
  }
382
+ /**
383
+ * @param {Record<string, any> | any[]} expected - Expected partial object.
384
+ * @returns {void} - No return value.
385
+ */
386
+ toMatchObject(expected) {
387
+ if (expected === null || typeof expected !== "object") {
388
+ throw new Error(`Expected object but got ${typeof expected}`);
389
+ }
390
+ const { matches, differences } = matchObject(this._object, expected);
391
+ const objectPrint = formatValue(this._object);
392
+ const expectedPrint = formatValue(expected);
393
+ if (this._not) {
394
+ if (matches) {
395
+ throw new Error(`Expected ${objectPrint} not to match ${expectedPrint}`);
396
+ }
397
+ }
398
+ else if (!matches) {
399
+ const diffPrint = Object.keys(differences).length > 0 ? ` (diff: ${minifiedStringify(differences)})` : "";
400
+ throw new Error(`Expected ${objectPrint} to match ${expectedPrint}${diffPrint}`);
401
+ }
402
+ }
382
403
  /**
383
404
  * @template T extends Error
384
405
  * @param {string|T} expectedError - Expected error.
@@ -465,6 +486,65 @@ class Expect extends BaseExpect {
465
486
  }
466
487
  }
467
488
  }
489
+ /**
490
+ * @param {unknown} value - Value.
491
+ * @returns {boolean} - Whether object-like.
492
+ */
493
+ function isObjectLike(value) {
494
+ return value !== null && typeof value === "object";
495
+ }
496
+ /**
497
+ * @param {unknown} actual - Actual value.
498
+ * @param {unknown} expected - Expected value.
499
+ * @param {string} path - Path.
500
+ * @param {Record<string, unknown[]>} differences - Differences.
501
+ * @returns {void} - No return value.
502
+ */
503
+ function collectMatchDifferences(actual, expected, path, differences) {
504
+ if (Array.isArray(expected)) {
505
+ if (!Array.isArray(actual)) {
506
+ differences[path || "$"] = [expected, actual];
507
+ return;
508
+ }
509
+ for (let i = 0; i < expected.length; i++) {
510
+ const nextPath = `${path}[${i}]`;
511
+ collectMatchDifferences(actual[i], expected[i], nextPath, differences);
512
+ }
513
+ return;
514
+ }
515
+ if (isObjectLike(expected)) {
516
+ if (!isObjectLike(actual)) {
517
+ differences[path || "$"] = [expected, actual];
518
+ return;
519
+ }
520
+ for (const key of Object.keys(expected)) {
521
+ const nextPath = path ? `${path}.${key}` : key;
522
+ if (!(key in /** @type {Record<string, unknown>} */ (actual))) {
523
+ differences[nextPath] = [expected[key], undefined];
524
+ continue;
525
+ }
526
+ collectMatchDifferences(actual[key], expected[key], nextPath, differences);
527
+ }
528
+ return;
529
+ }
530
+ if (actual != expected) {
531
+ differences[path || "$"] = [expected, actual];
532
+ }
533
+ }
534
+ /**
535
+ * @param {unknown} actual - Actual value.
536
+ * @param {Record<string, any> | any[]} expected - Expected value.
537
+ * @returns {{matches: boolean, differences: Record<string, unknown[]>}} - Match result.
538
+ */
539
+ function matchObject(actual, expected) {
540
+ /** @type {Record<string, unknown[]>} */
541
+ const differences = {};
542
+ collectMatchDifferences(actual, expected, "", differences);
543
+ return {
544
+ matches: Object.keys(differences).length === 0,
545
+ differences
546
+ };
547
+ }
468
548
  /**
469
549
  * @param {string} description - Description.
470
550
  * @param {object|(() => (void|Promise<void>))} arg1 - Arg1.
@@ -566,4 +646,4 @@ globalThis.fit = fit;
566
646
  globalThis.testEvents = testEvents;
567
647
  globalThis.configureTests = configureTests;
568
648
  export { afterAll, afterEach, beforeAll, beforeEach, configureTests, describe, expect, fit, it, testConfig, testEvents, tests };
569
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUNoRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQTtBQUN2RSxPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RCx1REFBdUQ7QUFDdkQsTUFBTSxLQUFLLEdBQUc7SUFDWiw2RUFBNkU7SUFDN0UsV0FBVyxFQUFFLEVBQUU7SUFDZiw0RUFBNEU7SUFDNUUsU0FBUyxFQUFFLEVBQUU7SUFDYixJQUFJLEVBQUUsRUFBRTtJQUVSLDRFQUE0RTtJQUM1RSxVQUFVLEVBQUUsRUFBRTtJQUNkLDZFQUE2RTtJQUM3RSxZQUFZLEVBQUUsRUFBRTtJQUNoQixJQUFJLEVBQUUsRUFBRTtJQUNSLEtBQUssRUFBRSxFQUFFO0NBQ1YsQ0FBQTtBQUVELE1BQU0sVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7QUFFckMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUV6Qjs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFJO0lBQ3pCLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFcEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBQ2pCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVuRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtB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QUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Zm9ybWF0VmFsdWUsIG1pbmlmaWVkU3RyaW5naWZ5fSBmcm9tIFwiLi9mb3JtYXQtdmFsdWUuanNcIlxuaW1wb3J0IHthbnl0aGluZ0RpZmZlcmVudH0gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlL2J1aWxkL2RpZmYtdXRpbHMuanNcIlxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiLi4vdXRpbHMvZXZlbnQtZW1pdHRlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3RzQXJndW1lbnR9ICovXG5jb25zdCB0ZXN0cyA9IHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrT2JqZWN0VHlwZVtdfSAqL1xuICBhZnRlckVhY2hlczogW10sXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5CZWZvcmVBZnRlckFsbENhbGxiYWNrT2JqZWN0VHlwZVtdfSAqL1xuICBhZnRlckFsbHM6IFtdLFxuICBhcmdzOiB7fSxcblxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbiAgYmVmb3JlQWxsczogW10sXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5BZnRlckJlZm9yZUVhY2hDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbiAgYmVmb3JlRWFjaGVzOiBbXSxcbiAgc3Viczoge30sXG4gIHRlc3RzOiB7fVxufVxuXG5jb25zdCB0ZXN0RXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbmxldCBjdXJyZW50UGF0aCA9IFt0ZXN0c11cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nIHwgdW5kZWZpbmVkfSB0YWdzIC0gVGFncy5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBOb3JtYWxpemVkIHRhZ3MuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRhZ3ModGFncykge1xuICBpZiAoIXRhZ3MpIHJldHVybiBbXVxuXG4gIGNvbnN0IHZhbHVlcyA9IFtdXG4gIGNvbnN0IHJhd1RhZ3MgPSBBcnJheS5pc0FycmF5KHRhZ3MpID8gdGFncyA6IFt0YWdzXVxuXG4gIGZvciAoY29uc3QgcmF3VGFnIG9mIHJhd1RhZ3MpIHtcbiAgICBpZiAocmF3VGFnID09PSB1bmRlZmluZWQgfHwgcmF3VGFnID09PSBudWxsKSBjb250aW51ZVxuXG4gICAgY29uc3QgcGFydHMgPSBTdHJpbmcocmF3VGFnKS5zcGxpdChcIixcIilcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IHBhcnQudHJpbSgpXG5cbiAgICAgIGlmICh0cmltbWVkKSB2YWx1ZXMucHVzaCh0cmltbWVkKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSlcbn1cblxuY29uc3QgdGVzdENvbmZpZyA9IHtcbiAgZXhjbHVkZVRhZ3M6IFtdXG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gW2FyZ3MuZXhjbHVkZVRhZ3NdIC0gVGFncyB0byBleGNsdWRlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGNvbmZpZ3VyZVRlc3RzKHtleGNsdWRlVGFnc30gPSB7fSkge1xuICB0ZXN0Q29uZmlnLmV4Y2x1ZGVUYWdzID0gbm9ybWFsaXplVGFncyhleGNsdWRlVGFncylcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGJhc2VBcmdzIC0gQmFzZSBhcmdzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBleHRyYUFyZ3MgLSBFeHRyYSBhcmdzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gTWVyZ2VkIGFyZ3MuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlVGVzdEFyZ3MoYmFzZUFyZ3MsIGV4dHJhQXJncykge1xuICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBiYXNlQXJncywgZXh0cmFBcmdzKVxuICBjb25zdCBtZXJnZWRUYWdzID0gWy4uLm5vcm1hbGl6ZVRhZ3MoYmFzZUFyZ3M/LnRhZ3MpLCAuLi5ub3JtYWxpemVUYWdzKGV4dHJhQXJncz8udGFncyldXG5cbiAgaWYgKG1lcmdlZFRhZ3MubGVuZ3RoID4gMCkge1xuICAgIG1lcmdlZC50YWdzID0gQXJyYXkuZnJvbShuZXcgU2V0KG1lcmdlZFRhZ3MpKVxuICB9IGVsc2UgaWYgKFwidGFnc1wiIGluIG1lcmdlZCkge1xuICAgIGRlbGV0ZSBtZXJnZWQudGFnc1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5BZnRlckJlZm9yZUVhY2hDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJlZm9yZUVhY2goY2FsbGJhY2spIHtcbiAgY29uc3QgY3VycmVudFRlc3QgPSBjdXJyZW50UGF0aFtjdXJyZW50UGF0aC5sZW5ndGggLSAxXVxuXG4gIGN1cnJlbnRUZXN0LmJlZm9yZUVhY2hlcy5wdXNoKHtjYWxsYmFja30pXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkJlZm9yZUFmdGVyQWxsQ2FsbGJhY2tUeXBlfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiZWZvcmVBbGwoY2FsbGJhY2spIHtcbiAgY29uc3QgY3VycmVudFRlc3QgPSBjdXJyZW50UGF0aFtjdXJyZW50UGF0aC5sZW5ndGggLSAxXVxuXG4gIGN1cnJlbnRUZXN0LmJlZm9yZUFsbHMucHVzaCh7Y2FsbGJhY2t9KVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5BZnRlckJlZm9yZUVhY2hDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFmdGVyRWFjaChjYWxsYmFjaykge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG5cbiAgY3VycmVudFRlc3QuYWZ0ZXJFYWNoZXMucHVzaCh7Y2FsbGJhY2t9KVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5CZWZvcmVBZnRlckFsbENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYWZ0ZXJBbGwoY2FsbGJhY2spIHtcbiAgY29uc3QgY3VycmVudFRlc3QgPSBjdXJyZW50UGF0aFtjdXJyZW50UGF0aC5sZW5ndGggLSAxXVxuXG4gIGN1cnJlbnRUZXN0LmFmdGVyQWxscy5wdXNoKHtjYWxsYmFja30pXG59XG5cbmNsYXNzIEJhc2VFeHBlY3Qge1xuICAvKipcbiAgICogQGFic3RyYWN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBydW5CZWZvcmUoKSB7IC8qIGRvIG5vdGhpbmcgKi8gfVxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJ1bkFmdGVyKCkgeyAvKiBkbyBub3RoaW5nICovIH1cbn1cblxuY2xhc3MgRXhwZWN0VG9DaGFuZ2UgZXh0ZW5kcyBCYXNlRXhwZWN0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogUHJvbWlzZTxudW1iZXI+fSBhcmdzLmNoYW5nZUNhbGxiYWNrIC0gQ2hhbmdlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge0V4cGVjdH0gYXJncy5leHBlY3QgLSBFeHBlY3QuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2hhbmdlQ2FsbGJhY2ssIGV4cGVjdCwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgc3VwZXIoKVxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICB0aGlzLmV4cGVjdCA9IGV4cGVjdFxuICAgIHRoaXMuY2hhbmdlQ2FsbGJhY2sgPSBjaGFuZ2VDYWxsYmFja1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIENvdW50IHZhbHVlLlxuICAgKiBAcmV0dXJucyB7RXhwZWN0fSAtIFRoZSBieS5cbiAgICovXG4gIGJ5KGNvdW50KSB7XG4gICAgdGhpcy5jb3VudCA9IGNvdW50XG5cbiAgICByZXR1cm4gdGhpcy5leHBlY3RcbiAgfVxuXG4gIGFzeW5jIHJ1bkJlZm9yZSgpIHtcbiAgICB0aGlzLm9sZENvdW50ID0gYXdhaXQgdGhpcy5jaGFuZ2VDYWxsYmFjaygpXG4gIH1cblxuICBhc3luYyBydW5BZnRlcigpIHtcbiAgICB0aGlzLm5ld0NvdW50ID0gYXdhaXQgdGhpcy5jaGFuZ2VDYWxsYmFjaygpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgaWYgKHRoaXMubmV3Q291bnQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLm9sZENvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdFRvQ2hhbmdlIG5vdCBleGVjdXRlZCBwcm9wZXJseVwiKVxuICAgIH1cblxuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB0aGlzLm5ld0NvdW50IC0gdGhpcy5vbGRDb3VudFxuXG4gICAgaWYgKGRpZmZlcmVuY2UgIT0gdGhpcy5jb3VudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0byBjaGFuZ2UgYnkgJHt0aGlzLmNvdW50fSBidXQgY2hhbmdlZCBieSAke2RpZmZlcmVuY2V9YClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgRXhwZWN0IGV4dGVuZHMgQmFzZUV4cGVjdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb2JqZWN0IC0gT2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqZWN0KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX29iamVjdCA9IG9iamVjdFxuXG4gICAgLyoqIEB0eXBlIHtBcnJheTxFeHBlY3QgfCBFeHBlY3RUb0NoYW5nZT59ICovXG4gICAgdGhpcy5leHBlY3RhdGlvbnMgPSBbXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogUHJvbWlzZTxudW1iZXI+fSBjaGFuZ2VDYWxsYmFjayAtIENoYW5nZSBjYWxsYmFjay5cbiAgICogQHJldHVybnMge0V4cGVjdFRvQ2hhbmdlfSAtIFRoZSBhbmQgY2hhbmdlLlxuICAgKi9cbiAgYW5kQ2hhbmdlKGNoYW5nZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMudG9DaGFuZ2UoY2hhbmdlQ2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3RoaXN9IC0gQSB2YWx1ZS5cbiAgICovXG4gIGdldCBub3QoKSB7XG4gICAgdGhpcy5fbm90ID0gdHJ1ZVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gcmVzdWx0IC0gUmVzdWx0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlKHJlc3VsdCkge1xuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmICh0aGlzLl9vYmplY3QgPT09IHJlc3VsdCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCBub3QgdG8gYmUgJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ICE9PSByZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2Fzbid0IGV4cGVjdGVkIGJlICR7cmVzdWx0UHJpbnR9YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZUxlc3NUaGFuT3JFcXVhbChyZXN1bHQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG51bWJlcnMgYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9IGFuZCAke3R5cGVvZiByZXN1bHR9YClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0IDw9IHJlc3VsdCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ID4gcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBleHBlY3RlZCB0byBiZSBncmVhdGVyIHRoYW4gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlRGVmaW5lZCgpIHtcbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXNuwrR0IGV4cGVjdGVkIHRvIGJlIGRlZmluZWRgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXNuJ3QgZXhwZWN0ZWQgYmUgdW5kZWZpbmVkYClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bn0ga2xhc3MgLSBDbGFzcyBjb25zdHJ1Y3RvciB0byBjaGVjayBhZ2FpbnN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlSW5zdGFuY2VPZihrbGFzcykge1xuICAgIGlmICghKHRoaXMuX29iamVjdCBpbnN0YW5jZW9mIGtsYXNzKSkge1xuICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtvYmplY3RQcmludH0gdG8gYmUgYSAke2tsYXNzLm5hbWV9IGJ1dCBpdCB3YXNuJ3RgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlRmFsc2UoKSB7XG4gICAgdGhpcy50b0JlKGZhbHNlKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVOdWxsKCkge1xuICAgIHRoaXMudG9CZShudWxsKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVVbmRlZmluZWQoKSB7XG4gICAgdGhpcy50b0JlKHVuZGVmaW5lZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlVHJ1ZSgpIHtcbiAgICB0aGlzLnRvQmUodHJ1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IFByb21pc2U8bnVtYmVyPn0gY2hhbmdlQ2FsbGJhY2sgLSBDaGFuZ2UgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtFeHBlY3RUb0NoYW5nZX0gLSBUaGUgY2hhbmdlLlxuICAgKi9cbiAgdG9DaGFuZ2UoY2hhbmdlQ2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fbm90KSB0aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3R1YlwiKVxuXG4gICAgY29uc3QgZXhwZWN0VG9DaGFuZ2UgPSBuZXcgRXhwZWN0VG9DaGFuZ2Uoe2NoYW5nZUNhbGxiYWNrLCBleHBlY3Q6IHRoaXN9KVxuXG4gICAgdGhpcy5leHBlY3RhdGlvbnMucHVzaChleHBlY3RUb0NoYW5nZSlcblxuICAgIHJldHVybiBleHBlY3RUb0NoYW5nZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVRvQ29udGFpbiAtIFZhbHVlIHRvIGNvbnRhaW4uXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQ29udGFpbih2YWx1ZVRvQ29udGFpbikge1xuICAgIGlmICh0aGlzLl9ub3QpIHRocm93IG5ldyBFcnJvcihcIm5vdCBzdHViXCIpXG5cbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoIXRoaXMuX29iamVjdC5pbmNsdWRlcyhTdHJpbmcodmFsdWVUb0NvbnRhaW4pKSkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IG1pbmlmaWVkU3RyaW5naWZ5KHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgdmFsdWVQcmludCA9IHR5cGVvZiB2YWx1ZVRvQ29udGFpbiA9PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBtaW5pZmllZFN0cmluZ2lmeSh2YWx1ZVRvQ29udGFpbilcbiAgICAgICAgICA6IGZvcm1hdFZhbHVlKHZhbHVlVG9Db250YWluKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gZG9lc24ndCBjb250YWluICR7dmFsdWVQcmludH1gKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuX29iamVjdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXJyYXkgb3Igc3RyaW5nIGJ1dCBnb3QgJHt0eXBlb2YgdGhpcy5fb2JqZWN0fWApXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9vYmplY3QuaW5jbHVkZXModmFsdWVUb0NvbnRhaW4pKSB7XG4gICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgIGNvbnN0IHZhbHVlUHJpbnQgPSB0eXBlb2YgdmFsdWVUb0NvbnRhaW4gPT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1pbmlmaWVkU3RyaW5naWZ5KHZhbHVlVG9Db250YWluKVxuICAgICAgICA6IGZvcm1hdFZhbHVlKHZhbHVlVG9Db250YWluKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IGRvZXNuJ3QgY29udGFpbiAke3ZhbHVlUHJpbnR9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9FcXVhbChyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZXN1bHQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoIWFueXRoaW5nRGlmZmVyZW50KHRoaXMuX29iamVjdCwgcmVzdWx0KSkge1xuICAgICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9vYmplY3QgPT0gcmVzdWx0KSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIGVxdWFsIHRvICR7cmVzdWx0UHJpbnR9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZXN1bHQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoYW55dGhpbmdEaWZmZXJlbnQodGhpcy5fb2JqZWN0LCByZXN1bHQpKSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9vYmplY3QpICYmIEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICAgICAgY29uc3QgYWN0dWFsU3RyaW5ncyA9IHRoaXMuX29iamVjdC5tYXAoKGl0ZW0pID0+IG1pbmlmaWVkU3RyaW5naWZ5KGl0ZW0pKVxuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRTdHJpbmdzID0gcmVzdWx0Lm1hcCgoaXRlbSkgPT4gbWluaWZpZWRTdHJpbmdpZnkoaXRlbSkpXG5cbiAgICAgICAgICAgIGNvbnN0IG1pc3NpbmdJdGVtcyA9IGV4cGVjdGVkU3RyaW5ncy5maWx0ZXIoKGl0ZW0pID0+ICFhY3R1YWxTdHJpbmdzLmluY2x1ZGVzKGl0ZW0pKVxuICAgICAgICAgICAgY29uc3QgdW5leHBlY3RlZEl0ZW1zID0gYWN0dWFsU3RyaW5ncy5maWx0ZXIoKGl0ZW0pID0+ICFleHBlY3RlZFN0cmluZ3MuaW5jbHVkZXMoaXRlbSkpXG5cbiAgICAgICAgICAgIGNvbnN0IGRpZmZQYXJ0cyA9IFtdXG5cbiAgICAgICAgICAgIGlmIChtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCkgZGlmZlBhcnRzLnB1c2goYG1pc3NpbmcgJHttaXNzaW5nSXRlbXMuam9pbihcIiwgXCIpfWApXG4gICAgICAgICAgICBpZiAodW5leHBlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIGRpZmZQYXJ0cy5wdXNoKGB1bmV4cGVjdGVkICR7dW5leHBlY3RlZEl0ZW1zLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgICAgICAgICBjb25zdCBkaWZmTWVzc2FnZSA9IGRpZmZQYXJ0cy5sZW5ndGggPiAwID8gYCAoZGlmZjogJHtkaWZmUGFydHMuam9pbihcIjsgXCIpfSlgIDogXCJcIlxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBlcXVhbCB0byAke3Jlc3VsdFByaW50fSR7ZGlmZk1lc3NhZ2V9YClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9vYmplY3QgIT0gcmVzdWx0KSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4IC0gUmVnZXguXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvTWF0Y2gocmVnZXgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBzdHJpbmcgYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9YClcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuX29iamVjdC5tYXRjaChyZWdleClcbiAgICBjb25zdCBvYmplY3RQcmludCA9IG1pbmlmaWVkU3RyaW5naWZ5KHRoaXMuX29iamVjdClcblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHNob3VsZG4ndCBtYXRjaCAke3JlZ2V4fWApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSBkaWRuJ3QgbWF0Y2ggJHtyZWdleH1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVCBleHRlbmRzIEVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfFR9IGV4cGVjdGVkRXJyb3IgLSBFeHBlY3RlZCBlcnJvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHRvVGhyb3dFcnJvcihleHBlY3RlZEVycm9yKSB7XG4gICAgaWYgKHRoaXMuX25vdCkgdGhyb3cgbmV3IEVycm9yKFwibm90IHN0dWJcIilcblxuICAgIGxldCBmYWlsZWRFcnJvclxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fb2JqZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBmdW5jdGlvbiBidXQgZ290ICR7dHlwZW9mIHRoaXMuX29iamVjdH1gKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9vYmplY3QoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmYWlsZWRFcnJvciA9IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKCFmYWlsZWRFcnJvcikgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgdG8gZmFpbCBidXQgZGlkbid0XCIpXG5cbiAgICBsZXQgZXhwZWN0ZWRFcnJvck1lc3NhZ2UsIGZhaWxlZEVycm9yTWVzc2FnZVxuXG4gICAgaWYgKHR5cGVvZiBmYWlsZWRFcnJvciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBmYWlsZWRFcnJvck1lc3NhZ2UgPSBmYWlsZWRFcnJvclxuICAgIH0gZWxzZSBpZiAoZmFpbGVkRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgZmFpbGVkRXJyb3JNZXNzYWdlID0gZmFpbGVkRXJyb3IubWVzc2FnZVxuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsZWRFcnJvck1lc3NhZ2UgPSBTdHJpbmcoZmFpbGVkRXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBleHBlY3RlZEVycm9yID09IFwic3RyaW5nXCIpIHtcbiAgICAgIGV4cGVjdGVkRXJyb3JNZXNzYWdlID0gZXhwZWN0ZWRFcnJvclxuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBleHBlY3RlZEVycm9yTWVzc2FnZSA9IGV4cGVjdGVkRXJyb3IubWVzc2FnZVxuICAgIH0gZWxzZSB7XG4gICAgICBleHBlY3RlZEVycm9yTWVzc2FnZSA9IFN0cmluZyhleHBlY3RlZEVycm9yKVxuICAgIH1cblxuICAgIGlmIChmYWlsZWRFcnJvck1lc3NhZ2UgIT0gZXhwZWN0ZWRFcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdG8gZmFpbCB3aXRoICcke2V4cGVjdGVkRXJyb3JNZXNzYWdlfScgYnV0IGZhaWxlZCB3aXRoICcke2ZhaWxlZEVycm9yTWVzc2FnZX0nYClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBleGVjdXRlLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBmb3IgKGNvbnN0IGV4cGVjdGF0aW9uIG9mIHRoaXMuZXhwZWN0YXRpb25zKSB7XG4gICAgICBhd2FpdCBleHBlY3RhdGlvbi5ydW5CZWZvcmUoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5fb2JqZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZnVuY3Rpb24gYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9vYmplY3QoKVxuXG4gICAgZm9yIChjb25zdCBleHBlY3RhdGlvbiBvZiB0aGlzLmV4cGVjdGF0aW9ucykge1xuICAgICAgYXdhaXQgZXhwZWN0YXRpb24ucnVuQWZ0ZXIoKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXhwZWN0YXRpb24gb2YgdGhpcy5leHBlY3RhdGlvbnMpIHtcbiAgICAgIGF3YWl0IGV4cGVjdGF0aW9uLmV4ZWN1dGUoKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9IYXZlQXR0cmlidXRlcyhyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5fbm90KSB0aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3R1YlwiKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnlbXT59ICovXG4gICAgY29uc3QgZGlmZmVyZW5jZXMgPSB7fVxuICAgIGNvbnN0IG9iamVjdEFzUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHRoaXMuX29iamVjdClcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHJlc3VsdCkge1xuICAgICAgY29uc3QgdmFsdWUgPSByZXN1bHRba2V5XVxuXG4gICAgICBpZiAoIShrZXkgaW4gb2JqZWN0QXNSZWNvcmQpKSB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5fb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWV9IGRvZXNuJ3QgcmVzcG9uZCB0byAke2tleX1gKVxuXG4gICAgICBjb25zdCBvYmplY3RWYWx1ZSA9IC8qKiBAdHlwZSB7KCkgPT4gdW5rbm93bn0gKi8gKG9iamVjdEFzUmVjb3JkW2tleV0pKClcblxuICAgICAgaWYgKHZhbHVlICE9IG9iamVjdFZhbHVlKSB7XG4gICAgICAgIGRpZmZlcmVuY2VzW2tleV0gPSBbdmFsdWUsIG9iamVjdFZhbHVlXVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhkaWZmZXJlbmNlcykubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPYmplY3QgaGFkIGRpZmZlcmV0IHZhbHVlczogJHttaW5pZmllZFN0cmluZ2lmeShkaWZmZXJlbmNlcyl9YClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IGFyZzEgLSBBcmcxLlxuICogQHBhcmFtIHt1bmRlZmluZWR8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gW2FyZzJdIC0gQXJnMi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlc2NyaWJlKGRlc2NyaXB0aW9uLCBhcmcxLCBhcmcyKSB7XG4gIGxldCB0ZXN0QXJncywgdGVzdEZ1bmN0aW9uXG5cbiAgaWYgKHR5cGVvZiBhcmcyID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IGFyZzJcbiAgICB0ZXN0QXJncyA9IGFyZzFcbiAgfSBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSBhcmcxXG4gICAgdGVzdEFyZ3MgPSB7fVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcmd1bWVudHMgZm9yIGRlc2NyaWJlOiAke2FyZzF9LCAke2FyZzJ9YClcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRUZXN0ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMV1cbiAgY29uc3QgbmV3VGVzdEFyZ3MgPSBtZXJnZVRlc3RBcmdzKGN1cnJlbnRUZXN0LmFyZ3MsIHRlc3RBcmdzKVxuXG4gIGlmIChkZXNjcmlwdGlvbiBpbiBjdXJyZW50VGVzdC5zdWJzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgdGVzdCBkZXNjcmlwdGlvbjogJHtkZXNjcmlwdGlvbn1gKVxuICB9XG5cbiAgY29uc3QgbmV3VGVzdERhdGEgPSB7YWZ0ZXJFYWNoZXM6IFtdLCBhZnRlckFsbHM6IFtdLCBhcmdzOiBuZXdUZXN0QXJncywgYmVmb3JlQWxsczogW10sIGJlZm9yZUVhY2hlczogW10sIHN1YnM6IHt9LCB0ZXN0czoge319XG5cbiAgY3VycmVudFRlc3Quc3Vic1tkZXNjcmlwdGlvbl0gPSBuZXdUZXN0RGF0YVxuICBjdXJyZW50UGF0aC5wdXNoKG5ld1Rlc3REYXRhKVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgdGVzdEZ1bmN0aW9uKClcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UGF0aC5wb3AoKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGFyZyAtIEFyZy5cbiAqIEByZXR1cm5zIHtFeHBlY3R9IC0gVGhlIGV4cGVjdC5cbiAqL1xuZnVuY3Rpb24gZXhwZWN0KGFyZykge1xuICByZXR1cm4gbmV3IEV4cGVjdChhcmcpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24uXG4gKiBAcGFyYW0ge29iamVjdHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBhcmcxIC0gQXJnMS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IFthcmcyXSAtIEFyZzIuXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGl0KGRlc2NyaXB0aW9uLCBhcmcxLCBhcmcyKSB7XG4gIGNvbnN0IGN1cnJlbnRUZXN0ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMV1cbiAgbGV0IHRlc3RBcmdzXG5cbiAgLyoqIEB0eXBlIHsoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KX0gKi9cbiAgbGV0IHRlc3RGdW5jdGlvblxuXG4gIGlmICh0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSBhcmcxXG4gICAgdGVzdEFyZ3MgPSB7fVxuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcyID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IGFyZzJcbiAgICB0ZXN0QXJncyA9IGFyZzFcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnRzIGZvciBpdDogJHtkZXNjcmlwdGlvbn0sICR7YXJnMX1gKVxuICB9XG5cbiAgY29uc3QgbmV3VGVzdEFyZ3MgPSBtZXJnZVRlc3RBcmdzKGN1cnJlbnRUZXN0LmFyZ3MsIHRlc3RBcmdzKVxuXG4gIGN1cnJlbnRUZXN0LnRlc3RzW2Rlc2NyaXB0aW9uXSA9IHthcmdzOiBuZXdUZXN0QXJncywgZnVuY3Rpb246IHRlc3RGdW5jdGlvbn1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IGFyZzEgLSBBcmcxLlxuICogQHBhcmFtIHt1bmRlZmluZWR8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gW2FyZzJdIC0gQXJnMi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZml0KGRlc2NyaXB0aW9uLCBhcmcxLCBhcmcyKSB7XG4gIGxldCB0ZXN0QXJnc1xuXG4gIC8qKiBAdHlwZSB7KCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPil9ICovXG4gIGxldCB0ZXN0RnVuY3Rpb25cblxuICBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gYXJnMVxuICAgIHRlc3RBcmdzID0ge2ZvY3VzOiB0cnVlfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcyID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IGFyZzJcbiAgICB0ZXN0QXJncyA9IE9iamVjdC5hc3NpZ24oe2ZvY3VzOiB0cnVlfSwgYXJnMSlcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnRzIGZvciBpdDogJHtkZXNjcmlwdGlvbn0sICR7YXJnMX1gKVxuICB9XG5cbiAgcmV0dXJuIGl0KGRlc2NyaXB0aW9uLCB0ZXN0QXJncywgdGVzdEZ1bmN0aW9uKVxufVxuXG4vLyBNYWtlIHRoZSBtZXRob2RzIGdsb2JhbCBzbyB0aGV5IGNhbiBiZSB1c2VkIGluIHRlc3QgZmlsZXNcbmdsb2JhbFRoaXMuYWZ0ZXJFYWNoID0gYWZ0ZXJFYWNoXG5nbG9iYWxUaGlzLmFmdGVyQWxsID0gYWZ0ZXJBbGxcbmdsb2JhbFRoaXMuYmVmb3JlRWFjaCA9IGJlZm9yZUVhY2hcbmdsb2JhbFRoaXMuYmVmb3JlQWxsID0gYmVmb3JlQWxsXG5nbG9iYWxUaGlzLmRlc2NyaWJlID0gZGVzY3JpYmVcbmdsb2JhbFRoaXMuZXhwZWN0ID0gZXhwZWN0XG5nbG9iYWxUaGlzLml0ID0gaXRcbmdsb2JhbFRoaXMuZml0ID0gZml0XG5nbG9iYWxUaGlzLnRlc3RFdmVudHMgPSB0ZXN0RXZlbnRzXG5nbG9iYWxUaGlzLmNvbmZpZ3VyZVRlc3RzID0gY29uZmlndXJlVGVzdHNcblxuZXhwb3J0IHthZnRlckFsbCwgYWZ0ZXJFYWNoLCBiZWZvcmVBbGwsIGJlZm9yZUVhY2gsIGNvbmZpZ3VyZVRlc3RzLCBkZXNjcmliZSwgZXhwZWN0LCBmaXQsIGl0LCB0ZXN0Q29uZmlnLCB0ZXN0RXZlbnRzLCB0ZXN0c31cbiJdfQ==
649
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUNoRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQTtBQUN2RSxPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RCx1REFBdUQ7QUFDdkQsTUFBTSxLQUFLLEdBQUc7SUFDWiw2RUFBNkU7SUFDN0UsV0FBVyxFQUFFLEVBQUU7SUFDZiw0RUFBNEU7SUFDNUUsU0FBUyxFQUFFLEVBQUU7SUFDYixJQUFJLEVBQUUsRUFBRTtJQUVSLDRFQUE0RTtJQUM1RSxVQUFVLEVBQUUsRUFBRTtJQUNkLDZFQUE2RTtJQUM3RSxZQUFZLEVBQUUsRUFBRTtJQUNoQixJQUFJLEVBQUUsRUFBRTtJQUNSLEtBQUssRUFBRSxFQUFFO0NBQ1YsQ0FBQTtBQUVELE1BQU0sVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7QUFFckMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUV6Qjs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFJO0lBQ3pCLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFcEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBQ2pCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVuRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtB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QUUsSUFBSSxDQUFDLENBQUE7SUFDL0MsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixXQUFXLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUN0RSxDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQTtBQUNoRCxDQUFDO0FBRUQsNERBQTREO0FBQzVELFVBQVUsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO0FBQ2hDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0FBQzlCLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO0FBQ2xDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO0FBQ2hDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0FBQzlCLFVBQVUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO0FBQzFCLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFBO0FBQ2xCLFVBQVUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO0FBQ3BCLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO0FBQ2xDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO0FBRTFDLE9BQU8sRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Zm9ybWF0VmFsdWUsIG1pbmlmaWVkU3RyaW5naWZ5fSBmcm9tIFwiLi9mb3JtYXQtdmFsdWUuanNcIlxuaW1wb3J0IHthbnl0aGluZ0RpZmZlcmVudH0gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlL2J1aWxkL2RpZmYtdXRpbHMuanNcIlxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiLi4vdXRpbHMvZXZlbnQtZW1pdHRlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3RzQXJndW1lbnR9ICovXG5jb25zdCB0ZXN0cyA9IHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrT2JqZWN0VHlwZVtdfSAqL1xuICBhZnRlckVhY2hlczogW10sXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5CZWZvcmVBZnRlckFsbENhbGxiYWNrT2JqZWN0VHlwZVtdfSAqL1xuICBhZnRlckFsbHM6IFtdLFxuICBhcmdzOiB7fSxcblxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbiAgYmVmb3JlQWxsczogW10sXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5BZnRlckJlZm9yZUVhY2hDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbiAgYmVmb3JlRWFjaGVzOiBbXSxcbiAgc3Viczoge30sXG4gIHRlc3RzOiB7fVxufVxuXG5jb25zdCB0ZXN0RXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbmxldCBjdXJyZW50UGF0aCA9IFt0ZXN0c11cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nIHwgdW5kZWZpbmVkfSB0YWdzIC0gVGFncy5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBOb3JtYWxpemVkIHRhZ3MuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRhZ3ModGFncykge1xuICBpZiAoIXRhZ3MpIHJldHVybiBbXVxuXG4gIGNvbnN0IHZhbHVlcyA9IFtdXG4gIGNvbnN0IHJhd1RhZ3MgPSBBcnJheS5pc0FycmF5KHRhZ3MpID8gdGFncyA6IFt0YWdzXVxuXG4gIGZvciAoY29uc3QgcmF3VGFnIG9mIHJhd1RhZ3MpIHtcbiAgICBpZiAocmF3VGFnID09PSB1bmRlZmluZWQgfHwgcmF3VGFnID09PSBudWxsKSBjb250aW51ZVxuXG4gICAgY29uc3QgcGFydHMgPSBTdHJpbmcocmF3VGFnKS5zcGxpdChcIixcIilcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IHBhcnQudHJpbSgpXG5cbiAgICAgIGlmICh0cmltbWVkKSB2YWx1ZXMucHVzaCh0cmltbWVkKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSlcbn1cblxuY29uc3QgdGVzdENvbmZpZyA9IHtcbiAgZXhjbHVkZVRhZ3M6IFtdXG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gW2FyZ3MuZXhjbHVkZVRhZ3NdIC0gVGFncyB0byBleGNsdWRlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGNvbmZpZ3VyZVRlc3RzKHtleGNsdWRlVGFnc30gPSB7fSkge1xuICB0ZXN0Q29uZmlnLmV4Y2x1ZGVUYWdzID0gbm9ybWFsaXplVGFncyhleGNsdWRlVGFncylcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGJhc2VBcmdzIC0gQmFzZSBhcmdzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBleHRyYUFyZ3MgLSBFeHRyYSBhcmdzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gTWVyZ2VkIGFyZ3MuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlVGVzdEFyZ3MoYmFzZUFyZ3MsIGV4dHJhQXJncykge1xuICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBiYXNlQXJncywgZXh0cmFBcmdzKVxuICBjb25zdCBtZXJnZWRUYWdzID0gWy4uLm5vcm1hbGl6ZVRhZ3MoYmFzZUFyZ3M/LnRhZ3MpLCAuLi5ub3JtYWxpemVUYWdzKGV4dHJhQXJncz8udGFncyldXG5cbiAgaWYgKG1lcmdlZFRhZ3MubGVuZ3RoID4gMCkge1xuICAgIG1lcmdlZC50YWdzID0gQXJyYXkuZnJvbShuZXcgU2V0KG1lcmdlZFRhZ3MpKVxuICB9IGVsc2UgaWYgKFwidGFnc1wiIGluIG1lcmdlZCkge1xuICAgIGRlbGV0ZSBtZXJnZWQudGFnc1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5BZnRlckJlZm9yZUVhY2hDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJlZm9yZUVhY2goY2FsbGJhY2spIHtcbiAgY29uc3QgY3VycmVudFRlc3QgPSBjdXJyZW50UGF0aFtjdXJyZW50UGF0aC5sZW5ndGggLSAxXVxuXG4gIGN1cnJlbnRUZXN0LmJlZm9yZUVhY2hlcy5wdXNoKHtjYWxsYmFja30pXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkJlZm9yZUFmdGVyQWxsQ2FsbGJhY2tUeXBlfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiZWZvcmVBbGwoY2FsbGJhY2spIHtcbiAgY29uc3QgY3VycmVudFRlc3QgPSBjdXJyZW50UGF0aFtjdXJyZW50UGF0aC5sZW5ndGggLSAxXVxuXG4gIGN1cnJlbnRUZXN0LmJlZm9yZUFsbHMucHVzaCh7Y2FsbGJhY2t9KVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5BZnRlckJlZm9yZUVhY2hDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFmdGVyRWFjaChjYWxsYmFjaykge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG5cbiAgY3VycmVudFRlc3QuYWZ0ZXJFYWNoZXMucHVzaCh7Y2FsbGJhY2t9KVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5CZWZvcmVBZnRlckFsbENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYWZ0ZXJBbGwoY2FsbGJhY2spIHtcbiAgY29uc3QgY3VycmVudFRlc3QgPSBjdXJyZW50UGF0aFtjdXJyZW50UGF0aC5sZW5ndGggLSAxXVxuXG4gIGN1cnJlbnRUZXN0LmFmdGVyQWxscy5wdXNoKHtjYWxsYmFja30pXG59XG5cbmNsYXNzIEJhc2VFeHBlY3Qge1xuICAvKipcbiAgICogQGFic3RyYWN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBydW5CZWZvcmUoKSB7IC8qIGRvIG5vdGhpbmcgKi8gfVxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJ1bkFmdGVyKCkgeyAvKiBkbyBub3RoaW5nICovIH1cbn1cblxuY2xhc3MgRXhwZWN0VG9DaGFuZ2UgZXh0ZW5kcyBCYXNlRXhwZWN0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogUHJvbWlzZTxudW1iZXI+fSBhcmdzLmNoYW5nZUNhbGxiYWNrIC0gQ2hhbmdlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge0V4cGVjdH0gYXJncy5leHBlY3QgLSBFeHBlY3QuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2hhbmdlQ2FsbGJhY2ssIGV4cGVjdCwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgc3VwZXIoKVxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICB0aGlzLmV4cGVjdCA9IGV4cGVjdFxuICAgIHRoaXMuY2hhbmdlQ2FsbGJhY2sgPSBjaGFuZ2VDYWxsYmFja1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIENvdW50IHZhbHVlLlxuICAgKiBAcmV0dXJucyB7RXhwZWN0fSAtIFRoZSBieS5cbiAgICovXG4gIGJ5KGNvdW50KSB7XG4gICAgdGhpcy5jb3VudCA9IGNvdW50XG5cbiAgICByZXR1cm4gdGhpcy5leHBlY3RcbiAgfVxuXG4gIGFzeW5jIHJ1bkJlZm9yZSgpIHtcbiAgICB0aGlzLm9sZENvdW50ID0gYXdhaXQgdGhpcy5jaGFuZ2VDYWxsYmFjaygpXG4gIH1cblxuICBhc3luYyBydW5BZnRlcigpIHtcbiAgICB0aGlzLm5ld0NvdW50ID0gYXdhaXQgdGhpcy5jaGFuZ2VDYWxsYmFjaygpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgaWYgKHRoaXMubmV3Q291bnQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLm9sZENvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdFRvQ2hhbmdlIG5vdCBleGVjdXRlZCBwcm9wZXJseVwiKVxuICAgIH1cblxuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB0aGlzLm5ld0NvdW50IC0gdGhpcy5vbGRDb3VudFxuXG4gICAgaWYgKGRpZmZlcmVuY2UgIT0gdGhpcy5jb3VudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0byBjaGFuZ2UgYnkgJHt0aGlzLmNvdW50fSBidXQgY2hhbmdlZCBieSAke2RpZmZlcmVuY2V9YClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgRXhwZWN0IGV4dGVuZHMgQmFzZUV4cGVjdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb2JqZWN0IC0gT2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqZWN0KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX29iamVjdCA9IG9iamVjdFxuXG4gICAgLyoqIEB0eXBlIHtBcnJheTxFeHBlY3QgfCBFeHBlY3RUb0NoYW5nZT59ICovXG4gICAgdGhpcy5leHBlY3RhdGlvbnMgPSBbXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogUHJvbWlzZTxudW1iZXI+fSBjaGFuZ2VDYWxsYmFjayAtIENoYW5nZSBjYWxsYmFjay5cbiAgICogQHJldHVybnMge0V4cGVjdFRvQ2hhbmdlfSAtIFRoZSBhbmQgY2hhbmdlLlxuICAgKi9cbiAgYW5kQ2hhbmdlKGNoYW5nZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMudG9DaGFuZ2UoY2hhbmdlQ2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3RoaXN9IC0gQSB2YWx1ZS5cbiAgICovXG4gIGdldCBub3QoKSB7XG4gICAgdGhpcy5fbm90ID0gdHJ1ZVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gcmVzdWx0IC0gUmVzdWx0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlKHJlc3VsdCkge1xuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmICh0aGlzLl9vYmplY3QgPT09IHJlc3VsdCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCBub3QgdG8gYmUgJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ICE9PSByZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2Fzbid0IGV4cGVjdGVkIGJlICR7cmVzdWx0UHJpbnR9YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZUxlc3NUaGFuT3JFcXVhbChyZXN1bHQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG51bWJlcnMgYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9IGFuZCAke3R5cGVvZiByZXN1bHR9YClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0IDw9IHJlc3VsdCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ID4gcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBleHBlY3RlZCB0byBiZSBncmVhdGVyIHRoYW4gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlRGVmaW5lZCgpIHtcbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXNuwrR0IGV4cGVjdGVkIHRvIGJlIGRlZmluZWRgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXNuJ3QgZXhwZWN0ZWQgYmUgdW5kZWZpbmVkYClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bn0ga2xhc3MgLSBDbGFzcyBjb25zdHJ1Y3RvciB0byBjaGVjayBhZ2FpbnN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlSW5zdGFuY2VPZihrbGFzcykge1xuICAgIGlmICghKHRoaXMuX29iamVjdCBpbnN0YW5jZW9mIGtsYXNzKSkge1xuICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtvYmplY3RQcmludH0gdG8gYmUgYSAke2tsYXNzLm5hbWV9IGJ1dCBpdCB3YXNuJ3RgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlRmFsc2UoKSB7XG4gICAgdGhpcy50b0JlKGZhbHNlKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVOdWxsKCkge1xuICAgIHRoaXMudG9CZShudWxsKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVVbmRlZmluZWQoKSB7XG4gICAgdGhpcy50b0JlKHVuZGVmaW5lZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlVHJ1ZSgpIHtcbiAgICB0aGlzLnRvQmUodHJ1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IFByb21pc2U8bnVtYmVyPn0gY2hhbmdlQ2FsbGJhY2sgLSBDaGFuZ2UgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtFeHBlY3RUb0NoYW5nZX0gLSBUaGUgY2hhbmdlLlxuICAgKi9cbiAgdG9DaGFuZ2UoY2hhbmdlQ2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fbm90KSB0aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3R1YlwiKVxuXG4gICAgY29uc3QgZXhwZWN0VG9DaGFuZ2UgPSBuZXcgRXhwZWN0VG9DaGFuZ2Uoe2NoYW5nZUNhbGxiYWNrLCBleHBlY3Q6IHRoaXN9KVxuXG4gICAgdGhpcy5leHBlY3RhdGlvbnMucHVzaChleHBlY3RUb0NoYW5nZSlcblxuICAgIHJldHVybiBleHBlY3RUb0NoYW5nZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVRvQ29udGFpbiAtIFZhbHVlIHRvIGNvbnRhaW4uXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQ29udGFpbih2YWx1ZVRvQ29udGFpbikge1xuICAgIGlmICh0aGlzLl9ub3QpIHRocm93IG5ldyBFcnJvcihcIm5vdCBzdHViXCIpXG5cbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoIXRoaXMuX29iamVjdC5pbmNsdWRlcyhTdHJpbmcodmFsdWVUb0NvbnRhaW4pKSkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IG1pbmlmaWVkU3RyaW5naWZ5KHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgdmFsdWVQcmludCA9IHR5cGVvZiB2YWx1ZVRvQ29udGFpbiA9PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBtaW5pZmllZFN0cmluZ2lmeSh2YWx1ZVRvQ29udGFpbilcbiAgICAgICAgICA6IGZvcm1hdFZhbHVlKHZhbHVlVG9Db250YWluKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gZG9lc24ndCBjb250YWluICR7dmFsdWVQcmludH1gKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuX29iamVjdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXJyYXkgb3Igc3RyaW5nIGJ1dCBnb3QgJHt0eXBlb2YgdGhpcy5fb2JqZWN0fWApXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9vYmplY3QuaW5jbHVkZXModmFsdWVUb0NvbnRhaW4pKSB7XG4gICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgIGNvbnN0IHZhbHVlUHJpbnQgPSB0eXBlb2YgdmFsdWVUb0NvbnRhaW4gPT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1pbmlmaWVkU3RyaW5naWZ5KHZhbHVlVG9Db250YWluKVxuICAgICAgICA6IGZvcm1hdFZhbHVlKHZhbHVlVG9Db250YWluKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IGRvZXNuJ3QgY29udGFpbiAke3ZhbHVlUHJpbnR9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9FcXVhbChyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZXN1bHQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoIWFueXRoaW5nRGlmZmVyZW50KHRoaXMuX29iamVjdCwgcmVzdWx0KSkge1xuICAgICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9vYmplY3QgPT0gcmVzdWx0KSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIGVxdWFsIHRvICR7cmVzdWx0UHJpbnR9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZXN1bHQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoYW55dGhpbmdEaWZmZXJlbnQodGhpcy5fb2JqZWN0LCByZXN1bHQpKSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9vYmplY3QpICYmIEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICAgICAgY29uc3QgYWN0dWFsU3RyaW5ncyA9IHRoaXMuX29iamVjdC5tYXAoKGl0ZW0pID0+IG1pbmlmaWVkU3RyaW5naWZ5KGl0ZW0pKVxuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRTdHJpbmdzID0gcmVzdWx0Lm1hcCgoaXRlbSkgPT4gbWluaWZpZWRTdHJpbmdpZnkoaXRlbSkpXG5cbiAgICAgICAgICAgIGNvbnN0IG1pc3NpbmdJdGVtcyA9IGV4cGVjdGVkU3RyaW5ncy5maWx0ZXIoKGl0ZW0pID0+ICFhY3R1YWxTdHJpbmdzLmluY2x1ZGVzKGl0ZW0pKVxuICAgICAgICAgICAgY29uc3QgdW5leHBlY3RlZEl0ZW1zID0gYWN0dWFsU3RyaW5ncy5maWx0ZXIoKGl0ZW0pID0+ICFleHBlY3RlZFN0cmluZ3MuaW5jbHVkZXMoaXRlbSkpXG5cbiAgICAgICAgICAgIGNvbnN0IGRpZmZQYXJ0cyA9IFtdXG5cbiAgICAgICAgICAgIGlmIChtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCkgZGlmZlBhcnRzLnB1c2goYG1pc3NpbmcgJHttaXNzaW5nSXRlbXMuam9pbihcIiwgXCIpfWApXG4gICAgICAgICAgICBpZiAodW5leHBlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIGRpZmZQYXJ0cy5wdXNoKGB1bmV4cGVjdGVkICR7dW5leHBlY3RlZEl0ZW1zLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgICAgICAgICBjb25zdCBkaWZmTWVzc2FnZSA9IGRpZmZQYXJ0cy5sZW5ndGggPiAwID8gYCAoZGlmZjogJHtkaWZmUGFydHMuam9pbihcIjsgXCIpfSlgIDogXCJcIlxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBlcXVhbCB0byAke3Jlc3VsdFByaW50fSR7ZGlmZk1lc3NhZ2V9YClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9vYmplY3QgIT0gcmVzdWx0KSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4IC0gUmVnZXguXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvTWF0Y2gocmVnZXgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBzdHJpbmcgYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9YClcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuX29iamVjdC5tYXRjaChyZWdleClcbiAgICBjb25zdCBvYmplY3RQcmludCA9IG1pbmlmaWVkU3RyaW5naWZ5KHRoaXMuX29iamVjdClcblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHNob3VsZG4ndCBtYXRjaCAke3JlZ2V4fWApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSBkaWRuJ3QgbWF0Y2ggJHtyZWdleH1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCBhbnlbXX0gZXhwZWN0ZWQgLSBFeHBlY3RlZCBwYXJ0aWFsIG9iamVjdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9NYXRjaE9iamVjdChleHBlY3RlZCkge1xuICAgIGlmIChleHBlY3RlZCA9PT0gbnVsbCB8fCB0eXBlb2YgZXhwZWN0ZWQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb2JqZWN0IGJ1dCBnb3QgJHt0eXBlb2YgZXhwZWN0ZWR9YClcbiAgICB9XG5cbiAgICBjb25zdCB7bWF0Y2hlcywgZGlmZmVyZW5jZXN9ID0gbWF0Y2hPYmplY3QodGhpcy5fb2JqZWN0LCBleHBlY3RlZClcbiAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICBjb25zdCBleHBlY3RlZFByaW50ID0gZm9ybWF0VmFsdWUoZXhwZWN0ZWQpXG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7b2JqZWN0UHJpbnR9IG5vdCB0byBtYXRjaCAke2V4cGVjdGVkUHJpbnR9YClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFtYXRjaGVzKSB7XG4gICAgICBjb25zdCBkaWZmUHJpbnQgPSBPYmplY3Qua2V5cyhkaWZmZXJlbmNlcykubGVuZ3RoID4gMCA/IGAgKGRpZmY6ICR7bWluaWZpZWRTdHJpbmdpZnkoZGlmZmVyZW5jZXMpfSlgIDogXCJcIlxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7b2JqZWN0UHJpbnR9IHRvIG1hdGNoICR7ZXhwZWN0ZWRQcmludH0ke2RpZmZQcmludH1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVCBleHRlbmRzIEVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfFR9IGV4cGVjdGVkRXJyb3IgLSBFeHBlY3RlZCBlcnJvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHRvVGhyb3dFcnJvcihleHBlY3RlZEVycm9yKSB7XG4gICAgaWYgKHRoaXMuX25vdCkgdGhyb3cgbmV3IEVycm9yKFwibm90IHN0dWJcIilcblxuICAgIGxldCBmYWlsZWRFcnJvclxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fb2JqZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBmdW5jdGlvbiBidXQgZ290ICR7dHlwZW9mIHRoaXMuX29iamVjdH1gKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9vYmplY3QoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmYWlsZWRFcnJvciA9IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKCFmYWlsZWRFcnJvcikgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgdG8gZmFpbCBidXQgZGlkbid0XCIpXG5cbiAgICBsZXQgZXhwZWN0ZWRFcnJvck1lc3NhZ2UsIGZhaWxlZEVycm9yTWVzc2FnZVxuXG4gICAgaWYgKHR5cGVvZiBmYWlsZWRFcnJvciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBmYWlsZWRFcnJvck1lc3NhZ2UgPSBmYWlsZWRFcnJvclxuICAgIH0gZWxzZSBpZiAoZmFpbGVkRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgZmFpbGVkRXJyb3JNZXNzYWdlID0gZmFpbGVkRXJyb3IubWVzc2FnZVxuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsZWRFcnJvck1lc3NhZ2UgPSBTdHJpbmcoZmFpbGVkRXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBleHBlY3RlZEVycm9yID09IFwic3RyaW5nXCIpIHtcbiAgICAgIGV4cGVjdGVkRXJyb3JNZXNzYWdlID0gZXhwZWN0ZWRFcnJvclxuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBleHBlY3RlZEVycm9yTWVzc2FnZSA9IGV4cGVjdGVkRXJyb3IubWVzc2FnZVxuICAgIH0gZWxzZSB7XG4gICAgICBleHBlY3RlZEVycm9yTWVzc2FnZSA9IFN0cmluZyhleHBlY3RlZEVycm9yKVxuICAgIH1cblxuICAgIGlmIChmYWlsZWRFcnJvck1lc3NhZ2UgIT0gZXhwZWN0ZWRFcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdG8gZmFpbCB3aXRoICcke2V4cGVjdGVkRXJyb3JNZXNzYWdlfScgYnV0IGZhaWxlZCB3aXRoICcke2ZhaWxlZEVycm9yTWVzc2FnZX0nYClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBleGVjdXRlLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBmb3IgKGNvbnN0IGV4cGVjdGF0aW9uIG9mIHRoaXMuZXhwZWN0YXRpb25zKSB7XG4gICAgICBhd2FpdCBleHBlY3RhdGlvbi5ydW5CZWZvcmUoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5fb2JqZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZnVuY3Rpb24gYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9vYmplY3QoKVxuXG4gICAgZm9yIChjb25zdCBleHBlY3RhdGlvbiBvZiB0aGlzLmV4cGVjdGF0aW9ucykge1xuICAgICAgYXdhaXQgZXhwZWN0YXRpb24ucnVuQWZ0ZXIoKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXhwZWN0YXRpb24gb2YgdGhpcy5leHBlY3RhdGlvbnMpIHtcbiAgICAgIGF3YWl0IGV4cGVjdGF0aW9uLmV4ZWN1dGUoKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9IYXZlQXR0cmlidXRlcyhyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5fbm90KSB0aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3R1YlwiKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnlbXT59ICovXG4gICAgY29uc3QgZGlmZmVyZW5jZXMgPSB7fVxuICAgIGNvbnN0IG9iamVjdEFzUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHRoaXMuX29iamVjdClcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHJlc3VsdCkge1xuICAgICAgY29uc3QgdmFsdWUgPSByZXN1bHRba2V5XVxuXG4gICAgICBpZiAoIShrZXkgaW4gb2JqZWN0QXNSZWNvcmQpKSB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5fb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWV9IGRvZXNuJ3QgcmVzcG9uZCB0byAke2tleX1gKVxuXG4gICAgICBjb25zdCBvYmplY3RWYWx1ZSA9IC8qKiBAdHlwZSB7KCkgPT4gdW5rbm93bn0gKi8gKG9iamVjdEFzUmVjb3JkW2tleV0pKClcblxuICAgICAgaWYgKHZhbHVlICE9IG9iamVjdFZhbHVlKSB7XG4gICAgICAgIGRpZmZlcmVuY2VzW2tleV0gPSBbdmFsdWUsIG9iamVjdFZhbHVlXVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhkaWZmZXJlbmNlcykubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPYmplY3QgaGFkIGRpZmZlcmV0IHZhbHVlczogJHttaW5pZmllZFN0cmluZ2lmeShkaWZmZXJlbmNlcyl9YClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIG9iamVjdC1saWtlLlxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIlxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWN0dWFsIC0gQWN0dWFsIHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSBleHBlY3RlZCAtIEV4cGVjdGVkIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duW10+fSBkaWZmZXJlbmNlcyAtIERpZmZlcmVuY2VzLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0TWF0Y2hEaWZmZXJlbmNlcyhhY3R1YWwsIGV4cGVjdGVkLCBwYXRoLCBkaWZmZXJlbmNlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWN0dWFsKSkge1xuICAgICAgZGlmZmVyZW5jZXNbcGF0aCB8fCBcIiRcIl0gPSBbZXhwZWN0ZWQsIGFjdHVhbF1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5leHRQYXRoID0gYCR7cGF0aH1bJHtpfV1gXG4gICAgICBjb2xsZWN0TWF0Y2hEaWZmZXJlbmNlcyhhY3R1YWxbaV0sIGV4cGVjdGVkW2ldLCBuZXh0UGF0aCwgZGlmZmVyZW5jZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoaXNPYmplY3RMaWtlKGV4cGVjdGVkKSkge1xuICAgIGlmICghaXNPYmplY3RMaWtlKGFjdHVhbCkpIHtcbiAgICAgIGRpZmZlcmVuY2VzW3BhdGggfHwgXCIkXCJdID0gW2V4cGVjdGVkLCBhY3R1YWxdXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhleHBlY3RlZCkpIHtcbiAgICAgIGNvbnN0IG5leHRQYXRoID0gcGF0aCA/IGAke3BhdGh9LiR7a2V5fWAgOiBrZXlcblxuICAgICAgaWYgKCEoa2V5IGluIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChhY3R1YWwpKSkge1xuICAgICAgICBkaWZmZXJlbmNlc1tuZXh0UGF0aF0gPSBbZXhwZWN0ZWRba2V5XSwgdW5kZWZpbmVkXVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb2xsZWN0TWF0Y2hEaWZmZXJlbmNlcyhhY3R1YWxba2V5XSwgZXhwZWN0ZWRba2V5XSwgbmV4dFBhdGgsIGRpZmZlcmVuY2VzKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGFjdHVhbCAhPSBleHBlY3RlZCkge1xuICAgIGRpZmZlcmVuY2VzW3BhdGggfHwgXCIkXCJdID0gW2V4cGVjdGVkLCBhY3R1YWxdXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFjdHVhbCAtIEFjdHVhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55PiB8IGFueVtdfSBleHBlY3RlZCAtIEV4cGVjdGVkIHZhbHVlLlxuICogQHJldHVybnMge3ttYXRjaGVzOiBib29sZWFuLCBkaWZmZXJlbmNlczogUmVjb3JkPHN0cmluZywgdW5rbm93bltdPn19IC0gTWF0Y2ggcmVzdWx0LlxuICovXG5mdW5jdGlvbiBtYXRjaE9iamVjdChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bltdPn0gKi9cbiAgY29uc3QgZGlmZmVyZW5jZXMgPSB7fVxuXG4gIGNvbGxlY3RNYXRjaERpZmZlcmVuY2VzKGFjdHVhbCwgZXhwZWN0ZWQsIFwiXCIsIGRpZmZlcmVuY2VzKVxuXG4gIHJldHVybiB7XG4gICAgbWF0Y2hlczogT2JqZWN0LmtleXMoZGlmZmVyZW5jZXMpLmxlbmd0aCA9PT0gMCxcbiAgICBkaWZmZXJlbmNlc1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24uXG4gKiBAcGFyYW0ge29iamVjdHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBhcmcxIC0gQXJnMS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IFthcmcyXSAtIEFyZzIuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZXNjcmliZShkZXNjcmlwdGlvbiwgYXJnMSwgYXJnMikge1xuICBsZXQgdGVzdEFyZ3MsIHRlc3RGdW5jdGlvblxuXG4gIGlmICh0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSBhcmcyXG4gICAgdGVzdEFyZ3MgPSBhcmcxXG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gYXJnMVxuICAgIHRlc3RBcmdzID0ge31cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnRzIGZvciBkZXNjcmliZTogJHthcmcxfSwgJHthcmcyfWApXG4gIH1cblxuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG4gIGNvbnN0IG5ld1Rlc3RBcmdzID0gbWVyZ2VUZXN0QXJncyhjdXJyZW50VGVzdC5hcmdzLCB0ZXN0QXJncylcblxuICBpZiAoZGVzY3JpcHRpb24gaW4gY3VycmVudFRlc3Quc3Vicykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHRlc3QgZGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259YClcbiAgfVxuXG4gIGNvbnN0IG5ld1Rlc3REYXRhID0ge2FmdGVyRWFjaGVzOiBbXSwgYWZ0ZXJBbGxzOiBbXSwgYXJnczogbmV3VGVzdEFyZ3MsIGJlZm9yZUFsbHM6IFtdLCBiZWZvcmVFYWNoZXM6IFtdLCBzdWJzOiB7fSwgdGVzdHM6IHt9fVxuXG4gIGN1cnJlbnRUZXN0LnN1YnNbZGVzY3JpcHRpb25dID0gbmV3VGVzdERhdGFcbiAgY3VycmVudFBhdGgucHVzaChuZXdUZXN0RGF0YSlcblxuICB0cnkge1xuICAgIGF3YWl0IHRlc3RGdW5jdGlvbigpXG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFBhdGgucG9wKClcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBhcmcgLSBBcmcuXG4gKiBAcmV0dXJucyB7RXhwZWN0fSAtIFRoZSBleHBlY3QuXG4gKi9cbmZ1bmN0aW9uIGV4cGVjdChhcmcpIHtcbiAgcmV0dXJuIG5ldyBFeHBlY3QoYXJnKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uLlxuICogQHBhcmFtIHtvYmplY3R8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gYXJnMSAtIEFyZzEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBbYXJnMl0gLSBBcmcyLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBpdChkZXNjcmlwdGlvbiwgYXJnMSwgYXJnMikge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG4gIGxldCB0ZXN0QXJnc1xuXG4gIC8qKiBAdHlwZSB7KCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPil9ICovXG4gIGxldCB0ZXN0RnVuY3Rpb25cblxuICBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gYXJnMVxuICAgIHRlc3RBcmdzID0ge31cbiAgfSBlbHNlIGlmICh0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSBhcmcyXG4gICAgdGVzdEFyZ3MgPSBhcmcxXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgaXQ6ICR7ZGVzY3JpcHRpb259LCAke2FyZzF9YClcbiAgfVxuXG4gIGNvbnN0IG5ld1Rlc3RBcmdzID0gbWVyZ2VUZXN0QXJncyhjdXJyZW50VGVzdC5hcmdzLCB0ZXN0QXJncylcblxuICBjdXJyZW50VGVzdC50ZXN0c1tkZXNjcmlwdGlvbl0gPSB7YXJnczogbmV3VGVzdEFyZ3MsIGZ1bmN0aW9uOiB0ZXN0RnVuY3Rpb259XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24uXG4gKiBAcGFyYW0ge29iamVjdHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBhcmcxIC0gQXJnMS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IFthcmcyXSAtIEFyZzIuXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGZpdChkZXNjcmlwdGlvbiwgYXJnMSwgYXJnMikge1xuICBsZXQgdGVzdEFyZ3NcblxuICAvKiogQHR5cGUgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSAqL1xuICBsZXQgdGVzdEZ1bmN0aW9uXG5cbiAgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IGFyZzFcbiAgICB0ZXN0QXJncyA9IHtmb2N1czogdHJ1ZX1cbiAgfSBlbHNlIGlmICh0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSBhcmcyXG4gICAgdGVzdEFyZ3MgPSBPYmplY3QuYXNzaWduKHtmb2N1czogdHJ1ZX0sIGFyZzEpXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgaXQ6ICR7ZGVzY3JpcHRpb259LCAke2FyZzF9YClcbiAgfVxuXG4gIHJldHVybiBpdChkZXNjcmlwdGlvbiwgdGVzdEFyZ3MsIHRlc3RGdW5jdGlvbilcbn1cblxuLy8gTWFrZSB0aGUgbWV0aG9kcyBnbG9iYWwgc28gdGhleSBjYW4gYmUgdXNlZCBpbiB0ZXN0IGZpbGVzXG5nbG9iYWxUaGlzLmFmdGVyRWFjaCA9IGFmdGVyRWFjaFxuZ2xvYmFsVGhpcy5hZnRlckFsbCA9IGFmdGVyQWxsXG5nbG9iYWxUaGlzLmJlZm9yZUVhY2ggPSBiZWZvcmVFYWNoXG5nbG9iYWxUaGlzLmJlZm9yZUFsbCA9IGJlZm9yZUFsbFxuZ2xvYmFsVGhpcy5kZXNjcmliZSA9IGRlc2NyaWJlXG5nbG9iYWxUaGlzLmV4cGVjdCA9IGV4cGVjdFxuZ2xvYmFsVGhpcy5pdCA9IGl0XG5nbG9iYWxUaGlzLmZpdCA9IGZpdFxuZ2xvYmFsVGhpcy50ZXN0RXZlbnRzID0gdGVzdEV2ZW50c1xuZ2xvYmFsVGhpcy5jb25maWd1cmVUZXN0cyA9IGNvbmZpZ3VyZVRlc3RzXG5cbmV4cG9ydCB7YWZ0ZXJBbGwsIGFmdGVyRWFjaCwgYmVmb3JlQWxsLCBiZWZvcmVFYWNoLCBjb25maWd1cmVUZXN0cywgZGVzY3JpYmUsIGV4cGVjdCwgZml0LCBpdCwgdGVzdENvbmZpZywgdGVzdEV2ZW50cywgdGVzdHN9XG4iXX0=
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.165",
6
+ "version": "1.0.166",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [