UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

382 lines 46.2 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MultipleWindowsModeIsNotAvailableInRemoteBrowserError = exports.MultipleWindowsModeIsDisabledError = exports.RequestHookNotImplementedMethodError = exports.RequestHookUnhandledError = exports.RequestHookBaseError = exports.SetNativeDialogHandlerCodeWrongTypeError = exports.RoleSwitchInRoleInitializerError = exports.ForbiddenCharactersInScreenshotPathError = exports.WindowDimensionsOverflowError = exports.UncaughtTestCafeErrorInCustomScript = exports.UncaughtErrorInCustomScript = exports.ActionSkipJsErrorsArgumentTypeError = exports.ActionUrlArgumentError = exports.ActionRequiredCookieArguments = exports.ActionUrlsCookieArgumentError = exports.ActionUrlCookieArgumentError = exports.ActionCookieArgumentsError = exports.ActionCookieArgumentError = exports.ActionUnsupportedDeviceTypeError = exports.SetTestSpeedArgumentError = exports.ActionStringArrayElementError = exports.ActionStringOrStringArrayArgumentError = exports.ActionPositiveIntegerArgumentError = exports.ActionFunctionArgumentError = exports.ActionRoleArgumentError = exports.ActionIntegerArgumentError = exports.ActionNullableStringArgumentError = exports.ActionStringArgumentError = exports.ActionOptionsTypeError = exports.ActionBooleanArgumentError = exports.AssertionUnawaitedPromiseError = exports.AssertionWithoutMethodCallError = exports.AssertionExecutableArgumentError = exports.ExternalAssertionLibraryError = exports.UncaughtExceptionError = exports.UnhandledPromiseRejectionError = exports.UncaughtNonErrorObjectInTestCode = exports.UncaughtErrorInTestCode = exports.RunTimeoutError = exports.TestTimeoutError = exports.TimeoutError = exports.PageLoadError = exports.ActionSelectorError = exports.MissingAwaitError = void 0; const types_1 = require("../types"); const diff = __importStar(require("../../utils/diff/")); const errors_1 = require("../../shared/errors"); __exportStar(require("../../shared/errors"), exports); // Base //-------------------------------------------------------------------- class ActionArgumentErrorBase extends errors_1.TestRunErrorBase { constructor(code, argumentName, actualValue) { super(code); this.argumentName = argumentName; this.actualValue = actualValue; } } // Synchronization errors //-------------------------------------------------------------------- class MissingAwaitError extends errors_1.TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.missingAwaitError); this.callsite = callsite; } } exports.MissingAwaitError = MissingAwaitError; // Selector errors //-------------------------------------------------------------------- class ActionSelectorError extends errors_1.TestRunErrorBase { constructor(selectorName, err, isAPIError) { super(types_1.TEST_RUN_ERRORS.actionSelectorError); this.selectorName = selectorName; this.errMsg = isAPIError ? err.rawMessage : err.message; this.originError = err; } } exports.ActionSelectorError = ActionSelectorError; // Page errors //-------------------------------------------------------------------- class PageLoadError extends errors_1.TestRunErrorBase { constructor(errMsg, url) { super(types_1.TEST_RUN_ERRORS.pageLoadError); this.url = url; this.errMsg = errMsg; } } exports.PageLoadError = PageLoadError; // Timeout errors //-------------------------------------------------------------------- class TimeoutError extends errors_1.TestRunErrorBase { constructor(timeout, scope) { super(types_1.TEST_RUN_ERRORS.executionTimeoutExceeded); this.timeout = timeout; this.scope = scope; } } exports.TimeoutError = TimeoutError; class TestTimeoutError extends TimeoutError { constructor(timeout) { super(timeout, 'Test'); } } exports.TestTimeoutError = TestTimeoutError; class RunTimeoutError extends TimeoutError { constructor(timeout) { super(timeout, 'Run'); } } exports.RunTimeoutError = RunTimeoutError; // Uncaught errors //-------------------------------------------------------------------- class UncaughtErrorInTestCode extends errors_1.TestRunErrorBase { constructor(err, callsite) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInTestCode); this.errMsg = String(err.rawMessage || err); this.callsite = err.callsite || callsite; this.originError = err; } } exports.UncaughtErrorInTestCode = UncaughtErrorInTestCode; class UncaughtNonErrorObjectInTestCode extends errors_1.TestRunErrorBase { constructor(obj) { super(types_1.TEST_RUN_ERRORS.uncaughtNonErrorObjectInTestCode); this.objType = typeof obj; this.objStr = this.objType === 'object' ? JSON.stringify(obj) : String(obj); } } exports.UncaughtNonErrorObjectInTestCode = UncaughtNonErrorObjectInTestCode; class UnhandledPromiseRejectionError extends errors_1.TestRunErrorBase { constructor(err) { super(types_1.TEST_RUN_ERRORS.unhandledPromiseRejection); this.errMsg = String(err); } } exports.UnhandledPromiseRejectionError = UnhandledPromiseRejectionError; class UncaughtExceptionError extends errors_1.TestRunErrorBase { constructor(err) { super(types_1.TEST_RUN_ERRORS.uncaughtException); this.errMsg = String(err); } } exports.UncaughtExceptionError = UncaughtExceptionError; // Assertion errors //-------------------------------------------------------------------- class ExternalAssertionLibraryError extends errors_1.TestRunErrorBase { constructor(err, callsite) { super(types_1.TEST_RUN_ERRORS.externalAssertionLibraryError); this.errMsg = String(err); this.diff = (err === null || err === void 0 ? void 0 : err.showDiff) && diff.generate(err.actual, err.expected); this.callsite = callsite; } } exports.ExternalAssertionLibraryError = ExternalAssertionLibraryError; class AssertionExecutableArgumentError extends ActionArgumentErrorBase { constructor(argumentName, argumentValue, err, isAPIError) { super(types_1.TEST_RUN_ERRORS.assertionExecutableArgumentError, argumentName, argumentValue); this.errMsg = isAPIError ? err.rawMessage : err.message; this.originError = err; } } exports.AssertionExecutableArgumentError = AssertionExecutableArgumentError; class AssertionWithoutMethodCallError extends errors_1.TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.assertionWithoutMethodCallError); this.callsite = callsite; } } exports.AssertionWithoutMethodCallError = AssertionWithoutMethodCallError; class AssertionUnawaitedPromiseError extends errors_1.TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.assertionUnawaitedPromiseError); this.callsite = callsite; } } exports.AssertionUnawaitedPromiseError = AssertionUnawaitedPromiseError; // Action parameters errors //-------------------------------------------------------------------- // Options errors //-------------------------------------------------------------------- class ActionBooleanArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionBooleanArgumentError, argumentName, actualValue); } } exports.ActionBooleanArgumentError = ActionBooleanArgumentError; class ActionOptionsTypeError extends errors_1.TestRunErrorBase { constructor(actualType) { super(types_1.TEST_RUN_ERRORS.actionOptionsTypeError); this.actualType = actualType; } } exports.ActionOptionsTypeError = ActionOptionsTypeError; // Arguments errors class ActionStringArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionStringArgumentError, argumentName, actualValue); } } exports.ActionStringArgumentError = ActionStringArgumentError; class ActionNullableStringArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionNullableStringArgumentError, argumentName, actualValue); } } exports.ActionNullableStringArgumentError = ActionNullableStringArgumentError; class ActionIntegerArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionIntegerArgumentError, argumentName, actualValue); } } exports.ActionIntegerArgumentError = ActionIntegerArgumentError; class ActionRoleArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionRoleArgumentError, argumentName, actualValue); } } exports.ActionRoleArgumentError = ActionRoleArgumentError; class ActionFunctionArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionFunctionArgumentError, argumentName, actualValue); } } exports.ActionFunctionArgumentError = ActionFunctionArgumentError; class ActionPositiveIntegerArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionPositiveIntegerArgumentError, argumentName, actualValue); } } exports.ActionPositiveIntegerArgumentError = ActionPositiveIntegerArgumentError; class ActionStringOrStringArrayArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionStringOrStringArrayArgumentError, argumentName, actualValue); } } exports.ActionStringOrStringArrayArgumentError = ActionStringOrStringArrayArgumentError; class ActionStringArrayElementError extends ActionArgumentErrorBase { constructor(argumentName, actualValue, elementIndex) { super(types_1.TEST_RUN_ERRORS.actionStringArrayElementError, argumentName, actualValue); this.elementIndex = elementIndex; } } exports.ActionStringArrayElementError = ActionStringArrayElementError; class SetTestSpeedArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.setTestSpeedArgumentError, argumentName, actualValue); } } exports.SetTestSpeedArgumentError = SetTestSpeedArgumentError; class ActionUnsupportedDeviceTypeError extends ActionArgumentErrorBase { constructor(argumentName, argumentValue) { super(types_1.TEST_RUN_ERRORS.actionUnsupportedDeviceTypeError, argumentName, argumentValue); } } exports.ActionUnsupportedDeviceTypeError = ActionUnsupportedDeviceTypeError; class ActionCookieArgumentError extends errors_1.TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionCookieArgumentError); } } exports.ActionCookieArgumentError = ActionCookieArgumentError; class ActionCookieArgumentsError extends errors_1.TestRunErrorBase { constructor(index, value) { super(types_1.TEST_RUN_ERRORS.actionCookieArgumentsError); this.index = index; this.actualValue = value; } } exports.ActionCookieArgumentsError = ActionCookieArgumentsError; class ActionUrlCookieArgumentError extends errors_1.TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionUrlCookieArgumentError); } } exports.ActionUrlCookieArgumentError = ActionUrlCookieArgumentError; class ActionUrlsCookieArgumentError extends errors_1.TestRunErrorBase { constructor(index, value) { super(types_1.TEST_RUN_ERRORS.actionUrlsCookieArgumentError); this.index = index; this.actualValue = value; } } exports.ActionUrlsCookieArgumentError = ActionUrlsCookieArgumentError; class ActionRequiredCookieArguments extends errors_1.TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionRequiredCookieArguments); } } exports.ActionRequiredCookieArguments = ActionRequiredCookieArguments; class ActionUrlArgumentError extends errors_1.TestRunErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionUrlArgumentError); this.argumentName = argumentName; this.actualValue = actualValue; } } exports.ActionUrlArgumentError = ActionUrlArgumentError; class ActionSkipJsErrorsArgumentTypeError extends errors_1.TestRunErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionSkipJsErrorsArgumentError); this.argumentName = argumentName; this.actualValue = actualValue; } } exports.ActionSkipJsErrorsArgumentTypeError = ActionSkipJsErrorsArgumentTypeError; // Action execution errors //-------------------------------------------------------------------- class UncaughtErrorInCustomScript extends errors_1.TestRunErrorBase { constructor(err, expression, line, column, callsite) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomScript); this.callsite = callsite; this.expression = expression; this.line = line; this.column = column; this.originError = err; this.errMsg = err.message || String(err); } } exports.UncaughtErrorInCustomScript = UncaughtErrorInCustomScript; class UncaughtTestCafeErrorInCustomScript extends errors_1.TestRunErrorBase { constructor(err, expression, line, column, callsite) { super(types_1.TEST_RUN_ERRORS.uncaughtTestCafeErrorInCustomScript); this.callsite = callsite; this.expression = expression; this.line = line; this.column = column; this.originError = err; this.errCallsite = err.callsite; } } exports.UncaughtTestCafeErrorInCustomScript = UncaughtTestCafeErrorInCustomScript; class WindowDimensionsOverflowError extends errors_1.TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.windowDimensionsOverflowError); this.callsite = callsite; } } exports.WindowDimensionsOverflowError = WindowDimensionsOverflowError; class ForbiddenCharactersInScreenshotPathError extends errors_1.TestRunErrorBase { constructor(screenshotPath, forbiddenCharsList) { super(types_1.TEST_RUN_ERRORS.forbiddenCharactersInScreenshotPathError); this.screenshotPath = screenshotPath; this.forbiddenCharsList = forbiddenCharsList; } } exports.ForbiddenCharactersInScreenshotPathError = ForbiddenCharactersInScreenshotPathError; class RoleSwitchInRoleInitializerError extends errors_1.TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.roleSwitchInRoleInitializerError); this.callsite = callsite; } } exports.RoleSwitchInRoleInitializerError = RoleSwitchInRoleInitializerError; // Native dialog errors //-------------------------------------------------------------------- class SetNativeDialogHandlerCodeWrongTypeError extends errors_1.TestRunErrorBase { constructor(actualType) { super(types_1.TEST_RUN_ERRORS.setNativeDialogHandlerCodeWrongTypeError); this.actualType = actualType; } } exports.SetNativeDialogHandlerCodeWrongTypeError = SetNativeDialogHandlerCodeWrongTypeError; class RequestHookBaseError extends errors_1.TestRunErrorBase { constructor(code, hookClassName, methodName) { super(code); this.hookClassName = hookClassName; this.methodName = methodName; } } exports.RequestHookBaseError = RequestHookBaseError; class RequestHookUnhandledError extends RequestHookBaseError { constructor(err, hookClassName, methodName) { super(types_1.TEST_RUN_ERRORS.requestHookUnhandledError, hookClassName, methodName); this.errMsg = String(err); } } exports.RequestHookUnhandledError = RequestHookUnhandledError; class RequestHookNotImplementedMethodError extends RequestHookBaseError { constructor(methodName, hookClassName) { super(types_1.TEST_RUN_ERRORS.requestHookNotImplementedError, hookClassName, methodName); } } exports.RequestHookNotImplementedMethodError = RequestHookNotImplementedMethodError; class MultipleWindowsModeIsDisabledError extends errors_1.TestRunErrorBase { constructor(methodName) { super(types_1.TEST_RUN_ERRORS.multipleWindowsModeIsDisabledError); this.methodName = methodName; } } exports.MultipleWindowsModeIsDisabledError = MultipleWindowsModeIsDisabledError; class MultipleWindowsModeIsNotAvailableInRemoteBrowserError extends errors_1.TestRunErrorBase { constructor(methodName) { super(types_1.TEST_RUN_ERRORS.multipleWindowsModeIsNotSupportedInRemoteBrowserError); this.methodName = methodName; } } exports.MultipleWindowsModeIsNotAvailableInRemoteBrowserError = MultipleWindowsModeIsNotAvailableInRemoteBrowserError; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXJyb3JzL3Rlc3QtcnVuL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0NBQTJDO0FBQzNDLHdEQUEwQztBQUMxQyxnREFBdUQ7QUFDdkQsc0RBQW9DO0FBRXBDLE9BQU87QUFDUCxzRUFBc0U7QUFDdEUsTUFBTSx1QkFBd0IsU0FBUSx5QkFBZ0I7SUFDbEQsWUFBYSxJQUFJLEVBQUUsWUFBWSxFQUFFLFdBQVc7UUFDeEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRVosSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBSSxXQUFXLENBQUM7SUFDcEMsQ0FBQztDQUNKO0FBR0QseUJBQXlCO0FBQ3pCLHNFQUFzRTtBQUN0RSxNQUFhLGlCQUFrQixTQUFRLHlCQUFnQjtJQUNuRCxZQUFhLFFBQVE7UUFDakIsS0FBSyxDQUFDLHVCQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUM3QixDQUFDO0NBQ0o7QUFORCw4Q0FNQztBQUdELGtCQUFrQjtBQUNsQixzRUFBc0U7QUFDdEUsTUFBYSxtQkFBb0IsU0FBUSx5QkFBZ0I7SUFDckQsWUFBYSxZQUFZLEVBQUUsR0FBRyxFQUFFLFVBQVU7UUFDdEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUM5RCxJQUFJLENBQUMsV0FBVyxHQUFJLEdBQUcsQ0FBQztJQUM1QixDQUFD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QztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFNLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0NBQ0o7QUFQRCxvREFPQztBQUVELE1BQWEseUJBQTBCLFNBQVEsb0JBQW9CO0lBQy9ELFlBQWEsR0FBRyxFQUFFLGFBQWEsRUFBRSxVQUFVO1FBQ3ZDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHlCQUF5QixFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1RSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0o7QUFORCw4REFNQztBQUVELE1BQWEsb0NBQXFDLFNBQVEsb0JBQW9CO0lBQzFFLFlBQWEsVUFBVSxFQUFFLGFBQWE7UUFDbEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsOEJBQThCLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7Q0FDSjtBQUpELG9GQUlDO0FBRUQsTUFBYSxrQ0FBbUMsU0FBUSx5QkFBZ0I7SUFDcEUsWUFBYSxVQUFVO1FBQ25CLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDakMsQ0FBQztDQUNKO0FBTkQsZ0ZBTUM7QUFFRCxNQUFhLHFEQUFzRCxTQUFRLHlCQUFnQjtJQUN2RixZQUFhLFVBQVU7UUFDbkIsS0FBSyxDQUFDLHVCQUFlLENBQUMscURBQXFELENBQUMsQ0FBQztRQUU3RSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUNqQyxDQUFDO0NBQ0o7QUFORCxzSEFNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRFU1RfUlVOX0VSUk9SUyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIGRpZmYgZnJvbSAnLi4vLi4vdXRpbHMvZGlmZi8nO1xuaW1wb3J0IHsgVGVzdFJ1bkVycm9yQmFzZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9lcnJvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi4vLi4vc2hhcmVkL2Vycm9ycyc7XG5cbi8vIEJhc2Vcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNsYXNzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNvZGUsIGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoY29kZSk7XG5cbiAgICAgICAgdGhpcy5hcmd1bWVudE5hbWUgPSBhcmd1bWVudE5hbWU7XG4gICAgICAgIHRoaXMuYWN0dWFsVmFsdWUgID0gYWN0dWFsVmFsdWU7XG4gICAgfVxufVxuXG5cbi8vIFN5bmNocm9uaXphdGlvbiBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBNaXNzaW5nQXdhaXRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMubWlzc2luZ0F3YWl0RXJyb3IpO1xuXG4gICAgICAgIHRoaXMuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICB9XG59XG5cblxuLy8gU2VsZWN0b3IgZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY2xhc3MgQWN0aW9uU2VsZWN0b3JFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChzZWxlY3Rvck5hbWUsIGVyciwgaXNBUElFcnJvcikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uU2VsZWN0b3JFcnJvcik7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rvck5hbWUgPSBzZWxlY3Rvck5hbWU7XG4gICAgICAgIHRoaXMuZXJyTXNnICAgICAgID0gaXNBUElFcnJvciA/IGVyci5yYXdNZXNzYWdlIDogZXJyLm1lc3NhZ2U7XG4gICAgICAgIHRoaXMub3JpZ2luRXJyb3IgID0gZXJyO1xuICAgIH1cbn1cblxuXG4vLyBQYWdlIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIFBhZ2VMb2FkRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoZXJyTXNnLCB1cmwpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnBhZ2VMb2FkRXJyb3IpO1xuXG4gICAgICAgIHRoaXMudXJsICAgID0gdXJsO1xuICAgICAgICB0aGlzLmVyck1zZyA9IGVyck1zZztcbiAgICB9XG59XG5cbi8vIFRpbWVvdXQgZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY2xhc3MgVGltZW91dEVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKHRpbWVvdXQsIHNjb3BlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5leGVjdXRpb25UaW1lb3V0RXhjZWVkZWQpO1xuXG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIHRoaXMuc2NvcGUgICA9IHNjb3BlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RUaW1lb3V0RXJyb3IgZXh0ZW5kcyBUaW1lb3V0RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yICh0aW1lb3V0KSB7XG4gICAgICAgIHN1cGVyKHRpbWVvdXQsICdUZXN0Jyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUnVuVGltZW91dEVycm9yIGV4dGVuZHMgVGltZW91dEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvciAodGltZW91dCkge1xuICAgICAgICBzdXBlcih0aW1lb3V0LCAnUnVuJyk7XG4gICAgfVxufVxuXG4vLyBVbmNhdWdodCBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9ySW5UZXN0Q29kZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnIsIGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5UZXN0Q29kZSk7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgICAgICA9IFN0cmluZyhlcnIucmF3TWVzc2FnZSB8fCBlcnIpO1xuICAgICAgICB0aGlzLmNhbGxzaXRlICAgID0gZXJyLmNhbGxzaXRlIHx8IGNhbGxzaXRlO1xuICAgICAgICB0aGlzLm9yaWdpbkVycm9yID0gZXJyO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0Tm9uRXJyb3JPYmplY3RJblRlc3RDb2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9iaikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHROb25FcnJvck9iamVjdEluVGVzdENvZGUpO1xuXG4gICAgICAgIHRoaXMub2JqVHlwZSA9IHR5cGVvZiBvYmo7XG4gICAgICAgIHRoaXMub2JqU3RyICA9IHRoaXMub2JqVHlwZSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShvYmopIDogU3RyaW5nKG9iaik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbkVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVycikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbik7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgPSBTdHJpbmcoZXJyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEV4Y2VwdGlvbkVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVycikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFeGNlcHRpb24pO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnID0gU3RyaW5nKGVycik7XG4gICAgfVxufVxuXG5cbi8vIEFzc2VydGlvbiBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbEFzc2VydGlvbkxpYnJhcnlFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnIsIGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5leHRlcm5hbEFzc2VydGlvbkxpYnJhcnlFcnJvcik7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgICA9IFN0cmluZyhlcnIpO1xuICAgICAgICB0aGlzLmRpZmYgICAgID0gZXJyPy5zaG93RGlmZiAmJiBkaWZmLmdlbmVyYXRlKGVyci5hY3R1YWwsIGVyci5leHBlY3RlZCk7XG4gICAgICAgIHRoaXMuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NlcnRpb25FeGVjdXRhYmxlQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhcmd1bWVudFZhbHVlLCBlcnIsIGlzQVBJRXJyb3IpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFzc2VydGlvbkV4ZWN1dGFibGVBcmd1bWVudEVycm9yLCBhcmd1bWVudE5hbWUsIGFyZ3VtZW50VmFsdWUpO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnICAgICAgPSBpc0FQSUVycm9yID8gZXJyLnJhd01lc3NhZ2UgOiBlcnIubWVzc2FnZTtcbiAgICAgICAgdGhpcy5vcmlnaW5FcnJvciA9IGVycjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NlcnRpb25XaXRob3V0TWV0aG9kQ2FsbEVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hc3NlcnRpb25XaXRob3V0TWV0aG9kQ2FsbEVycm9yKTtcblxuICAgICAgICB0aGlzLmNhbGxzaXRlID0gY2FsbHNpdGU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXNzZXJ0aW9uVW5hd2FpdGVkUHJvbWlzZUVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hc3NlcnRpb25VbmF3YWl0ZWRQcm9taXNlRXJyb3IpO1xuXG4gICAgICAgIHRoaXMuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICB9XG59XG5cblxuLy8gQWN0aW9uIHBhcmFtZXRlcnMgZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBPcHRpb25zIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIEFjdGlvbkJvb2xlYW5Bcmd1bWVudEVycm9yIGV4dGVuZHMgQWN0aW9uQXJndW1lbnRFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25Cb29sZWFuQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uT3B0aW9uc1R5cGVFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhY3R1YWxUeXBlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25PcHRpb25zVHlwZUVycm9yKTtcblxuICAgICAgICB0aGlzLmFjdHVhbFR5cGUgPSBhY3R1YWxUeXBlO1xuICAgIH1cbn1cblxuXG4vLyBBcmd1bWVudHMgZXJyb3JzXG5leHBvcnQgY2xhc3MgQWN0aW9uU3RyaW5nQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3RyaW5nQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uTnVsbGFibGVTdHJpbmdBcmd1bWVudEVycm9yIGV4dGVuZHMgQWN0aW9uQXJndW1lbnRFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25OdWxsYWJsZVN0cmluZ0FyZ3VtZW50RXJyb3IsIGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkludGVnZXJBcmd1bWVudEVycm9yIGV4dGVuZHMgQWN0aW9uQXJndW1lbnRFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25JbnRlZ2VyQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uUm9sZUFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblJvbGVBcmd1bWVudEVycm9yLCBhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25GdW5jdGlvbkFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkZ1bmN0aW9uQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uUG9zaXRpdmVJbnRlZ2VyQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uUG9zaXRpdmVJbnRlZ2VyQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uU3RyaW5nT3JTdHJpbmdBcnJheUFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ09yU3RyaW5nQXJyYXlBcmd1bWVudEVycm9yLCBhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25TdHJpbmdBcnJheUVsZW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSwgZWxlbWVudEluZGV4KSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25TdHJpbmdBcnJheUVsZW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5lbGVtZW50SW5kZXggPSBlbGVtZW50SW5kZXg7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0VGVzdFNwZWVkQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuc2V0VGVzdFNwZWVkQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uVW5zdXBwb3J0ZWREZXZpY2VUeXBlRXJyb3IgZXh0ZW5kcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYXJndW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uVW5zdXBwb3J0ZWREZXZpY2VUeXBlRXJyb3IsIGFyZ3VtZW50TmFtZSwgYXJndW1lbnRWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uQ29va2llQXJndW1lbnRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkNvb2tpZUFyZ3VtZW50RXJyb3IpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkNvb2tpZUFyZ3VtZW50c0Vycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uQ29va2llQXJndW1lbnRzRXJyb3IpO1xuXG4gICAgICAgIHRoaXMuaW5kZXggICAgICAgPSBpbmRleDtcbiAgICAgICAgdGhpcy5hY3R1YWxWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblVybENvb2tpZUFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25VcmxDb29raWVBcmd1bWVudEVycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25VcmxzQ29va2llQXJndW1lbnRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblVybHNDb29raWVBcmd1bWVudEVycm9yKTtcblxuICAgICAgICB0aGlzLmluZGV4ICAgICAgID0gaW5kZXg7XG4gICAgICAgIHRoaXMuYWN0dWFsVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25SZXF1aXJlZENvb2tpZUFyZ3VtZW50cyBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblJlcXVpcmVkQ29va2llQXJndW1lbnRzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25VcmxBcmd1bWVudEVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblVybEFyZ3VtZW50RXJyb3IpO1xuXG4gICAgICAgIHRoaXMuYXJndW1lbnROYW1lID0gYXJndW1lbnROYW1lO1xuICAgICAgICB0aGlzLmFjdHVhbFZhbHVlICA9IGFjdHVhbFZhbHVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblNraXBKc0Vycm9yc0FyZ3VtZW50VHlwZUVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblNraXBKc0Vycm9yc0FyZ3VtZW50RXJyb3IpO1xuXG4gICAgICAgIHRoaXMuYXJndW1lbnROYW1lID0gYXJndW1lbnROYW1lO1xuICAgICAgICB0aGlzLmFjdHVhbFZhbHVlICA9IGFjdHVhbFZhbHVlO1xuICAgIH1cbn1cblxuLy8gQWN0aW9uIGV4ZWN1dGlvbiBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9ySW5DdXN0b21TY3JpcHQgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoZXJyLCBleHByZXNzaW9uLCBsaW5lLCBjb2x1bW4sIGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5DdXN0b21TY3JpcHQpO1xuXG4gICAgICAgIHRoaXMuY2FsbHNpdGUgICA9IGNhbGxzaXRlO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLmxpbmUgICAgICAgPSBsaW5lO1xuICAgICAgICB0aGlzLmNvbHVtbiAgICAgPSBjb2x1bW47XG5cbiAgICAgICAgdGhpcy5vcmlnaW5FcnJvciA9IGVycjtcbiAgICAgICAgdGhpcy5lcnJNc2cgICAgICA9IGVyci5tZXNzYWdlIHx8IFN0cmluZyhlcnIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0VGVzdENhZmVFcnJvckluQ3VzdG9tU2NyaXB0IGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVyciwgZXhwcmVzc2lvbiwgbGluZSwgY29sdW1uLCBjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRUZXN0Q2FmZUVycm9ySW5DdXN0b21TY3JpcHQpO1xuXG4gICAgICAgIHRoaXMuY2FsbHNpdGUgICA9IGNhbGxzaXRlO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLmxpbmUgICAgICAgPSBsaW5lO1xuICAgICAgICB0aGlzLmNvbHVtbiAgICAgPSBjb2x1bW47XG5cbiAgICAgICAgdGhpcy5vcmlnaW5FcnJvciA9IGVycjtcbiAgICAgICAgdGhpcy5lcnJDYWxsc2l0ZSA9IGVyci5jYWxsc2l0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXaW5kb3dEaW1lbnNpb25zT3ZlcmZsb3dFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMud2luZG93RGltZW5zaW9uc092ZXJmbG93RXJyb3IpO1xuXG4gICAgICAgIHRoaXMuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JiaWRkZW5DaGFyYWN0ZXJzSW5TY3JlZW5zaG90UGF0aEVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKHNjcmVlbnNob3RQYXRoLCBmb3JiaWRkZW5DaGFyc0xpc3QpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmZvcmJpZGRlbkNoYXJhY3RlcnNJblNjcmVlbnNob3RQYXRoRXJyb3IpO1xuXG4gICAgICAgIHRoaXMuc2NyZWVuc2hvdFBhdGggICAgID0gc2NyZWVuc2hvdFBhdGg7XG4gICAgICAgIHRoaXMuZm9yYmlkZGVuQ2hhcnNMaXN0ID0gZm9yYmlkZGVuQ2hhcnNMaXN0O1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJvbGVTd2l0Y2hJblJvbGVJbml0aWFsaXplckVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5yb2xlU3dpdGNoSW5Sb2xlSW5pdGlhbGl6ZXJFcnJvcik7XG5cbiAgICAgICAgdGhpcy5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuICAgIH1cbn1cblxuXG4vLyBOYXRpdmUgZGlhbG9nIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIFNldE5hdGl2ZURpYWxvZ0hhbmRsZXJDb2RlV3JvbmdUeXBlRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYWN0dWFsVHlwZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuc2V0TmF0aXZlRGlhbG9nSGFuZGxlckNvZGVXcm9uZ1R5cGVFcnJvcik7XG5cbiAgICAgICAgdGhpcy5hY3R1YWxUeXBlID0gYWN0dWFsVHlwZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0SG9va0Jhc2VFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjb2RlLCBob29rQ2xhc3NOYW1lLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIHN1cGVyKGNvZGUpO1xuXG4gICAgICAgIHRoaXMuaG9va0NsYXNzTmFtZSA9IGhvb2tDbGFzc05hbWU7XG4gICAgICAgIHRoaXMubWV0aG9kTmFtZSAgICA9IG1ldGhvZE5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVxdWVzdEhvb2tVbmhhbmRsZWRFcnJvciBleHRlbmRzIFJlcXVlc3RIb29rQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvciAoZXJyLCBob29rQ2xhc3NOYW1lLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5yZXF1ZXN0SG9va1VuaGFuZGxlZEVycm9yLCBob29rQ2xhc3NOYW1lLCBtZXRob2ROYW1lKTtcblxuICAgICAgICB0aGlzLmVyck1zZyA9IFN0cmluZyhlcnIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRNZXRob2RFcnJvciBleHRlbmRzIFJlcXVlc3RIb29rQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvciAobWV0aG9kTmFtZSwgaG9va0NsYXNzTmFtZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZEVycm9yLCBob29rQ2xhc3NOYW1lLCBtZXRob2ROYW1lKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aXBsZVdpbmRvd3NNb2RlSXNEaXNhYmxlZEVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLm11bHRpcGxlV2luZG93c01vZGVJc0Rpc2FibGVkRXJyb3IpO1xuXG4gICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVXaW5kb3dzTW9kZUlzTm90QXZhaWxhYmxlSW5SZW1vdGVCcm93c2VyRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAobWV0aG9kTmFtZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMubXVsdGlwbGVXaW5kb3dzTW9kZUlzTm90U3VwcG9ydGVkSW5SZW1vdGVCcm93c2VyRXJyb3IpO1xuXG4gICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7XG4gICAgfVxufVxuXG4iXX0=