testcafe
Version:
Automated browser testing for the modern web development stack.
368 lines (347 loc) • 64.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("lodash");
const types_1 = require("../types");
const utils_1 = require("./utils");
const string_1 = require("../../utils/string");
const EXTERNAL_LINKS = {
createNewIssue: 'https://github.com/DevExpress/testcafe/issues/new?template=bug-report.md',
troubleshootNetwork: 'https://testcafe.io/documentation/403937/faq/working-with-testcafe#my-tests-fail-because-testcafe-cannot-resolve-a-network-request-what-are-the-possible-reasons',
viewportSizes: 'https://github.com/DevExpress/device-specs/blob/master/viewport-sizes.json',
skipJsErrorsRecipes: 'https://testcafe.io/documentation/404038/recipes/debugging/skip-javascript-errors',
};
exports.default = {
[types_1.TEST_RUN_ERRORS.actionIntegerOptionError]: err => `
The "${err.optionName}" option is expected to be an integer, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionPositiveIntegerOptionError]: err => `
The "${err.optionName}" option is expected to be a positive integer, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionBooleanOptionError]: err => `
The "${err.optionName}" option is expected to be a boolean value, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionSpeedOptionError]: err => `
The "${err.optionName}" option is expected to be a number between 0.01 and 1, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.pageLoadError]: err => `
Failed to load the page at ${(0, utils_1.formatUrl)(err.url)}.
Increase the value of the "pageRequestTimeout" variable, enable the "retryTestPages" option, or use quarantine mode to perform additional attempts to execute this test.
You can find troubleshooting information for this issue at ${(0, utils_1.formatUrl)(EXTERNAL_LINKS.troubleshootNetwork)}.
Error details:
${err.errMsg}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorOnPage]: err => `
A JavaScript error occurred on ${(0, utils_1.formatUrl)(err.pageDestUrl)}.
Repeat test actions in the browser and check the console for errors.
Enable the “skipJsErrors” option to ignore JavaScript errors during test execution. Learn more: ${(0, utils_1.formatUrl)(EXTERNAL_LINKS.skipJsErrorsRecipes)}
If the website only throws this error when you test it with TestCafe, please create a new issue at:
${(0, utils_1.formatUrl)(EXTERNAL_LINKS.createNewIssue)}.
JavaScript error details:
${(0, utils_1.replaceLeadingSpacesWithNbsp)((0, lodash_1.escape)(err.errStack))}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInTestCode]: err => `
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.nativeDialogNotHandledError]: err => `
A native ${err.dialogType} dialog was invoked on page ${(0, utils_1.formatUrl)(err.pageUrl)}, but no handler was set for it. Use the "setNativeDialogHandler" function to introduce a handler function for native dialogs.
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInNativeDialogHandler]: err => `
An error occurred in the native dialog handler called for a native ${err.dialogType} dialog on page ${(0, utils_1.formatUrl)(err.pageUrl)}:
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.setTestSpeedArgumentError]: err => `
Speed is expected to be a number between 0.01 and 1, but ${err.actualValue} was passed.
`,
[types_1.TEST_RUN_ERRORS.setNativeDialogHandlerCodeWrongTypeError]: err => `
The native dialog handler is expected to be a function, ClientFunction or null, but it was ${err.actualType}.
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInClientFunctionCode]: err => `
An error occurred in ${err.instantiationCallsiteName} code:
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomDOMPropertyCode]: err => `
An error occurred when trying to calculate a custom Selector property "${err.property}":
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.clientFunctionExecutionInterruptionError]: err => `
${err.instantiationCallsiteName} execution was interrupted by page unload. This problem may appear if you trigger page navigation from ${err.instantiationCallsiteName} code.
`,
[types_1.TEST_RUN_ERRORS.uncaughtNonErrorObjectInTestCode]: err => `
Uncaught ${err.objType} "${(0, lodash_1.escape)(err.objStr)}" was thrown. Throw Error instead.
`,
[types_1.TEST_RUN_ERRORS.unhandledPromiseRejection]: err => `
Unhandled promise rejection:
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.uncaughtException]: err => `
Uncaught exception:
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.actionOptionsTypeError]: err => `
Action options is expected to be an object, null or undefined but it was ${err.actualType}.
`,
[types_1.TEST_RUN_ERRORS.actionStringArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a non-empty string, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionBooleanArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a boolean value, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionNullableStringArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a null or a string, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionStringOrStringArrayArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a non-empty string or a string array, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionStringArrayElementError]: err => `
Elements of the "${err.argumentName}" argument are expected to be non-empty strings, but the element at index ${err.elementIndex} was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionRequiredCookieArguments]: () => `
The mandatory "cookies" argument is missing.
`,
[types_1.TEST_RUN_ERRORS.actionCookieArgumentError]: () => `
The value of the "cookies" argument does not belong to an acceptable data type: Object, String, or Array of objects or strings.
`,
[types_1.TEST_RUN_ERRORS.actionCookieArgumentsError]: err => `
The value of cookie number ${err.index + 1} (${err.actualValue}) does not belong to an acceptable data type: Object or String.
`,
[types_1.TEST_RUN_ERRORS.actionUrlCookieArgumentError]: () => `
Could not parse the url parameter. Check the value for formatting errors.
`,
[types_1.TEST_RUN_ERRORS.actionUrlsCookieArgumentError]: err => `
Could not parse url number ${err.index + 1} (${err.actualValue}). Check the value for formatting errors.
`,
[types_1.TEST_RUN_ERRORS.actionIntegerArgumentError]: err => `
The "${err.argumentName}" argument is expected to be an integer, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionRoleArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a Role instance, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionFunctionArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a function, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionPositiveIntegerArgumentError]: err => `
The "${err.argumentName}" argument is expected to be a positive integer, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionElementNotFoundError]: (err, viewportWidth) => `
The specified selector does not match any element in the DOM tree.
${(0, utils_1.formatSelectorCallstack)(err.apiFnChain, err.apiFnIndex, viewportWidth)}
`,
[types_1.TEST_RUN_ERRORS.actionElementIsInvisibleError]: err => `
${(0, lodash_1.escape)(err.reason) || 'The element that matches the specified selector is not visible.'}
`,
[types_1.TEST_RUN_ERRORS.actionElementIsNotTargetError]: () => `
The element that matches the specified selector is covered.
`,
[types_1.TEST_RUN_ERRORS.actionSelectorMatchesWrongNodeTypeError]: err => `
The specified selector is expected to match a DOM element, but it matches a ${err.nodeDescription} node.
`,
[types_1.TEST_RUN_ERRORS.actionAdditionalElementNotFoundError]: (err, viewportWidth) => `
The specified "${err.argumentName}" does not match any element in the DOM tree.
${(0, utils_1.formatSelectorCallstack)(err.apiFnChain, err.apiFnIndex, viewportWidth)}
`,
[types_1.TEST_RUN_ERRORS.actionAdditionalElementIsInvisibleError]: err => `
${(0, lodash_1.escape)(err.reason) || `The element that matches the specified "${err.argumentName}" is not visible.`}
`,
[types_1.TEST_RUN_ERRORS.actionAdditionalSelectorMatchesWrongNodeTypeError]: err => `
The specified "${err.argumentName}" is expected to match a DOM element, but it matches a ${err.nodeDescription} node.
`,
[types_1.TEST_RUN_ERRORS.actionElementNonEditableError]: () => `
The action element is expected to be editable (an input, textarea or element with the contentEditable attribute).
`,
[types_1.TEST_RUN_ERRORS.actionElementNonContentEditableError]: err => `
The element that matches the specified "${err.argumentName}" is expected to have the contentEditable attribute enabled or the entire document should be in design mode.
`,
[types_1.TEST_RUN_ERRORS.actionRootContainerNotFoundError]: () => `
Content between the action elements cannot be selected because the root container for the selection range cannot be found, i.e. these elements do not have a common ancestor with the contentEditable attribute.
`,
[types_1.TEST_RUN_ERRORS.actionElementIsNotFileInputError]: () => `
The specified selector does not match a file input element.
`,
[types_1.TEST_RUN_ERRORS.actionCannotFindFileToUploadError]: err => `
Cannot find the following file(s) to upload:
${err.filePaths.map(path => (0, lodash_1.escape)(path)).join('\n')}
The following locations were scanned for the missing upload files:
${err.scannedFilePaths.map(path => (0, lodash_1.escape)(path)).join('\n')}
Ensure these files exist or change the working directory.
`,
[types_1.TEST_RUN_ERRORS.actionElementNotTextAreaError]: () => `
The action element is expected to be a <textarea>.
`,
[types_1.TEST_RUN_ERRORS.actionElementNotIframeError]: () => `
The action element is expected to be an <iframe>.
`,
[types_1.TEST_RUN_ERRORS.actionIncorrectKeysError]: err => `
The "${err.argumentName}" argument contains an incorrect key or key combination.
`,
[types_1.TEST_RUN_ERRORS.actionUnsupportedDeviceTypeError]: err => `
The "${err.argumentName}" argument specifies an unsupported "${err.actualValue}" device. For a list of supported devices, refer to ${(0, utils_1.formatUrl)(EXTERNAL_LINKS.viewportSizes)}.
`,
[types_1.TEST_RUN_ERRORS.actionInvalidScrollTargetError]: err => `
Unable to scroll to the specified point because a point with the specified ${err.properties} is not located inside the element's cropping region.
`,
[types_1.TEST_RUN_ERRORS.actionIframeIsNotLoadedError]: () => `
Content of the iframe to which you are switching did not load.
`,
[types_1.TEST_RUN_ERRORS.currentIframeIsNotLoadedError]: () => `
Content of the iframe in which the test is currently operating did not load.
`,
[types_1.TEST_RUN_ERRORS.currentIframeNotFoundError]: () => `
The iframe in which the test is currently operating does not exist anymore.
`,
[types_1.TEST_RUN_ERRORS.currentIframeIsInvisibleError]: () => `
The iframe in which the test is currently operating is not visible anymore.
`,
[types_1.TEST_RUN_ERRORS.missingAwaitError]: () => `
A call to an async function is not awaited. Use the "await" keyword before actions, assertions or chains of them to ensure that they run in the right sequence.
`,
[types_1.TEST_RUN_ERRORS.externalAssertionLibraryError]: err => `
${(0, lodash_1.escape)(err.errMsg)}
${(0, utils_1.renderDiff)(err.diff)}
`,
[types_1.TEST_RUN_ERRORS.domNodeClientFunctionResultError]: err => `
${err.instantiationCallsiteName} cannot return DOM elements. Use Selector functions for this purpose.
`,
[types_1.TEST_RUN_ERRORS.invalidSelectorResultError]: () => `
Function that specifies a selector can only return a DOM node, an array of nodes, NodeList, HTMLCollection, null or undefined. Use ClientFunction to return other values.
`,
[types_1.TEST_RUN_ERRORS.actionSelectorError]: err => `
Action "${err.selectorName}" argument error:
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.cannotObtainInfoForElementSpecifiedBySelectorError]: (err, viewportWidth) => `
Cannot obtain information about the node because the specified selector does not match any node in the DOM tree.
${(0, utils_1.formatSelectorCallstack)(err.apiFnChain, err.apiFnIndex, viewportWidth)}
`,
[types_1.TEST_RUN_ERRORS.windowDimensionsOverflowError]: () => `
Unable to resize the window because the specified size exceeds the screen size. On macOS, a window cannot be larger than the screen.
`,
[types_1.TEST_RUN_ERRORS.forbiddenCharactersInScreenshotPathError]: err => `
There are forbidden characters in the "${err.screenshotPath}" screenshot path:
${(0, utils_1.renderForbiddenCharsList)(err.forbiddenCharsList)}
`,
[types_1.TEST_RUN_ERRORS.invalidElementScreenshotDimensionsError]: err => `
Unable to capture an element image because the resulting image ${err.dimensions} ${err.verb} zero or negative.
`,
[types_1.TEST_RUN_ERRORS.roleSwitchInRoleInitializerError]: () => `
Role cannot be switched while another role is being initialized.
`,
[types_1.TEST_RUN_ERRORS.assertionExecutableArgumentError]: err => `
Cannot evaluate the "${err.actualValue}" expression in the "${err.argumentName}" parameter because of the following error:
${err.errMsg}
`,
[types_1.TEST_RUN_ERRORS.assertionWithoutMethodCallError]: () => `
An assertion method is not specified.
`,
[types_1.TEST_RUN_ERRORS.assertionUnawaitedPromiseError]: () => `
Attempted to run assertions on a Promise object. Did you forget to await it? If not, pass "{ allowUnawaitedPromise: true }" to the assertion options.
`,
[types_1.TEST_RUN_ERRORS.requestHookNotImplementedError]: err => `
You should implement the "${err.methodName}" method in the "${err.hookClassName}" class.
`,
[types_1.TEST_RUN_ERRORS.requestHookUnhandledError]: err => `
An unhandled error occurred in the "${err.methodName}" method of the "${err.hookClassName}" class:
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCode]: err => `
An error occurred in a script injected into the tested page:
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCodeLoadedFromModule]: err => `
An error occurred in the '${err.moduleName}' module injected into the tested page. Make sure that this module can be executed in the browser environment.
Error details:
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomScript]: err => `
An unhandled error occurred in the custom script:
Error details: ${(0, lodash_1.escape)(err.errMsg)}
${(0, utils_1.formatExpressionMessage)(err.expression, err.line, err.column)}
`,
[types_1.TEST_RUN_ERRORS.childWindowIsNotLoadedError]: () => `
The page in the child window is not loaded.
`,
[types_1.TEST_RUN_ERRORS.childWindowNotFoundError]: () => `
The child window is not found.
`,
[types_1.TEST_RUN_ERRORS.cannotSwitchToWindowError]: () => `
Cannot switch to the window.
`,
[types_1.TEST_RUN_ERRORS.closeChildWindowError]: () => `
An error occurred while closing child windows.
`,
[types_1.TEST_RUN_ERRORS.childWindowClosedBeforeSwitchingError]: () => `
The child window was closed before TestCafe could switch to it.
`,
[types_1.TEST_RUN_ERRORS.cannotCloseWindowWithChildrenError]: () => `
Cannot close a window that has an open child window.
`,
[types_1.TEST_RUN_ERRORS.targetWindowNotFoundError]: () => `
Cannot find the window specified in the action parameters.
`,
[types_1.TEST_RUN_ERRORS.parentWindowNotFoundError]: () => `
Cannot find the parent window. Make sure that the tested window was opened from another window.
`,
[types_1.TEST_RUN_ERRORS.previousWindowNotFoundError]: () => `
Cannot find the previous window. Make sure that the previous window is opened.
`,
[types_1.TEST_RUN_ERRORS.switchToWindowPredicateError]: err => `
An error occurred inside the "switchToWindow" argument function.
Error details:
${(0, lodash_1.escape)(err.errMsg)}
`,
[types_1.TEST_RUN_ERRORS.multipleWindowsModeIsDisabledError]: err => `
Multi-window mode is disabled. To use the "${err.methodName}" method, remove the "disableMultipleWindows" option.
`,
[types_1.TEST_RUN_ERRORS.multipleWindowsModeIsNotSupportedInRemoteBrowserError]: err => `
Multi-window mode is supported only in locally-installed Chrome, Chromium, Edge 84+ and Firefox. Run tests in these browsers to use the "${err.methodName}" method.
`,
[types_1.TEST_RUN_ERRORS.multipleWindowsModeIsNotSupportedInNativeAutomationError]: () => `
The Native Automation mode does not support the use of multiple browser windows. Use the "disable native automation" option to continue.
`,
[types_1.TEST_RUN_ERRORS.cannotCloseWindowWithoutParent]: () => `
Cannot close the window because it does not have a parent. The parent window was closed or you are attempting to close the root browser window where tests were launched.
`,
[types_1.TEST_RUN_ERRORS.cannotRestoreChildWindowError]: () => `
Failed to restore connection to window within the allocated timeout.
`,
[types_1.TEST_RUN_ERRORS.executionTimeoutExceeded]: err => {
return `${err.scope} timeout of ${err.timeout}ms exceeded.`;
},
[types_1.TEST_RUN_ERRORS.actionStringOptionError]: err => `
The value of the "${err.optionName}" option belongs to an unsupported data type (${err.actualValue}). The "${err.optionName}" option only accepts String type values.
`,
[types_1.TEST_RUN_ERRORS.actionStringOrRegexOptionError]: err => `
The value of the "${err.optionName}" option belongs to an unsupported data type (${err.actualValue}). The "${err.optionName}" option only accepts String or Regex type values.
`,
[types_1.TEST_RUN_ERRORS.actionDateOptionError]: err => `
The value of the "${err.optionName}" option belongs to an unsupported data type (${err.actualValue}). The "${err.optionName}" option only accepts Date type values.
`,
[types_1.TEST_RUN_ERRORS.actionNumberOptionError]: err => `
The value of the "${err.optionName}" option belongs to an unsupported data type (${err.actualValue}). The "${err.optionName}" option only accepts Number type values.
`,
[types_1.TEST_RUN_ERRORS.actionUrlOptionError]: err => `
The value of the "${err.optionName}" option belongs to an unsupported data type (${err.actualValue}). The "${err.optionName}" option only accepts string or URL types values.
`,
[types_1.TEST_RUN_ERRORS.actionUrlSearchParamsOptionError]: err => `
The value of the "${err.optionName}" option belongs to an unsupported data type (${err.actualValue}). The "${err.optionName}" option only accepts object or URLSearchParams types values.
`,
[types_1.TEST_RUN_ERRORS.actionObjectOptionError]: err => `
The value of the "${err.optionName}" option belongs to an unsupported data type (${err.actualValue}). The "${err.optionName}" option only accepts object types values.
`,
[types_1.TEST_RUN_ERRORS.actionUrlArgumentError]: err => `
The "${err.argumentName}" argument is expected to be an URL or a string, but it was ${err.actualValue}.
`,
[types_1.TEST_RUN_ERRORS.actionSkipJsErrorsArgumentError]: err => `
Cannot execute the skipJsErrors method. The value of the "${err.argumentName}" argument belongs to an unsupported type (${err.actualValue}). The "${err.argumentName}" supports the following data types: Boolean, Object, Function.
`,
[types_1.TEST_RUN_ERRORS.actionFunctionOptionError]: err => `
The value of the "${err.optionName}" option belongs to an unsupported data type (${err.actualValue}). The "${err.optionName}" option only accepts function types values.
`,
[types_1.TEST_RUN_ERRORS.actionInvalidObjectPropertyError]: err => `
The "${err.objectName}" object does not support the "${err.propertyName}" property.
To proceed, remove invalid options from your code or check your test for spelling errors.
The "${err.objectName}" object supports the following options:
${(0, string_1.getConcatenatedValuesString)(err.availableProperties, ',\n')}.
`,
};
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy90ZXN0LXJ1bi90ZW1wbGF0ZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBOEM7QUFDOUMsb0NBQTJDO0FBQzNDLG1DQU9pQjtBQUNqQiwrQ0FBaUU7QUFHakUsTUFBTSxjQUFjLEdBQUc7SUFDbkIsY0FBYyxFQUFPLDBFQUEwRTtJQUMvRixtQkFBbUIsRUFBRSxrS0FBa0s7SUFDdkwsYUFBYSxFQUFRLDRFQUE0RTtJQUNqRyxtQkFBbUIsRUFBRSxtRkFBbUY7Q0FDM0csQ0FBQztBQUVGLGtCQUFlO0lBQ1gsQ0FBQyx1QkFBZSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztlQUN4QyxHQUFHLENBQUMsVUFBVSxxREFBcUQsR0FBRyxDQUFDLFdBQVc7S0FDNUY7SUFFRCxDQUFDLHVCQUFlLENBQUMsZ0NBQWdDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2VBQ2hELEdBQUcsQ0FBQyxVQUFVLDZEQUE2RCxHQUFHLENBQUMsV0FBVztLQUNwRztJQUVELENBQUMsdUJBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7ZUFDeEMsR0FBRyxDQUFDLFVBQVUsMERBQTBELEdBQUcsQ0FBQyxXQUFXO0tBQ2pHO0lBRUQsQ0FBQyx1QkFBZSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztlQUN0QyxHQUFHLENBQUMsVUFBVSxzRUFBc0UsR0FBRyxDQUFDLFdBQVc7S0FDN0c7SUFFRCxDQUFDLHVCQUFlLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztxQ0FDUCxJQUFBLGlCQUFTLEVBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7cUVBRWMsSUFBQSxpQkFBUyxFQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQzs7O1VBR3hH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Qzs0QkFDMUIsR0FBRyxDQUFDLFVBQVUsaURBQWlELEdBQUcsQ0FBQyxXQUFXLFdBQVcsR0FBRyxDQUFDLFVBQVU7S0FDOUg7SUFFRCxDQUFDLHVCQUFlLENBQUMsc0JBQXNCLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2VBQ3RDLEdBQUcsQ0FBQyxZQUFZLCtEQUErRCxHQUFHLENBQUMsV0FBVztLQUN4RztJQUVELENBQUMsdUJBQWUsQ0FBQywrQkFBK0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0VBQ00sR0FBRyxDQUFDLFlBQVksOENBQThDLEdBQUcsQ0FBQyxXQUFXLFdBQVcsR0FBRyxDQUFDLFlBQVk7S0FDdks7SUFFRCxDQUFDLHVCQUFlLENBQUMseUJBQXlCLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUM1QixHQUFHLENBQUMsVUFBVSxpREFBaUQsR0FBRyxDQUFDLFdBQVcsV0FBVyxHQUFHLENBQUMsVUFBVTtLQUM5SDtJQUVELENBQUMsdUJBQWUsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7ZUFDaEQsR0FBRyxDQUFDLFVBQVUsa0NBQWtDLEdBQUcsQ0FBQyxZQUFZOztlQUVoRSxHQUFHLENBQUMsVUFBVTtVQUNuQixJQUFBLG9DQUEyQixFQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUM7S0FDaEU7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXNjYXBlIGFzIGVzY2FwZUh0bWwgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVEVTVF9SVU5fRVJST1JTIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgICByZW5kZXJGb3JiaWRkZW5DaGFyc0xpc3QsXG4gICAgcmVuZGVyRGlmZixcbiAgICBmb3JtYXRTZWxlY3RvckNhbGxzdGFjayxcbiAgICBmb3JtYXRVcmwsXG4gICAgcmVwbGFjZUxlYWRpbmdTcGFjZXNXaXRoTmJzcCxcbiAgICBmb3JtYXRFeHByZXNzaW9uTWVzc2FnZSxcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBnZXRDb25jYXRlbmF0ZWRWYWx1ZXNTdHJpbmcgfSBmcm9tICcuLi8uLi91dGlscy9zdHJpbmcnO1xuXG5cbmNvbnN0IEVYVEVSTkFMX0xJTktTID0ge1xuICAgIGNyZWF0ZU5ld0lzc3VlOiAgICAgICdodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy90ZXN0Y2FmZS9pc3N1ZXMvbmV3P3RlbXBsYXRlPWJ1Zy1yZXBvcnQubWQnLFxuICAgIHRyb3VibGVzaG9vdE5ldHdvcms6ICdodHRwczovL3Rlc3RjYWZlLmlvL2RvY3VtZW50YXRpb24vNDAzOTM3L2ZhcS93b3JraW5nLXdpdGgtdGVzdGNhZmUjbXktdGVzdHMtZmFpbC1iZWNhdXNlLXRlc3RjYWZlLWNhbm5vdC1yZXNvbHZlLWEtbmV0d29yay1yZXF1ZXN0LXdoYXQtYXJlLXRoZS1wb3NzaWJsZS1yZWFzb25zJyxcbiAgICB2aWV3cG9ydFNpemVzOiAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvZGV2aWNlLXNwZWNzL2Jsb2IvbWFzdGVyL3ZpZXdwb3J0LXNpemVzLmpzb24nLFxuICAgIHNraXBKc0Vycm9yc1JlY2lwZXM6ICdodHRwczovL3Rlc3RjYWZlLmlvL2RvY3VtZW50YXRpb24vNDA0MDM4L3JlY2lwZXMvZGVidWdnaW5nL3NraXAtamF2YXNjcmlwdC1lcnJvcnMnLFxufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uSW50ZWdlck9wdGlvbkVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIub3B0aW9uTmFtZX1cIiBvcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW50ZWdlciwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uUG9zaXRpdmVJbnRlZ2VyT3B0aW9uRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5vcHRpb25OYW1lfVwiIG9wdGlvbiBpcyBleHBlY3RlZCB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkJvb2xlYW5PcHRpb25FcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLm9wdGlvbk5hbWV9XCIgb3B0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGEgYm9vbGVhbiB2YWx1ZSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3BlZWRPcHRpb25FcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLm9wdGlvbk5hbWV9XCIgb3B0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGEgbnVtYmVyIGJldHdlZW4gMC4wMSBhbmQgMSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMucGFnZUxvYWRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIEZhaWxlZCB0byBsb2FkIHRoZSBwYWdlIGF0ICR7Zm9ybWF0VXJsKGVyci51cmwpfS5cbiAgICAgICAgSW5jcmVhc2UgdGhlIHZhbHVlIG9mIHRoZSBcInBhZ2VSZXF1ZXN0VGltZW91dFwiIHZhcmlhYmxlLCBlbmFibGUgdGhlIFwicmV0cnlUZXN0UGFnZXNcIiBvcHRpb24sIG9yIHVzZSBxdWFyYW50aW5lIG1vZGUgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIGF0dGVtcHRzIHRvIGV4ZWN1dGUgdGhpcyB0ZXN0LlxuICAgICAgICBZb3UgY2FuIGZpbmQgdHJvdWJsZXNob290aW5nIGluZm9ybWF0aW9uIGZvciB0aGlzIGlzc3VlIGF0ICR7Zm9ybWF0VXJsKEVYVEVSTkFMX0xJTktTLnRyb3VibGVzaG9vdE5ldHdvcmspfS5cblxuICAgICAgICBFcnJvciBkZXRhaWxzOlxuICAgICAgICAke2Vyci5lcnJNc2d9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvck9uUGFnZV06IGVyciA9PiBgXG4gICAgICAgIEEgSmF2YVNjcmlwdCBlcnJvciBvY2N1cnJlZCBvbiAke2Zvcm1hdFVybChlcnIucGFnZURlc3RVcmwpfS5cbiAgICAgICAgUmVwZWF0IHRlc3QgYWN0aW9ucyBpbiB0aGUgYnJvd3NlciBhbmQgY2hlY2sgdGhlIGNvbnNvbGUgZm9yIGVycm9ycy5cbiAgICAgICAgRW5hYmxlIHRoZSDigJxza2lwSnNFcnJvcnPigJ0gb3B0aW9uIHRvIGlnbm9yZSBKYXZhU2NyaXB0IGVycm9ycyBkdXJpbmcgdGVzdCBleGVjdXRpb24uIExlYXJuIG1vcmU6ICR7Zm9ybWF0VXJsKEVYVEVSTkFMX0xJTktTLnNraXBKc0Vycm9yc1JlY2lwZXMpfVxuICAgICAgICBJZiB0aGUgd2Vic2l0ZSBvbmx5IHRocm93cyB0aGlzIGVycm9yIHdoZW4geW91IHRlc3QgaXQgd2l0aCBUZXN0Q2FmZSwgcGxlYXNlIGNyZWF0ZSBhIG5ldyBpc3N1ZSBhdDpcbiAgICAgICAgJHtmb3JtYXRVcmwoRVhURVJOQUxfTElOS1MuY3JlYXRlTmV3SXNzdWUpfS5cblxuICAgICAgICBKYXZhU2NyaXB0IGVycm9yIGRldGFpbHM6XG4gICAgICAgICR7cmVwbGFjZUxlYWRpbmdTcGFjZXNXaXRoTmJzcChlc2NhcGVIdG1sKGVyci5lcnJTdGFjaykpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJblRlc3RDb2RlXTogZXJyID0+IGBcbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLm5hdGl2ZURpYWxvZ05vdEhhbmRsZWRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIEEgbmF0aXZlICR7ZXJyLmRpYWxvZ1R5cGV9IGRpYWxvZyB3YXMgaW52b2tlZCBvbiBwYWdlICR7Zm9ybWF0VXJsKGVyci5wYWdlVXJsKX0sIGJ1dCBubyBoYW5kbGVyIHdhcyBzZXQgZm9yIGl0LiBVc2UgdGhlIFwic2V0TmF0aXZlRGlhbG9nSGFuZGxlclwiIGZ1bmN0aW9uIHRvIGludHJvZHVjZSBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIG5hdGl2ZSBkaWFsb2dzLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbk5hdGl2ZURpYWxvZ0hhbmRsZXJdOiBlcnIgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgbmF0aXZlIGRpYWxvZyBoYW5kbGVyIGNhbGxlZCBmb3IgYSBuYXRpdmUgJHtlcnIuZGlhbG9nVHlwZX0gZGlhbG9nIG9uIHBhZ2UgJHtmb3JtYXRVcmwoZXJyLnBhZ2VVcmwpfTpcblxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuc2V0VGVzdFNwZWVkQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFNwZWVkIGlzIGV4cGVjdGVkIHRvIGJlIGEgbnVtYmVyIGJldHdlZW4gMC4wMSBhbmQgMSwgYnV0ICR7ZXJyLmFjdHVhbFZhbHVlfSB3YXMgcGFzc2VkLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnNldE5hdGl2ZURpYWxvZ0hhbmRsZXJDb2RlV3JvbmdUeXBlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgbmF0aXZlIGRpYWxvZyBoYW5kbGVyIGlzIGV4cGVjdGVkIHRvIGJlIGEgZnVuY3Rpb24sIENsaWVudEZ1bmN0aW9uIG9yIG51bGwsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVHlwZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ2xpZW50RnVuY3Rpb25Db2RlXTogZXJyID0+IGBcbiAgICAgICAgQW4gZXJyb3Igb2NjdXJyZWQgaW4gJHtlcnIuaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZX0gY29kZTpcblxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tRE9NUHJvcGVydHlDb2RlXTogZXJyID0+IGBcbiAgICAgICAgQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB0cnlpbmcgdG8gY2FsY3VsYXRlIGEgY3VzdG9tIFNlbGVjdG9yIHByb3BlcnR5IFwiJHtlcnIucHJvcGVydHl9XCI6XG5cbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmNsaWVudEZ1bmN0aW9uRXhlY3V0aW9uSW50ZXJydXB0aW9uRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICAke2Vyci5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBleGVjdXRpb24gd2FzIGludGVycnVwdGVkIGJ5IHBhZ2UgdW5sb2FkLiBUaGlzIHByb2JsZW0gbWF5IGFwcGVhciBpZiB5b3UgdHJpZ2dlciBwYWdlIG5hdmlnYXRpb24gZnJvbSAke2Vyci5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBjb2RlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0Tm9uRXJyb3JPYmplY3RJblRlc3RDb2RlXTogZXJyID0+IGBcbiAgICAgICAgVW5jYXVnaHQgJHtlcnIub2JqVHlwZX0gXCIke2VzY2FwZUh0bWwoZXJyLm9ialN0cil9XCIgd2FzIHRocm93bi4gVGhyb3cgRXJyb3IgaW5zdGVhZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uXTogZXJyID0+IGBcbiAgICAgICAgVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uOlxuXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmNhdWdodEV4Y2VwdGlvbl06IGVyciA9PiBgXG4gICAgICAgIFVuY2F1Z2h0IGV4Y2VwdGlvbjpcblxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uT3B0aW9uc1R5cGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIEFjdGlvbiBvcHRpb25zIGlzIGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgbnVsbCBvciB1bmRlZmluZWQgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxUeXBlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25TdHJpbmdBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgbm9uLWVtcHR5IHN0cmluZywgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uQm9vbGVhbkFyZ3VtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBib29sZWFuIHZhbHVlLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25OdWxsYWJsZVN0cmluZ0FyZ3VtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBudWxsIG9yIGEgc3RyaW5nLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25TdHJpbmdPclN0cmluZ0FycmF5QXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBpcyBleHBlY3RlZCB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBzdHJpbmcgYXJyYXksIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ0FycmF5RWxlbWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgRWxlbWVudHMgb2YgdGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGFyZSBleHBlY3RlZCB0byBiZSBub24tZW1wdHkgc3RyaW5ncywgYnV0IHRoZSBlbGVtZW50IGF0IGluZGV4ICR7ZXJyLmVsZW1lbnRJbmRleH0gd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25SZXF1aXJlZENvb2tpZUFyZ3VtZW50c106ICgpID0+IGBcbiAgICAgICAgVGhlIG1hbmRhdG9yeSBcImNvb2tpZXNcIiBhcmd1bWVudCBpcyBtaXNzaW5nLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkNvb2tpZUFyZ3VtZW50RXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgXCJjb29raWVzXCIgYXJndW1lbnQgZG9lcyBub3QgYmVsb25nIHRvIGFuIGFjY2VwdGFibGUgZGF0YSB0eXBlOiBPYmplY3QsIFN0cmluZywgb3IgQXJyYXkgb2Ygb2JqZWN0cyBvciBzdHJpbmdzLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkNvb2tpZUFyZ3VtZW50c0Vycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIHZhbHVlIG9mIGNvb2tpZSBudW1iZXIgJHtlcnIuaW5kZXggKyAxfSAoJHtlcnIuYWN0dWFsVmFsdWV9KSBkb2VzIG5vdCBiZWxvbmcgdG8gYW4gYWNjZXB0YWJsZSBkYXRhIHR5cGU6IE9iamVjdCBvciBTdHJpbmcuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uVXJsQ29va2llQXJndW1lbnRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ291bGQgbm90IHBhcnNlIHRoZSB1cmwgcGFyYW1ldGVyLiBDaGVjayB0aGUgdmFsdWUgZm9yIGZvcm1hdHRpbmcgZXJyb3JzLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblVybHNDb29raWVBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgQ291bGQgbm90IHBhcnNlIHVybCBudW1iZXIgJHtlcnIuaW5kZXggKyAxfSAoJHtlcnIuYWN0dWFsVmFsdWV9KS4gQ2hlY2sgdGhlIHZhbHVlIGZvciBmb3JtYXR0aW5nIGVycm9ycy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25JbnRlZ2VyQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBpcyBleHBlY3RlZCB0byBiZSBhbiBpbnRlZ2VyLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25Sb2xlQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBpcyBleHBlY3RlZCB0byBiZSBhIFJvbGUgaW5zdGFuY2UsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkZ1bmN0aW9uQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBpcyBleHBlY3RlZCB0byBiZSBhIGZ1bmN0aW9uLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25Qb3NpdGl2ZUludGVnZXJBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudE5vdEZvdW5kRXJyb3JdOiAoZXJyLCB2aWV3cG9ydFdpZHRoKSA9PiBgXG4gICAgICAgIFRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgZG9lcyBub3QgbWF0Y2ggYW55IGVsZW1lbnQgaW4gdGhlIERPTSB0cmVlLlxuXG4gICAgICAgICR7Zm9ybWF0U2VsZWN0b3JDYWxsc3RhY2soZXJyLmFwaUZuQ2hhaW4sIGVyci5hcGlGbkluZGV4LCB2aWV3cG9ydFdpZHRoKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50SXNJbnZpc2libGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIucmVhc29uKSB8fCAnVGhlIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgaXMgbm90IHZpc2libGUuJ31cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50SXNOb3RUYXJnZXRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgaXMgY292ZXJlZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25TZWxlY3Rvck1hdGNoZXNXcm9uZ05vZGVUeXBlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgc3BlY2lmaWVkIHNlbGVjdG9yIGlzIGV4cGVjdGVkIHRvIG1hdGNoIGEgRE9NIGVsZW1lbnQsIGJ1dCBpdCBtYXRjaGVzIGEgJHtlcnIubm9kZURlc2NyaXB0aW9ufSBub2RlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkFkZGl0aW9uYWxFbGVtZW50Tm90Rm91bmRFcnJvcl06IChlcnIsIHZpZXdwb3J0V2lkdGgpID0+IGBcbiAgICAgICAgVGhlIHNwZWNpZmllZCBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBkb2VzIG5vdCBtYXRjaCBhbnkgZWxlbWVudCBpbiB0aGUgRE9NIHRyZWUuXG5cbiAgICAgICAgJHtmb3JtYXRTZWxlY3RvckNhbGxzdGFjayhlcnIuYXBpRm5DaGFpbiwgZXJyLmFwaUZuSW5kZXgsIHZpZXdwb3J0V2lkdGgpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkFkZGl0aW9uYWxFbGVtZW50SXNJbnZpc2libGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIucmVhc29uKSB8fCBgVGhlIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgaXMgbm90IHZpc2libGUuYH1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25BZGRpdGlvbmFsU2VsZWN0b3JNYXRjaGVzV3JvbmdOb2RlVHlwZUVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIHNwZWNpZmllZCBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBpcyBleHBlY3RlZCB0byBtYXRjaCBhIERPTSBlbGVtZW50LCBidXQgaXQgbWF0Y2hlcyBhICR7ZXJyLm5vZGVEZXNjcmlwdGlvbn0gbm9kZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm9uRWRpdGFibGVFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGFjdGlvbiBlbGVtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGVkaXRhYmxlIChhbiBpbnB1dCwgdGV4dGFyZWEgb3IgZWxlbWVudCB3aXRoIHRoZSBjb250ZW50RWRpdGFibGUgYXR0cmlidXRlKS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm9uQ29udGVudEVkaXRhYmxlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBpcyBleHBlY3RlZCB0byBoYXZlIHRoZSBjb250ZW50RWRpdGFibGUgYXR0cmlidXRlIGVuYWJsZWQgb3IgdGhlIGVudGlyZSBkb2N1bWVudCBzaG91bGQgYmUgaW4gZGVzaWduIG1vZGUuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uUm9vdENvbnRhaW5lck5vdEZvdW5kRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIENvbnRlbnQgYmV0d2VlbiB0aGUgYWN0aW9uIGVsZW1lbnRzIGNhbm5vdCBiZSBzZWxlY3RlZCBiZWNhdXNlIHRoZSByb290IGNvbnRhaW5lciBmb3IgdGhlIHNlbGVjdGlvbiByYW5nZSBjYW5ub3QgYmUgZm91bmQsIGkuZS4gdGhlc2UgZWxlbWVudHMgZG8gbm90IGhhdmUgYSBjb21tb24gYW5jZXN0b3Igd2l0aCB0aGUgY29udGVudEVkaXRhYmxlIGF0dHJpYnV0ZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50SXNOb3RGaWxlSW5wdXRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIHNwZWNpZmllZCBzZWxlY3RvciBkb2VzIG5vdCBtYXRjaCBhIGZpbGUgaW5wdXQgZWxlbWVudC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25DYW5ub3RGaW5kRmlsZVRvVXBsb2FkRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBDYW5ub3QgZmluZCB0aGUgZm9sbG93aW5nIGZpbGUocykgdG8gdXBsb2FkOlxuICAgICAgICAke2Vyci5maWxlUGF0aHMubWFwKHBhdGggPT4gZXNjYXBlSHRtbChwYXRoKSkuam9pbignXFxuJyl9XG5cbiAgICAgICAgVGhlIGZvbGxvd2luZyBsb2NhdGlvbnMgd2VyZSBzY2FubmVkIGZvciB0aGUgbWlzc2luZyB1cGxvYWQgZmlsZXM6XG4gICAgICAgICR7ZXJyLnNjYW5uZWRGaWxlUGF0aHMubWFwKHBhdGggPT4gZXNjYXBlSHRtbChwYXRoKSkuam9pbignXFxuJyl9XG5cbiAgICAgICAgRW5zdXJlIHRoZXNlIGZpbGVzIGV4aXN0IG9yIGNoYW5nZSB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudE5vdFRleHRBcmVhRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFRoZSBhY3Rpb24gZWxlbWVudCBpcyBleHBlY3RlZCB0byBiZSBhICZsdDt0ZXh0YXJlYSZndDsuXG4gICAgYCxcblxuICAgIFtURV