appium-adb 9.10.5 → 9.10.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/helpers.js +8 -9
- package/lib/helpers.js +7 -7
- package/package.json +4 -2
package/build/lib/helpers.js
CHANGED
|
@@ -68,22 +68,21 @@ const MAIN_ACTION = 'android.intent.action.MAIN';
|
|
|
68
68
|
const LAUNCHER_CATEGORY = 'android.intent.category.LAUNCHER';
|
|
69
69
|
|
|
70
70
|
const getModuleRoot = _lodash.default.memoize(function getModuleRoot() {
|
|
71
|
-
|
|
71
|
+
let currentDir = _path.default.dirname(_path.default.resolve(__filename));
|
|
72
72
|
|
|
73
|
-
|
|
74
|
-
const currentDir = _path.default.join(...pathParts.slice(0, pathItemIdx));
|
|
73
|
+
let isAtFsRoot = false;
|
|
75
74
|
|
|
75
|
+
while (!isAtFsRoot) {
|
|
76
76
|
const manifestPath = _path.default.join(currentDir, 'package.json');
|
|
77
77
|
|
|
78
78
|
try {
|
|
79
|
-
if (
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (JSON.parse(_fs2.default.readFileSync(manifestPath, 'utf8')).name === 'appium-adb') {
|
|
79
|
+
if (_fs2.default.existsSync(manifestPath) && JSON.parse(_fs2.default.readFileSync(manifestPath, 'utf8')).name === 'appium-adb') {
|
|
84
80
|
return currentDir;
|
|
85
81
|
}
|
|
86
82
|
} catch (ign) {}
|
|
83
|
+
|
|
84
|
+
currentDir = _path.default.dirname(currentDir);
|
|
85
|
+
isAtFsRoot = currentDir.length <= _path.default.dirname(currentDir).length;
|
|
87
86
|
}
|
|
88
87
|
|
|
89
88
|
throw new Error('Cannot find the root folder of the appium-adb Node.js module');
|
|
@@ -974,4 +973,4 @@ function parseLaunchableActivityNames(dumpsys) {
|
|
|
974
973
|
function matchComponentName(classString) {
|
|
975
974
|
return /^[a-z0-9./_]+$/i.exec(classString);
|
|
976
975
|
}
|
|
977
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUEtTX0VYVEVOU0lPTiIsIkFQS19FWFRFTlNJT04iLCJBUEtfSU5TVEFMTF9USU1FT1VUIiwiQVBLU19JTlNUQUxMX1RJTUVPVVQiLCJERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQiLCJNQUlOX0FDVElPTiIsIkxBVU5DSEVSX0NBVEVHT1JZIiwiZ2V0TW9kdWxlUm9vdCIsIl8iLCJtZW1vaXplIiwicGF0aFBhcnRzIiwicGF0aCIsInJlc29sdmUiLCJfX2Rpcm5hbWUiLCJzcGxpdCIsInNlcCIsInBhdGhJdGVtSWR4IiwibGVuZ3RoIiwiY3VycmVudERpciIsImpvaW4iLCJzbGljZSIsIm1hbmlmZXN0UGF0aCIsIl9mcyIsImV4aXN0c1N5bmMiLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJuYW1lIiwiaWduIiwiRXJyb3IiLCJnZXRTZGtSb290RnJvbUVudiIsInByb2Nlc3MiLCJlbnYiLCJBTkRST0lEX0hPTUUiLCJBTkRST0lEX1NES19ST09UIiwicmVxdWlyZVNka1Jvb3QiLCJjdXN0b21Sb290Iiwic2RrUm9vdCIsImRvY01zZyIsImlzRW1wdHkiLCJmcyIsImV4aXN0cyIsInN0YXRzIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCIsInByb3BzUGF0aHMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJwbGF0Zm9ybXNNYXBwaW5nIiwicHJvcHNQYXRoIiwicHJvcHNDb250ZW50IiwicmVhZEZpbGUiLCJwbGF0Zm9ybVBhdGgiLCJkaXJuYW1lIiwicGxhdGZvcm0iLCJiYXNlbmFtZSIsIm1hdGNoIiwiZXhlYyIsImxvZyIsIndhcm4iLCJwYXJzZUludCIsInJlY2VudFNka1ZlcnNpb24iLCJrZXlzIiwic29ydCIsInJldmVyc2UiLCJyZXN1bHQiLCJkZWJ1ZyIsInN0cmluZ2lmeSIsInVuemlwRmlsZSIsInppcFBhdGgiLCJkc3RSb290IiwiemlwIiwiYXNzZXJ0VmFsaWRaaXAiLCJleHRyYWN0QWxsVG8iLCJ1bnNpZ25BcGsiLCJhcGtQYXRoIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwibWV0YUluZkZvbGRlck5hbWUiLCJoYXNNZXRhSW5mIiwicmVhZEVudHJpZXMiLCJlbnRyeSIsImZpbGVOYW1lIiwic3RhcnRzV2l0aCIsInRtcFppcFJvb3QiLCJyaW1yYWYiLCJ0bXBSZXN1bHRQYXRoIiwidG9BcmNoaXZlIiwidW5saW5rIiwibXYiLCJnZXRJTUVMaXN0RnJvbU91dHB1dCIsInN0ZG91dCIsImVuZ2luZXMiLCJsaW5lIiwicHVzaCIsInRyaW0iLCJyZXBsYWNlIiwiZ2V0SmF2YUhvbWUiLCJKQVZBX0hPTUUiLCJnZXRKYXZhRm9yT3MiLCJqYXZhSG9tZSIsImVyck1zZyIsImVyciIsIm1lc3NhZ2UiLCJleGVjdXRhYmxlTmFtZSIsInN5c3RlbSIsImlzV2luZG93cyIsInJlc3VsdFBhdGgiLCJ3aGljaCIsImdldE9wZW5Tc2xGb3JPcyIsImJpbmFyeU5hbWUiLCJnZXRBcGtzaWduZXJGb3JPcyIsInN5c0hlbHBlcnMiLCJnZXRCaW5hcnlGcm9tU2RrUm9vdCIsImdldEFwa2FuYWx5emVyRm9yT3MiLCJpc1Nob3dpbmdMb2Nrc2NyZWVuIiwiZHVtcHN5cyIsInNvbWUiLCJ4IiwiaW5jbHVkZXMiLCJldmVyeSIsInRlc3QiLCJpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQiLCJtIiwiZ2V0U3VyZmFjZU9yaWVudGF0aW9uIiwiaXNTY3JlZW5PbkZ1bGx5IiwiYnVpbGRTdGFydENtZCIsInN0YXJ0QXBwT3B0aW9ucyIsImFwaUxldmVsIiwidXNlciIsIndhaXRGb3JMYXVuY2giLCJwa2ciLCJhY3Rpdml0eSIsImFjdGlvbiIsImNhdGVnb3J5Iiwic3RvcEFwcCIsImZsYWdzIiwiY21kIiwidXRpbCIsImhhc1ZhbHVlIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJwYXJzZUtleVZhbHVlIiwic3RyIiwic3BhY2UiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwicmUiLCJhcmdzIiwiYXBwbHkiLCJmbGFnIiwiZmxhZ1BvcyIsInByZXZBcmdzIiwiZ2V0U2RrVG9vbHNWZXJzaW9uIiwiYW5kcm9pZEhvbWUiLCJwcm9wZXJ0aWVzUGF0aCIsInByb3BlcnRpZXNDb250ZW50IiwidmVyc2lvbk1hdGNoZXIiLCJSZWdFeHAiLCJtYWpvciIsIm1pbm9yIiwiYnVpbGQiLCJnZXRCdWlsZFRvb2xzRGlycyIsImJ1aWxkVG9vbHNEaXJzIiwibWFwIiwiZGlyIiwiYSIsImIiLCJzZW12ZXIiLCJyY29tcGFyZSIsInBhaXIiLCJwYWlycyIsIkIiLCJtdGltZSIsInZhbHVlT2YiLCJpbmZvIiwiZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMiLCJkdW1wc3lzT3V0cHV0IiwiZ3JvdXBOYW1lcyIsImdyYW50ZWRTdGF0ZSIsImdyb3VwUGF0dGVybkJ5TmFtZSIsImdyb3VwTmFtZSIsImVzY2FwZVJlZ0V4cCIsImluZGVudFBhdHRlcm4iLCJwZXJtaXNzaW9uTmFtZVBhdHRlcm4iLCJncmFudGVkU3RhdGVQYXR0ZXJuIiwiZ3JvdXBNYXRjaCIsImxpbmVzIiwidGl0bGVJbmRlbnQiLCJzZWFyY2giLCJjdXJyZW50SW5kZW50IiwicGVybWlzc2lvbk5hbWVNYXRjaCIsIml0ZW0iLCJwZXJtaXNzaW9uIiwiZ3JhbnRlZFN0YXRlTWF0Y2giLCJncmFudGVkIiwiZmlsdGVyZWRSZXN1bHQiLCJmaWx0ZXIiLCJpc0Jvb2xlYW4iLCJwbHVyYWxpemUiLCJidWlsZEluc3RhbGxBcmdzIiwib3B0aW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwidXNlU2RjYXJkIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBhcnRpYWxJbnN0YWxsIiwicGFyc2VNYW5pZmVzdCIsIm1hbmlmZXN0IiwicGFja2FnZSIsInZlcnNpb25Db2RlIiwidmVyc2lvbk5hbWUiLCJhcHBsaWNhdGlvbiIsImFjdGl2aXRpZXMiLCJhY3Rpdml0eUFsaWFzZXMiLCJlbmFibGVkIiwiaW50ZW50RmlsdGVycyIsImFjdGlvbnMiLCJjYXRlZ29yaWVzIiwiaXNNYWluQWN0aW9uIiwiaXNMYXVuY2hlckNhdGVnb3J5IiwicGFyc2VBYXB0U3RyaW5ncyIsInJhd091dHB1dCIsImNvbmZpZ01hcmtlciIsIm5vcm1hbGl6ZVN0cmluZ01hdGNoIiwicyIsImFwa1N0cmluZ3MiLCJpc0luQ29uZmlnIiwiY3VycmVudFJlc291cmNlSWQiLCJpc0luUGx1cmFsR3JvdXAiLCJxdW90ZWRTdHJpbmdQYXR0ZXJuIiwib3MiLCJFT0wiLCJ0cmltbWVkTGluZSIsInBhcnNlQWFwdDJTdHJpbmdzIiwiYWxsTGluZXMiLCJleHRyYWN0Q29udGVudCIsInN0YXJ0SWR4IiwiaWR4Iiwic3RhcnRDaGFyUG9zIiwidGVybWluYXRpb25DaGFyTWF0Y2giLCJ0ZXJtaW5hdGlvbkNoYXJQb3MiLCJpbmRleCIsInRyaW1TdGFydCIsImlzSW5DdXJyZW50Q29uZmlnIiwibGluZUluZGV4IiwiY29udGVudCIsImlzU3RyaW5nIiwiZm9ybWF0Q29uZmlnTWFya2VyIiwiY29uZmlnc0dldHRlciIsImRlc2lyZWRNYXJrZXIiLCJkZWZhdWx0TWFya2VyIiwiY29uZmlncyIsInRvTG93ZXJDYXNlIiwicGFyc2VKc29uRGF0YSIsIm91dHB1dCIsImVudGl0eU5hbWUiLCJqc29uU3RyIiwiZSIsInRvQXZkTG9jYWxlQXJncyIsImxhbmd1YWdlIiwiY291bnRyeSIsInRvVXBwZXJDYXNlIiwibG9jYWxlIiwiZ2V0QW5kcm9pZFByZWZzUm9vdCIsImxvY2F0aW9uIiwiQU5EUk9JRF9FTVVMQVRPUl9IT01FIiwiZGlyRXhpc3RzIiwiaG9tZSIsIkhPTUUiLCJVU0VSUFJPRklMRSIsImVzY2FwZVNoZWxsQXJnIiwiYXJnIiwicGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcyIsIm1haW5BY3Rpdml0eU5hbWVSZSIsImNhdGVnb3J5TmFtZVJlIiwiYmxvY2tzIiwiYmxvY2tTdGFydEluZGVudCIsImJsb2NrIiwidHJpbUVuZCIsImlzTmlsIiwiaGFzQ2F0ZWdvcnkiLCJhY3Rpdml0eU5hbWVTdHIiLCJCb29sZWFuIiwiZnFBY3Rpdml0eU5hbWUiLCJtYXRjaENvbXBvbmVudE5hbWUiLCJjbGFzc1N0cmluZyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcywgemlwLCB1dGlsLCB0ZW1wRGlyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgX2ZzIGZyb20gJ2ZzJztcblxuY29uc3QgQVBLU19FWFRFTlNJT04gPSAnLmFwa3MnO1xuY29uc3QgQVBLX0VYVEVOU0lPTiA9ICcuYXBrJztcbmNvbnN0IEFQS19JTlNUQUxMX1RJTUVPVVQgPSA2MDAwMDtcbmNvbnN0IEFQS1NfSU5TVEFMTF9USU1FT1VUID0gQVBLX0lOU1RBTExfVElNRU9VVCAqIDI7XG5jb25zdCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQgPSAyMDAwMDsgLy8gaW4gbWlsbGlzZWNvbmRzXG5jb25zdCBNQUlOX0FDVElPTiA9ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTic7XG5jb25zdCBMQVVOQ0hFUl9DQVRFR09SWSA9ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUic7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcGF0aCB0byB0aGUgY3VycmVudCBtb2R1bGUncyByb290IGZvbGRlclxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gbW9kdWxlIHJvb3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY3VycmVudCBtb2R1bGUgcm9vdCBmb2xkZXIgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xuY29uc3QgZ2V0TW9kdWxlUm9vdCA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRNb2R1bGVSb290ICgpIHtcbiAgY29uc3QgcGF0aFBhcnRzID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSkuc3BsaXQocGF0aC5zZXApO1xuICBmb3IgKGxldCBwYXRoSXRlbUlkeCA9IHBhdGhQYXJ0cy5sZW5ndGg7IHBhdGhJdGVtSWR4ID4gMDsgLS1wYXRoSXRlbUlkeCkge1xuICAgIGNvbnN0IGN1cnJlbnREaXIgPSBwYXRoLmpvaW4oLi4uKHBhdGhQYXJ0cy5zbGljZSgwLCBwYXRoSXRlbUlkeCkpKTtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9mcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoSlNPTi5wYXJzZShfZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkubmFtZSA9PT0gJ2FwcGl1bS1hZGInKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RGlyO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHRoZSByb290IGZvbGRlciBvZiB0aGUgYXBwaXVtLWFkYiBOb2RlLmpzIG1vZHVsZScpO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhY3R1YWwgcGF0aCB0byBTREsgcm9vdCBmb2xkZXIgZnJvbSB0aGUgc3lzdGVtIGVudmlyb25tZW50XG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgU0RLIHJvb3QgZm9sZGVyXG4gKi9cbmZ1bmN0aW9uIGdldFNka1Jvb3RGcm9tRW52ICgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkFORFJPSURfSE9NRSB8fCBwcm9jZXNzLmVudi5BTkRST0lEX1NES19ST09UO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYWN0dWFsIHBhdGggdG8gU0RLIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBTREsgcm9vdCBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBlaXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgZW52IHZhcmlhYmxlIGlzIHVuc2V0IG9yIGlzXG4gKiBwb2ludGluZyB0byBhbiBpbnZhbGlkIGZpbGUgc3lzdGVtIGVudHJ5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVTZGtSb290IChjdXN0b21Sb290ID0gbnVsbCkge1xuICBjb25zdCBzZGtSb290ID0gY3VzdG9tUm9vdCB8fCBnZXRTZGtSb290RnJvbUVudigpO1xuICBjb25zdCBkb2NNc2cgPSAnUmVhZCBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vY29tbWFuZC1saW5lL3ZhcmlhYmxlcyBmb3IgbW9yZSBkZXRhaWxzJztcbiAgaWYgKF8uaXNFbXB0eShzZGtSb290KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTmVpdGhlciBBTkRST0lEX0hPTUUgbm9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIGV4cG9ydGVkLiAke2RvY01zZ31gKTtcbiAgfVxuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHNka1Jvb3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQW5kcm9pZCBTREsgcm9vdCBmb2xkZXIgJyR7c2RrUm9vdH0nIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4gJHtkb2NNc2d9YCk7XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNka1Jvb3QpO1xuICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBBbmRyb2lkIFNESyByb290ICcke3Nka1Jvb3R9JyBtdXN0IGJlIGEgZm9sZGVyLiAke2RvY01zZ31gKTtcbiAgfVxuICByZXR1cm4gc2RrUm9vdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQbGF0Zm9ybUluZm9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGxhdGZvcm0gLSBUaGUgcGxhdGZvcm0gbmFtZSwgZm9yIGV4YW1wbGUgYGFuZHJvaWQtMjRgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwbGF0Zm9ybVBhdGggLSBGdWxsIHBhdGggdG8gdGhlIHBsYXRmb3JtIFNESyBmb2xkZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICovXG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHBhdGggdG8gdGhlIHJlY2VudCBpbnN0YWxsZWQgQW5kcm9pZCBwbGF0Zm9ybS5cbiAqXG4gKiBAcmV0dXJuIHtQbGF0Zm9ybUluZm99IFRoZSByZXN1bHRpbmcgcGF0aCB0byB0aGUgbmV3ZXN0IGluc3RhbGxlZCBwbGF0Zm9ybS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCAoc2RrUm9vdCkge1xuICBjb25zdCBwcm9wc1BhdGhzID0gYXdhaXQgZnMuZ2xvYignKi9idWlsZC5wcm9wJywge1xuICAgIGN3ZDogcGF0aC5yZXNvbHZlKHNka1Jvb3QsICdwbGF0Zm9ybXMnKSxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IHBsYXRmb3Jtc01hcHBpbmcgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wc1BhdGggb2YgcHJvcHNQYXRocykge1xuICAgIGNvbnN0IHByb3BzQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BzUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGxhdGZvcm1QYXRoID0gcGF0aC5kaXJuYW1lKHByb3BzUGF0aCk7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBwYXRoLmJhc2VuYW1lKHBsYXRmb3JtUGF0aCk7XG4gICAgY29uc3QgbWF0Y2ggPSAvcm9cXC5idWlsZFxcLnZlcnNpb25cXC5zZGs9KFxcZCspLy5leGVjKHByb3BzQ29udGVudCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHRoZSBTREsgdmVyc2lvbiBmcm9tICcke3Byb3BzUGF0aH0nLiBTa2lwcGluZyAnJHtwbGF0Zm9ybX0nYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcGxhdGZvcm1zTWFwcGluZ1twYXJzZUludChtYXRjaFsxXSwgMTApXSA9IHtcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgcGxhdGZvcm1QYXRoLFxuICAgIH07XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShwbGF0Zm9ybXNNYXBwaW5nKSkge1xuICAgIGxvZy53YXJuKGBGb3VuZCB6ZXJvIHBsYXRmb3JtIGZvbGRlcnMgYXQgJyR7cGF0aC5yZXNvbHZlKHNka1Jvb3QsICdwbGF0Zm9ybXMnKX0nLiBgICtcbiAgICAgIGBEbyB5b3UgaGF2ZSBhbnkgQW5kcm9pZCBTREtzIGluc3RhbGxlZD9gKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGxhdGZvcm06IG51bGwsXG4gICAgICBwbGF0Zm9ybVBhdGg6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY2VudFNka1ZlcnNpb24gPSBfLmtleXMocGxhdGZvcm1zTWFwcGluZykuc29ydCgpLnJldmVyc2UoKVswXTtcbiAgY29uc3QgcmVzdWx0ID0gcGxhdGZvcm1zTWFwcGluZ1tyZWNlbnRTZGtWZXJzaW9uXTtcbiAgbG9nLmRlYnVnKGBGb3VuZCB0aGUgbW9zdCByZWNlbnQgQW5kcm9pZCBwbGF0Zm9ybTogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bnppcEZpbGUgKHppcFBhdGgsIGRzdFJvb3QgPSBwYXRoLmRpcm5hbWUoemlwUGF0aCkpIHtcbiAgbG9nLmRlYnVnKGBVbnppcHBpbmcgJyR7emlwUGF0aH0nIHRvICcke2RzdFJvb3R9J2ApO1xuICBhd2FpdCB6aXAuYXNzZXJ0VmFsaWRaaXAoemlwUGF0aCk7XG4gIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oemlwUGF0aCwgZHN0Um9vdCk7XG4gIGxvZy5kZWJ1ZygnVW56aXAgc3VjY2Vzc2Z1bCcpO1xufVxuXG4vKipcbiAqIFVuc2lnbnMgdGhlIGdpdmVuIGFwayBieSByZW1vdmluZyB0aGVcbiAqIE1FVEEtSU5GIGZvbGRlciByZWN1cnNpdmVseSBmcm9tIHRoZSBhcmNoaXZlLlxuICogISEhIFRoZSBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSBnaXZlbiBhcGsgYWZ0ZXIgc3VjY2Vzc2Z1bCB1bnNpZ25pbmcgISEhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwa1BhdGggVGhlIHBhdGggdG8gdGhlIGFwa1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgYXBrIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxuICogdW5zaWduZWQgYW5kIG92ZXJ3cml0dGVuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyB0aGUgdW5zaWduIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiB1bnNpZ25BcGsgKGFwa1BhdGgpIHtcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICBjb25zdCBtZXRhSW5mRm9sZGVyTmFtZSA9ICdNRVRBLUlORic7XG4gIHRyeSB7XG4gICAgbGV0IGhhc01ldGFJbmYgPSBmYWxzZTtcbiAgICBhd2FpdCB6aXAucmVhZEVudHJpZXMoYXBrUGF0aCwgKHtlbnRyeX0pID0+IHtcbiAgICAgIGhhc01ldGFJbmYgPSBlbnRyeS5maWxlTmFtZS5zdGFydHNXaXRoKGAke21ldGFJbmZGb2xkZXJOYW1lfS9gKTtcbiAgICAgIC8vIGVudHJpZXMgaXRlcmF0aW9uIHN0b3BzIGFmdGVyIGBmYWxzZWAgaXMgcmV0dXJuZWRcbiAgICAgIHJldHVybiAhaGFzTWV0YUluZjtcbiAgICB9KTtcbiAgICBpZiAoIWhhc01ldGFJbmYpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdG1wWmlwUm9vdCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCAnYXBrJyk7XG4gICAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyhhcGtQYXRoLCB0bXBaaXBSb290KTtcbiAgICBhd2FpdCBmcy5yaW1yYWYocGF0aC5yZXNvbHZlKHRtcFppcFJvb3QsIG1ldGFJbmZGb2xkZXJOYW1lKSk7XG4gICAgY29uc3QgdG1wUmVzdWx0UGF0aCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCBwYXRoLmJhc2VuYW1lKGFwa1BhdGgpKTtcbiAgICBhd2FpdCB6aXAudG9BcmNoaXZlKHRtcFJlc3VsdFBhdGgsIHtcbiAgICAgIGN3ZDogdG1wWmlwUm9vdCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy51bmxpbmsoYXBrUGF0aCk7XG4gICAgYXdhaXQgZnMubXYodG1wUmVzdWx0UGF0aCwgYXBrUGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElNRUxpc3RGcm9tT3V0cHV0IChzdGRvdXQpIHtcbiAgbGV0IGVuZ2luZXMgPSBbXTtcbiAgZm9yIChsZXQgbGluZSBvZiBzdGRvdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKGxpbmUubGVuZ3RoID4gMCAmJiBsaW5lWzBdICE9PSAnICcpIHtcbiAgICAgIC8vIHJlbW92ZSBuZXdsaW5lIGFuZCB0cmFpbGluZyBjb2xvbiwgYW5kIGFkZCB0byB0aGUgbGlzdFxuICAgICAgZW5naW5lcy5wdXNoKGxpbmUudHJpbSgpLnJlcGxhY2UoLzokLywgJycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVuZ2luZXM7XG59XG5cbmNvbnN0IGdldEphdmFIb21lID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldEphdmFIb21lICgpIHtcbiAgY29uc3QgcmVzdWx0ID0gcHJvY2Vzcy5lbnYuSkFWQV9IT01FO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0IGZvciB0aGUgY3VycmVudCBwcm9jZXNzJyk7XG4gIH1cbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocmVzdWx0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpBVkFfSE9NRSBsb2NhdGlvbiAnJHtyZXN1bHR9JyBtdXN0IGV4aXN0YCk7XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHJlc3VsdCk7XG4gIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpBVkFfSE9NRSBsb2NhdGlvbiAnJHtyZXN1bHR9JyBtdXN0IGJlIGEgdmFsaWQgZm9sZGVyYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5jb25zdCBnZXRKYXZhRm9yT3MgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0SmF2YUZvck9zICgpIHtcbiAgbGV0IGphdmFIb21lO1xuICBsZXQgZXJyTXNnO1xuICB0cnkge1xuICAgIGphdmFIb21lID0gYXdhaXQgZ2V0SmF2YUhvbWUoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyTXNnID0gZXJyLm1lc3NhZ2U7XG4gIH1cbiAgY29uc3QgZXhlY3V0YWJsZU5hbWUgPSBgamF2YSR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgaWYgKGphdmFIb21lKSB7XG4gICAgY29uc3QgcmVzdWx0UGF0aCA9IHBhdGgucmVzb2x2ZShqYXZhSG9tZSwgJ2JpbicsIGV4ZWN1dGFibGVOYW1lKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0UGF0aDtcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goZXhlY3V0YWJsZU5hbWUpO1xuICB9IGNhdGNoIChpZ24pIHt9XG4gIHRocm93IG5ldyBFcnJvcihgVGhlICcke2V4ZWN1dGFibGVOYW1lfScgYmluYXJ5IGNvdWxkIG5vdCBiZSBmb3VuZCBgICtcbiAgICBgbmVpdGhlciBpbiBQQVRIIG5vciB1bmRlciBKQVZBX0hPTUUgKCR7ZXJyTXNnIHx8IHBhdGgucmVzb2x2ZShqYXZhSG9tZSwgJ2JpbicpfSlgKTtcbn0pO1xuXG5jb25zdCBnZXRPcGVuU3NsRm9yT3MgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpbmFyeU5hbWUgPSBgb3BlbnNzbCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9wZW5zc2wgdG9vbCBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIGFuZCBhdmFpbGFibGUgb24gdGhlIHBhdGgnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2xcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3lzSGVscGVycyAtIEFuIGluc3RhbmNlIGNvbnRhaW5pbmcgc3lzdGVtQ2FsbE1ldGhvZHMgaGVscGVyIG1ldGhvZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEFuIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGtzaWduZXJGb3JPcyAoc3lzSGVscGVycykge1xuICByZXR1cm4gYXdhaXQgc3lzSGVscGVycy5nZXRCaW5hcnlGcm9tU2RrUm9vdCgnYXBrc2lnbmVyLmphcicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhcGthbmFseXplciB0b29sLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL2NvbW1hbmQtbGluZS9hcGthbmFseXplci5odG1sXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN5c0hlbHBlcnMgLSBBbiBpbnN0YW5jZSBjb250YWluaW5nIHN5c3RlbUNhbGxNZXRob2RzIGhlbHBlciBtZXRob2RzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBbiBhYnNvbHV0ZSBwYXRoIHRvIGFwa2FuYWx5emVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGthbmFseXplckZvck9zIChzeXNIZWxwZXJzKSB7XG4gIHJldHVybiBhd2FpdCBzeXNIZWxwZXJzLmdldEJpbmFyeUZyb21TZGtSb290KCdhcGthbmFseXplcicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBtU2hvd2luZ0xvY2tzY3JlZW4gb3IgbURyZWFtaW5nTG9ja3NjcmVlbiBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmVcbiAqIGlmIGxvY2sgc2NyZWVuIGlzIHNob3dpbmdcbiAqXG4gKiBBIG5vdGU6IGBhZGIgc2hlbGwgZHVtcHN5cyB0cnVzdGAgcGVyZm9ybXMgYmV0dGVyIHdoaWxlIGRldGVjdGluZyB0aGUgbG9ja2VkIHNjcmVlbiBzdGF0ZVxuICogaW4gY29tcGFyaXNvbiB0byBgYWRiIGR1bXBzeXMgd2luZG93YCBvdXRwdXQgcGFyc2luZy5cbiAqIEJ1dCB0aGUgdHJ1c3QgY29tbWFuZCBkb2VzIG5vdCB3b3JrIGZvciBgU3dpcGVgIHVubG9jayBwYXR0ZXJuLlxuICpcbiAqIEluIHNvbWUgQW5kcm9pZCBkZXZpY2VzIChQcm9iYWJseSBhcm91bmQgQW5kcm9pZCAxMCspLCBgbVNob3dpbmdMb2Nrc2NyZWVuYCBhbmQgYG1EcmVhbWluZ0xvY2tzY3JlZW5gXG4gKiBkbyBub3Qgd29yayB0byBkZXRlY3QgbG9jayBzdGF0dXMuIEluc3RlYWQsIGtleWd1YXJkIHByZWZlcmVuY2VzIGhlbHBzIHRvIGRldGVjdCB0aGUgbG9jayBjb25kaXRpb24uXG4gKiBTb21lIGRldmljZXMgc3VjaCBhcyBBbmRyb2lkIFRWIGRvIG5vdCBoYXZlIGtleWd1YXJkLCBzbyB3ZSBzaG91bGQga2VlcFxuICogc2NyZWVuIGNvbmRpdGlvbiBhcyB0aGlzIHByaW1hcnkgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzIC0gVGhlIG91dHB1dCBvZiBkdW1wc3lzIHdpbmRvdyBjb21tYW5kLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBsb2NrIHNjcmVlbiBpcyBzaG93aW5nLlxuICovXG5mdW5jdGlvbiBpc1Nob3dpbmdMb2Nrc2NyZWVuIChkdW1wc3lzKSB7XG4gIHJldHVybiBfLnNvbWUoWydtU2hvd2luZ0xvY2tzY3JlZW49dHJ1ZScsICdtRHJlYW1pbmdMb2Nrc2NyZWVuPXRydWUnXSwgKHgpID0+IGR1bXBzeXMuaW5jbHVkZXMoeCkpXG4gICAgLy8gYG1Jc1Nob3dpbmdgIGFuZCBgbUlucHV0UmVzdHJpY3RlZGAgYXJlIGB0cnVlYCBpbiBsb2NrIGNvbmRpdGlvbi4gYGZhbHNlYCBpcyB1bmxvY2sgY29uZGl0aW9uLlxuICAgIHx8IF8uZXZlcnkoWy9LZXlndWFyZFN0YXRlTW9uaXRvcltcXG5cXHNdK21Jc1Nob3dpbmc9dHJ1ZS8sIC9cXHMrbUlucHV0UmVzdHJpY3RlZD10cnVlL10sICh4KSA9PiB4LnRlc3QoZHVtcHN5cykpO1xufVxuXG4vKlxuICogQ2hlY2tzIG1DdXJyZW50Rm9jdXMgaW4gZHVtcHN5cyBvdXRwdXQgdG8gZGV0ZXJtaW5lIGlmIEtleWd1YXJkIGlzIGFjdGl2YXRlZFxuICovXG5mdW5jdGlvbiBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQgKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvbUN1cnJlbnRGb2N1cy4rS2V5Z3VhcmQvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuIChtICYmIG0ubGVuZ3RoICYmIG1bMF0pID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG4vKlxuICogUmVhZHMgU3VyZmFjZU9yaWVudGF0aW9uIGluIGR1bXBzeXMgb3V0cHV0XG4gKi9cbmZ1bmN0aW9uIGdldFN1cmZhY2VPcmllbnRhdGlvbiAoZHVtcHN5cykge1xuICBsZXQgbSA9IC9TdXJmYWNlT3JpZW50YXRpb246IFxcZC9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gbSAmJiBwYXJzZUludChtWzBdLnNwbGl0KCc6JylbMV0sIDEwKTtcbn1cblxuLypcbiAqIENoZWNrcyBtU2NyZWVuT25GdWxseSBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmUgaWYgc2NyZWVuIGlzIHNob3dpbmdcbiAqIERlZmF1bHQgaXMgdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1NjcmVlbk9uRnVsbHkgKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvbVNjcmVlbk9uRnVsbHk9XFx3Ky9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gIW0gfHwgLy8gaWYgaW5mb3JtYXRpb24gaXMgbWlzc2luZyB3ZSBhc3N1bWUgc2NyZWVuIGlzIGZ1bGx5IG9uXG4gICAgICAgICAobSAmJiBtLmxlbmd0aCA+IDAgJiYgbVswXS5zcGxpdCgnPScpWzFdID09PSAndHJ1ZScpIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBjb21tYW5kIGxpbmUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBnaXZlblxuICogYXBwbGljYXRpb24gc3RhcnR1cCBvcHRpb25zXG4gKlxuICogQHBhcmFtIHtTdGFydEFwcE9wdGlvbnN9IHN0YXJ0QXBwT3B0aW9ucyAtIEFwcGxpY2F0aW9uIG9wdGlvbnMgbWFwcGluZ1xuICogQHBhcmFtIHtudW1iZXJ9IGFwaUxldmVsIC0gVGhlIGFjdHVhbCBPUyBBUEkgbGV2ZWxcbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYWN0dWFsIGNvbW1hbmQgbGluZSBhcnJheVxuICovXG5mdW5jdGlvbiBidWlsZFN0YXJ0Q21kIChzdGFydEFwcE9wdGlvbnMsIGFwaUxldmVsKSB7XG4gIGNvbnN0IHtcbiAgICB1c2VyLFxuICAgIHdhaXRGb3JMYXVuY2gsXG4gICAgcGtnLFxuICAgIGFjdGl2aXR5LFxuICAgIGFjdGlvbixcbiAgICBjYXRlZ29yeSxcbiAgICBzdG9wQXBwLFxuICAgIGZsYWdzLFxuICB9ID0gc3RhcnRBcHBPcHRpb25zO1xuICBjb25zdCBjbWQgPSBbJ2FtJywgJ3N0YXJ0J107XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGlmICh3YWl0Rm9yTGF1bmNoKSB7XG4gICAgY21kLnB1c2goJy1XJyk7XG4gIH1cbiAgaWYgKGFjdGl2aXR5ICYmIHBrZykge1xuICAgIGNtZC5wdXNoKCctbicsIGAke3BrZ30vJHthY3Rpdml0eX1gKTtcbiAgfVxuICBpZiAoc3RvcEFwcCAmJiBhcGlMZXZlbCA+PSAxNSkge1xuICAgIGNtZC5wdXNoKCctUycpO1xuICB9XG4gIGlmIChhY3Rpb24pIHtcbiAgICBjbWQucHVzaCgnLWEnLCBhY3Rpb24pO1xuICB9XG4gIGlmIChjYXRlZ29yeSkge1xuICAgIGNtZC5wdXNoKCctYycsIGNhdGVnb3J5KTtcbiAgfVxuICBpZiAoZmxhZ3MpIHtcbiAgICBjbWQucHVzaCgnLWYnLCBmbGFncyk7XG4gIH1cbiAgaWYgKHN0YXJ0QXBwT3B0aW9ucy5vcHRpb25hbEludGVudEFyZ3VtZW50cykge1xuICAgIC8vIGV4cGVjdCBvcHRpb25hbEludGVudEFyZ3VtZW50cyB0byBiZSBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm06XG4gICAgLy8gICAgIFwiLWZsYWcga2V5XCJcbiAgICAvLyAgICAgXCItZmxhZyBrZXkgdmFsdWVcIlxuICAgIC8vIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UgKGUuZy4sIFwiLWZsYWcxIGtleTEgLWZsYWcyIGtleTIgdmFsdWUyXCIpXG5cbiAgICAvLyB0YWtlIGEgc3RyaW5nIGFuZCBwYXJzZSBvdXQgdGhlIHBhcnQgYmVmb3JlIGFueSBzcGFjZXMsIGFuZCBhbnl0aGluZyBhZnRlclxuICAgIC8vIHRoZSBmaXJzdCBzcGFjZVxuICAgIGxldCBwYXJzZUtleVZhbHVlID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICAgIGxldCBzcGFjZSA9IHN0ci5pbmRleE9mKCcgJyk7XG4gICAgICBpZiAoc3BhY2UgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBzdHIubGVuZ3RoID8gW3N0cl0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbc3RyLnN1YnN0cmluZygwLCBzcGFjZSkudHJpbSgpLCBzdHIuc3Vic3RyaW5nKHNwYWNlICsgMSkudHJpbSgpXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gY3ljbGUgdGhyb3VnaCB0aGUgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgYW5kIHB1bGwgb3V0IHRoZSBhcmd1bWVudHNcbiAgICAvLyBhZGQgYSBzcGFjZSBpbml0aWFsbHkgc28gZmxhZ3MgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBhcmd1bWVudHMgdGhhdFxuICAgIC8vIGhhdmUgaW50ZXJuYWwgaHlwaGVuc1xuICAgIGxldCBvcHRpb25hbEludGVudEFyZ3VtZW50cyA9IGAgJHtzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHN9YDtcbiAgICBsZXQgcmUgPSAvICgtW15cXHNdKykgKC4rKS87XG4gICAgd2hpbGUgKHRydWUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICAgIGxldCBhcmdzID0gcmUuZXhlYyhvcHRpb25hbEludGVudEFyZ3VtZW50cyk7XG4gICAgICBpZiAoIWFyZ3MpIHtcbiAgICAgICAgaWYgKG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIG5vIG1vcmUgZmxhZ3MsIHNvIHRoZSByZW1haW5kZXIgY2FuIGJlIHRyZWF0ZWQgYXMgJ2tleScgb3IgJ2tleSB2YWx1ZSdcbiAgICAgICAgICBjbWQucHVzaC5hcHBseShjbWQsIHBhcnNlS2V5VmFsdWUob3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSBhcmUgZG9uZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gdGFrZSB0aGUgZmxhZyBhbmQgc2VlIGlmIGl0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZ1xuICAgICAgLy8gaWYgaXQgaXMgbm90LCB0aGVuIGl0IG1lYW5zIHdlIGhhdmUgYmVlbiB0aHJvdWdoIGFscmVhZHksIGFuZFxuICAgICAgLy8gd2hhdCBpcyBiZWZvcmUgdGhlIGZsYWcgaXMgdGhlIGFyZ3VtZW50IGZvciB0aGUgcHJldmlvdXMgZmxhZ1xuICAgICAgbGV0IGZsYWcgPSBhcmdzWzFdO1xuICAgICAgbGV0IGZsYWdQb3MgPSBvcHRpb25hbEludGVudEFyZ3VtZW50cy5pbmRleE9mKGZsYWcpO1xuICAgICAgaWYgKGZsYWdQb3MgIT09IDApIHtcbiAgICAgICAgbGV0IHByZXZBcmdzID0gb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMuc3Vic3RyaW5nKDAsIGZsYWdQb3MpO1xuICAgICAgICBjbWQucHVzaC5hcHBseShjbWQsIHBhcnNlS2V5VmFsdWUocHJldkFyZ3MpKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSBmbGFnLCBhcyB0aGVyZSBhcmUgbm8gbW9yZSBlYXJsaWVyIGFyZ3VtZW50c1xuICAgICAgY21kLnB1c2goZmxhZyk7XG5cbiAgICAgIC8vIG1ha2Ugb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgaG9sZCB0aGUgcmVtYWluZGVyXG4gICAgICBvcHRpb25hbEludGVudEFyZ3VtZW50cyA9IGFyZ3NbMl07XG4gICAgfVxuICB9XG4gIHJldHVybiBjbWQ7XG59XG5cbmNvbnN0IGdldFNka1Rvb2xzVmVyc2lvbiA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRTZGtUb29sc1ZlcnNpb24gKCkge1xuICBjb25zdCBhbmRyb2lkSG9tZSA9IHByb2Nlc3MuZW52LkFORFJPSURfSE9NRTtcbiAgaWYgKCFhbmRyb2lkSG9tZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQU5EUk9JRF9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGV4cGVjdGVkIHRvIGJlIHNldCcpO1xuICB9XG4gIGNvbnN0IHByb3BlcnRpZXNQYXRoID0gcGF0aC5yZXNvbHZlKGFuZHJvaWRIb21lLCAndG9vbHMnLCAnc291cmNlLnByb3BlcnRpZXMnKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocHJvcGVydGllc1BhdGgpKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCBmaW5kICR7cHJvcGVydGllc1BhdGh9IGZpbGUgdG8gcmVhZCBTREsgdmVyc2lvbiBmcm9tYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHByb3BlcnRpZXNDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocHJvcGVydGllc1BhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHZlcnNpb25NYXRjaGVyID0gbmV3IFJlZ0V4cCgvUGtnXFwuUmV2aXNpb249KFxcZCspXFwuPyhcXGQrKT9cXC4/KFxcZCspPy8pO1xuICBjb25zdCBtYXRjaCA9IHZlcnNpb25NYXRjaGVyLmV4ZWMocHJvcGVydGllc0NvbnRlbnQpO1xuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWFqb3I6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksXG4gICAgICBtaW5vcjogbWF0Y2hbMl0gPyBwYXJzZUludChtYXRjaFsyXSwgMTApIDogMCxcbiAgICAgIGJ1aWxkOiBtYXRjaFszXSA/IHBhcnNlSW50KG1hdGNoWzNdLCAxMCkgOiAwXG4gICAgfTtcbiAgfVxuICBsb2cud2FybihgQ2Fubm90IHBhcnNlIFwiUGtnLlJldmlzaW9uXCIgdmFsdWUgZnJvbSAke3Byb3BlcnRpZXNQYXRofWApO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIGZ1bGwgcGF0aHMgdG8gYWxsICdidWlsZC10b29scycgc3ViZm9sZGVycyB1bmRlciB0aGUgcGFydGljdWxhclxuICogU0RLIHJvb3QgZm9sZGVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNka1Jvb3QgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBBbmRyb2lkIFNESyByb290IGZvbGRlclxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBmdWxsIHBhdGhzIHRvIHRoZSByZXN1bHRpbmcgZm9sZGVycyBzb3J0ZWQgYnlcbiAqIG1vZGlmaWNhdGlvbiBkYXRlICh0aGUgbmV3ZXN0IGNvbWVzIGZpcnN0KSBvciBhbiBlbXB0eSBsaXN0IGlmIG5vIG1hY3RoZXMgd2VyZSBmb3VuZFxuICovXG5jb25zdCBnZXRCdWlsZFRvb2xzRGlycyA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRCdWlsZFRvb2xzRGlycyAoc2RrUm9vdCkge1xuICBsZXQgYnVpbGRUb29sc0RpcnMgPSBhd2FpdCBmcy5nbG9iKCcqLycsIHtcbiAgICBjd2Q6IHBhdGgucmVzb2x2ZShzZGtSb290LCAnYnVpbGQtdG9vbHMnKSxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYnVpbGRUb29sc0RpcnMgPSBidWlsZFRvb2xzRGlyc1xuICAgICAgLm1hcCgoZGlyKSA9PiBbcGF0aC5iYXNlbmFtZShkaXIpLCBkaXJdKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHNlbXZlci5yY29tcGFyZShhWzBdLCBiWzBdKSlcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgQ2Fubm90IHNvcnQgYnVpbGQtdG9vbHMgZm9sZGVycyAke0pTT04uc3RyaW5naWZ5KGJ1aWxkVG9vbHNEaXJzLm1hcCgoZGlyKSA9PiBwYXRoLmJhc2VuYW1lKGRpcikpKX0gYCArXG4gICAgICBgYnkgc2VtYW50aWMgdmVyc2lvbiBuYW1lcy5gKTtcbiAgICBsb2cud2FybihgRmFsbGluZyBiYWNrIHRvIHNvcnRpbmcgYnkgbW9kaWZpY2F0aW9uIGRhdGUuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGNvbnN0IHBhaXJzID0gYXdhaXQgQi5tYXAoYnVpbGRUb29sc0RpcnMsIGFzeW5jIChkaXIpID0+IFsoYXdhaXQgZnMuc3RhdChkaXIpKS5tdGltZS52YWx1ZU9mKCksIGRpcl0pO1xuICAgIGJ1aWxkVG9vbHNEaXJzID0gcGFpcnNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhWzBdIDwgYlswXSlcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICB9XG4gIGxvZy5pbmZvKGBGb3VuZCAke2J1aWxkVG9vbHNEaXJzLmxlbmd0aH0gJ2J1aWxkLXRvb2xzJyBmb2xkZXJzIHVuZGVyICcke3Nka1Jvb3R9JyAobmV3ZXN0IGZpcnN0KTpgKTtcbiAgZm9yIChsZXQgZGlyIG9mIGJ1aWxkVG9vbHNEaXJzKSB7XG4gICAgbG9nLmluZm8oYCAgICAke2Rpcn1gKTtcbiAgfVxuICByZXR1cm4gYnVpbGRUb29sc0RpcnM7XG59KTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcGVybWlzc2lvbiBuYW1lcyBlbmNvZGVkIGluIGBkdW1wc3lzIHBhY2thZ2VgIGNvbW1hbmQgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzT3V0cHV0IC0gVGhlIGFjdHVhbCBjb21tYW5kIG91dHB1dC5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZ3JvdXBOYW1lcyAtIFRoZSBsaXN0IG9mIGdyb3VwIG5hbWVzIHRvIGxpc3QgcGVybWlzc2lvbnMgZm9yLlxuICogQHBhcmFtIHs/Ym9vbGVhbn0gZ3JhbnRlZFN0YXRlIC0gVGhlIGV4cGVjdGVkIHN0YXRlIG9mIGBncmFudGVkYCBhdHRyaWJ1dGUgdG8gZmlsdGVyIHdpdGguXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBmaWx0ZXJpbmcgaXMgZG9uZSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZXQuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwZXJtaXNzaW9uIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QgaWYgbm8gbWF0Y2hlcyB3ZXJlIGZvdW5kLlxuICovXG5jb25zdCBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uIChkdW1wc3lzT3V0cHV0LCBncm91cE5hbWVzLCBncmFudGVkU3RhdGUgPSBudWxsKSB7XG4gIGNvbnN0IGdyb3VwUGF0dGVybkJ5TmFtZSA9IChncm91cE5hbWUpID0+IG5ldyBSZWdFeHAoYF4oXFxcXHMqJHtfLmVzY2FwZVJlZ0V4cChncm91cE5hbWUpfSBwZXJtaXNzaW9uczpbXFxcXHNcXFxcU10rKWAsICdtJyk7XG4gIGNvbnN0IGluZGVudFBhdHRlcm4gPSAvXFxTfCQvO1xuICBjb25zdCBwZXJtaXNzaW9uTmFtZVBhdHRlcm4gPSAvYW5kcm9pZFxcLlxcdypcXC4/cGVybWlzc2lvblxcLlxcdysvO1xuICBjb25zdCBncmFudGVkU3RhdGVQYXR0ZXJuID0gL1xcYmdyYW50ZWQ9KFxcdyspLztcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIGdyb3VwTmFtZXMpIHtcbiAgICBjb25zdCBncm91cE1hdGNoID0gZ3JvdXBQYXR0ZXJuQnlOYW1lKGdyb3VwTmFtZSkuZXhlYyhkdW1wc3lzT3V0cHV0KTtcbiAgICBpZiAoIWdyb3VwTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gZ3JvdXBNYXRjaFsxXS5zcGxpdCgnXFxuJyk7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRpdGxlSW5kZW50ID0gbGluZXNbMF0uc2VhcmNoKGluZGVudFBhdHRlcm4pO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcy5zbGljZSgxKSkge1xuICAgICAgY29uc3QgY3VycmVudEluZGVudCA9IGxpbmUuc2VhcmNoKGluZGVudFBhdHRlcm4pO1xuICAgICAgaWYgKGN1cnJlbnRJbmRlbnQgPD0gdGl0bGVJbmRlbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlcm1pc3Npb25OYW1lTWF0Y2ggPSBwZXJtaXNzaW9uTmFtZVBhdHRlcm4uZXhlYyhsaW5lKTtcbiAgICAgIGlmICghcGVybWlzc2lvbk5hbWVNYXRjaCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgIHBlcm1pc3Npb246IHBlcm1pc3Npb25OYW1lTWF0Y2hbMF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgZ3JhbnRlZFN0YXRlTWF0Y2ggPSBncmFudGVkU3RhdGVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgICBpZiAoZ3JhbnRlZFN0YXRlTWF0Y2gpIHtcbiAgICAgICAgaXRlbS5ncmFudGVkID0gZ3JhbnRlZFN0YXRlTWF0Y2hbMV0gPT09ICd0cnVlJztcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkUmVzdWx0ID0gcmVzdWx0XG4gICAgLmZpbHRlcigoaXRlbSkgPT4gIV8uaXNCb29sZWFuKGdyYW50ZWRTdGF0ZSkgfHwgaXRlbS5ncmFudGVkID09PSBncmFudGVkU3RhdGUpXG4gICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5wZXJtaXNzaW9uKTtcbiAgbG9nLmRlYnVnKGBSZXRyaWV2ZWQgJHt1dGlsLnBsdXJhbGl6ZSgncGVybWlzc2lvbicsIGZpbHRlcmVkUmVzdWx0Lmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgIGBmcm9tICR7Z3JvdXBOYW1lc30gJHt1dGlsLnBsdXJhbGl6ZSgnZ3JvdXAnLCBncm91cE5hbWVzLmxlbmd0aCwgZmFsc2UpfWApO1xuICByZXR1cm4gZmlsdGVyZWRSZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFydGlhbEluc3RhbGwgW2ZhbHNlXSAtIEluc3RhbGwgYXBrcyBwYXJ0aWFsbHkuIEl0IGlzIHVzZWQgZm9yICdpbnN0YWxsLW11bHRpcGxlJy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9hbmRyb2lkLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xMTEwNjQvd2hhdC1pcy1hLXBhcnRpYWwtYXBwbGljYXRpb24taW5zdGFsbC12aWEtYWRiXG4gKi9cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGdpdmVuIG9wdGlvbnMgaW50byB0aGUgbGlzdCBvZiBgYWRiIGluc3RhbGwuaW5zdGFsbC1tdWx0aXBsZWAgY29tbWFuZCBhcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYXBpTGV2ZWwgLSBUaGUgY3VycmVudCBBUEkgbGV2ZWxcbiAqIEBwYXJhbSB7P0luc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgbWFwcGluZyB0byB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYXJyYXkgb2YgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbEFyZ3MgKGFwaUxldmVsLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG9wdGlvbnMucmVwbGFjZSkgfHwgb3B0aW9ucy5yZXBsYWNlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1yJyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuYWxsb3dUZXN0UGFja2FnZXMpIHtcbiAgICByZXN1bHQucHVzaCgnLXQnKTtcbiAgfVxuICBpZiAob3B0aW9ucy51c2VTZGNhcmQpIHtcbiAgICByZXN1bHQucHVzaCgnLXMnKTtcbiAgfVxuICBpZiAob3B0aW9ucy5ncmFudFBlcm1pc3Npb25zKSB7XG4gICAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2tpcHBpbmcgcGVybWlzc2lvbnMgZ3JhbnQgb3B0aW9uLCBzaW5jZSBgICtcbiAgICAgICAgICAgICAgICBgdGhlIGN1cnJlbnQgQVBJIGxldmVsICR7YXBpTGV2ZWx9IGRvZXMgbm90IHN1cHBvcnQgYXBwbGljYXRpb25zIGAgK1xuICAgICAgICAgICAgICAgIGBwZXJtaXNzaW9ucyBjdXN0b21pemF0aW9uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKCctZycpO1xuICAgIH1cbiAgfVxuICAvLyBGb3IgbXVsdGlwbGUtaW5zdGFsbFxuICBpZiAob3B0aW9ucy5wYXJ0aWFsSW5zdGFsbCkge1xuICAgIHJlc3VsdC5wdXNoKCctcCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYW5pZmVzdEluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2cgLSBUaGUgYXBwbGljYXRpb24gaWRlbnRpZmllclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gcGFja2FnZSBhY3Rpdml0eVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFRoZSB2ZXJzaW9uIGNvZGUgbnVtYmVyIChtaWdodCBiZSBgTmFOYClcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbk5hbWUgLSBUaGUgdmVyc2lvbiBuYW1lIChtaWdodCBiZSBgbnVsbGApXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtIHBhcnNpbmcgb2YgdGhlIG1hbmlmZXN0IG9iamVjdCBpbiBvcmRlclxuICogdG8gZXh0cmFjdCBzb21lIHZpdGFsIHZhbHVlcyBmcm9tIGl0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1hbmlmZXN0IFRoZSBtYW5pZmVzdCBjb250ZW50IGZvcm1hdHRlZCBhcyBKU09OXG4gKiBTZWUgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYWRia2l0LWFwa3JlYWRlciBmb3IgZGV0YWlsZWQgZm9ybWF0IGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyB7TWFuaWZlc3RJbmZvfVxuICovXG5mdW5jdGlvbiBwYXJzZU1hbmlmZXN0IChtYW5pZmVzdCkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgcGtnOiBtYW5pZmVzdC5wYWNrYWdlLFxuICAgIHZlcnNpb25Db2RlOiBwYXJzZUludChtYW5pZmVzdC52ZXJzaW9uQ29kZSwgMTApLFxuICAgIHZlcnNpb25OYW1lOiBtYW5pZmVzdC52ZXJzaW9uTmFtZSB8fCBudWxsLFxuICB9O1xuICBpZiAoIW1hbmlmZXN0LmFwcGxpY2F0aW9uKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIExvb2sgZm9yIGVuYWJsZWQgYWN0aXZpdHkgb3IgYWN0aXZpdHktYWxpYXMgd2l0aFxuICAvLyBhY3Rpb24gPT0gYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gYW5kXG4gIC8vIGNhdGVnb3J5ID09IGFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSXG4gIGZvciAoY29uc3QgYWN0aXZpdHkgb2YgW1xuICAgIC4uLm1hbmlmZXN0LmFwcGxpY2F0aW9uLmFjdGl2aXRpZXMsXG4gICAgLi4ubWFuaWZlc3QuYXBwbGljYXRpb24uYWN0aXZpdHlBbGlhc2VzLFxuICBdKSB7XG4gICAgaWYgKGFjdGl2aXR5LmVuYWJsZWQgPT09IGZhbHNlIHx8IF8uaXNFbXB0eShhY3Rpdml0eS5pbnRlbnRGaWx0ZXJzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7YWN0aW9ucywgY2F0ZWdvcmllc30gb2YgYWN0aXZpdHkuaW50ZW50RmlsdGVycykge1xuICAgICAgaWYgKF8uaXNFbXB0eShhY3Rpb25zKSB8fCBfLmlzRW1wdHkoY2F0ZWdvcmllcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzTWFpbkFjdGlvbiA9IGFjdGlvbnMuc29tZSgoe25hbWV9KSA9PiBuYW1lID09PSBNQUlOX0FDVElPTik7XG4gICAgICBjb25zdCBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBjYXRlZ29yaWVzLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gTEFVTkNIRVJfQ0FURUdPUlkpO1xuICAgICAgaWYgKGlzTWFpbkFjdGlvbiAmJiBpc0xhdW5jaGVyQ2F0ZWdvcnkpIHtcbiAgICAgICAgcmVzdWx0LmFjdGl2aXR5ID0gYWN0aXZpdHkubmFtZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYXBrIHN0cmluZ3MgZnJvbSBhYXB0IHRvb2wgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd091dHB1dCBUaGUgYWN0dWFsIHRvb2wgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnTWFya2VyIFRoZSBjb25maWcgbWFya2VyLiBVc3VhbGx5XG4gKiBhIGxhbmd1YWdlIGFiYnJldmlhdGlvbiBvciBgKGRlZmF1bHQpYFxuICogQHJldHVybnMge09iamVjdH0gU3RyaW5ncyBpZHMgdG8gdmFsdWVzIG1hcHBpbmcuIFBsdXJhbFxuICogdmFsdWVzIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMuIElmIG5vIGNvbmZpZyBmb3VuZCBmb3IgdGhlXG4gKiBnaXZlbiBtYXJrZXIgdGhlbiBhbiBlbXB0eSBtYXBwaW5nIGlzIHJldHVybmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUFhcHRTdHJpbmdzIChyYXdPdXRwdXQsIGNvbmZpZ01hcmtlcikge1xuICBjb25zdCBub3JtYWxpemVTdHJpbmdNYXRjaCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMucmVwbGFjZSgvXCIkLywgJycpLnJlcGxhY2UoL15cIi8sICcnKS5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG4gIH07XG5cbiAgY29uc3QgYXBrU3RyaW5ncyA9IHt9O1xuICBsZXQgaXNJbkNvbmZpZyA9IGZhbHNlO1xuICBsZXQgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICBsZXQgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gIC8vIFRoZSBwYXR0ZXJuIG1hdGNoZXMgYW55IHF1b3RlZCBjb250ZW50IGluY2x1ZGluZyBlc2NhcGVkIHF1b3Rlc1xuICBjb25zdCBxdW90ZWRTdHJpbmdQYXR0ZXJuID0gL1wiW15cIlxcXFxdKig/OlxcXFwuW15cIlxcXFxdKikqXCIvO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcmF3T3V0cHV0LnNwbGl0KG9zLkVPTCkpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmIChfLmlzRW1wdHkodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoWydjb25maWcnLCAndHlwZScsICdzcGVjJywgJ1BhY2thZ2UnXS5zb21lKCh4KSA9PiB0cmltbWVkTGluZS5zdGFydHNXaXRoKHgpKSkge1xuICAgICAgaXNJbkNvbmZpZyA9IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYGNvbmZpZyAke2NvbmZpZ01hcmtlcn06YCk7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNJbkNvbmZpZykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJ3Jlc291cmNlJykpIHtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuXG4gICAgICBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJzpzdHJpbmcvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvOnN0cmluZ1xcLyhcXFMrKTovLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6cGx1cmFscy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC86cGx1cmFsc1xcLyhcXFMrKTovLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlzSW5QbHVyYWxHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCAmJiB0cmltbWVkTGluZS5zdGFydHNXaXRoKCcoc3RyaW5nJykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gcXVvdGVkU3RyaW5nUGF0dGVybi5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSA9IG5vcm1hbGl6ZVN0cmluZ01hdGNoKG1hdGNoWzBdKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCAmJiBpc0luUGx1cmFsR3JvdXAgJiYgdHJpbW1lZExpbmUuaW5jbHVkZXMoJzogKHN0cmluZycpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHF1b3RlZFN0cmluZ1BhdHRlcm4uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBbXG4gICAgICAgICAgLi4uKGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdIHx8IFtdKSxcbiAgICAgICAgICBub3JtYWxpemVTdHJpbmdNYXRjaChtYXRjaFswXSksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFwa1N0cmluZ3M7XG59XG5cbi8qKlxuICogUGFyc2VzIGFwayBzdHJpbmdzIGZyb20gYWFwdDIgdG9vbCBvdXRwdXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3T3V0cHV0IFRoZSBhY3R1YWwgdG9vbCBvdXRwdXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdNYXJrZXIgVGhlIGNvbmZpZyBtYXJrZXIuIFVzdWFsbHlcbiAqIGEgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uIG9yIGFuIGVtcHR5IHN0cmluZyBmb3IgdGhlIGRlZmF1bHQgb25lXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTdHJpbmdzIGlkcyB0byB2YWx1ZXMgbWFwcGluZy4gUGx1cmFsXG4gKiB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFycmF5cy4gSWYgbm8gY29uZmlnIGZvdW5kIGZvciB0aGVcbiAqIGdpdmVuIG1hcmtlciB0aGVuIGFuIGVtcHR5IG1hcHBpbmcgaXMgcmV0dXJuZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQWFwdDJTdHJpbmdzIChyYXdPdXRwdXQsIGNvbmZpZ01hcmtlcikge1xuICBjb25zdCBhbGxMaW5lcyA9IHJhd091dHB1dC5zcGxpdChvcy5FT0wpO1xuICBmdW5jdGlvbiBleHRyYWN0Q29udGVudCAoc3RhcnRJZHgpIHtcbiAgICBsZXQgaWR4ID0gc3RhcnRJZHg7XG4gICAgY29uc3Qgc3RhcnRDaGFyUG9zID0gYWxsTGluZXNbc3RhcnRJZHhdLmluZGV4T2YoJ1wiJyk7XG4gICAgaWYgKHN0YXJ0Q2hhclBvcyA8IDApIHtcbiAgICAgIHJldHVybiBbbnVsbCwgaWR4XTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIHdoaWxlIChpZHggPCBhbGxMaW5lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRlcm1pbmF0aW9uQ2hhck1hdGNoID0gL1wiJC8uZXhlYyhhbGxMaW5lc1tpZHhdKTtcbiAgICAgIGlmICh0ZXJtaW5hdGlvbkNoYXJNYXRjaCkge1xuICAgICAgICBjb25zdCB0ZXJtaW5hdGlvbkNoYXJQb3MgPSB0ZXJtaW5hdGlvbkNoYXJNYXRjaC5pbmRleDtcbiAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSBpZHgpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoc3RhcnRDaGFyUG9zICsgMSwgdGVybWluYXRpb25DaGFyUG9zKSxcbiAgICAgICAgICAgIGlkeFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgJHtyZXN1bHR9XFxcXG4ke18udHJpbVN0YXJ0KGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKDAsIHRlcm1pbmF0aW9uQ2hhclBvcykpfWAsXG4gICAgICAgICAgaWR4LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCA+IHN0YXJ0SWR4KSB7XG4gICAgICAgIHJlc3VsdCArPSBgXFxcXG4ke18udHJpbVN0YXJ0KGFsbExpbmVzW2lkeF0pfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoc3RhcnRDaGFyUG9zICsgMSk7XG4gICAgICB9XG4gICAgICArK2lkeDtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXN1bHQsIGlkeF07XG4gIH1cblxuICBjb25zdCBhcGtTdHJpbmdzID0ge307XG4gIGxldCBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gIGxldCBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgbGV0IGlzSW5DdXJyZW50Q29uZmlnID0gZmFsc2U7XG4gIGxldCBsaW5lSW5kZXggPSAwO1xuICB3aGlsZSAobGluZUluZGV4IDwgYWxsTGluZXMubGVuZ3RoKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBhbGxMaW5lc1tsaW5lSW5kZXhdLnRyaW0oKTtcbiAgICBpZiAoXy5pc0VtcHR5KHRyaW1tZWRMaW5lKSkge1xuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoWyd0eXBlJywgJ1BhY2thZ2UnXS5zb21lKCh4KSA9PiB0cmltbWVkTGluZS5zdGFydHNXaXRoKHgpKSkge1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aCgncmVzb3VyY2UnKSkge1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuXG4gICAgICBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJ3N0cmluZy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9zdHJpbmdcXC8oXFxTKykvLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCdwbHVyYWxzLycpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gL3BsdXJhbHNcXC8oXFxTKykvLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlzSW5QbHVyYWxHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRSZXNvdXJjZUlkKSB7XG4gICAgICBpZiAoaXNJblBsdXJhbEdyb3VwKSB7XG4gICAgICAgIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKCcoJykpIHtcbiAgICAgICAgICBpc0luQ3VycmVudENvbmZpZyA9IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYCgke2NvbmZpZ01hcmtlcn0pYCk7XG4gICAgICAgICAgKytsaW5lSW5kZXg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSW5DdXJyZW50Q29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgW2NvbnRlbnQsIGlkeF0gPSBleHRyYWN0Q29udGVudChsaW5lSW5kZXgpO1xuICAgICAgICAgIGxpbmVJbmRleCA9IGlkeDtcbiAgICAgICAgICBpZiAoXy5pc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBbXG4gICAgICAgICAgICAgIC4uLihhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSB8fCBbXSksXG4gICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKGAoJHtjb25maWdNYXJrZXJ9KWApKSB7XG4gICAgICAgIGNvbnN0IFtjb250ZW50LCBpZHhdID0gZXh0cmFjdENvbnRlbnQobGluZUluZGV4KTtcbiAgICAgICAgbGluZUluZGV4ID0gaWR4O1xuICAgICAgICBpZiAoXy5pc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgICsrbGluZUluZGV4O1xuICB9XG4gIHJldHVybiBhcGtTdHJpbmdzO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGNvbmZpZyBtYXJrZXIsIHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvIHBhcnNlLi4gbWV0aG9kc1xuICogdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggcmVzb3VyY2UgZm9ybWF0cyBnZW5lcmF0ZWQgYnkgYWFwdCgyKSB0b29sXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29uZmlnc0dldHRlciBUaGUgZnVuY3Rpb24gd2hvc2UgcmVzdWx0IGlzIGEgbGlzdFxuICogb2YgYXBrIGNvbmZpZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNpcmVkTWFya2VyIFRoZSBkZXNpcmVkIGNvbmZpZyBtYXJrZXIgdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0TWFya2VyIFRoZSBkZWZhdWx0IGNvbmZpZyBtYXJrZXIgdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBjb25maWcgbWFya2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZvcm1hdENvbmZpZ01hcmtlciAoY29uZmlnc0dldHRlciwgZGVzaXJlZE1hcmtlciwgZGVmYXVsdE1hcmtlcikge1xuICBsZXQgY29uZmlnTWFya2VyID0gZGVzaXJlZE1hcmtlciB8fCBkZWZhdWx0TWFya2VyO1xuICBpZiAoY29uZmlnTWFya2VyLmluY2x1ZGVzKCctJykgJiYgIWNvbmZpZ01hcmtlci5pbmNsdWRlcygnLXInKSkge1xuICAgIGNvbmZpZ01hcmtlciA9IGNvbmZpZ01hcmtlci5yZXBsYWNlKCctJywgJy1yJyk7XG4gIH1cbiAgY29uc3QgY29uZmlncyA9IGF3YWl0IGNvbmZpZ3NHZXR0ZXIoKTtcbiAgbG9nLmRlYnVnKGBSZXNvdXJjZSBjb25maWd1cmF0aW9uczogJHtKU09OLnN0cmluZ2lmeShjb25maWdzKX1gKTtcbiAgLy8gQXNzdW1lIHRoZSAnZW4nIGNvbmZpZ3VyYXRpb24gaXMgdGhlIGRlZmF1bHQgb25lXG4gIGlmIChjb25maWdNYXJrZXIudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdlbicpXG4gICAgJiYgIWNvbmZpZ3Muc29tZSgoeCkgPT4geC50cmltKCkgPT09IGNvbmZpZ01hcmtlcikpIHtcbiAgICBsb2cuZGVidWcoYFJlc291cmNlIGNvbmZpZ3VyYXRpb24gbmFtZSAnJHtjb25maWdNYXJrZXJ9JyBpcyB1bmtub3duLiBgICtcbiAgICAgIGBSZXBsYWNpbmcgaXQgd2l0aCAnJHtkZWZhdWx0TWFya2VyfSdgKTtcbiAgICBjb25maWdNYXJrZXIgPSBkZWZhdWx0TWFya2VyO1xuICB9IGVsc2Uge1xuICAgIGxvZy5kZWJ1ZyhgU2VsZWN0ZWQgY29uZmlndXJhdGlvbjogJyR7Y29uZmlnTWFya2VyfSdgKTtcbiAgfVxuICByZXR1cm4gY29uZmlnTWFya2VyO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgb3V0cHV0IGluIEpTT04gZm9ybWF0IHJldHJpZXZlZCBmcm9tXG4gKiB0aGUgY29ycmVzcG9uZGluZyBBcHBpdW0gU2V0dGluZ3MgYnJvYWRjYXN0IGNhbGxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dCBUaGUgYWN0dWFsIGNvbW1hbmQgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gZW50aXR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHdoaWNoIGlzXG4gKiBnb2luZyB0byBiZSBwYXJzZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBwYXJzZWQgSlNPTiBvYmplY3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgb3V0cHV0IGNhbm5vdCBiZSBwYXJzZWRcbiAqIGFzIGEgdmFsaWQgSlNPTlxuICovXG5mdW5jdGlvbiBwYXJzZUpzb25EYXRhIChvdXRwdXQsIGVudGl0eU5hbWUpIHtcbiAgaWYgKCEvXFxicmVzdWx0PS0xXFxiLy50ZXN0KG91dHB1dCkgfHwgIS9cXGJkYXRhPVwiLy50ZXN0KG91dHB1dCkpIHtcbiAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXRyaWV2ZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gL1xcYmRhdGE9KFwiLispLy5leGVjKG91dHB1dCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIGNvbW1hbmQgb3V0cHV0LiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbiAgY29uc3QganNvblN0ciA9IF8udHJpbShtYXRjaFsxXSkucmVwbGFjZSgvKF5cIil8KFwiJCkvZywgJycpO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGpzb25TdHIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlICR7ZW50aXR5TmFtZX0gZnJvbSB0aGUgcmVzdWx0aW5nIGRhdGEgc3RyaW5nLiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBsYW5ndWFnZSBhbmQgY291bnRyeSBhYmJyZXZpYXRpb25zXG4gKiB0byBBVkQgYXJndW1lbnRzIGFycmF5XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsYW5ndWFnZSBMYW5ndWFnZSBuYW1lLCBmb3IgZXhhbXBsZSAnZnInXG4gKiBAcGFyYW0gez9zdHJpbmd9IGNvdW50cnkgQ291bnRyeSBuYW1lLCBmb3IgZXhhbXBsZSAnQ0EnXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGdlbmVyYXRlZCBhcmd1bWVudHMuIFRoZVxuICogcmVzdWx0aW5nIGFycmF5IG1pZ2h0IGJlIGVtcHR5IGlmIGJvdGggYXJndW1lbnRzIGFyZSBlbXB0eVxuICovXG5mdW5jdGlvbiB0b0F2ZExvY2FsZUFyZ3MgKGxhbmd1YWdlLCBjb3VudHJ5KSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBpZiAobGFuZ3VhZ2UgJiYgXy5pc1N0cmluZyhsYW5ndWFnZSkpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMubGFuZ3VhZ2U9JHtsYW5ndWFnZS50b0xvd2VyQ2FzZSgpfWApO1xuICB9XG4gIGlmIChjb3VudHJ5ICYmIF8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMuY291bnRyeT0ke2NvdW50cnkudG9VcHBlckNhc2UoKX1gKTtcbiAgfVxuICBsZXQgbG9jYWxlO1xuICBpZiAoXy5pc1N0cmluZyhsYW5ndWFnZSkgJiYgXy5pc1N0cmluZyhjb3VudHJ5KSAmJiBsYW5ndWFnZSAmJiBjb3VudHJ5KSB7XG4gICAgbG9jYWxlID0gbGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSArICctJyArIGNvdW50cnkudG9VcHBlckNhc2UoKTtcbiAgfSBlbHNlIGlmIChsYW5ndWFnZSAmJiBfLmlzU3RyaW5nKGxhbmd1YWdlKSkge1xuICAgIGxvY2FsZSA9IGxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAoY291bnRyeSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpKSB7XG4gICAgbG9jYWxlID0gY291bnRyeTtcbiAgfVxuICBpZiAobG9jYWxlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1wcm9wJywgYHBlcnNpc3Quc3lzLmxvY2FsZT0ke2xvY2FsZX1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBBbmRyb2lkIHByZWZlcmVuY2VzIHJvb3RcbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgZm9sZGVyIG9yIGBudWxsYCBpZiB0aGUgZm9sZGVyIGNhbm5vdCBiZSBmb3VuZFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbmRyb2lkUHJlZnNSb290ICgpIHtcbiAgbGV0IGxvY2F0aW9uID0gcHJvY2Vzcy5lbnYuQU5EUk9JRF9FTVVMQVRPUl9IT01FO1xuICBpZiAoYXdhaXQgZGlyRXhpc3RzKGxvY2F0aW9uKSkge1xuICAgIHJldHVybiBsb2NhdGlvbjtcbiAgfVxuXG4gIGlmIChsb2NhdGlvbikge1xuICAgIGxvZy53YXJuKGBUaGUgdmFsdWUgb2YgdGhlIEFORFJPSURfRU1VTEFUT1JfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnJHtsb2NhdGlvbn0nIGlzIG5vdCBhbiBleGlzdGluZyBkaXJlY3RvcnlgKTtcbiAgfVxuXG4gIGNvbnN0IGhvbWUgPSBwcm9jZXNzLmVudi5IT01FIHx8IHByb2Nlc3MuZW52LlVTRVJQUk9GSUxFO1xuICBpZiAoaG9tZSkge1xuICAgIGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGhvbWUsICcuYW5kcm9pZCcpO1xuICB9XG5cbiAgaWYgKCFhd2FpdCBkaXJFeGlzdHMobG9jYXRpb24pKSB7XG4gICAgbG9nLmRlYnVnKGBBbmRyb2lkIGNvbmZpZyByb290ICcke2xvY2F0aW9ufScgaXMgbm90IGFuIGV4aXN0aW5nIGRpcmVjdG9yeWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGxvY2F0aW9uO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGF0aCBleGlzdHMgb24gdGhlIGZpbGVzeXN0ZW0gYW5kIGlzIGEgZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsb2NhdGlvbiBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiBkaXJFeGlzdHMgKGxvY2F0aW9uKSB7XG4gIHJldHVybiBsb2NhdGlvblxuICAgICYmIGF3YWl0IGZzLmV4aXN0cyhsb2NhdGlvbilcbiAgICAmJiAoYXdhaXQgZnMuc3RhdChsb2NhdGlvbikpLmlzRGlyZWN0b3J5KCk7XG59XG5cbi8qKlxuICogRXNjYXBlcyBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy5cbiAqIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHBvc3NpYmxlIGlzc3VlcyB3aXRoIGhvdyBzeXN0ZW0gYHNwYXduYFxuICogY2FsbCBoYW5kbGVzIHRoZW0uXG4gKiBTZWUgaHR0cHM6Ly9kaXNjdXNzLmFwcGl1bS5pby90L2hvdy10by1tb2RpZnktd2QtcHJveHktYW5kLXVpYXV0b21hdG9yMi1zb3VyY2UtY29kZS10by1zdXBwb3J0LXVuaWNvZGUvMzM0NjZcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZyBOb24tZXNjYXBlZCBhcmd1bWVudCBzdHJpbmdcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIGFyZ3VtZW50XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVNoZWxsQXJnIChhcmcpIHtcbiAgYXJnID0gYCR7YXJnfWA7XG4gIGlmIChzeXN0ZW0uaXNXaW5kb3dzKCkpIHtcbiAgICByZXR1cm4gL1smfF5cXHNdLy50ZXN0KGFyZykgPyBgXCIke2FyZy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYCA6IGFyZztcbiAgfVxuICByZXR1cm4gYXJnLnJlcGxhY2UoLyYvZywgJ1xcXFwmJyk7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBuYW1lIG9mIGxhdW5jaGFibGUgcGFja2FnZSBhY3Rpdml0eVxuICogZnJvbSBkdW1wc3lzIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZHVtcHN5cyB0aGUgYWN0dWFsIGR1bXBzeXMgb3V0cHV0XG4gKiBAcmV0dXJucyB7c3RyaW5nW119IEVpdGhlciB0aGUgZnVsbHkgcXVhbGlmaWVkXG4gKiBhY3Rpdml0eSBuYW1lIGFzIGEgc2luZ2xlIGxpc3QgaXRlbSBvciBhbiBlbXB0eSBsaXN0IGlmIG5vdGhpbmcgY291bGQgYmUgcGFyc2VkLlxuICogSW4gQW5kcm9pZCA2IGFuZCBvbGRlciB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gZGV0ZXJtaW5lXG4gKiB0aGUgY2F0ZWdvcnkgbmFtZSBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5LCBzbyB0aGlzIEFQSSBqdXN0XG4gKiByZXR1cm5zIGFsbCBhY3Rpdml0eSBuYW1lcyBiZWxvbmdpbmcgdG8gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJ1xuICogd2l0aCB0aGUgZXhwZWN0YXRpb24gdGhhdCB0aGUgYXBwIG1hbmlmZXN0IGNvdWxkIGJlIHBhcnNlZCBuZXh0XG4gKiBpbiBvcmRlciB0byBkZXRlcm1pbmUgY2F0ZWdvcnkgbmFtZXMgZm9yIHRoZXNlLlxuICovXG5mdW5jdGlvbiBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzIChkdW1wc3lzKSB7XG4gIGNvbnN0IG1haW5BY3Rpdml0eU5hbWVSZSA9IG5ldyBSZWdFeHAoYF5cXFxccyoke18uZXNjYXBlUmVnRXhwKE1BSU5fQUNUSU9OKX06JGApO1xuICBjb25zdCBjYXRlZ29yeU5hbWVSZSA9IC9eXFxzKkNhdGVnb3J5OlxccytcIihbYS16QS1aMC05Ll8vLV0rKVwiJC87XG4gIGNvbnN0IGJsb2NrcyA9IFtdO1xuICBsZXQgYmxvY2tTdGFydEluZGVudDtcbiAgbGV0IGJsb2NrID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBkdW1wc3lzLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltRW5kKSkge1xuICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLmxlbmd0aCAtIF8udHJpbVN0YXJ0KGxpbmUpLmxlbmd0aDtcbiAgICBpZiAobWFpbkFjdGl2aXR5TmFtZVJlLnRlc3QobGluZSkpIHtcbiAgICAgIGJsb2NrU3RhcnRJbmRlbnQgPSBjdXJyZW50SW5kZW50O1xuICAgICAgaWYgKCFfLmlzRW1wdHkoYmxvY2spKSB7XG4gICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgYmxvY2sgPSBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXy5pc05pbChibG9ja1N0YXJ0SW5kZW50KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRJbmRlbnQgPiBibG9ja1N0YXJ0SW5kZW50KSB7XG4gICAgICBibG9jay5wdXNoKGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eShibG9jaykpIHtcbiAgICAgICAgYmxvY2tzLnB1c2goYmxvY2spO1xuICAgICAgICBibG9jayA9IFtdO1xuICAgICAgfVxuICAgICAgYmxvY2tTdGFydEluZGVudCA9IG51bGw7XG4gICAgfVxuICB9XG4gIGlmICghXy5pc0VtcHR5KGJsb2NrKSkge1xuICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYmxvY2tzKSB7XG4gICAgbGV0IGhhc0NhdGVnb3J5ID0gZmFsc2U7XG4gICAgbGV0IGlzTGF1bmNoZXJDYXRlZ29yeSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBpdGVtKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGNhdGVnb3J5TmFtZVJlLmV4ZWMobGluZSk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBoYXNDYXRlZ29yeSA9IHRydWU7XG4gICAgICBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBtYXRjaFsxXSA9PT0gTEFVTkNIRVJfQ0FURUdPUlk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gT24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucyB0aGUgY2F0ZWdvcnkgbmFtZVxuICAgIC8vIG1pZ2h0IG5vdCBiZSBsaXN0ZWQsIHNvIHdlIGp1c3QgdHJ5IHRvIGZldGNoXG4gICAgLy8gYWxsIG1hdGNoZXMgaW5zdGVhZFxuICAgIGlmIChoYXNDYXRlZ29yeSAmJiAhaXNMYXVuY2hlckNhdGVnb3J5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFjdGl2aXR5TmFtZVN0ciBvZiBpdGVtLm1hcChfLnRyaW0pLmZpbHRlcihCb29sZWFuKSkge1xuICAgICAgY29uc3QgZnFBY3Rpdml0eU5hbWUgPSBhY3Rpdml0eU5hbWVTdHIuc3BsaXQoL1xccysvKVsxXTtcbiAgICAgIGlmICghbWF0Y2hDb21wb25lbnROYW1lKGZxQWN0aXZpdHlOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGF1bmNoZXJDYXRlZ29yeSkge1xuICAgICAgICByZXR1cm4gW2ZxQWN0aXZpdHlOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGZxQWN0aXZpdHlOYW1lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgY29tcG9uZW50IG5hbWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NTdHJpbmcgVGhlIHN0cmluZyB0byB2ZXJpZnlcbiAqIEByZXR1cm4gez9BcnJheTxNYXRjaD59IFRoZSByZXN1bHQgb2YgUmVnZXhwLmV4ZWMgb3BlcmF0aW9uXG4gKiBvciBfbnVsbF8gaWYgbm8gbWF0Y2hlcyBhcmUgZm91bmRcbiAqL1xuZnVuY3Rpb24gbWF0Y2hDb21wb25lbnROYW1lIChjbGFzc1N0cmluZykge1xuICAvLyBzb21lLnBhY2thZ2Uvc29tZS5wYWNrYWdlLkFjdGl2aXR5XG4gIHJldHVybiAvXlthLXowLTkuL19dKyQvaS5leGVjKGNsYXNzU3RyaW5nKTtcbn1cblxuZXhwb3J0IHtcbiAgZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCwgdW56aXBGaWxlLFxuICBnZXRJTUVMaXN0RnJvbU91dHB1dCwgZ2V0SmF2YUZvck9zLCBpc1Nob3dpbmdMb2Nrc2NyZWVuLCBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQsXG4gIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgaXNTY3JlZW5PbkZ1bGx5LCBidWlsZFN0YXJ0Q21kLCBnZXRKYXZhSG9tZSxcbiAgZ2V0U2RrVG9vbHNWZXJzaW9uLCBnZXRBcGtzaWduZXJGb3JPcywgZ2V0QnVpbGRUb29sc0RpcnMsXG4gIGdldEFwa2FuYWx5emVyRm9yT3MsIGdldE9wZW5Tc2xGb3JPcywgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsIEFQS1NfRVhURU5TSU9OLFxuICBBUEtfSU5TVEFMTF9USU1FT1VULCBBUEtTX0lOU1RBTExfVElNRU9VVCwgYnVpbGRJbnN0YWxsQXJncywgQVBLX0VYVEVOU0lPTixcbiAgREVGQVVMVF9BREJfRVhFQ19USU1FT1VULCBwYXJzZU1hbmlmZXN0LCBwYXJzZUFhcHRTdHJpbmdzLCBwYXJzZUFhcHQyU3RyaW5ncyxcbiAgZm9ybWF0Q29uZmlnTWFya2VyLCBwYXJzZUpzb25EYXRhLCB1bnNpZ25BcGssIHRvQXZkTG9jYWxlQXJncywgcmVxdWlyZVNka1Jvb3QsXG4gIGdldFNka1Jvb3RGcm9tRW52LCBnZXRBbmRyb2lkUHJlZnNSb290LCBkaXJFeGlzdHMsIGVzY2FwZVNoZWxsQXJnLFxuICBwYXJzZUxhdW5jaGFibGVB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
|
|
976
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUEtTX0VYVEVOU0lPTiIsIkFQS19FWFRFTlNJT04iLCJBUEtfSU5TVEFMTF9USU1FT1VUIiwiQVBLU19JTlNUQUxMX1RJTUVPVVQiLCJERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQiLCJNQUlOX0FDVElPTiIsIkxBVU5DSEVSX0NBVEVHT1JZIiwiZ2V0TW9kdWxlUm9vdCIsIl8iLCJtZW1vaXplIiwiY3VycmVudERpciIsInBhdGgiLCJkaXJuYW1lIiwicmVzb2x2ZSIsIl9fZmlsZW5hbWUiLCJpc0F0RnNSb290IiwibWFuaWZlc3RQYXRoIiwiam9pbiIsIl9mcyIsImV4aXN0c1N5bmMiLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJuYW1lIiwiaWduIiwibGVuZ3RoIiwiRXJyb3IiLCJnZXRTZGtSb290RnJvbUVudiIsInByb2Nlc3MiLCJlbnYiLCJBTkRST0lEX0hPTUUiLCJBTkRST0lEX1NES19ST09UIiwicmVxdWlyZVNka1Jvb3QiLCJjdXN0b21Sb290Iiwic2RrUm9vdCIsImRvY01zZyIsImlzRW1wdHkiLCJmcyIsImV4aXN0cyIsInN0YXRzIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCIsInByb3BzUGF0aHMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJwbGF0Zm9ybXNNYXBwaW5nIiwicHJvcHNQYXRoIiwicHJvcHNDb250ZW50IiwicmVhZEZpbGUiLCJwbGF0Zm9ybVBhdGgiLCJwbGF0Zm9ybSIsImJhc2VuYW1lIiwibWF0Y2giLCJleGVjIiwibG9nIiwid2FybiIsInBhcnNlSW50IiwicmVjZW50U2RrVmVyc2lvbiIsImtleXMiLCJzb3J0IiwicmV2ZXJzZSIsInJlc3VsdCIsImRlYnVnIiwic3RyaW5naWZ5IiwidW56aXBGaWxlIiwiemlwUGF0aCIsImRzdFJvb3QiLCJ6aXAiLCJhc3NlcnRWYWxpZFppcCIsImV4dHJhY3RBbGxUbyIsInVuc2lnbkFwayIsImFwa1BhdGgiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJtZXRhSW5mRm9sZGVyTmFtZSIsImhhc01ldGFJbmYiLCJyZWFkRW50cmllcyIsImVudHJ5IiwiZmlsZU5hbWUiLCJzdGFydHNXaXRoIiwidG1wWmlwUm9vdCIsInJpbXJhZiIsInRtcFJlc3VsdFBhdGgiLCJ0b0FyY2hpdmUiLCJ1bmxpbmsiLCJtdiIsImdldElNRUxpc3RGcm9tT3V0cHV0Iiwic3Rkb3V0IiwiZW5naW5lcyIsImxpbmUiLCJzcGxpdCIsInB1c2giLCJ0cmltIiwicmVwbGFjZSIsImdldEphdmFIb21lIiwiSkFWQV9IT01FIiwiZ2V0SmF2YUZvck9zIiwiamF2YUhvbWUiLCJlcnJNc2ciLCJlcnIiLCJtZXNzYWdlIiwiZXhlY3V0YWJsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJyZXN1bHRQYXRoIiwid2hpY2giLCJnZXRPcGVuU3NsRm9yT3MiLCJiaW5hcnlOYW1lIiwiZ2V0QXBrc2lnbmVyRm9yT3MiLCJzeXNIZWxwZXJzIiwiZ2V0QmluYXJ5RnJvbVNka1Jvb3QiLCJnZXRBcGthbmFseXplckZvck9zIiwiaXNTaG93aW5nTG9ja3NjcmVlbiIsImR1bXBzeXMiLCJzb21lIiwieCIsImluY2x1ZGVzIiwiZXZlcnkiLCJ0ZXN0IiwiaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkIiwibSIsImdldFN1cmZhY2VPcmllbnRhdGlvbiIsImlzU2NyZWVuT25GdWxseSIsImJ1aWxkU3RhcnRDbWQiLCJzdGFydEFwcE9wdGlvbnMiLCJhcGlMZXZlbCIsInVzZXIiLCJ3YWl0Rm9yTGF1bmNoIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjYXRlZ29yeSIsInN0b3BBcHAiLCJmbGFncyIsImNtZCIsInV0aWwiLCJoYXNWYWx1ZSIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwicGFyc2VLZXlWYWx1ZSIsInN0ciIsInNwYWNlIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsInJlIiwiYXJncyIsImFwcGx5IiwiZmxhZyIsImZsYWdQb3MiLCJwcmV2QXJncyIsImdldFNka1Rvb2xzVmVyc2lvbiIsImFuZHJvaWRIb21lIiwicHJvcGVydGllc1BhdGgiLCJwcm9wZXJ0aWVzQ29udGVudCIsInZlcnNpb25NYXRjaGVyIiwiUmVnRXhwIiwibWFqb3IiLCJtaW5vciIsImJ1aWxkIiwiZ2V0QnVpbGRUb29sc0RpcnMiLCJidWlsZFRvb2xzRGlycyIsIm1hcCIsImRpciIsImEiLCJiIiwic2VtdmVyIiwicmNvbXBhcmUiLCJwYWlyIiwicGFpcnMiLCJCIiwibXRpbWUiLCJ2YWx1ZU9mIiwiaW5mbyIsImV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zIiwiZHVtcHN5c091dHB1dCIsImdyb3VwTmFtZXMiLCJncmFudGVkU3RhdGUiLCJncm91cFBhdHRlcm5CeU5hbWUiLCJncm91cE5hbWUiLCJlc2NhcGVSZWdFeHAiLCJpbmRlbnRQYXR0ZXJuIiwicGVybWlzc2lvbk5hbWVQYXR0ZXJuIiwiZ3JhbnRlZFN0YXRlUGF0dGVybiIsImdyb3VwTWF0Y2giLCJsaW5lcyIsInRpdGxlSW5kZW50Iiwic2VhcmNoIiwic2xpY2UiLCJjdXJyZW50SW5kZW50IiwicGVybWlzc2lvbk5hbWVNYXRjaCIsIml0ZW0iLCJwZXJtaXNzaW9uIiwiZ3JhbnRlZFN0YXRlTWF0Y2giLCJncmFudGVkIiwiZmlsdGVyZWRSZXN1bHQiLCJmaWx0ZXIiLCJpc0Jvb2xlYW4iLCJwbHVyYWxpemUiLCJidWlsZEluc3RhbGxBcmdzIiwib3B0aW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwidXNlU2RjYXJkIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBhcnRpYWxJbnN0YWxsIiwicGFyc2VNYW5pZmVzdCIsIm1hbmlmZXN0IiwicGFja2FnZSIsInZlcnNpb25Db2RlIiwidmVyc2lvbk5hbWUiLCJhcHBsaWNhdGlvbiIsImFjdGl2aXRpZXMiLCJhY3Rpdml0eUFsaWFzZXMiLCJlbmFibGVkIiwiaW50ZW50RmlsdGVycyIsImFjdGlvbnMiLCJjYXRlZ29yaWVzIiwiaXNNYWluQWN0aW9uIiwiaXNMYXVuY2hlckNhdGVnb3J5IiwicGFyc2VBYXB0U3RyaW5ncyIsInJhd091dHB1dCIsImNvbmZpZ01hcmtlciIsIm5vcm1hbGl6ZVN0cmluZ01hdGNoIiwicyIsImFwa1N0cmluZ3MiLCJpc0luQ29uZmlnIiwiY3VycmVudFJlc291cmNlSWQiLCJpc0luUGx1cmFsR3JvdXAiLCJxdW90ZWRTdHJpbmdQYXR0ZXJuIiwib3MiLCJFT0wiLCJ0cmltbWVkTGluZSIsInBhcnNlQWFwdDJTdHJpbmdzIiwiYWxsTGluZXMiLCJleHRyYWN0Q29udGVudCIsInN0YXJ0SWR4IiwiaWR4Iiwic3RhcnRDaGFyUG9zIiwidGVybWluYXRpb25DaGFyTWF0Y2giLCJ0ZXJtaW5hdGlvbkNoYXJQb3MiLCJpbmRleCIsInRyaW1TdGFydCIsImlzSW5DdXJyZW50Q29uZmlnIiwibGluZUluZGV4IiwiY29udGVudCIsImlzU3RyaW5nIiwiZm9ybWF0Q29uZmlnTWFya2VyIiwiY29uZmlnc0dldHRlciIsImRlc2lyZWRNYXJrZXIiLCJkZWZhdWx0TWFya2VyIiwiY29uZmlncyIsInRvTG93ZXJDYXNlIiwicGFyc2VKc29uRGF0YSIsIm91dHB1dCIsImVudGl0eU5hbWUiLCJqc29uU3RyIiwiZSIsInRvQXZkTG9jYWxlQXJncyIsImxhbmd1YWdlIiwiY291bnRyeSIsInRvVXBwZXJDYXNlIiwibG9jYWxlIiwiZ2V0QW5kcm9pZFByZWZzUm9vdCIsImxvY2F0aW9uIiwiQU5EUk9JRF9FTVVMQVRPUl9IT01FIiwiZGlyRXhpc3RzIiwiaG9tZSIsIkhPTUUiLCJVU0VSUFJPRklMRSIsImVzY2FwZVNoZWxsQXJnIiwiYXJnIiwicGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcyIsIm1haW5BY3Rpdml0eU5hbWVSZSIsImNhdGVnb3J5TmFtZVJlIiwiYmxvY2tzIiwiYmxvY2tTdGFydEluZGVudCIsImJsb2NrIiwidHJpbUVuZCIsImlzTmlsIiwiaGFzQ2F0ZWdvcnkiLCJhY3Rpdml0eU5hbWVTdHIiLCJCb29sZWFuIiwiZnFBY3Rpdml0eU5hbWUiLCJtYXRjaENvbXBvbmVudE5hbWUiLCJjbGFzc1N0cmluZyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcywgemlwLCB1dGlsLCB0ZW1wRGlyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgX2ZzIGZyb20gJ2ZzJztcblxuY29uc3QgQVBLU19FWFRFTlNJT04gPSAnLmFwa3MnO1xuY29uc3QgQVBLX0VYVEVOU0lPTiA9ICcuYXBrJztcbmNvbnN0IEFQS19JTlNUQUxMX1RJTUVPVVQgPSA2MDAwMDtcbmNvbnN0IEFQS1NfSU5TVEFMTF9USU1FT1VUID0gQVBLX0lOU1RBTExfVElNRU9VVCAqIDI7XG5jb25zdCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQgPSAyMDAwMDsgLy8gaW4gbWlsbGlzZWNvbmRzXG5jb25zdCBNQUlOX0FDVElPTiA9ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTic7XG5jb25zdCBMQVVOQ0hFUl9DQVRFR09SWSA9ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUic7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcGF0aCB0byB0aGUgY3VycmVudCBtb2R1bGUncyByb290IGZvbGRlclxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gbW9kdWxlIHJvb3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY3VycmVudCBtb2R1bGUgcm9vdCBmb2xkZXIgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xuY29uc3QgZ2V0TW9kdWxlUm9vdCA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRNb2R1bGVSb290ICgpIHtcbiAgbGV0IGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUocGF0aC5yZXNvbHZlKF9fZmlsZW5hbWUpKTtcbiAgbGV0IGlzQXRGc1Jvb3QgPSBmYWxzZTtcbiAgd2hpbGUgKCFpc0F0RnNSb290KSB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgaWYgKF9mcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkgJiZcbiAgICAgICAgICBKU09OLnBhcnNlKF9mcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKS5uYW1lID09PSAnYXBwaXVtLWFkYicpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgaXNBdEZzUm9vdCA9IGN1cnJlbnREaXIubGVuZ3RoIDw9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKS5sZW5ndGg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIGFwcGl1bS1hZGIgTm9kZS5qcyBtb2R1bGUnKTtcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYWN0dWFsIHBhdGggdG8gU0RLIHJvb3QgZm9sZGVyIGZyb20gdGhlIHN5c3RlbSBlbnZpcm9ubWVudFxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIFNESyByb290IGZvbGRlclxuICovXG5mdW5jdGlvbiBnZXRTZGtSb290RnJvbUVudiAoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5BTkRST0lEX0hPTUUgfHwgcHJvY2Vzcy5lbnYuQU5EUk9JRF9TREtfUk9PVDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGFjdHVhbCBwYXRoIHRvIFNESyByb290IGZvbGRlclxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgU0RLIHJvb3QgZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZWl0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGVudiB2YXJpYWJsZSBpcyB1bnNldCBvciBpc1xuICogcG9pbnRpbmcgdG8gYW4gaW52YWxpZCBmaWxlIHN5c3RlbSBlbnRyeVxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1aXJlU2RrUm9vdCAoY3VzdG9tUm9vdCA9IG51bGwpIHtcbiAgY29uc3Qgc2RrUm9vdCA9IGN1c3RvbVJvb3QgfHwgZ2V0U2RrUm9vdEZyb21FbnYoKTtcbiAgY29uc3QgZG9jTXNnID0gJ1JlYWQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL2NvbW1hbmQtbGluZS92YXJpYWJsZXMgZm9yIG1vcmUgZGV0YWlscyc7XG4gIGlmIChfLmlzRW1wdHkoc2RrUm9vdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5laXRoZXIgQU5EUk9JRF9IT01FIG5vciBBTkRST0lEX1NES19ST09UIGVudmlyb25tZW50IHZhcmlhYmxlIHdhcyBleHBvcnRlZC4gJHtkb2NNc2d9YCk7XG4gIH1cblxuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhzZGtSb290KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEFuZHJvaWQgU0RLIHJvb3QgZm9sZGVyICcke3Nka1Jvb3R9JyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uICR7ZG9jTXNnfWApO1xuICB9XG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChzZGtSb290KTtcbiAgaWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQW5kcm9pZCBTREsgcm9vdCAnJHtzZGtSb290fScgbXVzdCBiZSBhIGZvbGRlci4gJHtkb2NNc2d9YCk7XG4gIH1cbiAgcmV0dXJuIHNka1Jvb3Q7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGxhdGZvcm1JbmZvXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBsYXRmb3JtIC0gVGhlIHBsYXRmb3JtIG5hbWUsIGZvciBleGFtcGxlIGBhbmRyb2lkLTI0YFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGxhdGZvcm1QYXRoIC0gRnVsbCBwYXRoIHRvIHRoZSBwbGF0Zm9ybSBTREsgZm9sZGVyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBwYXRoIHRvIHRoZSByZWNlbnQgaW5zdGFsbGVkIEFuZHJvaWQgcGxhdGZvcm0uXG4gKlxuICogQHJldHVybiB7UGxhdGZvcm1JbmZvfSBUaGUgcmVzdWx0aW5nIHBhdGggdG8gdGhlIG5ld2VzdCBpbnN0YWxsZWQgcGxhdGZvcm0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGggKHNka1Jvb3QpIHtcbiAgY29uc3QgcHJvcHNQYXRocyA9IGF3YWl0IGZzLmdsb2IoJyovYnVpbGQucHJvcCcsIHtcbiAgICBjd2Q6IHBhdGgucmVzb2x2ZShzZGtSb290LCAncGxhdGZvcm1zJyksXG4gICAgYWJzb2x1dGU6IHRydWUsXG4gIH0pO1xuICBjb25zdCBwbGF0Zm9ybXNNYXBwaW5nID0ge307XG4gIGZvciAoY29uc3QgcHJvcHNQYXRoIG9mIHByb3BzUGF0aHMpIHtcbiAgICBjb25zdCBwcm9wc0NvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwcm9wc1BhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHBsYXRmb3JtUGF0aCA9IHBhdGguZGlybmFtZShwcm9wc1BhdGgpO1xuICAgIGNvbnN0IHBsYXRmb3JtID0gcGF0aC5iYXNlbmFtZShwbGF0Zm9ybVBhdGgpO1xuICAgIGNvbnN0IG1hdGNoID0gL3JvXFwuYnVpbGRcXC52ZXJzaW9uXFwuc2RrPShcXGQrKS8uZXhlYyhwcm9wc0NvbnRlbnQpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGxvZy53YXJuKGBDYW5ub3QgcmVhZCB0aGUgU0RLIHZlcnNpb24gZnJvbSAnJHtwcm9wc1BhdGh9Jy4gU2tpcHBpbmcgJyR7cGxhdGZvcm19J2ApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHBsYXRmb3Jtc01hcHBpbmdbcGFyc2VJbnQobWF0Y2hbMV0sIDEwKV0gPSB7XG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIHBsYXRmb3JtUGF0aCxcbiAgICB9O1xuICB9XG4gIGlmIChfLmlzRW1wdHkocGxhdGZvcm1zTWFwcGluZykpIHtcbiAgICBsb2cud2FybihgRm91bmQgemVybyBwbGF0Zm9ybSBmb2xkZXJzIGF0ICcke3BhdGgucmVzb2x2ZShzZGtSb290LCAncGxhdGZvcm1zJyl9Jy4gYCArXG4gICAgICBgRG8geW91IGhhdmUgYW55IEFuZHJvaWQgU0RLcyBpbnN0YWxsZWQ/YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYXRmb3JtOiBudWxsLFxuICAgICAgcGxhdGZvcm1QYXRoOiBudWxsLFxuICAgIH07XG4gIH1cblxuICBjb25zdCByZWNlbnRTZGtWZXJzaW9uID0gXy5rZXlzKHBsYXRmb3Jtc01hcHBpbmcpLnNvcnQoKS5yZXZlcnNlKClbMF07XG4gIGNvbnN0IHJlc3VsdCA9IHBsYXRmb3Jtc01hcHBpbmdbcmVjZW50U2RrVmVyc2lvbl07XG4gIGxvZy5kZWJ1ZyhgRm91bmQgdGhlIG1vc3QgcmVjZW50IEFuZHJvaWQgcGxhdGZvcm06ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdW56aXBGaWxlICh6aXBQYXRoLCBkc3RSb290ID0gcGF0aC5kaXJuYW1lKHppcFBhdGgpKSB7XG4gIGxvZy5kZWJ1ZyhgVW56aXBwaW5nICcke3ppcFBhdGh9JyB0byAnJHtkc3RSb290fSdgKTtcbiAgYXdhaXQgemlwLmFzc2VydFZhbGlkWmlwKHppcFBhdGgpO1xuICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHppcFBhdGgsIGRzdFJvb3QpO1xuICBsb2cuZGVidWcoJ1VuemlwIHN1Y2Nlc3NmdWwnKTtcbn1cblxuLyoqXG4gKiBVbnNpZ25zIHRoZSBnaXZlbiBhcGsgYnkgcmVtb3ZpbmcgdGhlXG4gKiBNRVRBLUlORiBmb2xkZXIgcmVjdXJzaXZlbHkgZnJvbSB0aGUgYXJjaGl2ZS5cbiAqICEhISBUaGUgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgZ2l2ZW4gYXBrIGFmdGVyIHN1Y2Nlc3NmdWwgdW5zaWduaW5nICEhIVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtQYXRoIFRoZSBwYXRoIHRvIHRoZSBhcGtcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGFwayBoYXMgYmVlbiBzdWNjZXNzZnVsbHlcbiAqIHVuc2lnbmVkIGFuZCBvdmVyd3JpdHRlblxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgdGhlIHVuc2lnbiBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdW5zaWduQXBrIChhcGtQYXRoKSB7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgY29uc3QgbWV0YUluZkZvbGRlck5hbWUgPSAnTUVUQS1JTkYnO1xuICB0cnkge1xuICAgIGxldCBoYXNNZXRhSW5mID0gZmFsc2U7XG4gICAgYXdhaXQgemlwLnJlYWRFbnRyaWVzKGFwa1BhdGgsICh7ZW50cnl9KSA9PiB7XG4gICAgICBoYXNNZXRhSW5mID0gZW50cnkuZmlsZU5hbWUuc3RhcnRzV2l0aChgJHttZXRhSW5mRm9sZGVyTmFtZX0vYCk7XG4gICAgICAvLyBlbnRyaWVzIGl0ZXJhdGlvbiBzdG9wcyBhZnRlciBgZmFsc2VgIGlzIHJldHVybmVkXG4gICAgICByZXR1cm4gIWhhc01ldGFJbmY7XG4gICAgfSk7XG4gICAgaWYgKCFoYXNNZXRhSW5mKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHRtcFppcFJvb3QgPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgJ2FwaycpO1xuICAgIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oYXBrUGF0aCwgdG1wWmlwUm9vdCk7XG4gICAgYXdhaXQgZnMucmltcmFmKHBhdGgucmVzb2x2ZSh0bXBaaXBSb290LCBtZXRhSW5mRm9sZGVyTmFtZSkpO1xuICAgIGNvbnN0IHRtcFJlc3VsdFBhdGggPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgcGF0aC5iYXNlbmFtZShhcGtQYXRoKSk7XG4gICAgYXdhaXQgemlwLnRvQXJjaGl2ZSh0bXBSZXN1bHRQYXRoLCB7XG4gICAgICBjd2Q6IHRtcFppcFJvb3QsXG4gICAgfSk7XG4gICAgYXdhaXQgZnMudW5saW5rKGFwa1BhdGgpO1xuICAgIGF3YWl0IGZzLm12KHRtcFJlc3VsdFBhdGgsIGFwa1BhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJTUVMaXN0RnJvbU91dHB1dCAoc3Rkb3V0KSB7XG4gIGxldCBlbmdpbmVzID0gW107XG4gIGZvciAobGV0IGxpbmUgb2Ygc3Rkb3V0LnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChsaW5lLmxlbmd0aCA+IDAgJiYgbGluZVswXSAhPT0gJyAnKSB7XG4gICAgICAvLyByZW1vdmUgbmV3bGluZSBhbmQgdHJhaWxpbmcgY29sb24sIGFuZCBhZGQgdG8gdGhlIGxpc3RcbiAgICAgIGVuZ2luZXMucHVzaChsaW5lLnRyaW0oKS5yZXBsYWNlKC86JC8sICcnKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbmdpbmVzO1xufVxuXG5jb25zdCBnZXRKYXZhSG9tZSA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRKYXZhSG9tZSAoKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3MuZW52LkpBVkFfSE9NRTtcbiAgaWYgKCFyZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcycpO1xuICB9XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHJlc3VsdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBKQVZBX0hPTUUgbG9jYXRpb24gJyR7cmVzdWx0fScgbXVzdCBleGlzdGApO1xuICB9XG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChyZXN1bHQpO1xuICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBKQVZBX0hPTUUgbG9jYXRpb24gJyR7cmVzdWx0fScgbXVzdCBiZSBhIHZhbGlkIGZvbGRlcmApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuY29uc3QgZ2V0SmF2YUZvck9zID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldEphdmFGb3JPcyAoKSB7XG4gIGxldCBqYXZhSG9tZTtcbiAgbGV0IGVyck1zZztcbiAgdHJ5IHtcbiAgICBqYXZhSG9tZSA9IGF3YWl0IGdldEphdmFIb21lKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyck1zZyA9IGVyci5tZXNzYWdlO1xuICB9XG4gIGNvbnN0IGV4ZWN1dGFibGVOYW1lID0gYGphdmEke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG4gIGlmIChqYXZhSG9tZSkge1xuICAgIGNvbnN0IHJlc3VsdFBhdGggPSBwYXRoLnJlc29sdmUoamF2YUhvbWUsICdiaW4nLCBleGVjdXRhYmxlTmFtZSk7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhyZXN1bHRQYXRoKSkge1xuICAgICAgcmV0dXJuIHJlc3VsdFBhdGg7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZzLndoaWNoKGV4ZWN1dGFibGVOYW1lKTtcbiAgfSBjYXRjaCAoaWduKSB7fVxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAnJHtleGVjdXRhYmxlTmFtZX0nIGJpbmFyeSBjb3VsZCBub3QgYmUgZm91bmQgYCArXG4gICAgYG5laXRoZXIgaW4gUEFUSCBub3IgdW5kZXIgSkFWQV9IT01FICgke2Vyck1zZyB8fCBwYXRoLnJlc29sdmUoamF2YUhvbWUsICdiaW4nKX0pYCk7XG59KTtcblxuY29uc3QgZ2V0T3BlblNzbEZvck9zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaW5hcnlOYW1lID0gYG9wZW5zc2wke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZzLndoaWNoKGJpbmFyeU5hbWUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBvcGVuc3NsIHRvb2wgbXVzdCBiZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBhbmQgYXZhaWxhYmxlIG9uIHRoZSBwYXRoJyk7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGFwa3NpZ25lciB0b29sXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN5c0hlbHBlcnMgLSBBbiBpbnN0YW5jZSBjb250YWluaW5nIHN5c3RlbUNhbGxNZXRob2RzIGhlbHBlciBtZXRob2RzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBbiBhYnNvbHV0ZSBwYXRoIHRvIGFwa3NpZ25lciB0b29sLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0b29sIGlzIG5vdCBwcmVzZW50IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXBrc2lnbmVyRm9yT3MgKHN5c0hlbHBlcnMpIHtcbiAgcmV0dXJuIGF3YWl0IHN5c0hlbHBlcnMuZ2V0QmluYXJ5RnJvbVNka1Jvb3QoJ2Fwa3NpZ25lci5qYXInKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggdG8gYXBrYW5hbHl6ZXIgdG9vbC5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9jb21tYW5kLWxpbmUvYXBrYW5hbHl6ZXIuaHRtbFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeXNIZWxwZXJzIC0gQW4gaW5zdGFuY2UgY29udGFpbmluZyBzeXN0ZW1DYWxsTWV0aG9kcyBoZWxwZXIgbWV0aG9kc1xuICogQHJldHVybnMge3N0cmluZ30gQW4gYWJzb2x1dGUgcGF0aCB0byBhcGthbmFseXplciB0b29sLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0b29sIGlzIG5vdCBwcmVzZW50IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXBrYW5hbHl6ZXJGb3JPcyAoc3lzSGVscGVycykge1xuICByZXR1cm4gYXdhaXQgc3lzSGVscGVycy5nZXRCaW5hcnlGcm9tU2RrUm9vdCgnYXBrYW5hbHl6ZXInKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgbVNob3dpbmdMb2Nrc2NyZWVuIG9yIG1EcmVhbWluZ0xvY2tzY3JlZW4gaW4gZHVtcHN5cyBvdXRwdXQgdG8gZGV0ZXJtaW5lXG4gKiBpZiBsb2NrIHNjcmVlbiBpcyBzaG93aW5nXG4gKlxuICogQSBub3RlOiBgYWRiIHNoZWxsIGR1bXBzeXMgdHJ1c3RgIHBlcmZvcm1zIGJldHRlciB3aGlsZSBkZXRlY3RpbmcgdGhlIGxvY2tlZCBzY3JlZW4gc3RhdGVcbiAqIGluIGNvbXBhcmlzb24gdG8gYGFkYiBkdW1wc3lzIHdpbmRvd2Agb3V0cHV0IHBhcnNpbmcuXG4gKiBCdXQgdGhlIHRydXN0IGNvbW1hbmQgZG9lcyBub3Qgd29yayBmb3IgYFN3aXBlYCB1bmxvY2sgcGF0dGVybi5cbiAqXG4gKiBJbiBzb21lIEFuZHJvaWQgZGV2aWNlcyAoUHJvYmFibHkgYXJvdW5kIEFuZHJvaWQgMTArKSwgYG1TaG93aW5nTG9ja3NjcmVlbmAgYW5kIGBtRHJlYW1pbmdMb2Nrc2NyZWVuYFxuICogZG8gbm90IHdvcmsgdG8gZGV0ZWN0IGxvY2sgc3RhdHVzLiBJbnN0ZWFkLCBrZXlndWFyZCBwcmVmZXJlbmNlcyBoZWxwcyB0byBkZXRlY3QgdGhlIGxvY2sgY29uZGl0aW9uLlxuICogU29tZSBkZXZpY2VzIHN1Y2ggYXMgQW5kcm9pZCBUViBkbyBub3QgaGF2ZSBrZXlndWFyZCwgc28gd2Ugc2hvdWxkIGtlZXBcbiAqIHNjcmVlbiBjb25kaXRpb24gYXMgdGhpcyBwcmltYXJ5IG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZHVtcHN5cyAtIFRoZSBvdXRwdXQgb2YgZHVtcHN5cyB3aW5kb3cgY29tbWFuZC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbG9jayBzY3JlZW4gaXMgc2hvd2luZy5cbiAqL1xuZnVuY3Rpb24gaXNTaG93aW5nTG9ja3NjcmVlbiAoZHVtcHN5cykge1xuICByZXR1cm4gXy5zb21lKFsnbVNob3dpbmdMb2Nrc2NyZWVuPXRydWUnLCAnbURyZWFtaW5nTG9ja3NjcmVlbj10cnVlJ10sICh4KSA9PiBkdW1wc3lzLmluY2x1ZGVzKHgpKVxuICAgIC8vIGBtSXNTaG93aW5nYCBhbmQgYG1JbnB1dFJlc3RyaWN0ZWRgIGFyZSBgdHJ1ZWAgaW4gbG9jayBjb25kaXRpb24uIGBmYWxzZWAgaXMgdW5sb2NrIGNvbmRpdGlvbi5cbiAgICB8fCBfLmV2ZXJ5KFsvS2V5Z3VhcmRTdGF0ZU1vbml0b3JbXFxuXFxzXSttSXNTaG93aW5nPXRydWUvLCAvXFxzK21JbnB1dFJlc3RyaWN0ZWQ9dHJ1ZS9dLCAoeCkgPT4geC50ZXN0KGR1bXBzeXMpKTtcbn1cblxuLypcbiAqIENoZWNrcyBtQ3VycmVudEZvY3VzIGluIGR1bXBzeXMgb3V0cHV0IHRvIGRldGVybWluZSBpZiBLZXlndWFyZCBpcyBhY3RpdmF0ZWRcbiAqL1xuZnVuY3Rpb24gaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkIChkdW1wc3lzKSB7XG4gIGxldCBtID0gL21DdXJyZW50Rm9jdXMuK0tleWd1YXJkL2dpLmV4ZWMoZHVtcHN5cyk7XG4gIHJldHVybiAobSAmJiBtLmxlbmd0aCAmJiBtWzBdKSA/IHRydWUgOiBmYWxzZTtcbn1cblxuLypcbiAqIFJlYWRzIFN1cmZhY2VPcmllbnRhdGlvbiBpbiBkdW1wc3lzIG91dHB1dFxuICovXG5mdW5jdGlvbiBnZXRTdXJmYWNlT3JpZW50YXRpb24gKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvU3VyZmFjZU9yaWVudGF0aW9uOiBcXGQvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuIG0gJiYgcGFyc2VJbnQobVswXS5zcGxpdCgnOicpWzFdLCAxMCk7XG59XG5cbi8qXG4gKiBDaGVja3MgbVNjcmVlbk9uRnVsbHkgaW4gZHVtcHN5cyBvdXRwdXQgdG8gZGV0ZXJtaW5lIGlmIHNjcmVlbiBpcyBzaG93aW5nXG4gKiBEZWZhdWx0IGlzIHRydWVcbiAqL1xuZnVuY3Rpb24gaXNTY3JlZW5PbkZ1bGx5IChkdW1wc3lzKSB7XG4gIGxldCBtID0gL21TY3JlZW5PbkZ1bGx5PVxcdysvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuICFtIHx8IC8vIGlmIGluZm9ybWF0aW9uIGlzIG1pc3Npbmcgd2UgYXNzdW1lIHNjcmVlbiBpcyBmdWxseSBvblxuICAgICAgICAgKG0gJiYgbS5sZW5ndGggPiAwICYmIG1bMF0uc3BsaXQoJz0nKVsxXSA9PT0gJ3RydWUnKSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgY29tbWFuZCBsaW5lIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgZ2l2ZW5cbiAqIGFwcGxpY2F0aW9uIHN0YXJ0dXAgb3B0aW9uc1xuICpcbiAqIEBwYXJhbSB7U3RhcnRBcHBPcHRpb25zfSBzdGFydEFwcE9wdGlvbnMgLSBBcHBsaWNhdGlvbiBvcHRpb25zIG1hcHBpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcGlMZXZlbCAtIFRoZSBhY3R1YWwgT1MgQVBJIGxldmVsXG4gKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gYnVpbGRTdGFydENtZCAoc3RhcnRBcHBPcHRpb25zLCBhcGlMZXZlbCkge1xuICBjb25zdCB7XG4gICAgdXNlcixcbiAgICB3YWl0Rm9yTGF1bmNoLFxuICAgIHBrZyxcbiAgICBhY3Rpdml0eSxcbiAgICBhY3Rpb24sXG4gICAgY2F0ZWdvcnksXG4gICAgc3RvcEFwcCxcbiAgICBmbGFncyxcbiAgfSA9IHN0YXJ0QXBwT3B0aW9ucztcbiAgY29uc3QgY21kID0gWydhbScsICdzdGFydCddO1xuICBpZiAodXRpbC5oYXNWYWx1ZSh1c2VyKSkge1xuICAgIGNtZC5wdXNoKCctLXVzZXInLCB1c2VyKTtcbiAgfVxuICBpZiAod2FpdEZvckxhdW5jaCkge1xuICAgIGNtZC5wdXNoKCctVycpO1xuICB9XG4gIGlmIChhY3Rpdml0eSAmJiBwa2cpIHtcbiAgICBjbWQucHVzaCgnLW4nLCBgJHtwa2d9LyR7YWN0aXZpdHl9YCk7XG4gIH1cbiAgaWYgKHN0b3BBcHAgJiYgYXBpTGV2ZWwgPj0gMTUpIHtcbiAgICBjbWQucHVzaCgnLVMnKTtcbiAgfVxuICBpZiAoYWN0aW9uKSB7XG4gICAgY21kLnB1c2goJy1hJywgYWN0aW9uKTtcbiAgfVxuICBpZiAoY2F0ZWdvcnkpIHtcbiAgICBjbWQucHVzaCgnLWMnLCBjYXRlZ29yeSk7XG4gIH1cbiAgaWYgKGZsYWdzKSB7XG4gICAgY21kLnB1c2goJy1mJywgZmxhZ3MpO1xuICB9XG4gIGlmIChzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpIHtcbiAgICAvLyBleHBlY3Qgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgdG8gYmUgYSBzaW5nbGUgc3RyaW5nIG9mIHRoZSBmb3JtOlxuICAgIC8vICAgICBcIi1mbGFnIGtleVwiXG4gICAgLy8gICAgIFwiLWZsYWcga2V5IHZhbHVlXCJcbiAgICAvLyBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZXNlIChlLmcuLCBcIi1mbGFnMSBrZXkxIC1mbGFnMiBrZXkyIHZhbHVlMlwiKVxuXG4gICAgLy8gdGFrZSBhIHN0cmluZyBhbmQgcGFyc2Ugb3V0IHRoZSBwYXJ0IGJlZm9yZSBhbnkgc3BhY2VzLCBhbmQgYW55dGhpbmcgYWZ0ZXJcbiAgICAvLyB0aGUgZmlyc3Qgc3BhY2VcbiAgICBsZXQgcGFyc2VLZXlWYWx1ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgICBsZXQgc3BhY2UgPSBzdHIuaW5kZXhPZignICcpO1xuICAgICAgaWYgKHNwYWNlID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyLmxlbmd0aCA/IFtzdHJdIDogW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3N0ci5zdWJzdHJpbmcoMCwgc3BhY2UpLnRyaW0oKSwgc3RyLnN1YnN0cmluZyhzcGFjZSArIDEpLnRyaW0oKV07XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGN5Y2xlIHRocm91Z2ggdGhlIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzIGFuZCBwdWxsIG91dCB0aGUgYXJndW1lbnRzXG4gICAgLy8gYWRkIGEgc3BhY2UgaW5pdGlhbGx5IHNvIGZsYWdzIGNhbiBiZSBkaXN0aW5ndWlzaGVkIGZyb20gYXJndW1lbnRzIHRoYXRcbiAgICAvLyBoYXZlIGludGVybmFsIGh5cGhlbnNcbiAgICBsZXQgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgPSBgICR7c3RhcnRBcHBPcHRpb25zLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzfWA7XG4gICAgbGV0IHJlID0gLyAoLVteXFxzXSspICguKykvO1xuICAgIHdoaWxlICh0cnVlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICBsZXQgYXJncyA9IHJlLmV4ZWMob3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpO1xuICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgIGlmIChvcHRpb25hbEludGVudEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBubyBtb3JlIGZsYWdzLCBzbyB0aGUgcmVtYWluZGVyIGNhbiBiZSB0cmVhdGVkIGFzICdrZXknIG9yICdrZXkgdmFsdWUnXG4gICAgICAgICAgY21kLnB1c2guYXBwbHkoY21kLCBwYXJzZUtleVZhbHVlKG9wdGlvbmFsSW50ZW50QXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd2UgYXJlIGRvbmVcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIHRha2UgdGhlIGZsYWcgYW5kIHNlZSBpZiBpdCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmdcbiAgICAgIC8vIGlmIGl0IGlzIG5vdCwgdGhlbiBpdCBtZWFucyB3ZSBoYXZlIGJlZW4gdGhyb3VnaCBhbHJlYWR5LCBhbmRcbiAgICAgIC8vIHdoYXQgaXMgYmVmb3JlIHRoZSBmbGFnIGlzIHRoZSBhcmd1bWVudCBmb3IgdGhlIHByZXZpb3VzIGZsYWdcbiAgICAgIGxldCBmbGFnID0gYXJnc1sxXTtcbiAgICAgIGxldCBmbGFnUG9zID0gb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMuaW5kZXhPZihmbGFnKTtcbiAgICAgIGlmIChmbGFnUG9zICE9PSAwKSB7XG4gICAgICAgIGxldCBwcmV2QXJncyA9IG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLnN1YnN0cmluZygwLCBmbGFnUG9zKTtcbiAgICAgICAgY21kLnB1c2guYXBwbHkoY21kLCBwYXJzZUtleVZhbHVlKHByZXZBcmdzKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCB0aGUgZmxhZywgYXMgdGhlcmUgYXJlIG5vIG1vcmUgZWFybGllciBhcmd1bWVudHNcbiAgICAgIGNtZC5wdXNoKGZsYWcpO1xuXG4gICAgICAvLyBtYWtlIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzIGhvbGQgdGhlIHJlbWFpbmRlclxuICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgPSBhcmdzWzJdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY21kO1xufVxuXG5jb25zdCBnZXRTZGtUb29sc1ZlcnNpb24gPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0U2RrVG9vbHNWZXJzaW9uICgpIHtcbiAgY29uc3QgYW5kcm9pZEhvbWUgPSBwcm9jZXNzLmVudi5BTkRST0lEX0hPTUU7XG4gIGlmICghYW5kcm9pZEhvbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FORFJPSURfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBleHBlY3RlZCB0byBiZSBzZXQnKTtcbiAgfVxuICBjb25zdCBwcm9wZXJ0aWVzUGF0aCA9IHBhdGgucmVzb2x2ZShhbmRyb2lkSG9tZSwgJ3Rvb2xzJywgJ3NvdXJjZS5wcm9wZXJ0aWVzJyk7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHByb3BlcnRpZXNQYXRoKSkge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgZmluZCAke3Byb3BlcnRpZXNQYXRofSBmaWxlIHRvIHJlYWQgU0RLIHZlcnNpb24gZnJvbWApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwcm9wZXJ0aWVzQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BlcnRpZXNQYXRoLCAndXRmOCcpO1xuICBjb25zdCB2ZXJzaW9uTWF0Y2hlciA9IG5ldyBSZWdFeHAoL1BrZ1xcLlJldmlzaW9uPShcXGQrKVxcLj8oXFxkKyk/XFwuPyhcXGQrKT8vKTtcbiAgY29uc3QgbWF0Y2ggPSB2ZXJzaW9uTWF0Y2hlci5leGVjKHByb3BlcnRpZXNDb250ZW50KTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ham9yOiBwYXJzZUludChtYXRjaFsxXSwgMTApLFxuICAgICAgbWlub3I6IG1hdGNoWzJdID8gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKSA6IDAsXG4gICAgICBidWlsZDogbWF0Y2hbM10gPyBwYXJzZUludChtYXRjaFszXSwgMTApIDogMFxuICAgIH07XG4gIH1cbiAgbG9nLndhcm4oYENhbm5vdCBwYXJzZSBcIlBrZy5SZXZpc2lvblwiIHZhbHVlIGZyb20gJHtwcm9wZXJ0aWVzUGF0aH1gKTtcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlcyBmdWxsIHBhdGhzIHRvIGFsbCAnYnVpbGQtdG9vbHMnIHN1YmZvbGRlcnMgdW5kZXIgdGhlIHBhcnRpY3VsYXJcbiAqIFNESyByb290IGZvbGRlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZGtSb290IC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgQW5kcm9pZCBTREsgcm9vdCBmb2xkZXJcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgZnVsbCBwYXRocyB0byB0aGUgcmVzdWx0aW5nIGZvbGRlcnMgc29ydGVkIGJ5XG4gKiBtb2RpZmljYXRpb24gZGF0ZSAodGhlIG5ld2VzdCBjb21lcyBmaXJzdCkgb3IgYW4gZW1wdHkgbGlzdCBpZiBubyBtYWN0aGVzIHdlcmUgZm91bmRcbiAqL1xuY29uc3QgZ2V0QnVpbGRUb29sc0RpcnMgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0QnVpbGRUb29sc0RpcnMgKHNka1Jvb3QpIHtcbiAgbGV0IGJ1aWxkVG9vbHNEaXJzID0gYXdhaXQgZnMuZ2xvYignKi8nLCB7XG4gICAgY3dkOiBwYXRoLnJlc29sdmUoc2RrUm9vdCwgJ2J1aWxkLXRvb2xzJyksXG4gICAgYWJzb2x1dGU6IHRydWUsXG4gIH0pO1xuICB0cnkge1xuICAgIGJ1aWxkVG9vbHNEaXJzID0gYnVpbGRUb29sc0RpcnNcbiAgICAgIC5tYXAoKGRpcikgPT4gW3BhdGguYmFzZW5hbWUoZGlyKSwgZGlyXSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBzZW12ZXIucmNvbXBhcmUoYVswXSwgYlswXSkpXG4gICAgICAubWFwKChwYWlyKSA9PiBwYWlyWzFdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCBzb3J0IGJ1aWxkLXRvb2xzIGZvbGRlcnMgJHtKU09OLnN0cmluZ2lmeShidWlsZFRvb2xzRGlycy5tYXAoKGRpcikgPT4gcGF0aC5iYXNlbmFtZShkaXIpKSl9IGAgK1xuICAgICAgYGJ5IHNlbWFudGljIHZlcnNpb24gbmFtZXMuYCk7XG4gICAgbG9nLndhcm4oYEZhbGxpbmcgYmFjayB0byBzb3J0aW5nIGJ5IG1vZGlmaWNhdGlvbiBkYXRlLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBjb25zdCBwYWlycyA9IGF3YWl0IEIubWFwKGJ1aWxkVG9vbHNEaXJzLCBhc3luYyAoZGlyKSA9PiBbKGF3YWl0IGZzLnN0YXQoZGlyKSkubXRpbWUudmFsdWVPZigpLCBkaXJdKTtcbiAgICBidWlsZFRvb2xzRGlycyA9IHBhaXJzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYVswXSA8IGJbMF0pXG4gICAgICAubWFwKChwYWlyKSA9PiBwYWlyWzFdKTtcbiAgfVxuICBsb2cuaW5mbyhgRm91bmQgJHtidWlsZFRvb2xzRGlycy5sZW5ndGh9ICdidWlsZC10b29scycgZm9sZGVycyB1bmRlciAnJHtzZGtSb290fScgKG5ld2VzdCBmaXJzdCk6YCk7XG4gIGZvciAobGV0IGRpciBvZiBidWlsZFRvb2xzRGlycykge1xuICAgIGxvZy5pbmZvKGAgICAgJHtkaXJ9YCk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkVG9vbHNEaXJzO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHBlcm1pc3Npb24gbmFtZXMgZW5jb2RlZCBpbiBgZHVtcHN5cyBwYWNrYWdlYCBjb21tYW5kIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZHVtcHN5c091dHB1dCAtIFRoZSBhY3R1YWwgY29tbWFuZCBvdXRwdXQuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGdyb3VwTmFtZXMgLSBUaGUgbGlzdCBvZiBncm91cCBuYW1lcyB0byBsaXN0IHBlcm1pc3Npb25zIGZvci5cbiAqIEBwYXJhbSB7P2Jvb2xlYW59IGdyYW50ZWRTdGF0ZSAtIFRoZSBleHBlY3RlZCBzdGF0ZSBvZiBgZ3JhbnRlZGAgYXR0cmlidXRlIHRvIGZpbHRlciB3aXRoLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gZmlsdGVyaW5nIGlzIGRvbmUgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2V0LlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcGVybWlzc2lvbiBuYW1lcyBvciBhbiBlbXB0eSBsaXN0IGlmIG5vIG1hdGNoZXMgd2VyZSBmb3VuZC5cbiAqL1xuY29uc3QgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMgPSBmdW5jdGlvbiAoZHVtcHN5c091dHB1dCwgZ3JvdXBOYW1lcywgZ3JhbnRlZFN0YXRlID0gbnVsbCkge1xuICBjb25zdCBncm91cFBhdHRlcm5CeU5hbWUgPSAoZ3JvdXBOYW1lKSA9PiBuZXcgUmVnRXhwKGBeKFxcXFxzKiR7Xy5lc2NhcGVSZWdFeHAoZ3JvdXBOYW1lKX0gcGVybWlzc2lvbnM6W1xcXFxzXFxcXFNdKylgLCAnbScpO1xuICBjb25zdCBpbmRlbnRQYXR0ZXJuID0gL1xcU3wkLztcbiAgY29uc3QgcGVybWlzc2lvbk5hbWVQYXR0ZXJuID0gL2FuZHJvaWRcXC5cXHcqXFwuP3Blcm1pc3Npb25cXC5cXHcrLztcbiAgY29uc3QgZ3JhbnRlZFN0YXRlUGF0dGVybiA9IC9cXGJncmFudGVkPShcXHcrKS87XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IGdyb3VwTmFtZSBvZiBncm91cE5hbWVzKSB7XG4gICAgY29uc3QgZ3JvdXBNYXRjaCA9IGdyb3VwUGF0dGVybkJ5TmFtZShncm91cE5hbWUpLmV4ZWMoZHVtcHN5c091dHB1dCk7XG4gICAgaWYgKCFncm91cE1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IGdyb3VwTWF0Y2hbMV0uc3BsaXQoJ1xcbicpO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPCAyKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0aXRsZUluZGVudCA9IGxpbmVzWzBdLnNlYXJjaChpbmRlbnRQYXR0ZXJuKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMuc2xpY2UoMSkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLnNlYXJjaChpbmRlbnRQYXR0ZXJuKTtcbiAgICAgIGlmIChjdXJyZW50SW5kZW50IDw9IHRpdGxlSW5kZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwZXJtaXNzaW9uTmFtZU1hdGNoID0gcGVybWlzc2lvbk5hbWVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgICBpZiAoIXBlcm1pc3Npb25OYW1lTWF0Y2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtID0ge1xuICAgICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uTmFtZU1hdGNoWzBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdyYW50ZWRTdGF0ZU1hdGNoID0gZ3JhbnRlZFN0YXRlUGF0dGVybi5leGVjKGxpbmUpO1xuICAgICAgaWYgKGdyYW50ZWRTdGF0ZU1hdGNoKSB7XG4gICAgICAgIGl0ZW0uZ3JhbnRlZCA9IGdyYW50ZWRTdGF0ZU1hdGNoWzFdID09PSAndHJ1ZSc7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZFJlc3VsdCA9IHJlc3VsdFxuICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFfLmlzQm9vbGVhbihncmFudGVkU3RhdGUpIHx8IGl0ZW0uZ3JhbnRlZCA9PT0gZ3JhbnRlZFN0YXRlKVxuICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0ucGVybWlzc2lvbik7XG4gIGxvZy5kZWJ1ZyhgUmV0cmlldmVkICR7dXRpbC5wbHVyYWxpemUoJ3Blcm1pc3Npb24nLCBmaWx0ZXJlZFJlc3VsdC5sZW5ndGgsIHRydWUpfSBgICtcbiAgICBgZnJvbSAke2dyb3VwTmFtZXN9ICR7dXRpbC5wbHVyYWxpemUoJ2dyb3VwJywgZ3JvdXBOYW1lcy5sZW5ndGgsIGZhbHNlKX1gKTtcbiAgcmV0dXJuIGZpbHRlcmVkUmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vYW5kcm9pZC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTExMDY0L3doYXQtaXMtYS1wYXJ0aWFsLWFwcGxpY2F0aW9uLWluc3RhbGwtdmlhLWFkYlxuICovXG5cbi8qKlxuICogVHJhbnNmb3JtcyBnaXZlbiBvcHRpb25zIGludG8gdGhlIGxpc3Qgb2YgYGFkYiBpbnN0YWxsLmluc3RhbGwtbXVsdGlwbGVgIGNvbW1hbmQgYXJndW1lbnRzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGFwaUxldmVsIC0gVGhlIGN1cnJlbnQgQVBJIGxldmVsXG4gKiBAcGFyYW0gez9JbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG1hcHBpbmcgdG8gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGFycmF5IG9mIGFyZ3VtZW50c1xuICovXG5mdW5jdGlvbiBidWlsZEluc3RhbGxBcmdzIChhcGlMZXZlbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gIGlmICghdXRpbC5oYXNWYWx1ZShvcHRpb25zLnJlcGxhY2UpIHx8IG9wdGlvbnMucmVwbGFjZSkge1xuICAgIHJlc3VsdC5wdXNoKCctcicpO1xuICB9XG4gIGlmIChvcHRpb25zLmFsbG93VGVzdFBhY2thZ2VzKSB7XG4gICAgcmVzdWx0LnB1c2goJy10Jyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudXNlU2RjYXJkKSB7XG4gICAgcmVzdWx0LnB1c2goJy1zJyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuZ3JhbnRQZXJtaXNzaW9ucykge1xuICAgIGlmIChhcGlMZXZlbCA8IDIzKSB7XG4gICAgICBsb2cuZGVidWcoYFNraXBwaW5nIHBlcm1pc3Npb25zIGdyYW50IG9wdGlvbiwgc2luY2UgYCArXG4gICAgICAgICAgICAgICAgYHRoZSBjdXJyZW50IEFQSSBsZXZlbCAke2FwaUxldmVsfSBkb2VzIG5vdCBzdXBwb3J0IGFwcGxpY2F0aW9ucyBgICtcbiAgICAgICAgICAgICAgICBgcGVybWlzc2lvbnMgY3VzdG9taXphdGlvbmApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCgnLWcnKTtcbiAgICB9XG4gIH1cbiAgLy8gRm9yIG11bHRpcGxlLWluc3RhbGxcbiAgaWYgKG9wdGlvbnMucGFydGlhbEluc3RhbGwpIHtcbiAgICByZXN1bHQucHVzaCgnLXAnKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFuaWZlc3RJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnIC0gVGhlIGFwcGxpY2F0aW9uIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIHBhY2thZ2UgYWN0aXZpdHlcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdmVyc2lvbkNvZGUgLSBUaGUgdmVyc2lvbiBjb2RlIG51bWJlciAobWlnaHQgYmUgYE5hTmApXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZlcnNpb25OYW1lIC0gVGhlIHZlcnNpb24gbmFtZSAobWlnaHQgYmUgYG51bGxgKVxuICovXG5cbi8qKlxuICogUGVyZm9ybSBwYXJzaW5nIG9mIHRoZSBtYW5pZmVzdCBvYmplY3QgaW4gb3JkZXJcbiAqIHRvIGV4dHJhY3Qgc29tZSB2aXRhbCB2YWx1ZXMgZnJvbSBpdFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtYW5pZmVzdCBUaGUgbWFuaWZlc3QgY29udGVudCBmb3JtYXR0ZWQgYXMgSlNPTlxuICogU2VlIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2FkYmtpdC1hcGtyZWFkZXIgZm9yIGRldGFpbGVkIGZvcm1hdCBkZXNjcmlwdGlvblxuICogQHJldHVybnMge01hbmlmZXN0SW5mb31cbiAqL1xuZnVuY3Rpb24gcGFyc2VNYW5pZmVzdCAobWFuaWZlc3QpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHBrZzogbWFuaWZlc3QucGFja2FnZSxcbiAgICB2ZXJzaW9uQ29kZTogcGFyc2VJbnQobWFuaWZlc3QudmVyc2lvbkNvZGUsIDEwKSxcbiAgICB2ZXJzaW9uTmFtZTogbWFuaWZlc3QudmVyc2lvbk5hbWUgfHwgbnVsbCxcbiAgfTtcbiAgaWYgKCFtYW5pZmVzdC5hcHBsaWNhdGlvbikge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBMb29rIGZvciBlbmFibGVkIGFjdGl2aXR5IG9yIGFjdGl2aXR5LWFsaWFzIHdpdGhcbiAgLy8gYWN0aW9uID09IGFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIGFuZFxuICAvLyBjYXRlZ29yeSA9PSBhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUlxuICBmb3IgKGNvbnN0IGFjdGl2aXR5IG9mIFtcbiAgICAuLi5tYW5pZmVzdC5hcHBsaWNhdGlvbi5hY3Rpdml0aWVzLFxuICAgIC4uLm1hbmlmZXN0LmFwcGxpY2F0aW9uLmFjdGl2aXR5QWxpYXNlcyxcbiAgXSkge1xuICAgIGlmIChhY3Rpdml0eS5lbmFibGVkID09PSBmYWxzZSB8fCBfLmlzRW1wdHkoYWN0aXZpdHkuaW50ZW50RmlsdGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qge2FjdGlvbnMsIGNhdGVnb3JpZXN9IG9mIGFjdGl2aXR5LmludGVudEZpbHRlcnMpIHtcbiAgICAgIGlmIChfLmlzRW1wdHkoYWN0aW9ucykgfHwgXy5pc0VtcHR5KGNhdGVnb3JpZXMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc01haW5BY3Rpb24gPSBhY3Rpb25zLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gTUFJTl9BQ1RJT04pO1xuICAgICAgY29uc3QgaXNMYXVuY2hlckNhdGVnb3J5ID0gY2F0ZWdvcmllcy5zb21lKCh7bmFtZX0pID0+IG5hbWUgPT09IExBVU5DSEVSX0NBVEVHT1JZKTtcbiAgICAgIGlmIChpc01haW5BY3Rpb24gJiYgaXNMYXVuY2hlckNhdGVnb3J5KSB7XG4gICAgICAgIHJlc3VsdC5hY3Rpdml0eSA9IGFjdGl2aXR5Lm5hbWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGFyc2VzIGFwayBzdHJpbmdzIGZyb20gYWFwdCB0b29sIG91dHB1dFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdPdXRwdXQgVGhlIGFjdHVhbCB0b29sIG91dHB1dFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZ01hcmtlciBUaGUgY29uZmlnIG1hcmtlci4gVXN1YWxseVxuICogYSBsYW5ndWFnZSBhYmJyZXZpYXRpb24gb3IgYChkZWZhdWx0KWBcbiAqIEByZXR1cm5zIHtPYmplY3R9IFN0cmluZ3MgaWRzIHRvIHZhbHVlcyBtYXBwaW5nLiBQbHVyYWxcbiAqIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYXMgYXJyYXlzLiBJZiBubyBjb25maWcgZm91bmQgZm9yIHRoZVxuICogZ2l2ZW4gbWFya2VyIHRoZW4gYW4gZW1wdHkgbWFwcGluZyBpcyByZXR1cm5lZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VBYXB0U3RyaW5ncyAocmF3T3V0cHV0LCBjb25maWdNYXJrZXIpIHtcbiAgY29uc3Qgbm9ybWFsaXplU3RyaW5nTWF0Y2ggPSBmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzLnJlcGxhY2UoL1wiJC8sICcnKS5yZXBsYWNlKC9eXCIvLCAnJykucmVwbGFjZSgvXFxcXFwiL2csICdcIicpO1xuICB9O1xuXG4gIGNvbnN0IGFwa1N0cmluZ3MgPSB7fTtcbiAgbGV0IGlzSW5Db25maWcgPSBmYWxzZTtcbiAgbGV0IGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgbGV0IGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAvLyBUaGUgcGF0dGVybiBtYXRjaGVzIGFueSBxdW90ZWQgY29udGVudCBpbmNsdWRpbmcgZXNjYXBlZCBxdW90ZXNcbiAgY29uc3QgcXVvdGVkU3RyaW5nUGF0dGVybiA9IC9cIlteXCJcXFxcXSooPzpcXFxcLlteXCJcXFxcXSopKlwiLztcbiAgZm9yIChjb25zdCBsaW5lIG9mIHJhd091dHB1dC5zcGxpdChvcy5FT0wpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAoXy5pc0VtcHR5KHRyaW1tZWRMaW5lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFsnY29uZmlnJywgJ3R5cGUnLCAnc3BlYycsICdQYWNrYWdlJ10uc29tZSgoeCkgPT4gdHJpbW1lZExpbmUuc3RhcnRzV2l0aCh4KSkpIHtcbiAgICAgIGlzSW5Db25maWcgPSB0cmltbWVkTGluZS5zdGFydHNXaXRoKGBjb25maWcgJHtjb25maWdNYXJrZXJ9OmApO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzSW5Db25maWcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKCdyZXNvdXJjZScpKSB7XG4gICAgICBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcblxuICAgICAgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6c3RyaW5nLycpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gLzpzdHJpbmdcXC8oXFxTKyk6Ly5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5pbmNsdWRlcygnOnBsdXJhbHMvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvOnBsdXJhbHNcXC8oXFxTKyk6Ly5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICBpc0luUGx1cmFsR3JvdXAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFJlc291cmNlSWQgJiYgdHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnKHN0cmluZycpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHF1b3RlZFN0cmluZ1BhdHRlcm4uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBub3JtYWxpemVTdHJpbmdNYXRjaChtYXRjaFswXSk7XG4gICAgICB9XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFJlc291cmNlSWQgJiYgaXNJblBsdXJhbEdyb3VwICYmIHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6IChzdHJpbmcnKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBxdW90ZWRTdHJpbmdQYXR0ZXJuLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gW1xuICAgICAgICAgIC4uLihhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSB8fCBbXSksXG4gICAgICAgICAgbm9ybWFsaXplU3RyaW5nTWF0Y2gobWF0Y2hbMF0pLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBhcGtTdHJpbmdzO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhcGsgc3RyaW5ncyBmcm9tIGFhcHQyIHRvb2wgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd091dHB1dCBUaGUgYWN0dWFsIHRvb2wgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnTWFya2VyIFRoZSBjb25maWcgbWFya2VyLiBVc3VhbGx5XG4gKiBhIGxhbmd1YWdlIGFiYnJldmlhdGlvbiBvciBhbiBlbXB0eSBzdHJpbmcgZm9yIHRoZSBkZWZhdWx0IG9uZVxuICogQHJldHVybnMge09iamVjdH0gU3RyaW5ncyBpZHMgdG8gdmFsdWVzIG1hcHBpbmcuIFBsdXJhbFxuICogdmFsdWVzIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMuIElmIG5vIGNvbmZpZyBmb3VuZCBmb3IgdGhlXG4gKiBnaXZlbiBtYXJrZXIgdGhlbiBhbiBlbXB0eSBtYXBwaW5nIGlzIHJldHVybmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUFhcHQyU3RyaW5ncyAocmF3T3V0cHV0LCBjb25maWdNYXJrZXIpIHtcbiAgY29uc3QgYWxsTGluZXMgPSByYXdPdXRwdXQuc3BsaXQob3MuRU9MKTtcbiAgZnVuY3Rpb24gZXh0cmFjdENvbnRlbnQgKHN0YXJ0SWR4KSB7XG4gICAgbGV0IGlkeCA9IHN0YXJ0SWR4O1xuICAgIGNvbnN0IHN0YXJ0Q2hhclBvcyA9IGFsbExpbmVzW3N0YXJ0SWR4XS5pbmRleE9mKCdcIicpO1xuICAgIGlmIChzdGFydENoYXJQb3MgPCAwKSB7XG4gICAgICByZXR1cm4gW251bGwsIGlkeF07XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICB3aGlsZSAoaWR4IDwgYWxsTGluZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0ZXJtaW5hdGlvbkNoYXJNYXRjaCA9IC9cIiQvLmV4ZWMoYWxsTGluZXNbaWR4XSk7XG4gICAgICBpZiAodGVybWluYXRpb25DaGFyTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgdGVybWluYXRpb25DaGFyUG9zID0gdGVybWluYXRpb25DaGFyTWF0Y2guaW5kZXg7XG4gICAgICAgIGlmIChzdGFydElkeCA9PT0gaWR4KSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKHN0YXJ0Q2hhclBvcyArIDEsIHRlcm1pbmF0aW9uQ2hhclBvcyksXG4gICAgICAgICAgICBpZHhcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYCR7cmVzdWx0fVxcXFxuJHtfLnRyaW1TdGFydChhbGxMaW5lc1tpZHhdLnN1YnN0cmluZygwLCB0ZXJtaW5hdGlvbkNoYXJQb3MpKX1gLFxuICAgICAgICAgIGlkeCxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGlmIChpZHggPiBzdGFydElkeCkge1xuICAgICAgICByZXN1bHQgKz0gYFxcXFxuJHtfLnRyaW1TdGFydChhbGxMaW5lc1tpZHhdKX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKHN0YXJ0Q2hhclBvcyArIDEpO1xuICAgICAgfVxuICAgICAgKytpZHg7XG4gICAgfVxuICAgIHJldHVybiBbcmVzdWx0LCBpZHhdO1xuICB9XG5cbiAgY29uc3QgYXBrU3RyaW5ncyA9IHt9O1xuICBsZXQgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICBsZXQgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gIGxldCBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuICBsZXQgbGluZUluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVJbmRleCA8IGFsbExpbmVzLmxlbmd0aCkge1xuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gYWxsTGluZXNbbGluZUluZGV4XS50cmltKCk7XG4gICAgaWYgKF8uaXNFbXB0eSh0cmltbWVkTGluZSkpIHtcbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFsndHlwZScsICdQYWNrYWdlJ10uc29tZSgoeCkgPT4gdHJpbW1lZExpbmUuc3RhcnRzV2l0aCh4KSkpIHtcbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgaXNJbkN1cnJlbnRDb25maWcgPSBmYWxzZTtcbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJ3Jlc291cmNlJykpIHtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJbkN1cnJlbnRDb25maWcgPSBmYWxzZTtcblxuICAgICAgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCdzdHJpbmcvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvc3RyaW5nXFwvKFxcUyspLy5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5pbmNsdWRlcygncGx1cmFscy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9wbHVyYWxzXFwvKFxcUyspLy5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICBpc0luUGx1cmFsR3JvdXAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICArK2xpbmVJbmRleDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCkge1xuICAgICAgaWYgKGlzSW5QbHVyYWxHcm91cCkge1xuICAgICAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnKCcpKSB7XG4gICAgICAgICAgaXNJbkN1cnJlbnRDb25maWcgPSB0cmltbWVkTGluZS5zdGFydHNXaXRoKGAoJHtjb25maWdNYXJrZXJ9KWApO1xuICAgICAgICAgICsrbGluZUluZGV4O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0luQ3VycmVudENvbmZpZykge1xuICAgICAgICAgIGNvbnN0IFtjb250ZW50LCBpZHhdID0gZXh0cmFjdENvbnRlbnQobGluZUluZGV4KTtcbiAgICAgICAgICBsaW5lSW5kZXggPSBpZHg7XG4gICAgICAgICAgaWYgKF8uaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gW1xuICAgICAgICAgICAgICAuLi4oYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gfHwgW10pLFxuICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aChgKCR7Y29uZmlnTWFya2VyfSlgKSkge1xuICAgICAgICBjb25zdCBbY29udGVudCwgaWR4XSA9IGV4dHJhY3RDb250ZW50KGxpbmVJbmRleCk7XG4gICAgICAgIGxpbmVJbmRleCA9IGlkeDtcbiAgICAgICAgaWYgKF8uaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgICAgICBhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSA9IGNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICArK2xpbmVJbmRleDtcbiAgfVxuICByZXR1cm4gYXBrU3RyaW5ncztcbn1cblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBjb25maWcgbWFya2VyLCB3aGljaCBpcyB0aGVuIHBhc3NlZCB0byBwYXJzZS4uIG1ldGhvZHNcbiAqIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIHJlc291cmNlIGZvcm1hdHMgZ2VuZXJhdGVkIGJ5IGFhcHQoMikgdG9vbFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbmZpZ3NHZXR0ZXIgVGhlIGZ1bmN0aW9uIHdob3NlIHJlc3VsdCBpcyBhIGxpc3RcbiAqIG9mIGFwayBjb25maWdzXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzaXJlZE1hcmtlciBUaGUgZGVzaXJlZCBjb25maWcgbWFya2VyIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVmYXVsdE1hcmtlciBUaGUgZGVmYXVsdCBjb25maWcgbWFya2VyIHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgY29uZmlnIG1hcmtlclxuICovXG5hc3luYyBmdW5jdGlvbiBmb3JtYXRDb25maWdNYXJrZXIgKGNvbmZpZ3NHZXR0ZXIsIGRlc2lyZWRNYXJrZXIsIGRlZmF1bHRNYXJrZXIpIHtcbiAgbGV0IGNvbmZpZ01hcmtlciA9IGRlc2lyZWRNYXJrZXIgfHwgZGVmYXVsdE1hcmtlcjtcbiAgaWYgKGNvbmZpZ01hcmtlci5pbmNsdWRlcygnLScpICYmICFjb25maWdNYXJrZXIuaW5jbHVkZXMoJy1yJykpIHtcbiAgICBjb25maWdNYXJrZXIgPSBjb25maWdNYXJrZXIucmVwbGFjZSgnLScsICctcicpO1xuICB9XG4gIGNvbnN0IGNvbmZpZ3MgPSBhd2FpdCBjb25maWdzR2V0dGVyKCk7XG4gIGxvZy5kZWJ1ZyhgUmVzb3VyY2UgY29uZmlndXJhdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlncyl9YCk7XG4gIC8vIEFzc3VtZSB0aGUgJ2VuJyBjb25maWd1cmF0aW9uIGlzIHRoZSBkZWZhdWx0IG9uZVxuICBpZiAoY29uZmlnTWFya2VyLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnZW4nKVxuICAgICYmICFjb25maWdzLnNvbWUoKHgpID0+IHgudHJpbSgpID09PSBjb25maWdNYXJrZXIpKSB7XG4gICAgbG9nLmRlYnVnKGBSZXNvdXJjZSBjb25maWd1cmF0aW9uIG5hbWUgJyR7Y29uZmlnTWFya2VyfScgaXMgdW5rbm93bi4gYCArXG4gICAgICBgUmVwbGFjaW5nIGl0IHdpdGggJyR7ZGVmYXVsdE1hcmtlcn0nYCk7XG4gICAgY29uZmlnTWFya2VyID0gZGVmYXVsdE1hcmtlcjtcbiAgfSBlbHNlIHtcbiAgICBsb2cuZGVidWcoYFNlbGVjdGVkIGNvbmZpZ3VyYXRpb246ICcke2NvbmZpZ01hcmtlcn0nYCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZ01hcmtlcjtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIG91dHB1dCBpbiBKU09OIGZvcm1hdCByZXRyaWV2ZWQgZnJvbVxuICogdGhlIGNvcnJlc3BvbmRpbmcgQXBwaXVtIFNldHRpbmdzIGJyb2FkY2FzdCBjYWxsc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgVGhlIGFjdHVhbCBjb21tYW5kIG91dHB1dFxuICogQHBhcmFtIHtzdHJpbmd9IGVudGl0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudGl0eSB3aGljaCBpc1xuICogZ29pbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcGFyc2VkIEpTT04gb2JqZWN0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG91dHB1dCBjYW5ub3QgYmUgcGFyc2VkXG4gKiBhcyBhIHZhbGlkIEpTT05cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uRGF0YSAob3V0cHV0LCBlbnRpdHlOYW1lKSB7XG4gIGlmICghL1xcYnJlc3VsdD0tMVxcYi8udGVzdChvdXRwdXQpIHx8ICEvXFxiZGF0YT1cIi8udGVzdChvdXRwdXQpKSB7XG4gICAgbG9nLmRlYnVnKG91dHB1dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgJHtlbnRpdHlOYW1lfSBmcm9tIHRoZSBkZXZpY2UuIGAgK1xuICAgICAgJ0NoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMnKTtcbiAgfVxuICBjb25zdCBtYXRjaCA9IC9cXGJkYXRhPShcIi4rKS8uZXhlYyhvdXRwdXQpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKG91dHB1dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgJHtlbnRpdHlOYW1lfSBmcm9tIHRoZSBjb21tYW5kIG91dHB1dC4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG4gIGNvbnN0IGpzb25TdHIgPSBfLnRyaW0obWF0Y2hbMV0pLnJlcGxhY2UoLyheXCIpfChcIiQpL2csICcnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1Zyhqc29uU3RyKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIHJlc3VsdGluZyBkYXRhIHN0cmluZy4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgYW5kIGNvdW50cnkgYWJicmV2aWF0aW9uc1xuICogdG8gQVZEIGFyZ3VtZW50cyBhcnJheVxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgTGFuZ3VhZ2UgbmFtZSwgZm9yIGV4YW1wbGUgJ2ZyJ1xuICogQHBhcmFtIHs/c3RyaW5nfSBjb3VudHJ5IENvdW50cnkgbmFtZSwgZm9yIGV4YW1wbGUgJ0NBJ1xuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBnZW5lcmF0ZWQgYXJndW1lbnRzLiBUaGVcbiAqIHJlc3VsdGluZyBhcnJheSBtaWdodCBiZSBlbXB0eSBpZiBib3RoIGFyZ3VtZW50cyBhcmUgZW1wdHlcbiAqL1xuZnVuY3Rpb24gdG9BdmRMb2NhbGVBcmdzIChsYW5ndWFnZSwgY291bnRyeSkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgaWYgKGxhbmd1YWdlICYmIF8uaXNTdHJpbmcobGFuZ3VhZ2UpKSB7XG4gICAgcmVzdWx0LnB1c2goJy1wcm9wJywgYHBlcnNpc3Quc3lzLmxhbmd1YWdlPSR7bGFuZ3VhZ2UudG9Mb3dlckNhc2UoKX1gKTtcbiAgfVxuICBpZiAoY291bnRyeSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpKSB7XG4gICAgcmVzdWx0LnB1c2goJy1wcm9wJywgYHBlcnNpc3Quc3lzLmNvdW50cnk9JHtjb3VudHJ5LnRvVXBwZXJDYXNlKCl9YCk7XG4gIH1cbiAgbGV0IGxvY2FsZTtcbiAgaWYgKF8uaXNTdHJpbmcobGFuZ3VhZ2UpICYmIF8uaXNTdHJpbmcoY291bnRyeSkgJiYgbGFuZ3VhZ2UgJiYgY291bnRyeSkge1xuICAgIGxvY2FsZSA9IGxhbmd1YWdlLnRvTG93ZXJDYXNlKCkgKyAnLScgKyBjb3VudHJ5LnRvVXBwZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAobGFuZ3VhZ2UgJiYgXy5pc1N0cmluZyhsYW5ndWFnZSkpIHtcbiAgICBsb2NhbGUgPSBsYW5ndWFnZS50b0xvd2VyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKGNvdW50cnkgJiYgXy5pc1N0cmluZyhjb3VudHJ5KSkge1xuICAgIGxvY2FsZSA9IGNvdW50cnk7XG4gIH1cbiAgaWYgKGxvY2FsZSkge1xuICAgIHJlc3VsdC5wdXNoKCctcHJvcCcsIGBwZXJzaXN0LnN5cy5sb2NhbGU9JHtsb2NhbGV9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgQW5kcm9pZCBwcmVmZXJlbmNlcyByb290XG4gKlxuICogQHJldHVybnMgez9zdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIGZvbGRlciBvciBgbnVsbGAgaWYgdGhlIGZvbGRlciBjYW5ub3QgYmUgZm91bmRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QW5kcm9pZFByZWZzUm9vdCAoKSB7XG4gIGxldCBsb2NhdGlvbiA9IHByb2Nlc3MuZW52LkFORFJPSURfRU1VTEFUT1JfSE9NRTtcbiAgaWYgKGF3YWl0IGRpckV4aXN0cyhsb2NhdGlvbikpIHtcbiAgICByZXR1cm4gbG9jYXRpb247XG4gIH1cblxuICBpZiAobG9jYXRpb24pIHtcbiAgICBsb2cud2FybihgVGhlIHZhbHVlIG9mIHRoZSBBTkRST0lEX0VNVUxBVE9SX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgJyR7bG9jYXRpb259JyBpcyBub3QgYW4gZXhpc3RpbmcgZGlyZWN0b3J5YCk7XG4gIH1cblxuICBjb25zdCBob21lID0gcHJvY2Vzcy5lbnYuSE9NRSB8fCBwcm9jZXNzLmVudi5VU0VSUFJPRklMRTtcbiAgaWYgKGhvbWUpIHtcbiAgICBsb2NhdGlvbiA9IHBhdGgucmVzb2x2ZShob21lLCAnLmFuZHJvaWQnKTtcbiAgfVxuXG4gIGlmICghYXdhaXQgZGlyRXhpc3RzKGxvY2F0aW9uKSkge1xuICAgIGxvZy5kZWJ1ZyhgQW5kcm9pZCBjb25maWcgcm9vdCAnJHtsb2NhdGlvbn0nIGlzIG5vdCBhbiBleGlzdGluZyBkaXJlY3RvcnlgKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBsb2NhdGlvbjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhdGggZXhpc3RzIG9uIHRoZSBmaWxlc3lzdGVtIGFuZCBpcyBhIGRpcmVjdG9yeVxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbG9jYXRpb24gVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlyRXhpc3RzIChsb2NhdGlvbikge1xuICByZXR1cm4gbG9jYXRpb25cbiAgICAmJiBhd2FpdCBmcy5leGlzdHMobG9jYXRpb24pXG4gICAgJiYgKGF3YWl0IGZzLnN0YXQobG9jYXRpb24pKS5pc0RpcmVjdG9yeSgpO1xufVxuXG4vKipcbiAqIEVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuXG4gKiBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCBwb3NzaWJsZSBpc3N1ZXMgd2l0aCBob3cgc3lzdGVtIGBzcGF3bmBcbiAqIGNhbGwgaGFuZGxlcyB0aGVtLlxuICogU2VlIGh0dHBzOi8vZGlzY3Vzcy5hcHBpdW0uaW8vdC9ob3ctdG8tbW9kaWZ5LXdkLXByb3h5LWFuZC11aWF1dG9tYXRvcjItc291cmNlLWNvZGUtdG8tc3VwcG9ydC11bmljb2RlLzMzNDY2XG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmcgTm9uLWVzY2FwZWQgYXJndW1lbnQgc3RyaW5nXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBhcmd1bWVudFxuICovXG5mdW5jdGlvbiBlc2NhcGVTaGVsbEFyZyAoYXJnKSB7XG4gIGFyZyA9IGAke2FyZ31gO1xuICBpZiAoc3lzdGVtLmlzV2luZG93cygpKSB7XG4gICAgcmV0dXJuIC9bJnxeXFxzXS8udGVzdChhcmcpID8gYFwiJHthcmcucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImAgOiBhcmc7XG4gIH1cbiAgcmV0dXJuIGFyZy5yZXBsYWNlKC8mL2csICdcXFxcJicpO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbmFtZSBvZiBsYXVuY2hhYmxlIHBhY2thZ2UgYWN0aXZpdHlcbiAqIGZyb20gZHVtcHN5cyBvdXRwdXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGR1bXBzeXMgdGhlIGFjdHVhbCBkdW1wc3lzIG91dHB1dFxuICogQHJldHVybnMge3N0cmluZ1tdfSBFaXRoZXIgdGhlIGZ1bGx5IHF1YWxpZmllZFxuICogYWN0aXZpdHkgbmFtZSBhcyBhIHNpbmdsZSBsaXN0IGl0ZW0gb3IgYW4gZW1wdHkgbGlzdCBpZiBub3RoaW5nIGNvdWxkIGJlIHBhcnNlZC5cbiAqIEluIEFuZHJvaWQgNiBhbmQgb2xkZXIgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGRldGVybWluZVxuICogdGhlIGNhdGVnb3J5IG5hbWUgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eSwgc28gdGhpcyBBUEkganVzdFxuICogcmV0dXJucyBhbGwgYWN0aXZpdHkgbmFtZXMgYmVsb25naW5nIHRvICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTidcbiAqIHdpdGggdGhlIGV4cGVjdGF0aW9uIHRoYXQgdGhlIGFwcCBtYW5pZmVzdCBjb3VsZCBiZSBwYXJzZWQgbmV4dFxuICogaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGNhdGVnb3J5IG5hbWVzIGZvciB0aGVzZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcyAoZHVtcHN5cykge1xuICBjb25zdCBtYWluQWN0aXZpdHlOYW1lUmUgPSBuZXcgUmVnRXhwKGBeXFxcXHMqJHtfLmVzY2FwZVJlZ0V4cChNQUlOX0FDVElPTil9OiRgKTtcbiAgY29uc3QgY2F0ZWdvcnlOYW1lUmUgPSAvXlxccypDYXRlZ29yeTpcXHMrXCIoW2EtekEtWjAtOS5fLy1dKylcIiQvO1xuICBjb25zdCBibG9ja3MgPSBbXTtcbiAgbGV0IGJsb2NrU3RhcnRJbmRlbnQ7XG4gIGxldCBibG9jayA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZHVtcHN5cy5zcGxpdCgnXFxuJykubWFwKF8udHJpbUVuZCkpIHtcbiAgICBjb25zdCBjdXJyZW50SW5kZW50ID0gbGluZS5sZW5ndGggLSBfLnRyaW1TdGFydChsaW5lKS5sZW5ndGg7XG4gICAgaWYgKG1haW5BY3Rpdml0eU5hbWVSZS50ZXN0KGxpbmUpKSB7XG4gICAgICBibG9ja1N0YXJ0SW5kZW50ID0gY3VycmVudEluZGVudDtcbiAgICAgIGlmICghXy5pc0VtcHR5KGJsb2NrKSkge1xuICAgICAgICBibG9ja3MucHVzaChibG9jayk7XG4gICAgICAgIGJsb2NrID0gW107XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKF8uaXNOaWwoYmxvY2tTdGFydEluZGVudCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50SW5kZW50ID4gYmxvY2tTdGFydEluZGVudCkge1xuICAgICAgYmxvY2sucHVzaChsaW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzRW1wdHkoYmxvY2spKSB7XG4gICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgYmxvY2sgPSBbXTtcbiAgICAgIH1cbiAgICAgIGJsb2NrU3RhcnRJbmRlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBpZiAoIV8uaXNFbXB0eShibG9jaykpIHtcbiAgICBibG9ja3MucHVzaChibG9jayk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGJsb2Nrcykge1xuICAgIGxldCBoYXNDYXRlZ29yeSA9IGZhbHNlO1xuICAgIGxldCBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgaXRlbSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBjYXRlZ29yeU5hbWVSZS5leGVjKGxpbmUpO1xuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaGFzQ2F0ZWdvcnkgPSB0cnVlO1xuICAgICAgaXNMYXVuY2hlckNhdGVnb3J5ID0gbWF0Y2hbMV0gPT09IExBVU5DSEVSX0NBVEVHT1JZO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE9uIG9sZGVyIEFuZHJvaWQgdmVyc2lvbnMgdGhlIGNhdGVnb3J5IG5hbWVcbiAgICAvLyBtaWdodCBub3QgYmUgbGlzdGVkLCBzbyB3ZSBqdXN0IHRyeSB0byBmZXRjaFxuICAgIC8vIGFsbCBtYXRjaGVzIGluc3RlYWRcbiAgICBpZiAoaGFzQ2F0ZWdvcnkgJiYgIWlzTGF1bmNoZXJDYXRlZ29yeSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhY3Rpdml0eU5hbWVTdHIgb2YgaXRlbS5tYXAoXy50cmltKS5maWx0ZXIoQm9vbGVhbikpIHtcbiAgICAgIGNvbnN0IGZxQWN0aXZpdHlOYW1lID0gYWN0aXZpdHlOYW1lU3RyLnNwbGl0KC9cXHMrLylbMV07XG4gICAgICBpZiAoIW1hdGNoQ29tcG9uZW50TmFtZShmcUFjdGl2aXR5TmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0xhdW5jaGVyQ2F0ZWdvcnkpIHtcbiAgICAgICAgcmV0dXJuIFtmcUFjdGl2aXR5TmFtZV07XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChmcUFjdGl2aXR5TmFtZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIGNvbXBvbmVudCBuYW1lXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzU3RyaW5nIFRoZSBzdHJpbmcgdG8gdmVyaWZ5XG4gKiBAcmV0dXJuIHs/QXJyYXk8TWF0Y2g+fSBUaGUgcmVzdWx0IG9mIFJlZ2V4cC5leGVjIG9wZXJhdGlvblxuICogb3IgX251bGxfIGlmIG5vIG1hdGNoZXMgYXJlIGZvdW5kXG4gKi9cbmZ1bmN0aW9uIG1hdGNoQ29tcG9uZW50TmFtZSAoY2xhc3NTdHJpbmcpIHtcbiAgLy8gc29tZS5wYWNrYWdlL3NvbWUucGFja2FnZS5BY3Rpdml0eVxuICByZXR1cm4gL15bYS16MC05Li9fXSskL2kuZXhlYyhjbGFzc1N0cmluZyk7XG59XG5cbmV4cG9ydCB7XG4gIGdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGgsIHVuemlwRmlsZSxcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldEphdmFGb3JPcywgaXNTaG93aW5nTG9ja3NjcmVlbiwgaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkLFxuICBnZXRTdXJmYWNlT3JpZW50YXRpb24sIGlzU2NyZWVuT25GdWxseSwgYnVpbGRTdGFydENtZCwgZ2V0SmF2YUhvbWUsXG4gIGdldFNka1Rvb2xzVmVyc2lvbiwgZ2V0QXBrc2lnbmVyRm9yT3MsIGdldEJ1aWxkVG9vbHNEaXJzLFxuICBnZXRBcGthbmFseXplckZvck9zLCBnZXRPcGVuU3NsRm9yT3MsIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zLCBBUEtTX0VYVEVOU0lPTixcbiAgQVBLX0lOU1RBTExfVElNRU9VVCwgQVBLU19JTlNUQUxMX1RJTUVPVVQsIGJ1aWxkSW5zdGFsbEFyZ3MsIEFQS19FWFRFTlNJT04sXG4gIERFRkFVTFRfQURCX0VYRUNfVElNRU9VVCwgcGFyc2VNYW5pZmVzdCwgcGFyc2VBYXB0U3RyaW5ncywgcGFyc2VBYXB0MlN0cmluZ3MsXG4gIGZvcm1hdENvbmZpZ01hcmtlciwgcGFyc2VKc29uRGF0YSwgdW5zaWduQXBrLCB0b0F2ZExvY2FsZUFyZ3MsIHJlcXVpcmVTZGtSb290LFxuICBnZXRTZGtSb290RnJvbUVudiwgZ2V0QW5kcm9pZFByZWZzUm9vdCwgZGlyRXhpc3RzLCBlc2NhcGVTaGVsbEFyZyxcbiAgcGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcywgbWF0Y2hDb21wb25lbnROYW1l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
|
package/lib/helpers.js
CHANGED
|
@@ -22,18 +22,18 @@ const LAUNCHER_CATEGORY = 'android.intent.category.LAUNCHER';
|
|
|
22
22
|
* @throws {Error} If the current module root folder cannot be determined
|
|
23
23
|
*/
|
|
24
24
|
const getModuleRoot = _.memoize(function getModuleRoot () {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
let currentDir = path.dirname(path.resolve(__filename));
|
|
26
|
+
let isAtFsRoot = false;
|
|
27
|
+
while (!isAtFsRoot) {
|
|
28
28
|
const manifestPath = path.join(currentDir, 'package.json');
|
|
29
29
|
try {
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
if (JSON.parse(_fs.readFileSync(manifestPath, 'utf8')).name === 'appium-adb') {
|
|
30
|
+
if (_fs.existsSync(manifestPath) &&
|
|
31
|
+
JSON.parse(_fs.readFileSync(manifestPath, 'utf8')).name === 'appium-adb') {
|
|
34
32
|
return currentDir;
|
|
35
33
|
}
|
|
36
34
|
} catch (ign) {}
|
|
35
|
+
currentDir = path.dirname(currentDir);
|
|
36
|
+
isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;
|
|
37
37
|
}
|
|
38
38
|
throw new Error('Cannot find the root folder of the appium-adb Node.js module');
|
|
39
39
|
});
|
package/package.json
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-adb",
|
|
3
|
-
"version": "9.10.
|
|
3
|
+
"version": "9.10.8",
|
|
4
4
|
"description": "Android Debug Bridge interface",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"build": "
|
|
7
|
+
"build": "rimraf build && babel --out-dir=build/lib lib && babel --out-dir=build index.js",
|
|
8
8
|
"dev": "npm run build -- --watch",
|
|
9
9
|
"lint": "eslint .",
|
|
10
10
|
"lint:fix": "npm run lint -- --fix",
|
|
11
11
|
"precommit-lint": "lint-staged",
|
|
12
12
|
"precommit-msg": "echo 'Pre-commit checks...' && exit 0",
|
|
13
|
+
"prepare": "npm run build",
|
|
13
14
|
"test": "mocha --exit --timeout 1m \"./test/unit/**/*-specs.js\"",
|
|
14
15
|
"e2e-test": "mocha --exit --timeout 5m \"./test/functional/**/*-specs.js\""
|
|
15
16
|
},
|
|
@@ -89,6 +90,7 @@
|
|
|
89
90
|
"mocha": "^10.0.0",
|
|
90
91
|
"pre-commit": "^1.1.3",
|
|
91
92
|
"prettier": "^2.7.1",
|
|
93
|
+
"rimraf": "^3.0.2",
|
|
92
94
|
"semantic-release": "^19.0.2",
|
|
93
95
|
"sinon": "^14.0.0",
|
|
94
96
|
"temp": "^0.x"
|