appium
Version:
Automation for Apps.
376 lines (307 loc) • 22.4 kB
JavaScript
;
var _slicedToArray = require('babel-runtime/helpers/sliced-to-array')['default'];
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _getIterator = require('babel-runtime/core-js/get-iterator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
Object.defineProperty(exports, '__esModule', {
value: true
});
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _appiumSupport = require('appium-support');
var _teen_process = require('teen_process');
var _logger = require('./logger');
var _logger2 = _interopRequireDefault(_logger);
var _packageJson = require('../../package.json');
var _packageJson2 = _interopRequireDefault(_packageJson);
// eslint-disable-line import/no-unresolved
var APPIUM_VER = _packageJson2['default'].version;
function getNodeVersion() {
// expect v<major>.<minor>.<patch>
// we will pull out `major` and `minor`
var version = process.version.match(/^v(\d+)\.(\d+)/);
return [Number(version[1]), Number(version[2])];
}
function getGitRev() {
var cwd, rev, _ref, stdout;
return _regeneratorRuntime.async(function getGitRev$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
cwd = _path2['default'].resolve(__dirname, "..", "..");
rev = null;
context$1$0.prev = 2;
context$1$0.next = 5;
return _regeneratorRuntime.awrap((0, _teen_process.exec)("git", ["rev-parse", "HEAD"], { cwd: cwd }));
case 5:
_ref = context$1$0.sent;
stdout = _ref.stdout;
rev = stdout.trim();
context$1$0.next = 12;
break;
case 10:
context$1$0.prev = 10;
context$1$0.t0 = context$1$0['catch'](2);
case 12:
return context$1$0.abrupt('return', rev);
case 13:
case 'end':
return context$1$0.stop();
}
}, null, this, [[2, 10]]);
}
function getAppiumConfig() {
var stat, built, config;
return _regeneratorRuntime.async(function getAppiumConfig$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.next = 2;
return _regeneratorRuntime.awrap(_appiumSupport.fs.stat(_path2['default'].resolve(__dirname, '..')));
case 2:
stat = context$1$0.sent;
built = stat.mtime.getTime();
context$1$0.next = 6;
return _regeneratorRuntime.awrap(getGitRev());
case 6:
context$1$0.t0 = context$1$0.sent;
context$1$0.t1 = built;
context$1$0.t2 = APPIUM_VER;
config = {
'git-sha': context$1$0.t0,
built: context$1$0.t1,
version: context$1$0.t2
};
return context$1$0.abrupt('return', config);
case 11:
case 'end':
return context$1$0.stop();
}
}, null, this);
}
function checkNodeOk() {
var _getNodeVersion = getNodeVersion();
var _getNodeVersion2 = _slicedToArray(_getNodeVersion, 2);
var major = _getNodeVersion2[0];
var minor = _getNodeVersion2[1];
if (major < 5) {
var msg = 'Node version must be >= 5. Currently ' + major + '.' + minor;
_logger2['default'].errorAndThrow(msg);
}
}
function warnNodeDeprecations() {
var _getNodeVersion3 = getNodeVersion();
var _getNodeVersion32 = _slicedToArray(_getNodeVersion3, 1);
var major = _getNodeVersion32[0];
if (major < 4) {
_logger2['default'].warn("Appium support for versions of node < 4 has been " + "deprecated and will be removed in a future version. Please " + "upgrade!");
}
}
function showConfig() {
var config;
return _regeneratorRuntime.async(function showConfig$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.next = 2;
return _regeneratorRuntime.awrap(getAppiumConfig());
case 2:
config = context$1$0.sent;
console.log(JSON.stringify(config)); // eslint-disable-line no-console
case 4:
case 'end':
return context$1$0.stop();
}
}, null, this);
}
function getNonDefaultArgs(parser, args) {
var nonDefaults = {};
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = _getIterator(parser.rawArgs), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var rawArg = _step.value;
var arg = rawArg[1].dest;
if (args[arg] && args[arg] !== rawArg[1].defaultValue) {
nonDefaults[arg] = args[arg];
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return nonDefaults;
}
function getDeprecatedArgs(parser, args) {
// go through the server command line arguments and figure
// out which of the ones used are deprecated
var deprecated = {};
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = _getIterator(parser.rawArgs), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var rawArg = _step2.value;
var arg = rawArg[1].dest;
var defaultValue = rawArg[1].defaultValue;
var isDeprecated = !!rawArg[1].deprecatedFor;
if (args[arg] && args[arg] !== defaultValue && isDeprecated) {
deprecated[rawArg[0]] = rawArg[1].deprecatedFor;
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2['return']) {
_iterator2['return']();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
return deprecated;
}
function checkValidPort(port, portName) {
if (port > 0 && port < 65536) return true; // eslint-disable-line curly
_logger2['default'].error('Port \'' + portName + '\' must be greater than 0 and less than 65536. Currently ' + port);
return false;
}
function validateServerArgs(parser, args) {
// arguments that cannot both be set
var exclusives = [['noReset', 'fullReset'], ['ipa', 'safari'], ['app', 'safari'], ['forceIphone', 'forceIpad'], ['deviceName', 'defaultDevice']];
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = _getIterator(exclusives), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var exSet = _step3.value;
var numFoundInArgs = 0;
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined;
try {
for (var _iterator5 = _getIterator(exSet), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var opt = _step5.value;
if (_lodash2['default'].has(args, opt) && args[opt]) {
numFoundInArgs++;
}
}
} catch (err) {
_didIteratorError5 = true;
_iteratorError5 = err;
} finally {
try {
if (!_iteratorNormalCompletion5 && _iterator5['return']) {
_iterator5['return']();
}
} finally {
if (_didIteratorError5) {
throw _iteratorError5;
}
}
}
if (numFoundInArgs > 1) {
throw new Error('You can\'t pass in more than one argument from the ' + ('set ' + JSON.stringify(exSet) + ', since they are ') + 'mutually exclusive');
}
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3['return']) {
_iterator3['return']();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
var validations = {
port: checkValidPort,
callbackPort: checkValidPort,
bootstrapPort: checkValidPort,
selendroidPort: checkValidPort,
chromedriverPort: checkValidPort,
robotPort: checkValidPort,
backendRetries: function backendRetries(r) {
return r >= 0;
}
};
var nonDefaultArgs = getNonDefaultArgs(parser, args);
var _iteratorNormalCompletion4 = true;
var _didIteratorError4 = false;
var _iteratorError4 = undefined;
try {
for (var _iterator4 = _getIterator(_lodash2['default'].toPairs(validations)), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
var _step4$value = _slicedToArray(_step4.value, 2);
var arg = _step4$value[0];
var validator = _step4$value[1];
if (_lodash2['default'].has(nonDefaultArgs, arg)) {
if (!validator(args[arg], arg)) {
throw new Error('Invalid argument for param ' + arg + ': ' + args[arg]);
}
}
}
} catch (err) {
_didIteratorError4 = true;
_iteratorError4 = err;
} finally {
try {
if (!_iteratorNormalCompletion4 && _iterator4['return']) {
_iterator4['return']();
}
} finally {
if (_didIteratorError4) {
throw _iteratorError4;
}
}
}
}
function validateTmpDir(tmpDir) {
return _regeneratorRuntime.async(function validateTmpDir$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.prev = 0;
context$1$0.next = 3;
return _regeneratorRuntime.awrap((0, _appiumSupport.mkdirp)(tmpDir));
case 3:
context$1$0.next = 8;
break;
case 5:
context$1$0.prev = 5;
context$1$0.t0 = context$1$0['catch'](0);
throw new Error('We could not ensure that the temp dir you specified ' + ('(' + tmpDir + ') exists. Please make sure it\'s writeable.'));
case 8:
case 'end':
return context$1$0.stop();
}
}, null, this, [[0, 5]]);
}
exports.getAppiumConfig = getAppiumConfig;
exports.validateServerArgs = validateServerArgs;
exports.checkNodeOk = checkNodeOk;
exports.showConfig = showConfig;
exports.warnNodeDeprecations = warnNodeDeprecations;
exports.validateTmpDir = validateTmpDir;
exports.getNonDefaultArgs = getNonDefaultArgs;
exports.getDeprecatedArgs = getDeprecatedArgs;
exports.getGitRev = getGitRev;
exports.checkValidPort = checkValidPort;
exports.APPIUM_VER = APPIUM_VER;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtBQUM5QixnQkFBTSxJQUFJLEtBQUssaUNBQStCLEdBQUcsVUFBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUcsQ0FBQztTQUNwRTtPQUNGO0tBQ0Y7Ozs7Ozs7Ozs7Ozs7OztDQUNGOztBQUVELFNBQWUsY0FBYyxDQUFFLE1BQU07Ozs7Ozt5Q0FFM0IsMkJBQU8sTUFBTSxDQUFDOzs7Ozs7Ozs7Y0FFZCxJQUFJLEtBQUssQ0FBQyxnRUFDSSxNQUFNLGlEQUE0QyxDQUFDOzs7Ozs7O0NBRTFFOztRQUVRLGVBQWUsR0FBZixlQUFlO1FBQUUsa0JBQWtCLEdBQWxCLGtCQUFrQjtRQUFFLFdBQVcsR0FBWCxXQUFXO1FBQUUsVUFBVSxHQUFWLFVBQVU7UUFDNUQsb0JBQW9CLEdBQXBCLG9CQUFvQjtRQUFFLGNBQWMsR0FBZCxjQUFjO1FBQUUsaUJBQWlCLEdBQWpCLGlCQUFpQjtRQUN2RCxpQkFBaUIsR0FBakIsaUJBQWlCO1FBQUUsU0FBUyxHQUFULFNBQVM7UUFBRSxjQUFjLEdBQWQsY0FBYztRQUFFLFVBQVUsR0FBVixVQUFVIiwiZmlsZSI6ImxpYi9jb25maWcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBta2RpcnAsIGZzIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBwa2dPYmogZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuXG5cbmNvbnN0IEFQUElVTV9WRVIgPSBwa2dPYmoudmVyc2lvbjtcblxuZnVuY3Rpb24gZ2V0Tm9kZVZlcnNpb24gKCkge1xuICAvLyBleHBlY3QgdjxtYWpvcj4uPG1pbm9yPi48cGF0Y2g+XG4gIC8vIHdlIHdpbGwgcHVsbCBvdXQgYG1ham9yYCBhbmQgYG1pbm9yYFxuICBsZXQgdmVyc2lvbiA9IHByb2Nlc3MudmVyc2lvbi5tYXRjaCgvXnYoXFxkKylcXC4oXFxkKykvKTtcbiAgcmV0dXJuIFtOdW1iZXIodmVyc2lvblsxXSksIE51bWJlcih2ZXJzaW9uWzJdKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEdpdFJldiAoKSB7XG4gIGxldCBjd2QgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIik7XG4gIGxldCByZXYgPSBudWxsO1xuICB0cnkge1xuICAgIGxldCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwge2N3ZH0pO1xuICAgIHJldiA9IHN0ZG91dC50cmltKCk7XG4gIH0gY2F0Y2ggKGlnbikge31cbiAgcmV0dXJuIHJldjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXBwaXVtQ29uZmlnICgpIHtcbiAgbGV0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicpKTtcbiAgbGV0IGJ1aWx0ID0gc3RhdC5tdGltZS5nZXRUaW1lKCk7XG4gIGxldCBjb25maWcgPSB7XG4gICAgJ2dpdC1zaGEnOiBhd2FpdCBnZXRHaXRSZXYoKSxcbiAgICBidWlsdCxcbiAgICB2ZXJzaW9uOiBBUFBJVU1fVkVSLFxuICB9O1xuICByZXR1cm4gY29uZmlnO1xufVxuXG5mdW5jdGlvbiBjaGVja05vZGVPayAoKSB7XG4gIGxldCBbbWFqb3IsIG1pbm9yXSA9IGdldE5vZGVWZXJzaW9uKCk7XG4gIGlmIChtYWpvciA8IDUpIHtcbiAgICBsZXQgbXNnID0gYE5vZGUgdmVyc2lvbiBtdXN0IGJlID49IDUuIEN1cnJlbnRseSAke21ham9yfS4ke21pbm9yfWA7XG4gICAgbG9nZ2VyLmVycm9yQW5kVGhyb3cobXNnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuTm9kZURlcHJlY2F0aW9ucyAoKSB7XG4gIGxldCBbbWFqb3JdID0gZ2V0Tm9kZVZlcnNpb24oKTtcbiAgaWYgKG1ham9yIDwgNCkge1xuICAgIGxvZ2dlci53YXJuKFwiQXBwaXVtIHN1cHBvcnQgZm9yIHZlcnNpb25zIG9mIG5vZGUgPCA0IGhhcyBiZWVuIFwiICtcbiAgICAgICAgICAgICAgICBcImRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBQbGVhc2UgXCIgK1xuICAgICAgICAgICAgICAgIFwidXBncmFkZSFcIik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2hvd0NvbmZpZyAoKSB7XG4gIGxldCBjb25maWcgPSBhd2FpdCBnZXRBcHBpdW1Db25maWcoKTtcbiAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxufVxuXG5mdW5jdGlvbiBnZXROb25EZWZhdWx0QXJncyAocGFyc2VyLCBhcmdzKSB7XG4gIGxldCBub25EZWZhdWx0cyA9IHt9O1xuICBmb3IgKGxldCByYXdBcmcgb2YgcGFyc2VyLnJhd0FyZ3MpIHtcbiAgICBsZXQgYXJnID0gcmF3QXJnWzFdLmRlc3Q7XG4gICAgaWYgKGFyZ3NbYXJnXSAmJiBhcmdzW2FyZ10gIT09IHJhd0FyZ1sxXS5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIG5vbkRlZmF1bHRzW2FyZ10gPSBhcmdzW2FyZ107XG4gICAgfVxuICB9XG4gIHJldHVybiBub25EZWZhdWx0cztcbn1cblxuZnVuY3Rpb24gZ2V0RGVwcmVjYXRlZEFyZ3MgKHBhcnNlciwgYXJncykge1xuICAvLyBnbyB0aHJvdWdoIHRoZSBzZXJ2ZXIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgZmlndXJlXG4gIC8vIG91dCB3aGljaCBvZiB0aGUgb25lcyB1c2VkIGFyZSBkZXByZWNhdGVkXG4gIGxldCBkZXByZWNhdGVkID0ge307XG4gIGZvciAobGV0IHJhd0FyZyBvZiBwYXJzZXIucmF3QXJncykge1xuICAgIGxldCBhcmcgPSByYXdBcmdbMV0uZGVzdDtcbiAgICBsZXQgZGVmYXVsdFZhbHVlID0gcmF3QXJnWzFdLmRlZmF1bHRWYWx1ZTtcbiAgICBsZXQgaXNEZXByZWNhdGVkID0gISFyYXdBcmdbMV0uZGVwcmVjYXRlZEZvcjtcbiAgICBpZiAoYXJnc1thcmddICYmIGFyZ3NbYXJnXSAhPT0gZGVmYXVsdFZhbHVlICYmIGlzRGVwcmVjYXRlZCkge1xuICAgICAgZGVwcmVjYXRlZFtyYXdBcmdbMF1dID0gcmF3QXJnWzFdLmRlcHJlY2F0ZWRGb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG5mdW5jdGlvbiBjaGVja1ZhbGlkUG9ydCAocG9ydCwgcG9ydE5hbWUpIHtcbiAgaWYgKHBvcnQgPiAwICYmIHBvcnQgPCA2NTUzNikgcmV0dXJuIHRydWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgbG9nZ2VyLmVycm9yKGBQb3J0ICcke3BvcnROYW1lfScgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIDY1NTM2LiBDdXJyZW50bHkgJHtwb3J0fWApO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU2VydmVyQXJncyAocGFyc2VyLCBhcmdzKSB7XG4gIC8vIGFyZ3VtZW50cyB0aGF0IGNhbm5vdCBib3RoIGJlIHNldFxuICBsZXQgZXhjbHVzaXZlcyA9IFtcbiAgICBbJ25vUmVzZXQnLCAnZnVsbFJlc2V0J10sXG4gICAgWydpcGEnLCAnc2FmYXJpJ10sXG4gICAgWydhcHAnLCAnc2FmYXJpJ10sXG4gICAgWydmb3JjZUlwaG9uZScsICdmb3JjZUlwYWQnXSxcbiAgICBbJ2RldmljZU5hbWUnLCAnZGVmYXVsdERldmljZSddXG4gIF07XG5cbiAgZm9yIChsZXQgZXhTZXQgb2YgZXhjbHVzaXZlcykge1xuICAgIGxldCBudW1Gb3VuZEluQXJncyA9IDA7XG4gICAgZm9yIChsZXQgb3B0IG9mIGV4U2V0KSB7XG4gICAgICBpZiAoXy5oYXMoYXJncywgb3B0KSAmJiBhcmdzW29wdF0pIHtcbiAgICAgICAgbnVtRm91bmRJbkFyZ3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG51bUZvdW5kSW5BcmdzID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgY2FuJ3QgcGFzcyBpbiBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGZyb20gdGhlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBzZXQgJHtKU09OLnN0cmluZ2lmeShleFNldCl9LCBzaW5jZSB0aGV5IGFyZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgbXV0dWFsbHkgZXhjbHVzaXZlYCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdmFsaWRhdGlvbnMgPSB7XG4gICAgcG9ydDogY2hlY2tWYWxpZFBvcnQsXG4gICAgY2FsbGJhY2tQb3J0OiBjaGVja1ZhbGlkUG9ydCxcbiAgICBib290c3RyYXBQb3J0OiBjaGVja1ZhbGlkUG9ydCxcbiAgICBzZWxlbmRyb2lkUG9ydDogY2hlY2tWYWxpZFBvcnQsXG4gICAgY2hyb21lZHJpdmVyUG9ydDogY2hlY2tWYWxpZFBvcnQsXG4gICAgcm9ib3RQb3J0OiBjaGVja1ZhbGlkUG9ydCxcbiAgICBiYWNrZW5kUmV0cmllczogKHIpID0+IHsgcmV0dXJuIHIgPj0gMDsgfVxuICB9O1xuXG4gIGNvbnN0IG5vbkRlZmF1bHRBcmdzID0gZ2V0Tm9uRGVmYXVsdEFyZ3MocGFyc2VyLCBhcmdzKTtcblxuICBmb3IgKGxldCBbYXJnLCB2YWxpZGF0b3JdIG9mIF8udG9QYWlycyh2YWxpZGF0aW9ucykpIHtcbiAgICBpZiAoXy5oYXMobm9uRGVmYXVsdEFyZ3MsIGFyZykpIHtcbiAgICAgIGlmICghdmFsaWRhdG9yKGFyZ3NbYXJnXSwgYXJnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnQgZm9yIHBhcmFtICR7YXJnfTogJHthcmdzW2FyZ119YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlVG1wRGlyICh0bXBEaXIpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBta2RpcnAodG1wRGlyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgV2UgY291bGQgbm90IGVuc3VyZSB0aGF0IHRoZSB0ZW1wIGRpciB5b3Ugc3BlY2lmaWVkIGAgK1xuICAgICAgICAgICAgICAgICAgICBgKCR7dG1wRGlyfSkgZXhpc3RzLiBQbGVhc2UgbWFrZSBzdXJlIGl0J3Mgd3JpdGVhYmxlLmApO1xuICB9XG59XG5cbmV4cG9ydCB7IGdldEFwcGl1bUNvbmZpZywgdmFsaWRhdGVTZXJ2ZXJBcmdzLCBjaGVja05vZGVPaywgc2hvd0NvbmZpZyxcbiAgICAgICAgIHdhcm5Ob2RlRGVwcmVjYXRpb25zLCB2YWxpZGF0ZVRtcERpciwgZ2V0Tm9uRGVmYXVsdEFyZ3MsXG4gICAgICAgICBnZXREZXByZWNhdGVkQXJncywgZ2V0R2l0UmV2LCBjaGVja1ZhbGlkUG9ydCwgQVBQSVVNX1ZFUiB9O1xuIl0sInNvdXJjZVJvb3QiOiIuLi8uLiJ9