testcafe 1.14.1 → 1.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/LICENSE +21 -21
  3. package/bin/testcafe-with-v8-flag-filter.js +0 -0
  4. package/lib/api/exportable-lib/index.js +49 -49
  5. package/lib/api/request-hooks/assert-type.js +7 -7
  6. package/lib/api/request-hooks/hook-method-names.js +9 -9
  7. package/lib/api/request-hooks/hook.js +32 -32
  8. package/lib/api/request-hooks/interfaces.js +2 -2
  9. package/lib/api/request-hooks/request-logger.js +112 -112
  10. package/lib/api/request-hooks/request-mock/create-request-mock.js +10 -10
  11. package/lib/api/request-hooks/request-mock/index.js +44 -44
  12. package/lib/api/request-hooks/request-mock.js +46 -46
  13. package/lib/api/structure/base-unit.js +11 -11
  14. package/lib/api/structure/fixture.js +75 -75
  15. package/lib/api/structure/interfaces.js +2 -2
  16. package/lib/api/structure/test-file.js +31 -31
  17. package/lib/api/structure/test-timeout.js +9 -9
  18. package/lib/api/structure/test.js +85 -85
  19. package/lib/api/structure/testing-unit.js +89 -89
  20. package/lib/api/structure/unit-type.js +9 -9
  21. package/lib/api/test-controller/assertion.js +88 -88
  22. package/lib/api/test-controller/execution-context.js +82 -82
  23. package/lib/api/test-controller/index.js +358 -358
  24. package/lib/api/test-controller/proxy.js +28 -28
  25. package/lib/api/test-page-url.js +60 -60
  26. package/lib/api/test-run-tracker.js +68 -68
  27. package/lib/api/wrap-test-function.js +49 -49
  28. package/lib/assertions/executor.js +74 -74
  29. package/lib/assertions/get-fn.js +46 -46
  30. package/lib/assertions/type.js +20 -20
  31. package/lib/assets/content-types.js +9 -9
  32. package/lib/assets/injectables.js +18 -18
  33. package/lib/browser/connection/command.js +10 -10
  34. package/lib/browser/connection/error-hints.js +9 -9
  35. package/lib/browser/connection/gateway.js +159 -159
  36. package/lib/browser/connection/get-hints.js +33 -33
  37. package/lib/browser/connection/heartbeat-status.js +8 -8
  38. package/lib/browser/connection/index.js +328 -328
  39. package/lib/browser/connection/remotes-queue.js +46 -46
  40. package/lib/browser/connection/service-routes.js +12 -12
  41. package/lib/browser/connection/status.js +12 -12
  42. package/lib/browser/interfaces.js +2 -2
  43. package/lib/browser/provider/built-in/dedicated/base.js +80 -80
  44. package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
  45. package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
  46. package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
  47. package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
  48. package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
  49. package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
  50. package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
  51. package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
  52. package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
  53. package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
  54. package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
  55. package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
  56. package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
  57. package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
  58. package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
  59. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
  60. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
  61. package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
  62. package/lib/browser/provider/built-in/index.js +21 -21
  63. package/lib/browser/provider/built-in/locally-installed.js +30 -30
  64. package/lib/browser/provider/built-in/path.js +47 -47
  65. package/lib/browser/provider/built-in/remote.js +58 -58
  66. package/lib/browser/provider/index.js +303 -303
  67. package/lib/browser/provider/parse-provider-name.js +16 -16
  68. package/lib/browser/provider/plugin-host.js +121 -121
  69. package/lib/browser/provider/pool.js +115 -115
  70. package/lib/browser/provider/utils/argument-parsing.js +74 -74
  71. package/lib/browser/provider/utils/browser-starter.js +34 -34
  72. package/lib/browser/provider/utils/client-functions.js +24 -24
  73. package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
  74. package/lib/cli/argument-parser.js +284 -284
  75. package/lib/cli/authentication-helper.js +35 -35
  76. package/lib/cli/cli.js +134 -134
  77. package/lib/cli/correct-browsers-and-sources.js +40 -40
  78. package/lib/cli/index.js +19 -19
  79. package/lib/cli/log.js +43 -43
  80. package/lib/cli/remotes-wizard.js +36 -36
  81. package/lib/cli/termination-handler.js +38 -38
  82. package/lib/client/automation/index.js +34 -16
  83. package/lib/client/automation/index.min.js +1 -1
  84. package/lib/client/browser/idle-page/index.html.mustache +35 -35
  85. package/lib/client/browser/idle-page/logo.svg +86 -86
  86. package/lib/client/core/index.js +14 -14
  87. package/lib/client/driver/index.js +46 -16
  88. package/lib/client/driver/index.min.js +1 -1
  89. package/lib/client/driver/internal-properties.js +9 -9
  90. package/lib/client/test-run/iframe.js.mustache +17 -17
  91. package/lib/client/test-run/index.js.mustache +51 -51
  92. package/lib/client/ui/index.js +14 -14
  93. package/lib/client/ui/sprite.svg +42 -42
  94. package/lib/client-functions/builder-symbol.js +4 -4
  95. package/lib/client-functions/client-function-builder.js +155 -155
  96. package/lib/client-functions/replicator.js +61 -61
  97. package/lib/client-functions/return-single-prop-mode.js +8 -8
  98. package/lib/client-functions/selector-api-execution-mode.js +20 -20
  99. package/lib/client-functions/selectors/add-api.js +645 -645
  100. package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
  101. package/lib/client-functions/selectors/prepare-api-args.js +20 -20
  102. package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
  103. package/lib/client-functions/selectors/selector-builder.js +153 -153
  104. package/lib/client-functions/selectors/selector-text-filter.js +43 -43
  105. package/lib/client-functions/selectors/snapshot-properties.js +48 -48
  106. package/lib/client-functions/types.js +18 -18
  107. package/lib/compiler/babel/format-babel-produced-code.js +10 -10
  108. package/lib/compiler/babel/get-base-babel-options.js +11 -11
  109. package/lib/compiler/babel/load-libs.js +63 -63
  110. package/lib/compiler/babel/preset-stage-2.js +19 -19
  111. package/lib/compiler/compile-client-function.js +73 -73
  112. package/lib/compiler/compilers.js +33 -33
  113. package/lib/compiler/index.js +92 -92
  114. package/lib/compiler/interfaces.js +2 -2
  115. package/lib/compiler/test-file/api-based.js +146 -146
  116. package/lib/compiler/test-file/base.js +36 -36
  117. package/lib/compiler/test-file/exportble-lib-path.js +5 -5
  118. package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
  119. package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
  120. package/lib/compiler/test-file/formats/es-next/compiler.js +42 -42
  121. package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
  122. package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
  123. package/lib/compiler/test-file/formats/raw.js +85 -85
  124. package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
  125. package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
  126. package/lib/compiler/test-file/test-file-parser-base.js +214 -214
  127. package/lib/configuration/configuration-base.js +165 -165
  128. package/lib/configuration/constants.js +9 -9
  129. package/lib/configuration/customizable-compilers.js +7 -7
  130. package/lib/configuration/default-values.js +51 -51
  131. package/lib/configuration/interfaces.js +2 -2
  132. package/lib/configuration/option-names.js +53 -53
  133. package/lib/configuration/option-source.js +9 -9
  134. package/lib/configuration/option.js +14 -14
  135. package/lib/configuration/quarantine-option-names.js +8 -8
  136. package/lib/configuration/run-option-names.js +26 -26
  137. package/lib/configuration/screenshot-option-names.js +10 -10
  138. package/lib/configuration/testcafe-configuration.js +163 -163
  139. package/lib/configuration/types.js +2 -2
  140. package/lib/configuration/typescript-configuration.js +62 -62
  141. package/lib/custom-client-scripts/assert-type.js +7 -7
  142. package/lib/custom-client-scripts/client-script-init.js +2 -2
  143. package/lib/custom-client-scripts/client-script.js +106 -106
  144. package/lib/custom-client-scripts/get-code.js +11 -11
  145. package/lib/custom-client-scripts/get-url.js +6 -6
  146. package/lib/custom-client-scripts/load.js +15 -15
  147. package/lib/custom-client-scripts/problematic-scripts.js +2 -2
  148. package/lib/custom-client-scripts/routing.js +36 -36
  149. package/lib/custom-client-scripts/utils.js +60 -60
  150. package/lib/embedding-utils.js +83 -83
  151. package/lib/errors/create-stack-filter.js +18 -18
  152. package/lib/errors/error-list.js +26 -26
  153. package/lib/errors/get-callsite.js +31 -31
  154. package/lib/errors/internal-modules-prefix.js +8 -8
  155. package/lib/errors/is-internal-stack-frame.js +45 -45
  156. package/lib/errors/process-test-fn-error.js +37 -37
  157. package/lib/errors/runtime/index.js +123 -123
  158. package/lib/errors/runtime/templates.js +115 -115
  159. package/lib/errors/runtime/type-assertions.js +112 -112
  160. package/lib/errors/stack-cleaning-hook.js +64 -64
  161. package/lib/errors/test-run/formattable-adapter.js +59 -59
  162. package/lib/errors/test-run/index.js +301 -301
  163. package/lib/errors/test-run/render-error-template.js +31 -31
  164. package/lib/errors/test-run/templates.js +91 -91
  165. package/lib/errors/test-run/utils.js +89 -89
  166. package/lib/errors/types.js +156 -156
  167. package/lib/index.js +81 -81
  168. package/lib/live/bootstrapper.js +43 -43
  169. package/lib/live/controller.js +107 -107
  170. package/lib/live/file-watcher/index.js +67 -67
  171. package/lib/live/file-watcher/modules-graph.js +58 -58
  172. package/lib/live/keyboard-observer.js +76 -76
  173. package/lib/live/logger/index.js +64 -64
  174. package/lib/live/test-run-controller.js +96 -96
  175. package/lib/live/test-run-state.js +6 -6
  176. package/lib/live/test-run.js +56 -56
  177. package/lib/live/test-runner.js +167 -167
  178. package/lib/load-assets.js +29 -29
  179. package/lib/notifications/add-rendered-warning.js +16 -16
  180. package/lib/notifications/debug-logger.js +78 -78
  181. package/lib/notifications/deprecated.js +24 -24
  182. package/lib/notifications/information-message.js +9 -9
  183. package/lib/notifications/warning-log.js +31 -31
  184. package/lib/notifications/warning-message.js +47 -47
  185. package/lib/reporter/command/command-formatter.js +120 -109
  186. package/lib/reporter/command/format-command.js +8 -8
  187. package/lib/reporter/command/interfaces.js +2 -2
  188. package/lib/reporter/index.js +319 -314
  189. package/lib/reporter/interfaces.js +2 -2
  190. package/lib/reporter/plugin-host.js +135 -135
  191. package/lib/reporter/plugin-methods.js +12 -12
  192. package/lib/role/index.js +74 -74
  193. package/lib/role/marker-symbol.js +7 -7
  194. package/lib/role/phase.js +9 -9
  195. package/lib/runner/bootstrapper.js +271 -271
  196. package/lib/runner/browser-job-result.js +9 -9
  197. package/lib/runner/browser-job.js +152 -152
  198. package/lib/runner/browser-set.js +114 -114
  199. package/lib/runner/fixture-hook-controller.js +85 -85
  200. package/lib/runner/index.js +449 -449
  201. package/lib/runner/interfaces.js +2 -2
  202. package/lib/runner/reporter-stream-controller.js +27 -27
  203. package/lib/runner/task/index.js +151 -151
  204. package/lib/runner/task/phase.js +9 -9
  205. package/lib/runner/test-run-controller.js +165 -165
  206. package/lib/runner/tested-app.js +72 -72
  207. package/lib/screenshots/capturer.js +141 -141
  208. package/lib/screenshots/constants.js +11 -11
  209. package/lib/screenshots/crop.js +111 -111
  210. package/lib/screenshots/default-extension.js +4 -4
  211. package/lib/screenshots/index.js +67 -67
  212. package/lib/screenshots/utils.js +39 -39
  213. package/lib/services/compiler/host.js +190 -190
  214. package/lib/services/compiler/io.js +9 -9
  215. package/lib/services/compiler/protocol.js +17 -16
  216. package/lib/services/compiler/service.js +225 -212
  217. package/lib/services/compiler/test-run-proxy.js +111 -111
  218. package/lib/services/interfaces.js +2 -2
  219. package/lib/services/process-title.js +8 -8
  220. package/lib/services/serialization/prepare-options.js +17 -17
  221. package/lib/services/serialization/replicator/create-replicator.js +25 -25
  222. package/lib/services/serialization/replicator/custom-error-transform.js +26 -26
  223. package/lib/services/serialization/test-structure.js +92 -92
  224. package/lib/services/utils/ipc/interfaces.js +30 -30
  225. package/lib/services/utils/ipc/io.js +108 -108
  226. package/lib/services/utils/ipc/message.js +75 -75
  227. package/lib/services/utils/ipc/packet.js +55 -55
  228. package/lib/services/utils/ipc/proxy.js +109 -109
  229. package/lib/services/utils/ipc/transport.js +64 -64
  230. package/lib/shared/errors/index.js +382 -382
  231. package/lib/shared/node-modules-folder-name.js +4 -4
  232. package/lib/test-run/bookmark.js +90 -90
  233. package/lib/test-run/browser-console-messages.js +73 -73
  234. package/lib/test-run/browser-manipulation-queue.js +92 -92
  235. package/lib/test-run/client-messages.js +9 -9
  236. package/lib/test-run/commands/actions.js +486 -483
  237. package/lib/test-run/commands/assertion.js +45 -45
  238. package/lib/test-run/commands/base.js +14 -14
  239. package/lib/test-run/commands/browser-manipulation.js +95 -95
  240. package/lib/test-run/commands/from-object.js +82 -82
  241. package/lib/test-run/commands/observation.js +61 -61
  242. package/lib/test-run/commands/options.js +231 -215
  243. package/lib/test-run/commands/service.js +54 -48
  244. package/lib/test-run/commands/type.js +65 -64
  245. package/lib/test-run/commands/utils.js +87 -87
  246. package/lib/test-run/commands/validations/argument.js +90 -90
  247. package/lib/test-run/commands/validations/factories.js +47 -47
  248. package/lib/test-run/commands/validations/initializers.js +44 -44
  249. package/lib/test-run/debug-log.js +32 -32
  250. package/lib/test-run/execute-js-expression.js +74 -74
  251. package/lib/test-run/index.js +823 -799
  252. package/lib/test-run/marker-symbol.js +7 -7
  253. package/lib/test-run/observed-callsites-storage.js +17 -17
  254. package/lib/test-run/phase.js +16 -16
  255. package/lib/test-run/session-controller.js +104 -104
  256. package/lib/testcafe.js +118 -118
  257. package/lib/utils/assignable.js +39 -39
  258. package/lib/utils/async-event-emitter.js +28 -28
  259. package/lib/utils/async-queue.js +14 -14
  260. package/lib/utils/browser-connection-timeouts.js +19 -19
  261. package/lib/utils/callsite.js +17 -17
  262. package/lib/utils/check-file-path.js +31 -31
  263. package/lib/utils/check-url.js +51 -51
  264. package/lib/utils/convert-to-best-fit-type.js +16 -16
  265. package/lib/utils/correct-file-path.js +21 -21
  266. package/lib/utils/define-lazy-property.js +13 -13
  267. package/lib/utils/delay.js +6 -6
  268. package/lib/utils/delegated-api.js +44 -44
  269. package/lib/utils/detect-display.js +6 -6
  270. package/lib/utils/detect-ffmpeg.js +44 -44
  271. package/lib/utils/diff/colors.js +29 -29
  272. package/lib/utils/diff/index.js +52 -52
  273. package/lib/utils/diff/util.js +23 -23
  274. package/lib/utils/diff.js +29 -29
  275. package/lib/utils/escape-user-agent.js +10 -10
  276. package/lib/utils/flag-list.js +17 -17
  277. package/lib/utils/get-any-key.js +8 -8
  278. package/lib/utils/get-browser.js +8 -8
  279. package/lib/utils/get-common-path.js +34 -34
  280. package/lib/utils/get-filter-fn.js +40 -40
  281. package/lib/utils/get-options/base.js +36 -36
  282. package/lib/utils/get-options/compiler.js +33 -33
  283. package/lib/utils/get-options/grep.js +15 -15
  284. package/lib/utils/get-options/index.js +20 -20
  285. package/lib/utils/get-options/meta.js +22 -22
  286. package/lib/utils/get-options/quarantine.js +91 -91
  287. package/lib/utils/get-options/screenshot.js +17 -17
  288. package/lib/utils/get-options/ssl.js +45 -45
  289. package/lib/utils/get-options/video.js +10 -10
  290. package/lib/utils/get-viewport-width.js +17 -17
  291. package/lib/utils/guard-time-execution.js +10 -10
  292. package/lib/utils/handle-errors.js +74 -74
  293. package/lib/utils/handle-tag-args.js +8 -8
  294. package/lib/utils/http.js +30 -30
  295. package/lib/utils/is-localhost.js +11 -11
  296. package/lib/utils/is-password-input.js +11 -0
  297. package/lib/utils/is-repl.js +10 -10
  298. package/lib/utils/is-window-in-iframe.js +6 -6
  299. package/lib/utils/limit-number.js +10 -10
  300. package/lib/utils/make-reg-exp.js +7 -7
  301. package/lib/utils/moment-loader.js +20 -20
  302. package/lib/utils/parse-file-list.js +71 -71
  303. package/lib/utils/parse-user-agent.js +55 -55
  304. package/lib/utils/path-pattern.js +114 -114
  305. package/lib/utils/prepare-reporters.js +30 -30
  306. package/lib/utils/prerender-callsite.js +18 -18
  307. package/lib/utils/process.js +119 -119
  308. package/lib/utils/promisified-functions.js +46 -46
  309. package/lib/utils/re-executable-promise.js +39 -39
  310. package/lib/utils/render-callsite-sync.js +29 -29
  311. package/lib/utils/render-template.js +9 -9
  312. package/lib/utils/reporter.js +30 -30
  313. package/lib/utils/resolve-path-relatively-cwd.js +7 -7
  314. package/lib/utils/string.js +105 -105
  315. package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
  316. package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
  317. package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
  318. package/lib/utils/temp-directory/index.js +87 -87
  319. package/lib/utils/temp-directory/lockfile.js +56 -56
  320. package/lib/utils/thennable.js +7 -7
  321. package/lib/utils/timer.js +15 -15
  322. package/lib/utils/to-posix-path.js +8 -8
  323. package/lib/utils/types.js +2 -2
  324. package/lib/video-recorder/interfaces.js +2 -2
  325. package/lib/video-recorder/process.js +126 -126
  326. package/lib/video-recorder/recorder.js +136 -136
  327. package/lib/video-recorder/test-run-video-recorder.js +69 -69
  328. package/lib/video-recorder/videos.js +37 -37
  329. package/package.json +2 -2
  330. package/ts-defs/index.d.ts +25 -14
  331. package/ts-defs/selectors.d.ts +16 -5
  332. package/ts-defs/testcafe-scripts.d.ts +17 -6
@@ -1,36 +1,36 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const callsite_record_1 = require("callsite-record");
7
- const types_1 = require("../types");
8
- const utils_1 = require("./utils");
9
- const templates_1 = __importDefault(require("./templates"));
10
- function getTestCafeErrorInCustomScriptError(err, viewportWidth) {
11
- const originErrTemplate = templates_1.default[err.originError.code];
12
- const originErrMessage = '\n' + err.originError.message;
13
- let originCallsiteMarkup = '';
14
- if (err.errCallsite && originErrTemplate && !utils_1.shouldSkipCallsite(err.originError)) {
15
- // HACK: we need to get callsite for custom TestCafe script without real file for it.
16
- // We use expression as a file content
17
- originCallsiteMarkup = err.errCallsite._renderRecord(err.expression, {
18
- renderer: callsite_record_1.renderers.html,
19
- stack: false
20
- });
21
- }
22
- const originErrorText = originErrTemplate ? originErrTemplate(err.originError, viewportWidth) : originErrMessage +
23
- '\n';
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const callsite_record_1 = require("callsite-record");
7
+ const types_1 = require("../types");
8
+ const utils_1 = require("./utils");
9
+ const templates_1 = __importDefault(require("./templates"));
10
+ function getTestCafeErrorInCustomScriptError(err, viewportWidth) {
11
+ const originErrTemplate = templates_1.default[err.originError.code];
12
+ const originErrMessage = '\n' + err.originError.message;
13
+ let originCallsiteMarkup = '';
14
+ if (err.errCallsite && originErrTemplate && !utils_1.shouldSkipCallsite(err.originError)) {
15
+ // HACK: we need to get callsite for custom TestCafe script without real file for it.
16
+ // We use expression as a file content
17
+ originCallsiteMarkup = err.errCallsite._renderRecord(err.expression, {
18
+ renderer: callsite_record_1.renderers.html,
19
+ stack: false
20
+ });
21
+ }
22
+ const originErrorText = originErrTemplate ? originErrTemplate(err.originError, viewportWidth) : originErrMessage +
23
+ '\n';
24
24
  return utils_1.markup(err, `
25
25
  An unhandled error occurred in the custom script:
26
26
  ${originErrorText}${!originCallsiteMarkup ? `\n${utils_1.formatExpressionMessage(err.expression, err.line, err.column)}` : ''}
27
- `, originCallsiteMarkup);
28
- }
29
- function renderErrorTemplate(err, viewportWidth) {
30
- if (err.code === types_1.TEST_RUN_ERRORS.uncaughtTestCafeErrorInCustomScript)
31
- return getTestCafeErrorInCustomScriptError(err, viewportWidth);
32
- return utils_1.markup(err, templates_1.default[err.code](err, viewportWidth));
33
- }
34
- exports.default = renderErrorTemplate;
27
+ `, originCallsiteMarkup);
28
+ }
29
+ function renderErrorTemplate(err, viewportWidth) {
30
+ if (err.code === types_1.TEST_RUN_ERRORS.uncaughtTestCafeErrorInCustomScript)
31
+ return getTestCafeErrorInCustomScriptError(err, viewportWidth);
32
+ return utils_1.markup(err, templates_1.default[err.code](err, viewportWidth));
33
+ }
34
+ exports.default = renderErrorTemplate;
35
35
  module.exports = exports.default;
36
36
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWVycm9yLXRlbXBsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy90ZXN0LXJ1bi9yZW5kZXItZXJyb3ItdGVtcGxhdGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBNEM7QUFDNUMsb0NBQTJDO0FBQzNDLG1DQUlpQjtBQUVqQiw0REFBb0M7QUFFcEMsU0FBUyxtQ0FBbUMsQ0FBRSxHQUFHLEVBQUUsYUFBYTtJQUM1RCxNQUFNLGlCQUFpQixHQUFJLG1CQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxNQUFNLGdCQUFnQixHQUFLLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztJQUMxRCxJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztJQUU5QixJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksaUJBQWlCLElBQUksQ0FBQywwQkFBa0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDOUUscUZBQXFGO1FBQ3JGLHNDQUFzQztRQUN0QyxvQkFBb0IsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ2pFLFFBQVEsRUFBRSwyQkFBUyxDQUFDLElBQUk7WUFDeEIsS0FBSyxFQUFLLEtBQUs7U0FDbEIsQ0FBQyxDQUFDO0tBQ047SUFFRCxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO1FBQ2hCLElBQUksQ0FBQztJQUVyRyxPQUFPLGNBQU0sQ0FBQyxHQUFHLEVBQUU7O1VBRWIsZUFBZSxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEtBQUssK0JBQXVCLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQ3hILEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsU0FBd0IsbUJBQW1CLENBQUUsR0FBRyxFQUFFLGFBQWE7SUFDM0QsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLHVCQUFlLENBQUMsbUNBQW1DO1FBQ2hFLE9BQU8sbUNBQW1DLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRW5FLE9BQU8sY0FBTSxDQUFDLEdBQUcsRUFBRSxtQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBTEQsc0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXJlcnMgfSBmcm9tICdjYWxsc2l0ZS1yZWNvcmQnO1xuaW1wb3J0IHsgVEVTVF9SVU5fRVJST1JTIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgICBtYXJrdXAsXG4gICAgc2hvdWxkU2tpcENhbGxzaXRlLFxuICAgIGZvcm1hdEV4cHJlc3Npb25NZXNzYWdlXG59IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQgVEVNUExBVEVTIGZyb20gJy4vdGVtcGxhdGVzJztcblxuZnVuY3Rpb24gZ2V0VGVzdENhZmVFcnJvckluQ3VzdG9tU2NyaXB0RXJyb3IgKGVyciwgdmlld3BvcnRXaWR0aCkge1xuICAgIGNvbnN0IG9yaWdpbkVyclRlbXBsYXRlICA9IFRFTVBMQVRFU1tlcnIub3JpZ2luRXJyb3IuY29kZV07XG4gICAgY29uc3Qgb3JpZ2luRXJyTWVzc2FnZSAgID0gJ1xcbicgKyBlcnIub3JpZ2luRXJyb3IubWVzc2FnZTtcbiAgICBsZXQgb3JpZ2luQ2FsbHNpdGVNYXJrdXAgPSAnJztcblxuICAgIGlmIChlcnIuZXJyQ2FsbHNpdGUgJiYgb3JpZ2luRXJyVGVtcGxhdGUgJiYgIXNob3VsZFNraXBDYWxsc2l0ZShlcnIub3JpZ2luRXJyb3IpKSB7XG4gICAgICAgIC8vIEhBQ0s6IHdlIG5lZWQgdG8gZ2V0IGNhbGxzaXRlIGZvciBjdXN0b20gVGVzdENhZmUgc2NyaXB0IHdpdGhvdXQgcmVhbCBmaWxlIGZvciBpdC5cbiAgICAgICAgLy8gV2UgdXNlIGV4cHJlc3Npb24gYXMgYSBmaWxlIGNvbnRlbnRcbiAgICAgICAgb3JpZ2luQ2FsbHNpdGVNYXJrdXAgPSBlcnIuZXJyQ2FsbHNpdGUuX3JlbmRlclJlY29yZChlcnIuZXhwcmVzc2lvbiwge1xuICAgICAgICAgICAgcmVuZGVyZXI6IHJlbmRlcmVycy5odG1sLFxuICAgICAgICAgICAgc3RhY2s6ICAgIGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbkVycm9yVGV4dCA9IG9yaWdpbkVyclRlbXBsYXRlID8gb3JpZ2luRXJyVGVtcGxhdGUoZXJyLm9yaWdpbkVycm9yLCB2aWV3cG9ydFdpZHRoKSA6IG9yaWdpbkVyck1lc3NhZ2UgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nO1xuXG4gICAgcmV0dXJuIG1hcmt1cChlcnIsIGBcbiAgICAgICAgQW4gdW5oYW5kbGVkIGVycm9yIG9jY3VycmVkIGluIHRoZSBjdXN0b20gc2NyaXB0OlxuICAgICAgICAke29yaWdpbkVycm9yVGV4dH0keyFvcmlnaW5DYWxsc2l0ZU1hcmt1cCA/IGBcXG4ke2Zvcm1hdEV4cHJlc3Npb25NZXNzYWdlKGVyci5leHByZXNzaW9uLCBlcnIubGluZSwgZXJyLmNvbHVtbil9YCA6ICcnfVxuICAgIGAsIG9yaWdpbkNhbGxzaXRlTWFya3VwKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVuZGVyRXJyb3JUZW1wbGF0ZSAoZXJyLCB2aWV3cG9ydFdpZHRoKSB7XG4gICAgaWYgKGVyci5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRUZXN0Q2FmZUVycm9ySW5DdXN0b21TY3JpcHQpXG4gICAgICAgIHJldHVybiBnZXRUZXN0Q2FmZUVycm9ySW5DdXN0b21TY3JpcHRFcnJvcihlcnIsIHZpZXdwb3J0V2lkdGgpO1xuXG4gICAgcmV0dXJuIG1hcmt1cChlcnIsIFRFTVBMQVRFU1tlcnIuY29kZV0oZXJyLCB2aWV3cG9ydFdpZHRoKSk7XG59XG5cbiJdfQ==
@@ -1,26 +1,26 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const lodash_1 = require("lodash");
4
- const types_1 = require("../types");
5
- const utils_1 = require("./utils");
6
- const EXTERNAL_LINKS = {
7
- createNewIssue: 'https://github.com/DevExpress/testcafe/issues/new?template=bug-report.md',
8
- troubleshootNetwork: 'https://go.devexpress.com/TestCafe_FAQ_ARequestHasFailed.aspx',
9
- viewportSizes: 'https://github.com/DevExpress/device-specs/blob/master/viewport-sizes.json'
10
- };
11
- exports.default = {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lodash_1 = require("lodash");
4
+ const types_1 = require("../types");
5
+ const utils_1 = require("./utils");
6
+ const EXTERNAL_LINKS = {
7
+ createNewIssue: 'https://github.com/DevExpress/testcafe/issues/new?template=bug-report.md',
8
+ troubleshootNetwork: 'https://go.devexpress.com/TestCafe_FAQ_ARequestHasFailed.aspx',
9
+ viewportSizes: 'https://github.com/DevExpress/device-specs/blob/master/viewport-sizes.json'
10
+ };
11
+ exports.default = {
12
12
  [types_1.TEST_RUN_ERRORS.actionIntegerOptionError]: err => `
13
13
  The "${err.optionName}" option is expected to be an integer, but it was ${err.actualValue}.
14
- `,
14
+ `,
15
15
  [types_1.TEST_RUN_ERRORS.actionPositiveIntegerOptionError]: err => `
16
16
  The "${err.optionName}" option is expected to be a positive integer, but it was ${err.actualValue}.
17
- `,
17
+ `,
18
18
  [types_1.TEST_RUN_ERRORS.actionBooleanOptionError]: err => `
19
19
  The "${err.optionName}" option is expected to be a boolean value, but it was ${err.actualValue}.
20
- `,
20
+ `,
21
21
  [types_1.TEST_RUN_ERRORS.actionSpeedOptionError]: err => `
22
22
  The "${err.optionName}" option is expected to be a number between 0.01 and 1, but it was ${err.actualValue}.
23
- `,
23
+ `,
24
24
  [types_1.TEST_RUN_ERRORS.pageLoadError]: err => `
25
25
  Failed to load the page at ${utils_1.formatUrl(err.url)}.
26
26
  Increase the value of the "pageRequestTimeout" variable, enable the "retryTestPages" option, or use quarantine mode to perform additional attempts to execute this test.
@@ -28,7 +28,7 @@ exports.default = {
28
28
 
29
29
  Error details:
30
30
  ${err.errMsg}
31
- `,
31
+ `,
32
32
  [types_1.TEST_RUN_ERRORS.uncaughtErrorOnPage]: err => `
33
33
  A JavaScript error occurred on ${utils_1.formatUrl(err.pageDestUrl)}.
34
34
  Repeat test actions in the browser and check the console for errors.
@@ -38,114 +38,114 @@ exports.default = {
38
38
 
39
39
  JavaScript error details:
40
40
  ${utils_1.replaceLeadingSpacesWithNbsp(lodash_1.escape(err.errStack))}
41
- `,
41
+ `,
42
42
  [types_1.TEST_RUN_ERRORS.uncaughtErrorInTestCode]: err => `
43
43
  ${lodash_1.escape(err.errMsg)}
44
- `,
44
+ `,
45
45
  [types_1.TEST_RUN_ERRORS.nativeDialogNotHandledError]: err => `
46
46
  A native ${err.dialogType} dialog was invoked on page ${utils_1.formatUrl(err.pageUrl)}, but no handler was set for it. Use the "setNativeDialogHandler" function to introduce a handler function for native dialogs.
47
- `,
47
+ `,
48
48
  [types_1.TEST_RUN_ERRORS.uncaughtErrorInNativeDialogHandler]: err => `
49
49
  An error occurred in the native dialog handler called for a native ${err.dialogType} dialog on page ${utils_1.formatUrl(err.pageUrl)}:
50
50
 
51
51
  ${lodash_1.escape(err.errMsg)}
52
- `,
52
+ `,
53
53
  [types_1.TEST_RUN_ERRORS.setTestSpeedArgumentError]: err => `
54
54
  Speed is expected to be a number between 0.01 and 1, but ${err.actualValue} was passed.
55
- `,
55
+ `,
56
56
  [types_1.TEST_RUN_ERRORS.setNativeDialogHandlerCodeWrongTypeError]: err => `
57
57
  The native dialog handler is expected to be a function, ClientFunction or null, but it was ${err.actualType}.
58
- `,
58
+ `,
59
59
  [types_1.TEST_RUN_ERRORS.uncaughtErrorInClientFunctionCode]: err => `
60
60
  An error occurred in ${err.instantiationCallsiteName} code:
61
61
 
62
62
  ${lodash_1.escape(err.errMsg)}
63
- `,
63
+ `,
64
64
  [types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomDOMPropertyCode]: err => `
65
65
  An error occurred when trying to calculate a custom Selector property "${err.property}":
66
66
 
67
67
  ${lodash_1.escape(err.errMsg)}
68
- `,
68
+ `,
69
69
  [types_1.TEST_RUN_ERRORS.clientFunctionExecutionInterruptionError]: err => `
70
70
  ${err.instantiationCallsiteName} execution was interrupted by page unload. This problem may appear if you trigger page navigation from ${err.instantiationCallsiteName} code.
71
- `,
71
+ `,
72
72
  [types_1.TEST_RUN_ERRORS.uncaughtNonErrorObjectInTestCode]: err => `
73
73
  Uncaught ${err.objType} "${lodash_1.escape(err.objStr)}" was thrown. Throw Error instead.
74
- `,
74
+ `,
75
75
  [types_1.TEST_RUN_ERRORS.unhandledPromiseRejection]: err => `
76
76
  Unhandled promise rejection:
77
77
 
78
78
  ${lodash_1.escape(err.errMsg)}
79
- `,
79
+ `,
80
80
  [types_1.TEST_RUN_ERRORS.uncaughtException]: err => `
81
81
  Uncaught exception:
82
82
 
83
83
  ${lodash_1.escape(err.errMsg)}
84
- `,
84
+ `,
85
85
  [types_1.TEST_RUN_ERRORS.actionOptionsTypeError]: err => `
86
86
  Action options is expected to be an object, null or undefined but it was ${err.actualType}.
87
- `,
87
+ `,
88
88
  [types_1.TEST_RUN_ERRORS.actionStringArgumentError]: err => `
89
89
  The "${err.argumentName}" argument is expected to be a non-empty string, but it was ${err.actualValue}.
90
- `,
90
+ `,
91
91
  [types_1.TEST_RUN_ERRORS.actionBooleanArgumentError]: err => `
92
92
  The "${err.argumentName}" argument is expected to be a boolean value, but it was ${err.actualValue}.
93
- `,
93
+ `,
94
94
  [types_1.TEST_RUN_ERRORS.actionNullableStringArgumentError]: err => `
95
95
  The "${err.argumentName}" argument is expected to be a null or a string, but it was ${err.actualValue}.
96
- `,
96
+ `,
97
97
  [types_1.TEST_RUN_ERRORS.actionStringOrStringArrayArgumentError]: err => `
98
98
  The "${err.argumentName}" argument is expected to be a non-empty string or a string array, but it was ${err.actualValue}.
99
- `,
99
+ `,
100
100
  [types_1.TEST_RUN_ERRORS.actionStringArrayElementError]: err => `
101
101
  Elements of the "${err.argumentName}" argument are expected to be non-empty strings, but the element at index ${err.elementIndex} was ${err.actualValue}.
102
- `,
102
+ `,
103
103
  [types_1.TEST_RUN_ERRORS.actionIntegerArgumentError]: err => `
104
104
  The "${err.argumentName}" argument is expected to be an integer, but it was ${err.actualValue}.
105
- `,
105
+ `,
106
106
  [types_1.TEST_RUN_ERRORS.actionRoleArgumentError]: err => `
107
107
  The "${err.argumentName}" argument is expected to be a Role instance, but it was ${err.actualValue}.
108
- `,
108
+ `,
109
109
  [types_1.TEST_RUN_ERRORS.actionFunctionArgumentError]: err => `
110
110
  The "${err.argumentName}" argument is expected to be a function, but it was ${err.actualValue}.
111
- `,
111
+ `,
112
112
  [types_1.TEST_RUN_ERRORS.actionPositiveIntegerArgumentError]: err => `
113
113
  The "${err.argumentName}" argument is expected to be a positive integer, but it was ${err.actualValue}.
114
- `,
114
+ `,
115
115
  [types_1.TEST_RUN_ERRORS.actionElementNotFoundError]: (err, viewportWidth) => `
116
116
  The specified selector does not match any element in the DOM tree.
117
117
 
118
118
  ${utils_1.formatSelectorCallstack(err.apiFnChain, err.apiFnIndex, viewportWidth)}
119
- `,
119
+ `,
120
120
  [types_1.TEST_RUN_ERRORS.actionElementIsInvisibleError]: () => `
121
121
  The element that matches the specified selector is not visible.
122
- `,
122
+ `,
123
123
  [types_1.TEST_RUN_ERRORS.actionSelectorMatchesWrongNodeTypeError]: err => `
124
124
  The specified selector is expected to match a DOM element, but it matches a ${err.nodeDescription} node.
125
- `,
125
+ `,
126
126
  [types_1.TEST_RUN_ERRORS.actionAdditionalElementNotFoundError]: (err, viewportWidth) => `
127
127
  The specified "${err.argumentName}" does not match any element in the DOM tree.
128
128
 
129
129
  ${utils_1.formatSelectorCallstack(err.apiFnChain, err.apiFnIndex, viewportWidth)}
130
- `,
130
+ `,
131
131
  [types_1.TEST_RUN_ERRORS.actionAdditionalElementIsInvisibleError]: err => `
132
132
  The element that matches the specified "${err.argumentName}" is not visible.
133
- `,
133
+ `,
134
134
  [types_1.TEST_RUN_ERRORS.actionAdditionalSelectorMatchesWrongNodeTypeError]: err => `
135
135
  The specified "${err.argumentName}" is expected to match a DOM element, but it matches a ${err.nodeDescription} node.
136
- `,
136
+ `,
137
137
  [types_1.TEST_RUN_ERRORS.actionElementNonEditableError]: () => `
138
138
  The action element is expected to be editable (an input, textarea or element with the contentEditable attribute).
139
- `,
139
+ `,
140
140
  [types_1.TEST_RUN_ERRORS.actionElementNonContentEditableError]: err => `
141
141
  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.
142
- `,
142
+ `,
143
143
  [types_1.TEST_RUN_ERRORS.actionRootContainerNotFoundError]: () => `
144
144
  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.
145
- `,
145
+ `,
146
146
  [types_1.TEST_RUN_ERRORS.actionElementIsNotFileInputError]: () => `
147
147
  The specified selector does not match a file input element.
148
- `,
148
+ `,
149
149
  [types_1.TEST_RUN_ERRORS.actionCannotFindFileToUploadError]: err => `
150
150
  Cannot find the following file(s) to upload:
151
151
  ${err.filePaths.map(path => lodash_1.escape(path)).join('\n')}
@@ -154,153 +154,153 @@ exports.default = {
154
154
  ${err.scannedFilePaths.map(path => lodash_1.escape(path)).join('\n')}
155
155
 
156
156
  Ensure these files exist or change the working directory.
157
- `,
157
+ `,
158
158
  [types_1.TEST_RUN_ERRORS.actionElementNotTextAreaError]: () => `
159
159
  The action element is expected to be a <textarea>.
160
- `,
160
+ `,
161
161
  [types_1.TEST_RUN_ERRORS.actionElementNotIframeError]: () => `
162
162
  The action element is expected to be an <iframe&gt.
163
- `,
163
+ `,
164
164
  [types_1.TEST_RUN_ERRORS.actionIncorrectKeysError]: err => `
165
165
  The "${err.argumentName}" argument contains an incorrect key or key combination.
166
- `,
166
+ `,
167
167
  [types_1.TEST_RUN_ERRORS.actionUnsupportedDeviceTypeError]: err => `
168
168
  The "${err.argumentName}" argument specifies an unsupported "${err.actualValue}" device. For a list of supported devices, refer to ${utils_1.formatUrl(EXTERNAL_LINKS.viewportSizes)}.
169
- `,
169
+ `,
170
170
  [types_1.TEST_RUN_ERRORS.actionInvalidScrollTargetError]: err => `
171
171
  Unable to scroll to the specified point because a point with the specified ${err.properties} is not located inside the element's cropping region.
172
- `,
172
+ `,
173
173
  [types_1.TEST_RUN_ERRORS.actionIframeIsNotLoadedError]: () => `
174
174
  Content of the iframe to which you are switching did not load.
175
- `,
175
+ `,
176
176
  [types_1.TEST_RUN_ERRORS.currentIframeIsNotLoadedError]: () => `
177
177
  Content of the iframe in which the test is currently operating did not load.
178
- `,
178
+ `,
179
179
  [types_1.TEST_RUN_ERRORS.currentIframeNotFoundError]: () => `
180
180
  The iframe in which the test is currently operating does not exist anymore.
181
- `,
181
+ `,
182
182
  [types_1.TEST_RUN_ERRORS.currentIframeIsInvisibleError]: () => `
183
183
  The iframe in which the test is currently operating is not visible anymore.
184
- `,
184
+ `,
185
185
  [types_1.TEST_RUN_ERRORS.missingAwaitError]: () => `
186
186
  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.
187
- `,
187
+ `,
188
188
  [types_1.TEST_RUN_ERRORS.externalAssertionLibraryError]: err => `
189
189
  ${lodash_1.escape(err.errMsg)}
190
190
 
191
191
  ${utils_1.renderDiff(err.diff)}
192
- `,
192
+ `,
193
193
  [types_1.TEST_RUN_ERRORS.domNodeClientFunctionResultError]: err => `
194
194
  ${err.instantiationCallsiteName} cannot return DOM elements. Use Selector functions for this purpose.
195
- `,
195
+ `,
196
196
  [types_1.TEST_RUN_ERRORS.invalidSelectorResultError]: () => `
197
197
  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.
198
- `,
198
+ `,
199
199
  [types_1.TEST_RUN_ERRORS.actionSelectorError]: err => `
200
200
  Action "${err.selectorName}" argument error:
201
201
 
202
202
  ${lodash_1.escape(err.errMsg)}
203
- `,
203
+ `,
204
204
  [types_1.TEST_RUN_ERRORS.cannotObtainInfoForElementSpecifiedBySelectorError]: (err, viewportWidth) => `
205
205
  Cannot obtain information about the node because the specified selector does not match any node in the DOM tree.
206
206
 
207
207
  ${utils_1.formatSelectorCallstack(err.apiFnChain, err.apiFnIndex, viewportWidth)}
208
- `,
208
+ `,
209
209
  [types_1.TEST_RUN_ERRORS.windowDimensionsOverflowError]: () => `
210
210
  Unable to resize the window because the specified size exceeds the screen size. On macOS, a window cannot be larger than the screen.
211
- `,
211
+ `,
212
212
  [types_1.TEST_RUN_ERRORS.forbiddenCharactersInScreenshotPathError]: err => `
213
213
  There are forbidden characters in the "${err.screenshotPath}" screenshot path:
214
214
  ${utils_1.renderForbiddenCharsList(err.forbiddenCharsList)}
215
- `,
215
+ `,
216
216
  [types_1.TEST_RUN_ERRORS.invalidElementScreenshotDimensionsError]: err => `
217
217
  Unable to capture an element image because the resulting image ${err.dimensions} ${err.verb} zero or negative.
218
- `,
218
+ `,
219
219
  [types_1.TEST_RUN_ERRORS.roleSwitchInRoleInitializerError]: () => `
220
220
  Role cannot be switched while another role is being initialized.
221
- `,
221
+ `,
222
222
  [types_1.TEST_RUN_ERRORS.assertionExecutableArgumentError]: err => `
223
223
  Cannot evaluate the "${err.actualValue}" expression in the "${err.argumentName}" parameter because of the following error:
224
224
 
225
225
  ${err.errMsg}
226
- `,
226
+ `,
227
227
  [types_1.TEST_RUN_ERRORS.assertionWithoutMethodCallError]: () => `
228
228
  An assertion method is not specified.
229
- `,
229
+ `,
230
230
  [types_1.TEST_RUN_ERRORS.assertionUnawaitedPromiseError]: () => `
231
231
  Attempted to run assertions on a Promise object. Did you forget to await it? If not, pass "{ allowUnawaitedPromise: true }" to the assertion options.
232
- `,
232
+ `,
233
233
  [types_1.TEST_RUN_ERRORS.requestHookNotImplementedError]: err => `
234
234
  You should implement the "${err.methodName}" method in the "${err.hookClassName}" class.
235
- `,
235
+ `,
236
236
  [types_1.TEST_RUN_ERRORS.requestHookUnhandledError]: err => `
237
237
  An unhandled error occurred in the "${err.methodName}" method of the "${err.hookClassName}" class:
238
238
 
239
239
  ${lodash_1.escape(err.errMsg)}
240
- `,
240
+ `,
241
241
  [types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCode]: err => `
242
242
  An error occurred in a script injected into the tested page:
243
243
 
244
244
  ${lodash_1.escape(err.errMsg)}
245
- `,
245
+ `,
246
246
  [types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCodeLoadedFromModule]: err => `
247
247
  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.
248
248
 
249
249
  Error details:
250
250
  ${lodash_1.escape(err.errMsg)}
251
- `,
251
+ `,
252
252
  [types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomScript]: err => `
253
253
  An unhandled error occurred in the custom script:
254
254
 
255
255
  Error details: ${lodash_1.escape(err.errMsg)}
256
256
 
257
257
  ${utils_1.formatExpressionMessage(err.expression, err.line, err.column)}
258
- `,
258
+ `,
259
259
  [types_1.TEST_RUN_ERRORS.childWindowIsNotLoadedError]: () => `
260
260
  The page in the child window is not loaded.
261
- `,
261
+ `,
262
262
  [types_1.TEST_RUN_ERRORS.childWindowNotFoundError]: () => `
263
263
  The child window is not found.
264
- `,
264
+ `,
265
265
  [types_1.TEST_RUN_ERRORS.cannotSwitchToWindowError]: () => `
266
266
  Cannot switch to the window.
267
- `,
267
+ `,
268
268
  [types_1.TEST_RUN_ERRORS.closeChildWindowError]: () => `
269
269
  An error occurred while closing child windows.
270
- `,
270
+ `,
271
271
  [types_1.TEST_RUN_ERRORS.childWindowClosedBeforeSwitchingError]: () => `
272
272
  The child window was closed before TestCafe could switch to it.
273
- `,
273
+ `,
274
274
  [types_1.TEST_RUN_ERRORS.cannotCloseWindowWithChildrenError]: () => `
275
275
  Cannot close a window that has an open child window.
276
- `,
276
+ `,
277
277
  [types_1.TEST_RUN_ERRORS.targetWindowNotFoundError]: () => `
278
278
  Cannot find the window specified in the action parameters.
279
- `,
279
+ `,
280
280
  [types_1.TEST_RUN_ERRORS.parentWindowNotFoundError]: () => `
281
281
  Cannot find the parent window. Make sure that the tested window was opened from another window.
282
- `,
282
+ `,
283
283
  [types_1.TEST_RUN_ERRORS.previousWindowNotFoundError]: () => `
284
284
  Cannot find the previous window. Make sure that the previous window is opened.
285
- `,
285
+ `,
286
286
  [types_1.TEST_RUN_ERRORS.switchToWindowPredicateError]: err => `
287
287
  An error occurred inside the "switchToWindow" argument function.
288
288
 
289
289
  Error details:
290
290
  ${lodash_1.escape(err.errMsg)}
291
- `,
291
+ `,
292
292
  [types_1.TEST_RUN_ERRORS.multipleWindowsModeIsDisabledError]: err => `
293
293
  Multi-window mode is disabled. To use the "${err.methodName}" method, remove the "disableMultipleWindows" option.
294
- `,
294
+ `,
295
295
  [types_1.TEST_RUN_ERRORS.multipleWindowsModeIsNotSupportedInRemoteBrowserError]: err => `
296
296
  Multi-window mode is supported in Chrome, Chromium, Edge 84+ and Firefox only. Run tests in these browsers to use the "${err.methodName}" method.
297
- `,
297
+ `,
298
298
  [types_1.TEST_RUN_ERRORS.cannotCloseWindowWithoutParent]: () => `
299
299
  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.
300
- `,
300
+ `,
301
301
  [types_1.TEST_RUN_ERRORS.cannotRestoreChildWindowError]: () => `
302
302
  Failed to restore connection to window within the allocated timeout.
303
- `,
304
- };
303
+ `,
304
+ };
305
305
  module.exports = exports.default;
306
306
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy90ZXN0LXJ1bi90ZW1wbGF0ZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBOEM7QUFDOUMsb0NBQTJDO0FBQzNDLG1DQU9pQjtBQUVqQixNQUFNLGNBQWMsR0FBRztJQUNuQixjQUFjLEVBQU8sMEVBQTBFO0lBQy9GLG1CQUFtQixFQUFFLCtEQUErRDtJQUNwRixhQUFhLEVBQVEsNEVBQTRFO0NBQ3BHLENBQUM7QUFFRixrQkFBZTtJQUNYLENBQUMsdUJBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7ZUFDeEMsR0FBRyxDQUFDLFVBQVUscURBQXFELEdBQUcsQ0FBQyxXQUFXO0tBQzVGO0lBRUQsQ0FBQyx1QkFBZSxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztlQUNoRCxHQUFHLENBQUMsVUFBVSw2REFBNkQsR0FBRyxDQUFDLFdBQVc7S0FDcEc7SUFFRCxDQUFDLHVCQUFlLENBQUMsd0JBQXdCLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2VBQ3hDLEdBQUcsQ0FBQyxVQUFVLDBEQUEwRCxHQUFHLENBQUMsV0FBVztLQUNqRztJQUVELENBQUMsdUJBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7ZUFDdEMsR0FBRyxDQUFDLFVBQVUsc0VBQXNFLEdBQUcsQ0FBQyxXQUFXO0tBQzdHO0lBRUQsQ0FBQyx1QkFBZSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7cUNBQ1AsaUJBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDOztxRUFFYyxpQkFBUyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQzs7O1VBR3hHLEdBQUcsQ0FBQyxNQUFNO0tBQ2Y7SUFFRCxDQUFDLHVCQUFlLENBQUMsbUJBQW1C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WyJpbXBvcnQgeyBlc2NhcGUgYXMgZXNjYXBlSHRtbCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBURVNUX1JVTl9FUlJPUlMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge1xuICAgIHJlbmRlckZvcmJpZGRlbkNoYXJzTGlzdCxcbiAgICByZW5kZXJEaWZmLFxuICAgIGZvcm1hdFNlbGVjdG9yQ2FsbHN0YWNrLFxuICAgIGZvcm1hdFVybCxcbiAgICByZXBsYWNlTGVhZGluZ1NwYWNlc1dpdGhOYnNwLFxuICAgIGZvcm1hdEV4cHJlc3Npb25NZXNzYWdlXG59IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBFWFRFUk5BTF9MSU5LUyA9IHtcbiAgICBjcmVhdGVOZXdJc3N1ZTogICAgICAnaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvdGVzdGNhZmUvaXNzdWVzL25ldz90ZW1wbGF0ZT1idWctcmVwb3J0Lm1kJyxcbiAgICB0cm91Ymxlc2hvb3ROZXR3b3JrOiAnaHR0cHM6Ly9nby5kZXZleHByZXNzLmNvbS9UZXN0Q2FmZV9GQVFfQVJlcXVlc3RIYXNGYWlsZWQuYXNweCcsXG4gICAgdmlld3BvcnRTaXplczogICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9EZXZFeHByZXNzL2RldmljZS1zcGVjcy9ibG9iL21hc3Rlci92aWV3cG9ydC1zaXplcy5qc29uJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uSW50ZWdlck9wdGlvbkVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIub3B0aW9uTmFtZX1cIiBvcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW50ZWdlciwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uUG9zaXRpdmVJbnRlZ2VyT3B0aW9uRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5vcHRpb25OYW1lfVwiIG9wdGlvbiBpcyBleHBlY3RlZCB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkJvb2xlYW5PcHRpb25FcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLm9wdGlvbk5hbWV9XCIgb3B0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGEgYm9vbGVhbiB2YWx1ZSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3BlZWRPcHRpb25FcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLm9wdGlvbk5hbWV9XCIgb3B0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGEgbnVtYmVyIGJldHdlZW4gMC4wMSBhbmQgMSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMucGFnZUxvYWRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIEZhaWxlZCB0byBsb2FkIHRoZSBwYWdlIGF0ICR7Zm9ybWF0VXJsKGVyci51cmwpfS5cbiAgICAgICAgSW5jcmVhc2UgdGhlIHZhbHVlIG9mIHRoZSBcInBhZ2VSZXF1ZXN0VGltZW91dFwiIHZhcmlhYmxlLCBlbmFibGUgdGhlIFwicmV0cnlUZXN0UGFnZXNcIiBvcHRpb24sIG9yIHVzZSBxdWFyYW50aW5lIG1vZGUgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIGF0dGVtcHRzIHRvIGV4ZWN1dGUgdGhpcyB0ZXN0LlxuICAgICAgICBZb3UgY2FuIGZpbmQgdHJvdWJsZXNob290aW5nIGluZm9ybWF0aW9uIGZvciB0aGlzIGlzc3VlIGF0ICR7Zm9ybWF0VXJsKEVYVEVSTkFMX0xJTktTLnRyb3VibGVzaG9vdE5ldHdvcmspfS5cblxuICAgICAgICBFcnJvciBkZXRhaWxzOlxuICAgICAgICAke2Vyci5lcnJNc2d9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvck9uUGFnZV06IGVyciA9PiBgXG4gICAgICAgIEEgSmF2YVNjcmlwdCBlcnJvciBvY2N1cnJlZCBvbiAke2Zvcm1hdFVybChlcnIucGFnZURlc3RVcmwpfS5cbiAgICAgICAgUmVwZWF0IHRlc3QgYWN0aW9ucyBpbiB0aGUgYnJvd3NlciBhbmQgY2hlY2sgdGhlIGNvbnNvbGUgZm9yIGVycm9ycy5cbiAgICAgICAgVG8gaWdub3JlIGNsaWVudC1zaWRlIEphdmFTY3JpcHQgZXJyb3JzLCBlbmFibGUgdGhlIFwiLS1za2lwLWpzLWVycm9yc1wiIENMSSBvcHRpb24sIG9yIHNldCB0aGUgXCJza2lwSnNFcnJvcnNcIiBjb25maWd1cmF0aW9uIGZpbGUgcHJvcGVydHkgdG8gXCJ0cnVlXCIuXG4gICAgICAgIElmIHRoZSB3ZWJzaXRlIG9ubHkgdGhyb3dzIHRoaXMgZXJyb3Igd2hlbiB5b3UgdGVzdCBpdCB3aXRoIFRlc3RDYWZlLCBwbGVhc2UgY3JlYXRlIGEgbmV3IGlzc3VlIGF0OlxuICAgICAgICAke2Zvcm1hdFVybChFWFRFUk5BTF9MSU5LUy5jcmVhdGVOZXdJc3N1ZSl9LlxuXG4gICAgICAgIEphdmFTY3JpcHQgZXJyb3IgZGV0YWlsczpcbiAgICAgICAgJHtyZXBsYWNlTGVhZGluZ1NwYWNlc1dpdGhOYnNwKGVzY2FwZUh0bWwoZXJyLmVyclN0YWNrKSl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluVGVzdENvZGVdOiBlcnIgPT4gYFxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMubmF0aXZlRGlhbG9nTm90SGFuZGxlZEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgQSBuYXRpdmUgJHtlcnIuZGlhbG9nVHlwZX0gZGlhbG9nIHdhcyBpbnZva2VkIG9uIHBhZ2UgJHtmb3JtYXRVcmwoZXJyLnBhZ2VVcmwpfSwgYnV0IG5vIGhhbmRsZXIgd2FzIHNldCBmb3IgaXQuIFVzZSB0aGUgXCJzZXROYXRpdmVEaWFsb2dIYW5kbGVyXCIgZnVuY3Rpb24gdG8gaW50cm9kdWNlIGEgaGFuZGxlciBmdW5jdGlvbiBmb3IgbmF0aXZlIGRpYWxvZ3MuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluTmF0aXZlRGlhbG9nSGFuZGxlcl06IGVyciA9PiBgXG4gICAgICAgIEFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBuYXRpdmUgZGlhbG9nIGhhbmRsZXIgY2FsbGVkIGZvciBhIG5hdGl2ZSAke2Vyci5kaWFsb2dUeXBlfSBkaWFsb2cgb24gcGFnZSAke2Zvcm1hdFVybChlcnIucGFnZVVybCl9OlxuXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5zZXRUZXN0U3BlZWRBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgU3BlZWQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBudW1iZXIgYmV0d2VlbiAwLjAxIGFuZCAxLCBidXQgJHtlcnIuYWN0dWFsVmFsdWV9IHdhcyBwYXNzZWQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuc2V0TmF0aXZlRGlhbG9nSGFuZGxlckNvZGVXcm9uZ1R5cGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBuYXRpdmUgZGlhbG9nIGhhbmRsZXIgaXMgZXhwZWN0ZWQgdG8gYmUgYSBmdW5jdGlvbiwgQ2xpZW50RnVuY3Rpb24gb3IgbnVsbCwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxUeXBlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5DbGllbnRGdW5jdGlvbkNvZGVdOiBlcnIgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCBpbiAke2Vyci5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBjb2RlOlxuXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5DdXN0b21ET01Qcm9wZXJ0eUNvZGVdOiBlcnIgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCB3aGVuIHRyeWluZyB0byBjYWxjdWxhdGUgYSBjdXN0b20gU2VsZWN0b3IgcHJvcGVydHkgXCIke2Vyci5wcm9wZXJ0eX1cIjpcblxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2xpZW50RnVuY3Rpb25FeGVjdXRpb25JbnRlcnJ1cHRpb25FcnJvcl06IGVyciA9PiBgXG4gICAgICAgICR7ZXJyLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGV4ZWN1dGlvbiB3YXMgaW50ZXJydXB0ZWQgYnkgcGFnZSB1bmxvYWQuIFRoaXMgcHJvYmxlbSBtYXkgYXBwZWFyIGlmIHlvdSB0cmlnZ2VyIHBhZ2UgbmF2aWdhdGlvbiBmcm9tICR7ZXJyLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGNvZGUuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHROb25FcnJvck9iamVjdEluVGVzdENvZGVdOiBlcnIgPT4gYFxuICAgICAgICBVbmNhdWdodCAke2Vyci5vYmpUeXBlfSBcIiR7ZXNjYXBlSHRtbChlcnIub2JqU3RyKX1cIiB3YXMgdGhyb3duLiBUaHJvdyBFcnJvciBpbnN0ZWFkLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25dOiBlcnIgPT4gYFxuICAgICAgICBVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb246XG5cbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXhjZXB0aW9uXTogZXJyID0+IGBcbiAgICAgICAgVW5jYXVnaHQgZXhjZXB0aW9uOlxuXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25PcHRpb25zVHlwZUVycm9yXTogZXJyID0+IGBcbiAgICAgICAgQWN0aW9uIG9wdGlvbnMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gb2JqZWN0LCBudWxsIG9yIHVuZGVmaW5lZCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFR5cGV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ0FyZ3VtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBub24tZW1wdHkgc3RyaW5nLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25Cb29sZWFuQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBpcyBleHBlY3RlZCB0byBiZSBhIGJvb2xlYW4gdmFsdWUsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbk51bGxhYmxlU3RyaW5nQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBpcyBleHBlY3RlZCB0byBiZSBhIG51bGwgb3IgYSBzdHJpbmcsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ09yU3RyaW5nQXJyYXlBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHN0cmluZyBhcnJheSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3RyaW5nQXJyYXlFbGVtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBFbGVtZW50cyBvZiB0aGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgYXJlIGV4cGVjdGVkIHRvIGJlIG5vbi1lbXB0eSBzdHJpbmdzLCBidXQgdGhlIGVsZW1lbnQgYXQgaW5kZXggJHtlcnIuZWxlbWVudEluZGV4fSB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkludGVnZXJBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGFuIGludGVnZXIsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblJvbGVBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgUm9sZSBpbnN0YW5jZSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uRnVuY3Rpb25Bcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgZnVuY3Rpb24sIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblBvc2l0aXZlSW50ZWdlckFyZ3VtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm90Rm91bmRFcnJvcl06IChlcnIsIHZpZXdwb3J0V2lkdGgpID0+IGBcbiAgICAgICAgVGhlIHNwZWNpZmllZCBzZWxlY3RvciBkb2VzIG5vdCBtYXRjaCBhbnkgZWxlbWVudCBpbiB0aGUgRE9NIHRyZWUuXG5cbiAgICAgICAgJHtmb3JtYXRTZWxlY3RvckNhbGxzdGFjayhlcnIuYXBpRm5DaGFpbiwgZXJyLmFwaUZuSW5kZXgsIHZpZXdwb3J0V2lkdGgpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnRJc0ludmlzaWJsZUVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzZWxlY3RvciBpcyBub3QgdmlzaWJsZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25TZWxlY3Rvck1hdGNoZXNXcm9uZ05vZGVUeXBlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgc3BlY2lmaWVkIHNlbGVjdG9yIGlzIGV4cGVjdGVkIHRvIG1hdGNoIGEgRE9NIGVsZW1lbnQsIGJ1dCBpdCBtYXRjaGVzIGEgJHtlcnIubm9kZURlc2NyaXB0aW9ufSBub2RlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkFkZGl0aW9uYWxFbGVtZW50Tm90Rm91bmRFcnJvcl06IChlcnIsIHZpZXdwb3J0V2lkdGgpID0+IGBcbiAgICAgICAgVGhlIHNwZWNpZmllZCBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBkb2VzIG5vdCBtYXRjaCBhbnkgZWxlbWVudCBpbiB0aGUgRE9NIHRyZWUuXG5cbiAgICAgICAgJHtmb3JtYXRTZWxlY3RvckNhbGxzdGFjayhlcnIuYXBpRm5DaGFpbiwgZXJyLmFwaUZuSW5kZXgsIHZpZXdwb3J0V2lkdGgpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkFkZGl0aW9uYWxFbGVtZW50SXNJbnZpc2libGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGlzIG5vdCB2aXNpYmxlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkFkZGl0aW9uYWxTZWxlY3Rvck1hdGNoZXNXcm9uZ05vZGVUeXBlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgc3BlY2lmaWVkIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGlzIGV4cGVjdGVkIHRvIG1hdGNoIGEgRE9NIGVsZW1lbnQsIGJ1dCBpdCBtYXRjaGVzIGEgJHtlcnIubm9kZURlc2NyaXB0aW9ufSBub2RlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnROb25FZGl0YWJsZUVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgYWN0aW9uIGVsZW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgZWRpdGFibGUgKGFuIGlucHV0LCB0ZXh0YXJlYSBvciBlbGVtZW50IHdpdGggdGhlIGNvbnRlbnRFZGl0YWJsZSBhdHRyaWJ1dGUpLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnROb25Db250ZW50RWRpdGFibGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGlzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGNvbnRlbnRFZGl0YWJsZSBhdHRyaWJ1dGUgZW5hYmxlZCBvciB0aGUgZW50aXJlIGRvY3VtZW50IHNob3VsZCBiZSBpbiBkZXNpZ24gbW9kZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25Sb290Q29udGFpbmVyTm90Rm91bmRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ29udGVudCBiZXR3ZWVuIHRoZSBhY3Rpb24gZWxlbWVudHMgY2Fubm90IGJlIHNlbGVjdGVkIGJlY2F1c2UgdGhlIHJvb3QgY29udGFpbmVyIGZvciB0aGUgc2VsZWN0aW9uIHJhbmdlIGNhbm5vdCBiZSBmb3VuZCwgaS5lLiB0aGVzZSBlbGVtZW50cyBkbyBub3QgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvciB3aXRoIHRoZSBjb250ZW50RWRpdGFibGUgYXR0cmlidXRlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnRJc05vdEZpbGVJbnB1dEVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgc3BlY2lmaWVkIHNlbGVjdG9yIGRvZXMgbm90IG1hdGNoIGEgZmlsZSBpbnB1dCBlbGVtZW50LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkNhbm5vdEZpbmRGaWxlVG9VcGxvYWRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIENhbm5vdCBmaW5kIHRoZSBmb2xsb3dpbmcgZmlsZShzKSB0byB1cGxvYWQ6XG4gICAgICAgICR7ZXJyLmZpbGVQYXRocy5tYXAocGF0aCA9PiBlc2NhcGVIdG1sKHBhdGgpKS5qb2luKCdcXG4nKX1cblxuICAgICAgICBUaGUgZm9sbG93aW5nIGxvY2F0aW9ucyB3ZXJlIHNjYW5uZWQgZm9yIHRoZSBtaXNzaW5nIHVwbG9hZCBmaWxlczpcbiAgICAgICAgJHtlcnIuc2Nhbm5lZEZpbGVQYXRocy5tYXAocGF0aCA9PiBlc2NhcGVIdG1sKHBhdGgpKS5qb2luKCdcXG4nKX1cblxuICAgICAgICBFbnN1cmUgdGhlc2UgZmlsZXMgZXhpc3Qgb3IgY2hhbmdlIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm90VGV4dEFyZWFFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGFjdGlvbiBlbGVtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgJmx0O3RleHRhcmVhJmd0Oy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm90SWZyYW1lRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFRoZSBhY3Rpb24gZWxlbWVudCBpcyBleHBlY3RlZCB0byBiZSBhbiAmbHQ7aWZyYW1lJmd0LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkluY29ycmVjdEtleXNFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBjb250YWlucyBhbiBpbmNvcnJlY3Qga2V5IG9yIGtleSBjb21iaW5hdGlvbi5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25VbnN1cHBvcnRlZERldmljZVR5cGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBzcGVjaWZpZXMgYW4gdW5zdXBwb3J0ZWQgXCIke2Vyci5hY3R1YWxWYWx1ZX1cIiBkZXZpY2UuIEZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMsIHJlZmVyIHRvICR7Zm9ybWF0VXJsKEVYVEVSTkFMX0xJTktTLnZpZXdwb3J0U2l6ZXMpfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25JbnZhbGlkU2Nyb2xsVGFyZ2V0RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBVbmFibGUgdG8gc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgcG9pbnQgYmVjYXVzZSBhIHBvaW50IHdpdGggdGhlIHNwZWNpZmllZCAke2Vyci5wcm9wZXJ0aWVzfSBpcyBub3QgbG9jYXRlZCBpbnNpZGUgdGhlIGVsZW1lbnQncyBjcm9wcGluZyByZWdpb24uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uSWZyYW1lSXNOb3RMb2FkZWRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ29udGVudCBvZiB0aGUgaWZyYW1lIHRvIHdoaWNoIHlvdSBhcmUgc3dpdGNoaW5nIGRpZCBub3QgbG9hZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jdXJyZW50SWZyYW1lSXNOb3RMb2FkZWRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ29udGVudCBvZiB0aGUgaWZyYW1lIGluIHdoaWNoIHRoZSB0ZXN0IGlzIGN1cnJlbnRseSBvcGVyYXRpbmcgZGlkIG5vdCBsb2FkLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmN1cnJlbnRJZnJhbWVOb3RGb3VuZEVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgaWZyYW1lIGluIHdoaWNoIHRoZSB0ZXN0IGlzIGN1cnJlbnRseSBvcGVyYXRpbmcgZG9lcyBub3QgZXhpc3QgYW55bW9yZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jdXJyZW50SWZyYW1lSXNJbnZpc2libGVFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGlmcmFtZSBpbiB3aGljaCB0aGUgdGVzdCBpcyBjdXJyZW50bHkgb3BlcmF0aW5nIGlzIG5vdCB2aXNpYmxlIGFueW1vcmUuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMubWlzc2luZ0F3YWl0RXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIEEgY2FsbCB0byBhbiBhc3luYyBmdW5jdGlvbiBpcyBub3QgYXdhaXRlZC4gVXNlIHRoZSBcImF3YWl0XCIga2V5d29yZCBiZWZvcmUgYWN0aW9ucywgYXNzZXJ0aW9ucyBvciBjaGFpbnMgb2YgdGhlbSB0byBlbnN1cmUgdGhhdCB0aGV5IHJ1biBpbiB0aGUgcmlnaHQgc2VxdWVuY2UuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuZXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG5cbiAgICAgICAgJHtyZW5kZXJEaWZmKGVyci5kaWZmKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5kb21Ob2RlQ2xpZW50RnVuY3Rpb25SZXN1bHRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgJHtlcnIuaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZX0gY2Fubm90IHJldHVybiBET00gZWxlbWVudHMuIFVzZSBTZWxlY3RvciBmdW5jdGlvbnMgZm9yIHRoaXMgcHVycG9zZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5pbnZhbGlkU2VsZWN0b3JSZXN1bHRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgRnVuY3Rpb24gdGhhdCBzcGVjaWZpZXMgYSBzZWxlY3RvciBjYW4gb25seSByZXR1cm4gYSBET00gbm9kZSwgYW4gYXJyYXkgb2Ygbm9kZXMsIE5vZGVMaXN0LCBIVE1MQ29sbGVjdGlvbiwgbnVsbCBvciB1bmRlZmluZWQuIFVzZSBDbGllbnRGdW5jdGlvbiB0byByZXR1cm4gb3RoZXIgdmFsdWVzLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblNlbGVjdG9yRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBBY3Rpb24gXCIke2Vyci5zZWxlY3Rvck5hbWV9XCIgYXJndW1lbnQgZXJyb3I6XG5cbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmNhbm5vdE9idGFpbkluZm9Gb3JFbGVtZW50U3BlY2lmaWVkQnlTZWxlY3RvckVycm9yXTogKGVyciwgdmlld3BvcnRXaWR0aCkgPT4gYFxuICAgICAgICBDYW5ub3Qgb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBub2RlIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBzZWxlY3RvciBkb2VzIG5vdCBtYXRjaCBhbnkgbm9kZSBpbiB0aGUgRE9NIHRyZWUuXG5cbiAgICAgICAgJHtmb3JtYXRTZWxlY3RvckNhbGxzdGFjayhlcnIuYXBpRm5DaGFpbiwgZXJyLmFwaUZuSW5kZXgsIHZpZXdwb3J0V2lkdGgpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLndpbmRvd0RpbWVuc2lvbnNPdmVyZmxvd0Vycm9yXTogKCkgPT4gYFxuICAgICAgICBVbmFibGUgdG8gcmVzaXplIHRoZSB3aW5kb3cgYmVjYXVzZSB0aGUgc3BlY2lmaWVkIHNpemUgZXhjZWVkcyB0aGUgc2NyZWVuIHNpemUuIE9uIG1hY09TLCBhIHdpbmRvdyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIHNjcmVlbi5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5mb3JiaWRkZW5DaGFyYWN0ZXJzSW5TY3JlZW5zaG90UGF0aEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlcmUgYXJlIGZvcmJpZGRlbiBjaGFyYWN0ZXJzIGluIHRoZSBcIiR7ZXJyLnNjcmVlbnNob3RQYXRofVwiIHNjcmVlbnNob3QgcGF0aDpcbiAgICAgICAgJHtyZW5kZXJGb3JiaWRkZW5DaGFyc0xpc3QoZXJyLmZvcmJpZGRlbkNoYXJzTGlzdCl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuaW52YWxpZEVsZW1lbnRTY3JlZW5zaG90RGltZW5zaW9uc0Vycm9yXTogZXJyID0+IGBcbiAgICAgICAgIFVuYWJsZSB0byBjYXB0dXJlIGFuIGVsZW1lbnQgaW1hZ2UgYmVjYXVzZSB0aGUgcmVzdWx0aW5nIGltYWdlICR7ZXJyLmRpbWVuc2lvbnN9ICR7ZXJyLnZlcmJ9IHplcm8gb3IgbmVnYXRpdmUuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMucm9sZVN3aXRjaEluUm9sZUluaXRpYWxpemVyRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFJvbGUgY2Fubm90IGJlIHN3aXRjaGVkIHdoaWxlIGFub3RoZXIgcm9sZSBpcyBiZWluZyBpbml0aWFsaXplZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hc3NlcnRpb25FeGVjdXRhYmxlQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIENhbm5vdCBldmFsdWF0ZSB0aGUgXCIke2Vyci5hY3R1YWxWYWx1ZX1cIiBleHByZXNzaW9uIGluIHRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBwYXJhbWV0ZXIgYmVjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGVycm9yOlxuXG4gICAgICAgICR7ZXJyLmVyck1zZ31cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hc3NlcnRpb25XaXRob3V0TWV0aG9kQ2FsbEVycm9yXTogKCkgPT4gYFxuICAgICAgICBBbiBhc3NlcnRpb24gbWV0aG9kIGlzIG5vdCBzcGVjaWZpZWQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYXNzZXJ0aW9uVW5hd2FpdGVkUHJvbWlzZUVycm9yXTogKCkgPT4gYFxuICAgICAgICBBdHRlbXB0ZWQgdG8gcnVuIGFzc2VydGlvbnMgb24gYSBQcm9taXNlIG9iamVjdC4gRGlkIHlvdSBmb3JnZXQgdG8gYXdhaXQgaXQ/IElmIG5vdCwgcGFzcyBcInsgYWxsb3dVbmF3YWl0ZWRQcm9taXNlOiB0cnVlIH1cIiB0byB0aGUgYXNzZXJ0aW9uIG9wdGlvbnMuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgWW91IHNob3VsZCBpbXBsZW1lbnQgdGhlIFwiJHtlcnIubWV0aG9kTmFtZX1cIiBtZXRob2QgaW4gdGhlIFwiJHtlcnIuaG9va0NsYXNzTmFtZX1cIiBjbGFzcy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5yZXF1ZXN0SG9va1VuaGFuZGxlZEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgQW4gdW5oYW5kbGVkIGVycm9yIG9jY3VycmVkIGluIHRoZSBcIiR7ZXJyLm1ldGhvZE5hbWV9XCIgbWV0aG9kIG9mIHRoZSBcIiR7ZXJyLmhvb2tDbGFzc05hbWV9XCIgY2xhc3M6XG5cbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbkN1c3RvbUNsaWVudFNjcmlwdENvZGVdOiBlcnIgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCBpbiBhIHNjcmlwdCBpbmplY3RlZCBpbnRvIHRoZSB0ZXN0ZWQgcGFnZTpcblxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tQ2xpZW50U2NyaXB0Q29kZUxvYWRlZEZyb21Nb2R1bGVdOiBlcnIgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgJyR7ZXJyLm1vZHVsZU5hbWV9JyBtb2R1bGUgaW5qZWN0ZWQgaW50byB0aGUgdGVzdGVkIHBhZ2UuIE1ha2Ugc3VyZSB0aGF0IHRoaXMgbW9kdWxlIGNhbiBiZSBleGVjdXRlZCBpbiB0aGUgYnJvd3NlciBlbnZpcm9ubWVudC5cblxuICAgICAgICBFcnJvciBkZXRhaWxzOlxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tU2NyaXB0XTogZXJyID0+IGBcbiAgICAgICAgQW4gdW5oYW5kbGVkIGVycm9yIG9jY3VycmVkIGluIHRoZSBjdXN0b20gc2NyaXB0OlxuXG4gICAgICAgIEVycm9yIGRldGFpbHM6ICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cblxuICAgICAgICAke2Zvcm1hdEV4cHJlc3Npb25NZXNzYWdlKGVyci5leHByZXNzaW9uLCBlcnIubGluZSwgZXJyLmNvbHVtbil9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2hpbGRXaW5kb3dJc05vdExvYWRlZEVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgcGFnZSBpbiB0aGUgY2hpbGQgd2luZG93IGlzIG5vdCBsb2FkZWQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2hpbGRXaW5kb3dOb3RGb3VuZEVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgY2hpbGQgd2luZG93IGlzIG5vdCBmb3VuZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jYW5ub3RTd2l0Y2hUb1dpbmRvd0Vycm9yXTogKCkgPT4gYFxuICAgICAgICBDYW5ub3Qgc3dpdGNoIHRvIHRoZSB3aW5kb3cuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2xvc2VDaGlsZFdpbmRvd0Vycm9yXTogKCkgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjbG9zaW5nIGNoaWxkIHdpbmRvd3MuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2hpbGRXaW5kb3dDbG9zZWRCZWZvcmVTd2l0Y2hpbmdFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGNoaWxkIHdpbmRvdyB3YXMgY2xvc2VkIGJlZm9yZSBUZXN0Q2FmZSBjb3VsZCBzd2l0Y2ggdG8gaXQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2Fubm90Q2xvc2VXaW5kb3dXaXRoQ2hpbGRyZW5FcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ2Fubm90IGNsb3NlIGEgd2luZG93IHRoYXQgaGFzIGFuIG9wZW4gY2hpbGQgd2luZG93LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnRhcmdldFdpbmRvd05vdEZvdW5kRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIENhbm5vdCBmaW5kIHRoZSB3aW5kb3cgc3BlY2lmaWVkIGluIHRoZSBhY3Rpb24gcGFyYW1ldGVycy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5wYXJlbnRXaW5kb3dOb3RGb3VuZEVycm9yXTogKCkgPT4gYFxuICAgICAgICBDYW5ub3QgZmluZCB0aGUgcGFyZW50IHdpbmRvdy4gTWFrZSBzdXJlIHRoYXQgdGhlIHRlc3RlZCB3aW5kb3cgd2FzIG9wZW5lZCBmcm9tIGFub3RoZXIgd2luZG93LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnByZXZpb3VzV2luZG93Tm90Rm91bmRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ2Fubm90IGZpbmQgdGhlIHByZXZpb3VzIHdpbmRvdy4gTWFrZSBzdXJlIHRoYXQgdGhlIHByZXZpb3VzIHdpbmRvdyBpcyBvcGVuZWQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuc3dpdGNoVG9XaW5kb3dQcmVkaWNhdGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIEFuIGVycm9yIG9jY3VycmVkIGluc2lkZSB0aGUgXCJzd2l0Y2hUb1dpbmRvd1wiIGFyZ3VtZW50IGZ1bmN0aW9uLlxuXG4gICAgICAgIEVycm9yIGRldGFpbHM6XG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5tdWx0aXBsZVdpbmRvd3NNb2RlSXNEaXNhYmxlZEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgTXVsdGktd2luZG93IG1vZGUgaXMgZGlzYWJsZWQuIFRvIHVzZSB0aGUgXCIke2Vyci5tZXRob2ROYW1lfVwiIG1ldGhvZCwgcmVtb3ZlIHRoZSBcImRpc2FibGVNdWx0aXBsZVdpbmRvd3NcIiBvcHRpb24uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMubXVsdGlwbGVXaW5kb3dzTW9kZUlzTm90U3VwcG9ydGVkSW5SZW1vdGVCcm93c2VyRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBNdWx0aS13aW5kb3cgbW9kZSBpcyBzdXBwb3J0ZWQgaW4gQ2hyb21lLCBDaHJvbWl1bSwgRWRnZSA4NCsgYW5kIEZpcmVmb3ggb25seS4gUnVuIHRlc3RzIGluIHRoZXNlIGJyb3dzZXJzIHRvIHVzZSB0aGUgXCIke2Vyci5tZXRob2ROYW1lfVwiIG1ldGhvZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jYW5ub3RDbG9zZVdpbmRvd1dpdGhvdXRQYXJlbnRdOiAoKSA9PiBgXG4gICAgICAgIENhbm5vdCBjbG9zZSB0aGUgd2luZG93IGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudC4gVGhlIHBhcmVudCB3aW5kb3cgd2FzIGNsb3NlZCBvciB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhlIHJvb3QgYnJvd3NlciB3aW5kb3cgd2hlcmUgdGVzdHMgd2VyZSBsYXVuY2hlZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jYW5ub3RSZXN0b3JlQ2hpbGRXaW5kb3dFcnJvcl06ICgpID0+IGBcbiAgICAgICAgRmFpbGVkIHRvIHJlc3RvcmUgY29ubmVjdGlvbiB0byB3aW5kb3cgd2l0aGluIHRoZSBhbGxvY2F0ZWQgdGltZW91dC5cbiAgICBgLFxufTtcbiJdfQ==