@testim/testim-cli
Version:
Command line interface for running Testing on you CI
237 lines (186 loc) • 22.9 kB
JavaScript
'use strict';
var _createClass = require('babel-runtime/helpers/create-class')['default'];
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
var _Object$keys = require('babel-runtime/core-js/object/keys')['default'];
var _Promise = require('babel-runtime/core-js/promise')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
Object.defineProperty(exports, '__esModule', {
value: true
});
var _url = require('url');
var _url2 = _interopRequireDefault(_url);
var _request = require('request');
var _request2 = _interopRequireDefault(_request);
var _deepmerge = require('deepmerge');
var _deepmerge2 = _interopRequireDefault(_deepmerge);
var _helpersConstants = require('../helpers/constants');
var _ErrorHandler = require('./ErrorHandler');
var _packageJson = require('../../package.json');
var _packageJson2 = _interopRequireDefault(_packageJson);
/**
* RequestHandler
*/
var RequestHandler = (function () {
function RequestHandler(options, eventHandler, logger) {
_classCallCheck(this, RequestHandler);
this.sessionID = null;
this.startPath = options.path === '/' ? '' : options.path || '/wd/hub';
this.eventHandler = eventHandler;
this.logger = logger;
this.defaultOptions = options;
/**
* actually host is `hostname:port` but to keep config properties
* short we abuse host as hostname
*/
if (options.host !== undefined) {
options.hostname = options.host;
delete options.host;
}
/**
* set auth from user and password configs
*/
if (this.defaultOptions.user && this.defaultOptions.key) {
this.auth = {
user: this.defaultOptions.user,
pass: this.defaultOptions.key
};
delete this.defaultOptions.user;
delete this.defaultOptions.key;
}
}
/**
* merges default options with request options
*
* @param {Object} requestOptions request options
*/
_createClass(RequestHandler, [{
key: 'createOptions',
value: function createOptions(requestOptions, data) {
var newOptions = {};
/**
* if we don't have a session id we set it here, unless we call commands that don't require session ids, for
* example /sessions. The call to /sessions is not connected to a session itself and it therefore doesn't
* require it
*/
if (requestOptions.path.match(/\:sessionId/) && !this.sessionID && requestOptions.requiresSession !== false) {
// throw session id error
throw new _ErrorHandler.RuntimeError(101);
}
newOptions.uri = _url2['default'].parse(this.defaultOptions.protocol + '://' + this.defaultOptions.hostname + ':' + this.defaultOptions.port + this.startPath + requestOptions.path.replace(':sessionId', this.sessionID || ''));
// send authentication credentials only when creating new session
if (requestOptions.path === '/session' && this.auth !== undefined) {
newOptions.auth = this.auth;
}
if (requestOptions.method) {
newOptions.method = requestOptions.method;
}
newOptions.json = true;
newOptions.followAllRedirects = true;
newOptions.headers = {
'Connection': 'keep-alive',
'Accept': 'application/json',
'User-Agent': 'webdriverio/webdriverio/' + _packageJson2['default'].version
};
if (_Object$keys(data).length > 0) {
var requestData = JSON.stringify(data);
newOptions.body = requestData;
newOptions.method = 'POST';
newOptions.headers = (0, _deepmerge2['default'])(newOptions.headers, {
'Content-Type': 'application/json; charset=UTF-8',
'Content-Length': Buffer.byteLength(requestData, 'UTF-8')
});
}
return newOptions;
}
/**
* creates a http request with its given options and send the protocol
* command to the webdriver server
*
* @param {Object} requestOptions defines url, method and other request options
* @param {Object} data contains request data
*/
}, {
key: 'create',
value: function create(requestOptions, data) {
var _this = this;
data = data || {};
/**
* allow to pass a string as shorthand argument
*/
if (typeof requestOptions === 'string') {
requestOptions = {
path: requestOptions
};
}
var fullRequestOptions = this.createOptions(requestOptions, data);
this.eventHandler.emit('command', {
method: fullRequestOptions.method || 'GET',
uri: fullRequestOptions.uri,
data: data
});
return new _Promise(function (resolve, reject) {
(0, _request2['default'])(fullRequestOptions, _this.responseHandler(resolve, reject, data, requestOptions, fullRequestOptions));
});
}
/**
* response handler
*/
}, {
key: 'responseHandler',
value: function responseHandler(resolve, reject, data, requestOptions, fullRequestOptions) {
var _this2 = this;
return function (err, response, body) {
var error = null;
if (err || body && body.status !== 0) {
if (body && typeof body === 'string') {
error = new _ErrorHandler.RuntimeError(body);
} else if (body) {
error = new _ErrorHandler.RuntimeError({
status: body.status,
type: _helpersConstants.ERROR_CODES[body.status] ? _helpersConstants.ERROR_CODES[body.status].id : 'unknown',
message: _helpersConstants.ERROR_CODES[body.status] ? _helpersConstants.ERROR_CODES[body.status].message : 'unknown',
orgStatusMessage: body.value ? body.value.message : ''
});
} else {
error = new _ErrorHandler.RuntimeError({
status: -1,
type: 'ECONNREFUSED',
message: 'Couldn\'t connect to selenium server',
orgStatusMessage: 'Couldn\'t connect to selenium server'
});
}
return reject(error);
}
/**
* if no session id was set before we've called the init command
*/
if (_this2.sessionID === null && requestOptions.requiresSession !== false) {
_this2.sessionID = body.sessionId;
_this2.eventHandler.emit('init', {
sessionID: _this2.sessionID,
options: body.value,
desiredCapabilities: data.desiredCapabilities
});
_this2.logger.log('SET SESSION ID ' + _this2.sessionID);
}
if (body === undefined) {
body = {
status: 0,
orgStatusMessage: _helpersConstants.ERROR_CODES[0].message
};
}
_this2.eventHandler.emit('result', {
requestData: data,
requestOptions: fullRequestOptions,
response: response,
body: body
});
return resolve(body);
};
}
}]);
return RequestHandler;
})();
exports['default'] = RequestHandler;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi91dGlscy9SZXF1ZXN0SGFuZGxlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O21CQUFnQixLQUFLOzs7O3VCQUNELFNBQVM7Ozs7eUJBQ1gsV0FBVzs7OztnQ0FFRCxzQkFBc0I7OzRCQUNyQixnQkFBZ0I7OzJCQUM3QixvQkFBb0I7Ozs7Ozs7O0lBSzlCLGNBQWM7QUFDSixhQURWLGNBQWMsQ0FDSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRTs4QkFEMUMsY0FBYzs7QUFFWixZQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtBQUNyQixZQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQTtBQUN0RSxZQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtBQUNoQyxZQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtBQUNwQixZQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQTs7Ozs7O0FBTTdCLFlBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7QUFDNUIsbUJBQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtBQUMvQixtQkFBTyxPQUFPLENBQUMsSUFBSSxDQUFBO1NBQ3RCOzs7OztBQUtELFlBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUU7QUFDckQsZ0JBQUksQ0FBQyxJQUFJLEdBQUc7QUFDUixvQkFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSTtBQUM5QixvQkFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRzthQUNoQyxDQUFBOztBQUVELG1CQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFBO0FBQy9CLG1CQUFPLElBQUksQ0FBQyxj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O0FBRUQsMkJBQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUN2Qjs7Ozs7QUFLRCxvQkFBSSxPQUFLLFNBQVMsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFDLGVBQWUsS0FBSyxLQUFLLEVBQUU7QUFDckUsMkJBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7O0FBRS9CLDJCQUFLLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQzNCLGlDQUFTLEVBQUUsT0FBSyxTQUFTO0FBQ3pCLCtCQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUs7QUFDbkIsMkNBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtxQkFDaEQsQ0FBQyxDQUFBOztBQUVGLDJCQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEdBQUcsT0FBSyxTQUFTLENBQUMsQ0FBQTtpQkFDdEQ7O0FBRUQsb0JBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUNwQix3QkFBSSxHQUFHO0FBQ0gsOEJBQU0sRUFBRSxDQUFDO0FBQ1Qsd0NBQWdCLEVBQUUsOEJBQVksQ0FBQyxDQUFDLENBQUMsT0FBTztxQkFDM0MsQ0FBQTtpQkFDSjs7QUFFRCx1QkFBSyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUM3QiwrQkFBVyxFQUFFLElBQUk7QUFDakIsa0NBQWMsRUFBRSxrQkFBa0I7QUFDbEMsNEJBQVEsRUFBRSxRQUFRO0FBQ2xCLHdCQUFJLEVBQUUsSUFBSTtpQkFDYixDQUFDLENBQUE7O0FBRUYsdUJBQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQ3ZCLENBQUE7U0FDSjs7O1dBbExDLGNBQWM7OztxQkFxTEwsY0FBYyIsImZpbGUiOiJSZXF1ZXN0SGFuZGxlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB1cmwgZnJvbSAndXJsJ1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAncmVxdWVzdCdcbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnXG5cbmltcG9ydCB7IEVSUk9SX0NPREVTIH0gZnJvbSAnLi4vaGVscGVycy9jb25zdGFudHMnXG5pbXBvcnQgeyBSdW50aW1lRXJyb3IgfSBmcm9tICcuL0Vycm9ySGFuZGxlcidcbmltcG9ydCBwa2cgZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJ1xuXG4vKipcbiAqIFJlcXVlc3RIYW5kbGVyXG4gKi9cbmNsYXNzIFJlcXVlc3RIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucywgZXZlbnRIYW5kbGVyLCBsb2dnZXIpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uSUQgPSBudWxsXG4gICAgICAgIHRoaXMuc3RhcnRQYXRoID0gb3B0aW9ucy5wYXRoID09PSAnLycgPyAnJyA6IG9wdGlvbnMucGF0aCB8fCAnL3dkL2h1YidcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICAgICAgdGhpcy5kZWZhdWx0T3B0aW9ucyA9IG9wdGlvbnNcblxuICAgICAgICAvKipcbiAgICAgICAgICogYWN0dWFsbHkgaG9zdCBpcyBgaG9zdG5hbWU6cG9ydGAgYnV0IHRvIGtlZXAgY29uZmlnIHByb3BlcnRpZXNcbiAgICAgICAgICogc2hvcnQgd2UgYWJ1c2UgaG9zdCBhcyBob3N0bmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG9wdGlvbnMuaG9zdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhvc3RuYW1lID0gb3B0aW9ucy5ob3N0XG4gICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob3N0XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogc2V0IGF1dGggZnJvbSB1c2VyIGFuZCBwYXNzd29yZCBjb25maWdzXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0T3B0aW9ucy51c2VyICYmIHRoaXMuZGVmYXVsdE9wdGlvbnMua2V5KSB7XG4gICAgICAgICAgICB0aGlzLmF1dGggPSB7XG4gICAgICAgICAgICAgICAgdXNlcjogdGhpcy5kZWZhdWx0T3B0aW9ucy51c2VyLFxuICAgICAgICAgICAgICAgIHBhc3M6IHRoaXMuZGVmYXVsdE9wdGlvbnMua2V5XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRlZmF1bHRPcHRpb25zLnVzZXJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRlZmF1bHRPcHRpb25zLmtleVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbWVyZ2VzIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHJlcXVlc3Qgb3B0aW9uc1xuICAgICAqXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSByZXF1ZXN0T3B0aW9ucyAgcmVxdWVzdCBvcHRpb25zXG4gICAgICovXG4gICAgY3JlYXRlT3B0aW9ucyAocmVxdWVzdE9wdGlvbnMsIGRhdGEpIHtcbiAgICAgICAgbGV0IG5ld09wdGlvbnMgPSB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBpZiB3ZSBkb24ndCBoYXZlIGEgc2Vzc2lvbiBpZCB3ZSBzZXQgaXQgaGVyZSwgdW5sZXNzIHdlIGNhbGwgY29tbWFuZHMgdGhhdCBkb24ndCByZXF1aXJlIHNlc3Npb24gaWRzLCBmb3JcbiAgICAgICAgICogZXhhbXBsZSAvc2Vzc2lvbnMuIFRoZSBjYWxsIHRvIC9zZXNzaW9ucyBpcyBub3QgY29ubmVjdGVkIHRvIGEgc2Vzc2lvbiBpdHNlbGYgYW5kIGl0IHRoZXJlZm9yZSBkb2Vzbid0XG4gICAgICAgICAqIHJlcXVpcmUgaXRcbiAgICAgICAgICovXG4gICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5wYXRoLm1hdGNoKC9cXDpzZXNzaW9uSWQvKSAmJiAhdGhpcy5zZXNzaW9uSUQgJiYgcmVxdWVzdE9wdGlvbnMucmVxdWlyZXNTZXNzaW9uICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy8gdGhyb3cgc2Vzc2lvbiBpZCBlcnJvclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcigxMDEpXG4gICAgICAgIH1cblxuICAgICAgICBuZXdPcHRpb25zLnVyaSA9IHVybC5wYXJzZShcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMucHJvdG9jb2wgKyAnOi8vJyArXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRPcHRpb25zLmhvc3RuYW1lICsgJzonICsgdGhpcy5kZWZhdWx0T3B0aW9ucy5wb3J0ICtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQYXRoICtcbiAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zLnBhdGgucmVwbGFjZSgnOnNlc3Npb25JZCcsIHRoaXMuc2Vzc2lvbklEIHx8ICcnKSlcblxuICAgICAgICAvLyBzZW5kIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIG9ubHkgd2hlbiBjcmVhdGluZyBuZXcgc2Vzc2lvblxuICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMucGF0aCA9PT0gJy9zZXNzaW9uJyAmJiB0aGlzLmF1dGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3T3B0aW9ucy5hdXRoID0gdGhpcy5hdXRoXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMubWV0aG9kKSB7XG4gICAgICAgICAgICBuZXdPcHRpb25zLm1ldGhvZCA9IHJlcXVlc3RPcHRpb25zLm1ldGhvZFxuICAgICAgICB9XG5cbiAgICAgICAgbmV3T3B0aW9ucy5qc29uID0gdHJ1ZVxuICAgICAgICBuZXdPcHRpb25zLmZvbGxvd0FsbFJlZGlyZWN0cyA9IHRydWVcblxuICAgICAgICBuZXdPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgICAnQ29ubmVjdGlvbic6ICdrZWVwLWFsaXZlJyxcbiAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6ICd3ZWJkcml2ZXJpby93ZWJkcml2ZXJpby8nICsgcGtnLnZlcnNpb25cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcmVxdWVzdERhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgICAgICAgICAgbmV3T3B0aW9ucy5ib2R5ID0gcmVxdWVzdERhdGFcbiAgICAgICAgICAgIG5ld09wdGlvbnMubWV0aG9kID0gJ1BPU1QnXG4gICAgICAgICAgICBuZXdPcHRpb25zLmhlYWRlcnMgPSBtZXJnZShuZXdPcHRpb25zLmhlYWRlcnMsIHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgnLFxuICAgICAgICAgICAgICAgICdDb250ZW50LUxlbmd0aCc6IEJ1ZmZlci5ieXRlTGVuZ3RoKHJlcXVlc3REYXRhLCAnVVRGLTgnKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdPcHRpb25zXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY3JlYXRlcyBhIGh0dHAgcmVxdWVzdCB3aXRoIGl0cyBnaXZlbiBvcHRpb25zIGFuZCBzZW5kIHRoZSBwcm90b2NvbFxuICAgICAqIGNvbW1hbmQgdG8gdGhlIHdlYmRyaXZlciBzZXJ2ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gICByZXF1ZXN0T3B0aW9ucyAgZGVmaW5lcyB1cmwsIG1ldGhvZCBhbmQgb3RoZXIgcmVxdWVzdCBvcHRpb25zXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSAgIGRhdGEgICAgICAgICAgICBjb250YWlucyByZXF1ZXN0IGRhdGFcbiAgICAgKi9cbiAgICBjcmVhdGUgKHJlcXVlc3RPcHRpb25zLCBkYXRhKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsbG93IHRvIHBhc3MgYSBzdHJpbmcgYXMgc2hvcnRoYW5kIGFyZ3VtZW50XG4gICAgICAgICAqL1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3RPcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgcGF0aDogcmVxdWVzdE9wdGlvbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmdWxsUmVxdWVzdE9wdGlvbnMgPSB0aGlzLmNyZWF0ZU9wdGlvbnMocmVxdWVzdE9wdGlvbnMsIGRhdGEpXG5cbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgnY29tbWFuZCcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogZnVsbFJlcXVlc3RPcHRpb25zLm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgICAgICAgIHVyaTogZnVsbFJlcXVlc3RPcHRpb25zLnVyaSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdChmdWxsUmVxdWVzdE9wdGlvbnMsIHRoaXMucmVzcG9uc2VIYW5kbGVyKHJlc29sdmUsIHJlamVjdCwgZGF0YSwgcmVxdWVzdE9wdGlvbnMsIGZ1bGxSZXF1ZXN0T3B0aW9ucykpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVzcG9uc2UgaGFuZGxlclxuICAgICAqL1xuICAgIHJlc3BvbnNlSGFuZGxlciAocmVzb2x2ZSwgcmVqZWN0LCBkYXRhLCByZXF1ZXN0T3B0aW9ucywgZnVsbFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiAoZXJyLCByZXNwb25zZSwgYm9keSkgPT4ge1xuICAgICAgICAgICAgbGV0IGVycm9yID0gbnVsbFxuXG4gICAgICAgICAgICBpZiAoZXJyIHx8IChib2R5ICYmIGJvZHkuc3RhdHVzICE9PSAwKSkge1xuICAgICAgICAgICAgICAgIGlmIChib2R5ICYmIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBSdW50aW1lRXJyb3IoYm9keSlcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgUnVudGltZUVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogYm9keS5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBFUlJPUl9DT0RFU1tib2R5LnN0YXR1c10gPyBFUlJPUl9DT0RFU1tib2R5LnN0YXR1c10uaWQgOiAndW5rbm93bicsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBFUlJPUl9DT0RFU1tib2R5LnN0YXR1c10gPyBFUlJPUl9DT0RFU1tib2R5LnN0YXR1c10ubWVzc2FnZSA6ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZ1N0YXR1c01lc3NhZ2U6IGJvZHkudmFsdWUgPyBib2R5LnZhbHVlLm1lc3NhZ2UgOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IFJ1bnRpbWVFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0VDT05OUkVGVVNFRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQ291bGRuXFwndCBjb25uZWN0IHRvIHNlbGVuaXVtIHNlcnZlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmdTdGF0dXNNZXNzYWdlOiAnQ291bGRuXFwndCBjb25uZWN0IHRvIHNlbGVuaXVtIHNlcnZlcidcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNldCBiZWZvcmUgd2UndmUgY2FsbGVkIHRoZSBpbml0IGNvbW1hbmRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbklEID09PSBudWxsICYmIHJlcXVlc3RPcHRpb25zLnJlcXVpcmVzU2Vzc2lvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25JRCA9IGJvZHkuc2Vzc2lvbklkXG5cbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0KCdpbml0Jywge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSUQ6IHRoaXMuc2Vzc2lvbklELFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBib2R5LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBkZXNpcmVkQ2FwYWJpbGl0aWVzOiBkYXRhLmRlc2lyZWRDYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKCdTRVQgU0VTU0lPTiBJRCAnICsgdGhpcy5zZXNzaW9uSUQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBib2R5ID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgICAgICAgICAgICAgIG9yZ1N0YXR1c01lc3NhZ2U6IEVSUk9SX0NPREVTWzBdLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXQoJ3Jlc3VsdCcsIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0RGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0T3B0aW9uczogZnVsbFJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShib2R5KVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0SGFuZGxlclxuIl19