webdriverio-automation
Version:
WebdriverIO-Automation android ios project
964 lines (726 loc) • 91.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isErrorType = isErrorType;
exports.isUnknownError = isUnknownError;
exports.errorFromMJSONWPStatusCode = errorFromMJSONWPStatusCode;
exports.errorFromW3CJsonCode = errorFromW3CJsonCode;
exports.getResponseForW3CError = getResponseForW3CError;
exports.getResponseForJsonwpError = getResponseForJsonwpError;
exports.errors = exports.ProtocolError = void 0;
require("source-map-support/register");
var _es6Error = _interopRequireDefault(require("es6-error"));
var _lodash = _interopRequireDefault(require("lodash"));
var _appiumSupport = require("appium-support");
var _httpStatusCodes = _interopRequireDefault(require("http-status-codes"));
const mjsonwpLog = _appiumSupport.logger.getLogger('MJSONWP');
const w3cLog = _appiumSupport.logger.getLogger('W3C');
const W3C_UNKNOWN_ERROR = 'unknown error';
class ProtocolError extends _es6Error.default {
constructor(msg, jsonwpCode, w3cStatus, error) {
super(msg);
this.jsonwpCode = jsonwpCode;
this.error = error || W3C_UNKNOWN_ERROR;
if (this.jsonwpCode === null) {
this.jsonwpCode = 13;
}
this.w3cStatus = w3cStatus || _httpStatusCodes.default.BAD_REQUEST;
this._stacktrace = null;
}
get stacktrace() {
return this._stacktrace || this.stack;
}
set stacktrace(value) {
this._stacktrace = value;
}
}
exports.ProtocolError = ProtocolError;
class NoSuchDriverError extends ProtocolError {
static code() {
return 6;
}
static w3cStatus() {
return _httpStatusCodes.default.NOT_FOUND;
}
static error() {
return 'invalid session id';
}
constructor(err) {
super(err || 'A session is either terminated or not started', NoSuchDriverError.code(), NoSuchDriverError.w3cStatus(), NoSuchDriverError.error());
}
}
class NoSuchElementError extends ProtocolError {
static code() {
return 7;
}
static w3cStatus() {
return _httpStatusCodes.default.NOT_FOUND;
}
static error() {
return 'no such element';
}
constructor(err) {
super(err || 'An element could not be located on the page using the given ' + 'search parameters.', NoSuchElementError.code(), NoSuchElementError.w3cStatus(), NoSuchElementError.error());
}
}
class NoSuchFrameError extends ProtocolError {
static code() {
return 8;
}
static error() {
return 'no such frame';
}
static w3cStatus() {
return _httpStatusCodes.default.NOT_FOUND;
}
constructor(err) {
super(err || 'A request to switch to a frame could not be satisfied because ' + 'the frame could not be found.', NoSuchFrameError.code(), NoSuchFrameError.w3cStatus(), NoSuchFrameError.error());
}
}
class UnknownCommandError extends ProtocolError {
static code() {
return 9;
}
static w3cStatus() {
return _httpStatusCodes.default.NOT_FOUND;
}
static error() {
return 'unknown command';
}
constructor(err) {
super(err || 'The requested resource could not be found, or a request was ' + 'received using an HTTP method that is not supported by the mapped ' + 'resource.', UnknownCommandError.code(), UnknownCommandError.w3cStatus(), UnknownCommandError.error());
}
}
class StaleElementReferenceError extends ProtocolError {
static code() {
return 10;
}
static w3cStatus() {
return _httpStatusCodes.default.NOT_FOUND;
}
static error() {
return 'stale element reference';
}
constructor(err) {
super(err || 'An element command failed because the referenced element is no ' + 'longer attached to the DOM.', StaleElementReferenceError.code(), StaleElementReferenceError.w3cStatus(), StaleElementReferenceError.error());
}
}
class ElementNotVisibleError extends ProtocolError {
static code() {
return 11;
}
static w3cStatus() {
return _httpStatusCodes.default.BAD_REQUEST;
}
static error() {
return 'element not visible';
}
constructor(err) {
super(err || 'An element command could not be completed because the element is ' + 'not visible on the page.', ElementNotVisibleError.code(), ElementNotVisibleError.w3cStatus(), ElementNotVisibleError.error());
}
}
class InvalidElementStateError extends ProtocolError {
static code() {
return 12;
}
static w3cStatus() {
return _httpStatusCodes.default.BAD_REQUEST;
}
static error() {
return 'invalid element state';
}
constructor(err) {
super(err || 'An element command could not be completed because the element is ' + 'in an invalid state (e.g. attempting to click a disabled element).', InvalidElementStateError.code(), InvalidElementStateError.w3cStatus(), InvalidElementStateError.error());
}
}
class UnknownError extends ProtocolError {
static code() {
return 13;
}
static w3cStatus() {
return _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
}
static error() {
return W3C_UNKNOWN_ERROR;
}
constructor(originalError) {
let origMessage = originalError;
if (originalError instanceof Error) {
origMessage = originalError.message;
}
let message = 'An unknown server-side error occurred while processing ' + 'the command.';
if (originalError) {
message = `${message} Original error: ${origMessage}`;
}
super(message, UnknownError.code(), UnknownError.w3cStatus(), UnknownError.error());
}
}
class UnknownMethodError extends ProtocolError {
static code() {
return 405;
}
static w3cStatus() {
return _httpStatusCodes.default.METHOD_NOT_ALLOWED;
}
static error() {
return 'unknown method';
}
constructor(err) {
super(err || 'The requested command matched a known URL but did not match an method for that URL', UnknownMethodError.code(), UnknownMethodError.w3cStatus(), UnknownMethodError.error());
}
}
class UnsupportedOperationError extends ProtocolError {
static code() {
return 405;
}
static w3cStatus() {
return _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
}
static error() {
return 'unsupported operation';
}
constructor(err) {
super(err || 'A server-side error occurred. Command cannot be supported.', UnsupportedOperationError.code(), UnsupportedOperationError.w3cStatus(), UnsupportedOperationError.error());
}
}
class ElementIsNotSelectableError extends ProtocolError {
static code() {
return 15;
}
static error() {
return 'element not selectable';
}
static w3cStatus() {
return _httpStatusCodes.default.BAD_REQUEST;
}
constructor(err) {
super(err || 'An attempt was made to select an element that cannot be selected.', ElementIsNotSelectableError.code(), ElementIsNotSelectableError.w3cStatus(), ElementIsNotSelectableError.error());
}
}
class ElementClickInterceptedError extends ProtocolError {
static code() {
return 64;
}
static error() {
return 'element click intercepted';
}
static w3cStatus() {
return _httpStatusCodes.default.BAD_REQUEST;
}
constructor(err) {
super(err || 'The Element Click command could not be completed because the element receiving ' + 'the events is obscuring the element that was requested clicked', ElementClickInterceptedError.code(), ElementClickInterceptedError.w3cStatus(), ElementClickInterceptedError.error());
}
}
class ElementNotInteractableError extends ProtocolError {
static code() {
return 60;
}
static error() {
return 'element not interactable';
}
static w3cStatus() {
return _httpStatusCodes.default.BAD_REQUEST;
}
constructor(err) {
super(err || 'A command could not be completed because the element is not pointer- or keyboard interactable', ElementNotInteractableError.code(), ElementNotInteractableError.w3cStatus(), ElementNotInteractableError.error());
}
}
class InsecureCertificateError extends ProtocolError {
static error() {
return 'insecure certificate';
}
constructor(err) {
super(err || 'Navigation caused the user agent to hit a certificate warning, which is usually the result of an expired or invalid TLS certificate', ElementIsNotSelectableError.code(), null, InsecureCertificateError.error());
}
}
class JavaScriptError extends ProtocolError {
static code() {
return 17;
}
static w3cStatus() {
return _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
}
static error() {
return 'javascript error';
}
constructor(err) {
super(err || 'An error occurred while executing user supplied JavaScript.', JavaScriptError.code(), JavaScriptError.w3cStatus(), JavaScriptError.error());
}
}
class XPathLookupError extends ProtocolError {
static code() {
return 19;
}
static w3cStatus() {
return _httpStatusCodes.default.BAD_REQUEST;
}
static error() {
return 'invalid selector';
}
constructor(err) {
super(err || 'An error occurred while searching for an element by XPath.', XPathLookupError.code(), XPathLookupError.w3cStatus(), XPathLookupError.error());
}
}
class TimeoutError extends ProtocolError {
static code() {
return 21;
}
static w3cStatus() {
return _httpStatusCodes.default.REQUEST_TIMEOUT;
}
static error() {
return 'timeout';
}
constructor(err) {
super(err || 'An operation did not complete before its timeout expired.', TimeoutError.code(), TimeoutError.w3cStatus(), TimeoutError.error());
}
}
class NoSuchWindowError extends ProtocolError {
static code() {
return 23;
}
static error() {
return 'no such window';
}
static w3cStatus() {
return _httpStatusCodes.default.NOT_FOUND;
}
constructor(err) {
super(err || 'A request to switch to a different window could not be satisfied ' + 'because the window could not be found.', NoSuchWindowError.code(), NoSuchWindowError.w3cStatus(), NoSuchWindowError.error());
}
}
class InvalidArgumentError extends ProtocolError {
static code() {
return 61;
}
static error() {
return 'invalid argument';
}
static w3cStatus() {
return _httpStatusCodes.default.BAD_REQUEST;
}
constructor(err) {
super(err || 'The arguments passed to the command are either invalid or malformed', InvalidArgumentError.code(), InvalidArgumentError.w3cStatus(), InvalidArgumentError.error());
}
}
class InvalidCookieDomainError extends ProtocolError {
static code() {
return 24;
}
static error() {
return 'invalid cookie domain';
}
static w3cStatus() {
return _httpStatusCodes.default.BAD_REQUEST;
}
constructor(err) {
super(err || 'An illegal attempt was made to set a cookie under a different ' + 'domain than the current page.', InvalidCookieDomainError.code(), InvalidCookieDomainError.w3cStatus(), InvalidCookieDomainError.error());
}
}
class NoSuchCookieError extends ProtocolError {
static code() {
return 62;
}
static w3cStatus() {
return _httpStatusCodes.default.NOT_FOUND;
}
static error() {
return 'no such cookie';
}
constructor(err) {
super(err || 'No cookie matching the given path name was found amongst the associated cookies of the current browsing context’s active document', NoSuchCookieError.code(), NoSuchCookieError.w3cStatus(), NoSuchCookieError.error());
}
}
class UnableToSetCookieError extends ProtocolError {
static code() {
return 25;
}
static w3cStatus() {
return _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
}
static error() {
return 'unable to set cookie';
}
constructor(err) {
super(err || 'A request to set a cookie\'s value could not be satisfied.', UnableToSetCookieError.code(), UnableToSetCookieError.w3cStatus(), UnableToSetCookieError.error());
}
}
class UnexpectedAlertOpenError extends ProtocolError {
static code() {
return 26;
}
static w3cStatus() {
return _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
}
static error() {
return 'unexpected alert open';
}
constructor(err) {
super(err || 'A modal dialog was open, blocking this operation', UnexpectedAlertOpenError.code(), UnexpectedAlertOpenError.w3cStatus(), UnexpectedAlertOpenError.error());
}
}
class NoAlertOpenError extends ProtocolError {
static code() {
return 27;
}
static w3cStatus() {
return _httpStatusCodes.default.NOT_FOUND;
}
static error() {
return 'no such alert';
}
constructor(err) {
super(err || 'An attempt was made to operate on a modal dialog when one ' + 'was not open.', NoAlertOpenError.code(), NoAlertOpenError.w3cStatus(), NoAlertOpenError.error());
}
}
class NoSuchAlertError extends NoAlertOpenError {}
class ScriptTimeoutError extends ProtocolError {
static code() {
return 28;
}
static w3cStatus() {
return _httpStatusCodes.default.REQUEST_TIMEOUT;
}
static error() {
return 'script timeout';
}
constructor(err) {
super(err || 'A script did not complete before its timeout expired.', ScriptTimeoutError.code(), ScriptTimeoutError.w3cStatus(), ScriptTimeoutError.error());
}
}
class InvalidElementCoordinatesError extends ProtocolError {
static code() {
return 29;
}
static w3cStatus() {
return _httpStatusCodes.default.BAD_REQUEST;
}
static error() {
return 'invalid coordinates';
}
constructor(err) {
super(err || 'The coordinates provided to an interactions operation are invalid.', InvalidElementCoordinatesError.code(), InvalidElementCoordinatesError.w3cStatus(), InvalidElementCoordinatesError.error());
}
}
class InvalidCoordinatesError extends InvalidElementCoordinatesError {}
class IMENotAvailableError extends ProtocolError {
static code() {
return 30;
}
static w3cStatus() {
return _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
}
static error() {
return 'unsupported operation';
}
constructor(err) {
super(err || 'IME was not available.', IMENotAvailableError.code(), IMENotAvailableError.w3cStatus(), IMENotAvailableError.error());
}
}
class IMEEngineActivationFailedError extends ProtocolError {
static code() {
return 31;
}
static w3cStatus() {
return _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
}
static error() {
return 'unsupported operation';
}
constructor(err) {
super(err || 'An IME engine could not be started.', IMEEngineActivationFailedError.code(), IMEEngineActivationFailedError.w3cStatus(), IMEEngineActivationFailedError.error());
}
}
class InvalidSelectorError extends ProtocolError {
static code() {
return 32;
}
static w3cStatus() {
return _httpStatusCodes.default.BAD_REQUEST;
}
static error() {
return 'invalid selector';
}
constructor(err) {
super(err || 'Argument was an invalid selector (e.g. XPath/CSS).', InvalidSelectorError.code(), InvalidSelectorError.w3cStatus(), InvalidSelectorError.error());
}
}
class SessionNotCreatedError extends ProtocolError {
static code() {
return 33;
}
static w3cStatus() {
return _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
}
static error() {
return 'session not created';
}
constructor(details) {
let message = 'A new session could not be created.';
if (details) {
message += ` Details: ${details}`;
}
super(message, SessionNotCreatedError.code(), SessionNotCreatedError.w3cStatus(), SessionNotCreatedError.error());
}
}
class MoveTargetOutOfBoundsError extends ProtocolError {
static code() {
return 34;
}
static w3cStatus() {
return _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
}
static error() {
return 'move target out of bounds';
}
constructor(err) {
super(err || 'Target provided for a move action is out of bounds.', MoveTargetOutOfBoundsError.code(), MoveTargetOutOfBoundsError.w3cStatus(), MoveTargetOutOfBoundsError.error());
}
}
class NoSuchContextError extends ProtocolError {
static code() {
return 35;
}
constructor(err) {
super(err || 'No such context found.', NoSuchContextError.code());
}
}
class InvalidContextError extends ProtocolError {
static code() {
return 36;
}
constructor(err) {
super(err || 'That command could not be executed in the current context.', InvalidContextError.code());
}
}
class NotYetImplementedError extends ProtocolError {
static code() {
return 13;
}
static w3cStatus() {
return _httpStatusCodes.default.NOT_FOUND;
}
static error() {
return 'unknown method';
}
constructor(err) {
super(err || 'Method has not yet been implemented', NotYetImplementedError.code(), NotYetImplementedError.w3cStatus(), NotYetImplementedError.error());
}
}
class NotImplementedError extends ProtocolError {
static code() {
return 13;
}
static w3cStatus() {
return _httpStatusCodes.default.METHOD_NOT_ALLOWED;
}
constructor(err) {
super(err || 'Method is not implemented', NotImplementedError.code(), NotImplementedError.w3cStatus());
}
}
class UnableToCaptureScreen extends ProtocolError {
static code() {
return 63;
}
static w3cStatus() {
return _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
}
static error() {
return 'unable to capture screen';
}
constructor(err) {
super(err || 'A screen capture was made impossible', UnableToCaptureScreen.code(), UnableToCaptureScreen.w3cStatus(), UnableToCaptureScreen.error());
}
}
class BadParametersError extends _es6Error.default {
static error() {
return 'invalid argument';
}
constructor(requiredParams, actualParams, errMessage) {
let message;
if (!errMessage) {
message = `Parameters were incorrect. We wanted ` + `${JSON.stringify(requiredParams)} and you ` + `sent ${JSON.stringify(actualParams)}`;
} else {
message = `Parameters were incorrect. You sent ${JSON.stringify(actualParams)}, ${errMessage}`;
}
super(message);
this.w3cStatus = _httpStatusCodes.default.BAD_REQUEST;
}
}
class ProxyRequestError extends _es6Error.default {
constructor(err, responseError, httpStatus) {
let responseErrorObj = _appiumSupport.util.safeJsonParse(responseError);
if (!_lodash.default.isPlainObject(responseErrorObj)) {
responseErrorObj = {};
}
let origMessage = _lodash.default.isString(responseError) ? responseError : '';
if (!_lodash.default.isEmpty(responseErrorObj)) {
if (_lodash.default.isString(responseErrorObj.value)) {
origMessage = responseErrorObj.value;
} else if (_lodash.default.isPlainObject(responseErrorObj.value) && _lodash.default.isString(responseErrorObj.value.message)) {
origMessage = responseErrorObj.value.message;
}
}
super(_lodash.default.isEmpty(err) ? `Proxy request unsuccessful. ${origMessage}` : err);
this.w3cStatus = _httpStatusCodes.default.BAD_REQUEST;
if (_lodash.default.isPlainObject(responseErrorObj.value) && _lodash.default.has(responseErrorObj.value, 'error')) {
this.w3c = responseErrorObj.value;
this.w3cStatus = httpStatus || _httpStatusCodes.default.BAD_REQUEST;
} else {
this.jsonwp = responseErrorObj;
}
}
getActualError() {
if (_appiumSupport.util.hasValue(this.jsonwp) && _appiumSupport.util.hasValue(this.jsonwp.status) && _appiumSupport.util.hasValue(this.jsonwp.value)) {
return errorFromMJSONWPStatusCode(this.jsonwp.status, this.jsonwp.value);
} else if (_appiumSupport.util.hasValue(this.w3c) && _lodash.default.isNumber(this.w3cStatus) && this.w3cStatus >= 300) {
return errorFromW3CJsonCode(this.w3c.error, this.w3c.message || this.message, this.w3c.stacktrace);
}
return new UnknownError(this.message);
}
}
const errors = {
NotYetImplementedError,
NotImplementedError,
BadParametersError,
InvalidArgumentError,
NoSuchDriverError,
NoSuchElementError,
UnknownCommandError,
StaleElementReferenceError,
ElementNotVisibleError,
InvalidElementStateError,
UnknownError,
ElementIsNotSelectableError,
ElementClickInterceptedError,
ElementNotInteractableError,
InsecureCertificateError,
JavaScriptError,
XPathLookupError,
TimeoutError,
NoSuchWindowError,
NoSuchCookieError,
InvalidCookieDomainError,
InvalidCoordinatesError,
UnableToSetCookieError,
UnexpectedAlertOpenError,
NoAlertOpenError,
ScriptTimeoutError,
InvalidElementCoordinatesError,
IMENotAvailableError,
IMEEngineActivationFailedError,
InvalidSelectorError,
SessionNotCreatedError,
MoveTargetOutOfBoundsError,
NoSuchAlertError,
NoSuchContextError,
InvalidContextError,
NoSuchFrameError,
UnableToCaptureScreen,
UnknownMethodError,
UnsupportedOperationError,
ProxyRequestError
};
exports.errors = errors;
const jsonwpErrorCodeMap = {};
for (let ErrorClass of _lodash.default.values(errors)) {
if (ErrorClass.code) {
jsonwpErrorCodeMap[ErrorClass.code()] = ErrorClass;
}
}
const w3cErrorCodeMap = {};
for (let ErrorClass of _lodash.default.values(errors)) {
if (ErrorClass.error) {
w3cErrorCodeMap[ErrorClass.error()] = ErrorClass;
}
}
function isUnknownError(err) {
return !err.constructor.name || !_lodash.default.values(errors).find(function equalNames(error) {
return error.name === err.constructor.name;
});
}
function isErrorType(err, type) {
if (type.name === ProtocolError.name) {
return !!err.jsonwpCode;
} else if (type.name === ProxyRequestError.name) {
if (err.jsonwp) {
return !!err.jsonwp.status;
}
if (_lodash.default.isPlainObject(err.w3c)) {
return _lodash.default.isNumber(err.w3cStatus) && err.w3cStatus >= 300;
}
return false;
}
return err.constructor.name === type.name;
}
function errorFromMJSONWPStatusCode(code, value = '') {
const message = (value || {}).message || value || '';
if (code !== UnknownError.code() && jsonwpErrorCodeMap[code]) {
mjsonwpLog.debug(`Matched JSONWP error code ${code} to ${jsonwpErrorCodeMap[code].name}`);
return new jsonwpErrorCodeMap[code](message);
}
mjsonwpLog.debug(`Matched JSONWP error code ${code} to UnknownError`);
return new UnknownError(message);
}
function errorFromW3CJsonCode(code, message, stacktrace = null) {
if (code && w3cErrorCodeMap[code.toLowerCase()]) {
w3cLog.debug(`Matched W3C error code '${code}' to ${w3cErrorCodeMap[code.toLowerCase()].name}`);
const resultError = new w3cErrorCodeMap[code.toLowerCase()](message);
resultError.stacktrace = stacktrace;
return resultError;
}
w3cLog.debug(`Matched W3C error code '${code}' to UnknownError`);
const resultError = new UnknownError(message);
resultError.stacktrace = stacktrace;
return resultError;
}
function getResponseForW3CError(err) {
let httpStatus;
let w3cErrorString;
if (!err.w3cStatus) {
err = _appiumSupport.util.hasValue(err.status) ? errorFromMJSONWPStatusCode(err.status, err.value) : new errors.UnknownError(err.message);
}
if (isErrorType(err, errors.BadParametersError)) {
w3cLog.debug(`Bad parameters: ${err}`);
w3cErrorString = BadParametersError.error();
} else {
w3cErrorString = err.error;
}
httpStatus = err.w3cStatus;
if (!w3cErrorString) {
w3cErrorString = UnknownError.error();
}
let httpResBody = {
value: {
error: w3cErrorString,
message: err.message,
stacktrace: err.stacktrace || err.stack
}
};
return [httpStatus, httpResBody];
}
function getResponseForJsonwpError(err) {
if (isUnknownError(err)) {
err = new errors.UnknownError(err);
}
let httpStatus = _httpStatusCodes.default.INTERNAL_SERVER_ERROR;
let httpResBody = {
status: err.jsonwpCode,
value: {
message: err.message
}
};
if (isErrorType(err, errors.BadParametersError)) {
mjsonwpLog.debug(`Bad parameters: ${err}`);
httpStatus = _httpStatusCodes.default.BAD_REQUEST;
httpResBody = err.message;
} else if (isErrorType(err, errors.NotYetImplementedError) || isErrorType(err, errors.NotImplementedError)) {
httpStatus = _httpStatusCodes.default.NOT_IMPLEMENTED;
} else if (isErrorType(err, errors.NoSuchDriverError)) {
httpStatus = _httpStatusCodes.default.NOT_FOUND;
}
return [httpStatus, httpResBody];
}require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9lcnJvcnMuanMiXSwibmFtZXMiOlsibWpzb253cExvZyIsImxvZ2dlciIsImdldExvZ2dlciIsInczY0xvZyIsIlczQ19VTktOT1dOX0VSUk9SIiwiUHJvdG9jb2xFcnJvciIsIkVTNkVycm9yIiwiY29uc3RydWN0b3IiLCJtc2ciLCJqc29ud3BDb2RlIiwidzNjU3RhdHVzIiwiZXJyb3IiLCJIVFRQU3RhdHVzQ29kZXMiLCJCQURfUkVRVUVTVCIsIl9zdGFja3RyYWNlIiwic3RhY2t0cmFjZSIsInN0YWNrIiwidmFsdWUiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImNvZGUiLCJOT1RfRk9VTkQiLCJlcnIiLCJOb1N1Y2hFbGVtZW50RXJyb3IiLCJOb1N1Y2hGcmFtZUVycm9yIiwiVW5rbm93bkNvbW1hbmRFcnJvciIsIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yIiwiRWxlbWVudE5vdFZpc2libGVFcnJvciIsIkludmFsaWRFbGVtZW50U3RhdGVFcnJvciIsIlVua25vd25FcnJvciIsIklOVEVSTkFMX1NFUlZFUl9FUlJPUiIsIm9yaWdpbmFsRXJyb3IiLCJvcmlnTWVzc2FnZSIsIkVycm9yIiwibWVzc2FnZSIsIlVua25vd25NZXRob2RFcnJvciIsIk1FVEhPRF9OT1RfQUxMT1dFRCIsIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IiLCJFbGVtZW50SXNOb3RTZWxlY3RhYmxlRXJyb3IiLCJFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yIiwiRWxlbWVudE5vdEludGVyYWN0YWJsZUVycm9yIiwiSW5zZWN1cmVDZXJ0aWZpY2F0ZUVycm9yIiwiSmF2YVNjcmlwdEVycm9yIiwiWFBhdGhMb29rdXBFcnJvciIsIlRpbWVvdXRFcnJvciIsIlJFUVVFU1RfVElNRU9VVCIsIk5vU3VjaFdpbmRvd0Vycm9yIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJJbnZhbGlkQ29va2llRG9tYWluRXJyb3IiLCJOb1N1Y2hDb29raWVFcnJvciIsIlVuYWJsZVRvU2V0Q29va2llRXJyb3IiLCJVbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3IiLCJOb0FsZXJ0T3BlbkVycm9yIiwiTm9TdWNoQWxlcnRFcnJvciIsIlNjcmlwdFRpbWVvdXRFcnJvciIsIkludmFsaWRFbGVtZW50Q29vcmRpbmF0ZXNFcnJvciIsIkludmFsaWRDb29yZGluYXRlc0Vycm9yIiwiSU1FTm90QXZhaWxhYmxlRXJyb3IiLCJJTUVFbmdpbmVBY3RpdmF0aW9uRmFpbGVkRXJyb3IiLCJJbnZhbGlkU2VsZWN0b3JFcnJvciIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJkZXRhaWxzIiwiTW92ZVRhcmdldE91dE9mQm91bmRzRXJyb3IiLCJOb1N1Y2hDb250ZXh0RXJyb3IiLCJJbnZhbGlkQ29udGV4dEVycm9yIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJVbmFibGVUb0NhcHR1cmVTY3JlZW4iLCJCYWRQYXJhbWV0ZXJzRXJyb3IiLCJyZXF1aXJlZFBhcmFtcyIsImFjdHVhbFBhcmFtcyIsImVyck1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5IiwiUHJveHlSZXF1ZXN0RXJyb3IiLCJyZXNwb25zZUVycm9yIiwiaHR0cFN0YXR1cyIsInJlc3BvbnNlRXJyb3JPYmoiLCJ1dGlsIiwic2FmZUpzb25QYXJzZSIsIl8iLCJpc1BsYWluT2JqZWN0IiwiaXNTdHJpbmciLCJpc0VtcHR5IiwiaGFzIiwidzNjIiwianNvbndwIiwiZ2V0QWN0dWFsRXJyb3IiLCJoYXNWYWx1ZSIsInN0YXR1cyIsImVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlIiwiaXNOdW1iZXIiLCJlcnJvckZyb21XM0NKc29uQ29kZSIsImVycm9ycyIsImpzb253cEVycm9yQ29kZU1hcCIsIkVycm9yQ2xhc3MiLCJ2YWx1ZXMiLCJ3M2NFcnJvckNvZGVNYXAiLCJpc1Vua25vd25FcnJvciIsIm5hbWUiLCJmaW5kIiwiZXF1YWxOYW1lcyIsImlzRXJyb3JUeXBlIiwidHlwZSIsImRlYnVnIiwidG9Mb3dlckNhc2UiLCJyZXN1bHRFcnJvciIsImdldFJlc3BvbnNlRm9yVzNDRXJyb3IiLCJ3M2NFcnJvclN0cmluZyIsImh0dHBSZXNCb2R5IiwiZ2V0UmVzcG9uc2VGb3JKc29ud3BFcnJvciIsIk5PVF9JTVBMRU1FTlRFRCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUdDLHNCQUFPQyxTQUFQLENBQWlCLFNBQWpCLENBQW5COztBQUNBLE1BQU1DLE1BQU0sR0FBR0Ysc0JBQU9DLFNBQVAsQ0FBaUIsS0FBakIsQ0FBZjs7QUFFQSxNQUFNRSxpQkFBaUIsR0FBRyxlQUExQjs7QUFHQSxNQUFNQyxhQUFOLFNBQTRCQyxpQkFBNUIsQ0FBcUM7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBRUMsR0FBRixFQUFPQyxVQUFQLEVBQW1CQyxTQUFuQixFQUE4QkMsS0FBOUIsRUFBcUM7QUFDOUMsVUFBTUgsR0FBTjtBQUNBLFNBQUtDLFVBQUwsR0FBa0JBLFVBQWxCO0FBQ0EsU0FBS0UsS0FBTCxHQUFhQSxLQUFLLElBQUlQLGlCQUF0Qjs7QUFDQSxRQUFJLEtBQUtLLFVBQUwsS0FBb0IsSUFBeEIsRUFBOEI7QUFDNUIsV0FBS0EsVUFBTCxHQUFrQixFQUFsQjtBQUNEOztBQUNELFNBQUtDLFNBQUwsR0FBaUJBLFNBQVMsSUFBSUUseUJBQWdCQyxXQUE5QztBQUNBLFNBQUtDLFdBQUwsR0FBbUIsSUFBbkI7QUFDRDs7QUFFRCxNQUFJQyxVQUFKLEdBQWtCO0FBQ2hCLFdBQU8sS0FBS0QsV0FBTCxJQUFvQixLQUFLRSxLQUFoQztBQUNEOztBQUVELE1BQUlELFVBQUosQ0FBZ0JFLEtBQWhCLEVBQXVCO0FBQ3JCLFNBQUtILFdBQUwsR0FBbUJHLEtBQW5CO0FBQ0Q7O0FBbEJrQzs7OztBQXlCckMsTUFBTUMsaUJBQU4sU0FBZ0NiLGFBQWhDLENBQThDO0FBQzVDLFNBQU9jLElBQVAsR0FBZTtBQUNiLFdBQU8sQ0FB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