testcafe 1.13.0 → 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.
- package/CHANGELOG.md +88 -10
- package/LICENSE +21 -21
- package/README.md +52 -48
- package/bin/testcafe-with-v8-flag-filter.js +0 -0
- package/lib/api/exportable-lib/index.js +50 -50
- package/lib/api/request-hooks/assert-type.js +7 -7
- package/lib/api/request-hooks/hook-method-names.js +11 -0
- package/lib/api/request-hooks/hook.js +33 -39
- package/lib/api/request-hooks/interfaces.js +3 -3
- package/lib/api/request-hooks/request-logger.js +113 -111
- package/lib/api/request-hooks/request-mock/create-request-mock.js +12 -0
- package/lib/api/request-hooks/request-mock/index.js +46 -0
- package/lib/api/request-hooks/request-mock.js +47 -48
- package/lib/api/structure/base-unit.js +11 -11
- package/lib/api/structure/fixture.js +75 -75
- package/lib/api/structure/interfaces.js +2 -2
- package/lib/api/structure/test-file.js +31 -31
- package/lib/api/structure/test-timeout.js +9 -9
- package/lib/api/structure/test.js +85 -85
- package/lib/api/structure/testing-unit.js +89 -89
- package/lib/api/structure/unit-type.js +9 -9
- package/lib/api/test-controller/assertion.js +88 -88
- package/lib/api/test-controller/execution-context.js +82 -82
- package/lib/api/test-controller/index.js +359 -319
- package/lib/api/test-controller/proxy.js +28 -28
- package/lib/api/test-page-url.js +60 -60
- package/lib/api/test-run-tracker.js +68 -68
- package/lib/api/wrap-test-function.js +49 -49
- package/lib/assertions/executor.js +74 -74
- package/lib/assertions/get-fn.js +46 -46
- package/lib/assertions/type.js +20 -20
- package/lib/assets/content-types.js +9 -9
- package/lib/assets/injectables.js +18 -18
- package/lib/browser/connection/command.js +10 -10
- package/lib/browser/connection/error-hints.js +9 -9
- package/lib/browser/connection/gateway.js +159 -159
- package/lib/browser/connection/get-hints.js +33 -33
- package/lib/browser/connection/heartbeat-status.js +8 -8
- package/lib/browser/connection/index.js +328 -328
- package/lib/browser/connection/remotes-queue.js +46 -46
- package/lib/browser/connection/service-routes.js +12 -12
- package/lib/browser/connection/status.js +12 -12
- package/lib/browser/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/base.js +80 -80
- package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
- package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
- package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
- package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
- package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
- package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
- package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
- package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
- package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
- package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
- package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
- package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
- package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
- package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
- package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
- package/lib/browser/provider/built-in/index.js +21 -21
- package/lib/browser/provider/built-in/locally-installed.js +30 -30
- package/lib/browser/provider/built-in/path.js +47 -47
- package/lib/browser/provider/built-in/remote.js +58 -58
- package/lib/browser/provider/index.js +303 -303
- package/lib/browser/provider/parse-provider-name.js +16 -16
- package/lib/browser/provider/plugin-host.js +121 -121
- package/lib/browser/provider/pool.js +115 -115
- package/lib/browser/provider/utils/argument-parsing.js +74 -74
- package/lib/browser/provider/utils/browser-starter.js +34 -34
- package/lib/browser/provider/utils/client-functions.js +24 -24
- package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
- package/lib/cli/argument-parser.js +284 -279
- package/lib/cli/authentication-helper.js +35 -35
- package/lib/cli/cli.js +134 -134
- package/lib/cli/correct-browsers-and-sources.js +40 -40
- package/lib/cli/index.js +19 -19
- package/lib/cli/log.js +43 -43
- package/lib/cli/remotes-wizard.js +36 -36
- package/lib/cli/termination-handler.js +38 -38
- package/lib/client/automation/index.js +144 -46
- package/lib/client/automation/index.min.js +1 -1
- package/lib/client/browser/idle-page/index.html.mustache +35 -35
- package/lib/client/browser/idle-page/logo.svg +86 -86
- package/lib/client/browser/service-worker.js +4 -6
- package/lib/client/core/index.js +19 -13
- package/lib/client/core/index.min.js +1 -1
- package/lib/client/driver/index.js +1807 -451
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/driver/internal-properties.js +9 -9
- package/lib/client/test-run/iframe.js.mustache +17 -17
- package/lib/client/test-run/index.js.mustache +51 -51
- package/lib/client/ui/index.js +14 -12
- package/lib/client/ui/index.min.js +1 -1
- package/lib/client/ui/sprite.svg +42 -42
- package/lib/client-functions/builder-symbol.js +4 -4
- package/lib/client-functions/client-function-builder.js +156 -135
- package/lib/client-functions/replicator.js +61 -61
- package/lib/client-functions/return-single-prop-mode.js +8 -8
- package/lib/client-functions/selector-api-execution-mode.js +22 -0
- package/lib/client-functions/selectors/add-api.js +646 -588
- package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
- package/lib/client-functions/selectors/prepare-api-args.js +20 -20
- package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
- package/lib/client-functions/selectors/selector-builder.js +154 -150
- package/lib/client-functions/selectors/selector-text-filter.js +43 -43
- package/lib/client-functions/selectors/snapshot-properties.js +48 -48
- package/lib/client-functions/types.js +18 -18
- package/lib/compiler/babel/format-babel-produced-code.js +10 -10
- package/lib/compiler/babel/get-base-babel-options.js +11 -11
- package/lib/compiler/babel/load-libs.js +64 -62
- package/lib/compiler/babel/preset-stage-2.js +19 -19
- package/lib/compiler/compile-client-function.js +73 -73
- package/lib/compiler/compilers.js +33 -33
- package/lib/compiler/index.js +92 -92
- package/lib/compiler/interfaces.js +2 -2
- package/lib/compiler/test-file/api-based.js +146 -146
- package/lib/compiler/test-file/base.js +36 -36
- package/lib/compiler/test-file/exportble-lib-path.js +5 -5
- package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
- package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
- package/lib/compiler/test-file/formats/es-next/compiler.js +43 -43
- package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
- package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
- package/lib/compiler/test-file/formats/raw.js +85 -85
- package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
- package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
- package/lib/compiler/test-file/test-file-parser-base.js +214 -214
- package/lib/configuration/configuration-base.js +165 -165
- package/lib/configuration/constants.js +9 -9
- package/lib/configuration/customizable-compilers.js +7 -7
- package/lib/configuration/default-values.js +51 -51
- package/lib/configuration/interfaces.js +3 -3
- package/lib/configuration/option-names.js +53 -53
- package/lib/configuration/option-source.js +9 -9
- package/lib/configuration/option.js +14 -14
- package/lib/configuration/quarantine-option-names.js +10 -0
- package/lib/configuration/run-option-names.js +26 -26
- package/lib/configuration/screenshot-option-names.js +10 -10
- package/lib/configuration/testcafe-configuration.js +164 -165
- package/lib/configuration/types.js +2 -2
- package/lib/configuration/typescript-configuration.js +62 -62
- package/lib/custom-client-scripts/assert-type.js +7 -7
- package/lib/custom-client-scripts/client-script-init.js +3 -3
- package/lib/custom-client-scripts/client-script.js +107 -108
- package/lib/custom-client-scripts/get-code.js +11 -11
- package/lib/custom-client-scripts/get-url.js +6 -6
- package/lib/custom-client-scripts/load.js +15 -15
- package/lib/custom-client-scripts/problematic-scripts.js +2 -2
- package/lib/custom-client-scripts/routing.js +36 -36
- package/lib/custom-client-scripts/utils.js +60 -60
- package/lib/embedding-utils.js +83 -83
- package/lib/errors/create-stack-filter.js +18 -18
- package/lib/errors/error-list.js +26 -26
- package/lib/errors/get-callsite.js +31 -31
- package/lib/errors/internal-modules-prefix.js +8 -8
- package/lib/errors/is-internal-stack-frame.js +46 -46
- package/lib/errors/process-test-fn-error.js +37 -37
- package/lib/errors/runtime/index.js +123 -123
- package/lib/errors/runtime/templates.js +116 -114
- package/lib/errors/runtime/type-assertions.js +112 -112
- package/lib/errors/stack-cleaning-hook.js +64 -64
- package/lib/errors/test-run/formattable-adapter.js +59 -59
- package/lib/errors/test-run/index.js +302 -302
- package/lib/errors/test-run/render-error-template.js +31 -31
- package/lib/errors/test-run/templates.js +93 -95
- package/lib/errors/test-run/utils.js +90 -85
- package/lib/errors/types.js +157 -155
- package/lib/index.js +81 -81
- package/lib/live/bootstrapper.js +44 -44
- package/lib/live/controller.js +107 -107
- package/lib/live/file-watcher/index.js +67 -67
- package/lib/live/file-watcher/modules-graph.js +58 -58
- package/lib/live/keyboard-observer.js +76 -76
- package/lib/live/logger/index.js +64 -64
- package/lib/live/test-run-controller.js +96 -96
- package/lib/live/test-run-state.js +6 -6
- package/lib/live/test-run.js +56 -56
- package/lib/live/test-runner.js +168 -168
- package/lib/load-assets.js +29 -29
- package/lib/notifications/add-rendered-warning.js +16 -16
- package/lib/notifications/debug-logger.js +78 -78
- package/lib/notifications/deprecated.js +24 -24
- package/lib/notifications/information-message.js +12 -12
- package/lib/notifications/warning-log.js +32 -31
- package/lib/notifications/warning-message.js +48 -48
- package/lib/reporter/command/command-formatter.js +120 -109
- package/lib/reporter/command/format-command.js +8 -8
- package/lib/reporter/command/interfaces.js +2 -2
- package/lib/reporter/index.js +319 -314
- package/lib/reporter/interfaces.js +2 -2
- package/lib/reporter/plugin-host.js +136 -137
- package/lib/reporter/plugin-methods.js +12 -12
- package/lib/role/index.js +74 -74
- package/lib/role/marker-symbol.js +7 -7
- package/lib/role/phase.js +9 -9
- package/lib/runner/bootstrapper.js +272 -272
- package/lib/runner/browser-job-result.js +9 -9
- package/lib/runner/browser-job.js +153 -123
- package/lib/runner/browser-set.js +114 -114
- package/lib/runner/fixture-hook-controller.js +85 -85
- package/lib/runner/index.js +450 -442
- package/lib/runner/interfaces.js +3 -3
- package/lib/runner/reporter-stream-controller.js +28 -28
- package/lib/runner/task/index.js +152 -133
- package/lib/runner/task/phase.js +9 -9
- package/lib/runner/test-run-controller.js +166 -185
- package/lib/runner/tested-app.js +73 -72
- package/lib/screenshots/capturer.js +141 -141
- package/lib/screenshots/constants.js +11 -11
- package/lib/screenshots/crop.js +111 -111
- package/lib/screenshots/default-extension.js +4 -4
- package/lib/screenshots/index.js +67 -67
- package/lib/screenshots/utils.js +39 -39
- package/lib/services/compiler/host.js +190 -106
- package/lib/services/compiler/io.js +9 -9
- package/lib/services/compiler/protocol.js +17 -16
- package/lib/services/compiler/service.js +225 -106
- package/lib/services/compiler/test-run-proxy.js +111 -73
- package/lib/services/interfaces.js +3 -0
- package/lib/services/process-title.js +8 -8
- package/lib/services/serialization/prepare-options.js +17 -17
- package/lib/services/serialization/replicator/create-replicator.js +27 -0
- package/lib/services/serialization/replicator/custom-error-transform.js +28 -0
- package/lib/services/serialization/test-structure.js +93 -77
- package/lib/services/utils/ipc/interfaces.js +30 -30
- package/lib/services/utils/ipc/io.js +108 -108
- package/lib/services/utils/ipc/message.js +76 -73
- package/lib/services/utils/ipc/packet.js +55 -55
- package/lib/services/utils/ipc/proxy.js +110 -118
- package/lib/services/utils/ipc/transport.js +64 -64
- package/lib/shared/errors/index.js +382 -382
- package/lib/shared/node-modules-folder-name.js +4 -4
- package/lib/test-run/bookmark.js +90 -90
- package/lib/test-run/browser-console-messages.js +73 -73
- package/lib/test-run/browser-manipulation-queue.js +92 -92
- package/lib/test-run/client-messages.js +9 -9
- package/lib/test-run/commands/actions.js +486 -425
- package/lib/test-run/commands/assertion.js +45 -45
- package/lib/test-run/commands/base.js +14 -14
- package/lib/test-run/commands/browser-manipulation.js +95 -95
- package/lib/test-run/commands/from-object.js +82 -82
- package/lib/test-run/commands/observation.js +61 -61
- package/lib/test-run/commands/options.js +231 -215
- package/lib/test-run/commands/service.js +54 -48
- package/lib/test-run/commands/type.js +65 -60
- package/lib/test-run/commands/utils.js +87 -87
- package/lib/test-run/commands/validations/argument.js +90 -90
- package/lib/test-run/commands/validations/factories.js +47 -47
- package/lib/test-run/commands/validations/initializers.js +44 -44
- package/lib/test-run/debug-log.js +32 -32
- package/lib/test-run/execute-js-expression.js +74 -74
- package/lib/test-run/index.js +823 -752
- package/lib/test-run/marker-symbol.js +7 -7
- package/lib/test-run/observed-callsites-storage.js +17 -17
- package/lib/test-run/phase.js +16 -16
- package/lib/test-run/session-controller.js +104 -104
- package/lib/testcafe.js +119 -114
- package/lib/utils/assignable.js +39 -39
- package/lib/utils/async-event-emitter.js +28 -28
- package/lib/utils/async-queue.js +14 -14
- package/lib/utils/browser-connection-timeouts.js +19 -19
- package/lib/utils/callsite.js +17 -17
- package/lib/utils/check-file-path.js +31 -31
- package/lib/utils/check-url.js +51 -51
- package/lib/utils/convert-to-best-fit-type.js +16 -16
- package/lib/utils/correct-file-path.js +21 -21
- package/lib/utils/define-lazy-property.js +13 -13
- package/lib/utils/delay.js +6 -6
- package/lib/utils/delegated-api.js +44 -44
- package/lib/utils/detect-display.js +6 -6
- package/lib/utils/detect-ffmpeg.js +44 -44
- package/lib/utils/diff/colors.js +29 -29
- package/lib/utils/diff/index.js +53 -53
- package/lib/utils/diff/util.js +24 -22
- package/lib/utils/diff.js +29 -29
- package/lib/utils/escape-user-agent.js +10 -10
- package/lib/utils/flag-list.js +17 -17
- package/lib/utils/get-any-key.js +8 -8
- package/lib/utils/get-browser.js +8 -8
- package/lib/utils/get-common-path.js +34 -34
- package/lib/utils/get-filter-fn.js +40 -40
- package/lib/utils/get-options/base.js +36 -36
- package/lib/utils/get-options/compiler.js +33 -33
- package/lib/utils/get-options/grep.js +15 -15
- package/lib/utils/get-options/index.js +21 -19
- package/lib/utils/get-options/meta.js +22 -22
- package/lib/utils/get-options/quarantine.js +92 -0
- package/lib/utils/get-options/screenshot.js +17 -17
- package/lib/utils/get-options/ssl.js +45 -45
- package/lib/utils/get-options/video.js +10 -10
- package/lib/utils/get-viewport-width.js +18 -18
- package/lib/utils/guard-time-execution.js +10 -10
- package/lib/utils/handle-errors.js +74 -74
- package/lib/utils/handle-tag-args.js +8 -8
- package/lib/utils/http.js +30 -30
- package/lib/utils/is-localhost.js +11 -11
- package/lib/utils/is-password-input.js +11 -0
- package/lib/utils/is-repl.js +12 -0
- package/lib/utils/is-window-in-iframe.js +6 -6
- package/lib/utils/limit-number.js +10 -10
- package/lib/utils/make-reg-exp.js +7 -7
- package/lib/utils/moment-loader.js +20 -20
- package/lib/utils/parse-file-list.js +71 -71
- package/lib/utils/parse-user-agent.js +55 -55
- package/lib/utils/path-pattern.js +114 -114
- package/lib/utils/prepare-reporters.js +30 -30
- package/lib/utils/prerender-callsite.js +18 -18
- package/lib/utils/process.js +119 -119
- package/lib/utils/promisified-functions.js +46 -46
- package/lib/utils/re-executable-promise.js +39 -39
- package/lib/utils/render-callsite-sync.js +29 -29
- package/lib/utils/render-template.js +10 -10
- package/lib/utils/reporter.js +30 -30
- package/lib/utils/resolve-path-relatively-cwd.js +7 -7
- package/lib/utils/string.js +105 -105
- package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
- package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
- package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
- package/lib/utils/temp-directory/index.js +87 -87
- package/lib/utils/temp-directory/lockfile.js +56 -56
- package/lib/utils/thennable.js +7 -7
- package/lib/utils/timer.js +15 -15
- package/lib/utils/to-posix-path.js +8 -8
- package/lib/utils/types.js +2 -2
- package/lib/video-recorder/interfaces.js +2 -2
- package/lib/video-recorder/process.js +126 -126
- package/lib/video-recorder/recorder.js +136 -136
- package/lib/video-recorder/test-run-video-recorder.js +69 -69
- package/lib/video-recorder/videos.js +37 -37
- package/package.json +7 -7
- package/ts-defs/index.d.ts +109 -17
- package/ts-defs/selectors.d.ts +95 -7
- package/ts-defs/testcafe-scripts.d.ts +96 -8
|
@@ -1,107 +1,226 @@
|
|
|
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 fs_1 = __importDefault(require("fs"));
|
|
7
|
-
const compiler_1 = __importDefault(require("../../compiler"));
|
|
8
|
-
const test_run_proxy_1 = __importDefault(require("./test-run-proxy"));
|
|
9
|
-
const test_structure_1 = require("../serialization/test-structure");
|
|
10
|
-
const io_1 = require("./io");
|
|
11
|
-
const proxy_1 = require("../utils/ipc/proxy");
|
|
12
|
-
const transport_1 = require("../utils/ipc/transport");
|
|
13
|
-
const source_map_support_1 = __importDefault(require("source-map-support"));
|
|
14
|
-
const protocol_1 = require("./protocol");
|
|
15
|
-
const process_title_1 = __importDefault(require("../process-title"));
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this.
|
|
29
|
-
this.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const
|
|
54
|
-
if (
|
|
55
|
-
return
|
|
56
|
-
return this.
|
|
57
|
-
}
|
|
58
|
-
_setupRoutes() {
|
|
59
|
-
this.proxy.register([
|
|
60
|
-
this.getTests,
|
|
61
|
-
this.
|
|
62
|
-
this.cleanUp,
|
|
63
|
-
this.setOptions
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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 fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const compiler_1 = __importDefault(require("../../compiler"));
|
|
8
|
+
const test_run_proxy_1 = __importDefault(require("./test-run-proxy"));
|
|
9
|
+
const test_structure_1 = require("../serialization/test-structure");
|
|
10
|
+
const io_1 = require("./io");
|
|
11
|
+
const proxy_1 = require("../utils/ipc/proxy");
|
|
12
|
+
const transport_1 = require("../utils/ipc/transport");
|
|
13
|
+
const source_map_support_1 = __importDefault(require("source-map-support"));
|
|
14
|
+
const protocol_1 = require("./protocol");
|
|
15
|
+
const process_title_1 = __importDefault(require("../process-title"));
|
|
16
|
+
const hook_method_names_1 = __importDefault(require("../../api/request-hooks/hook-method-names"));
|
|
17
|
+
const testcafe_hammerhead_1 = require("testcafe-hammerhead");
|
|
18
|
+
source_map_support_1.default.install({
|
|
19
|
+
hookRequire: true,
|
|
20
|
+
handleUncaughtExceptions: false,
|
|
21
|
+
environment: 'node'
|
|
22
|
+
});
|
|
23
|
+
class CompilerService {
|
|
24
|
+
constructor() {
|
|
25
|
+
process.title = process_title_1.default.service;
|
|
26
|
+
const input = fs_1.default.createReadStream('', { fd: io_1.SERVICE_INPUT_FD });
|
|
27
|
+
const output = fs_1.default.createWriteStream('', { fd: io_1.SERVICE_OUTPUT_FD });
|
|
28
|
+
this.proxy = new proxy_1.IPCProxy(new transport_1.ServiceTransport(input, output, io_1.SERVICE_SYNC_FD));
|
|
29
|
+
this.state = this._initState();
|
|
30
|
+
this._setupRoutes();
|
|
31
|
+
this.ready();
|
|
32
|
+
}
|
|
33
|
+
_initState() {
|
|
34
|
+
return {
|
|
35
|
+
testRuns: {},
|
|
36
|
+
fixtureCtxs: {},
|
|
37
|
+
units: {},
|
|
38
|
+
options: {}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
_getFixtureCtx({ id }) {
|
|
42
|
+
const unit = this.state.units[id];
|
|
43
|
+
const fixtureId = test_structure_1.isTest(unit) ? unit.fixture.id : unit.id;
|
|
44
|
+
return this.state.fixtureCtxs[fixtureId];
|
|
45
|
+
}
|
|
46
|
+
_getTestCtx({ testRunId }, test) {
|
|
47
|
+
const testRunProxy = this.state.testRuns[testRunId];
|
|
48
|
+
const targetFixtureCtx = this.state.fixtureCtxs[test.fixture.id];
|
|
49
|
+
testRunProxy.fixtureCtx = targetFixtureCtx;
|
|
50
|
+
return testRunProxy;
|
|
51
|
+
}
|
|
52
|
+
_getContext(args, unit) {
|
|
53
|
+
const { testRunId } = args;
|
|
54
|
+
if (testRunId)
|
|
55
|
+
return this._getTestCtx(args, unit);
|
|
56
|
+
return this._getFixtureCtx(args);
|
|
57
|
+
}
|
|
58
|
+
_setupRoutes() {
|
|
59
|
+
this.proxy.register([
|
|
60
|
+
this.getTests,
|
|
61
|
+
this.runTestFn,
|
|
62
|
+
this.cleanUp,
|
|
63
|
+
this.setOptions,
|
|
64
|
+
this.onRequestHookEvent,
|
|
65
|
+
this.setMock,
|
|
66
|
+
this.setConfigureResponseEventOptions,
|
|
67
|
+
this.setHeaderOnConfigureResponseEvent,
|
|
68
|
+
this.removeHeaderOnConfigureResponseEvent,
|
|
69
|
+
this.executeRequestFilterRulePredicate,
|
|
70
|
+
this.executeMockPredicate,
|
|
71
|
+
this.getWarningMessages,
|
|
72
|
+
this.addRequestEventListeners,
|
|
73
|
+
this.removeRequestEventListeners,
|
|
74
|
+
this.initializeTestRunData
|
|
75
|
+
], this);
|
|
76
|
+
}
|
|
77
|
+
_getFunction(unit, functionName) {
|
|
78
|
+
if (test_structure_1.isTest(unit) && protocol_1.isTestFunctionProperty(functionName))
|
|
79
|
+
return unit[functionName];
|
|
80
|
+
if (test_structure_1.isFixture(unit) && protocol_1.isFixtureFunctionProperty(functionName))
|
|
81
|
+
return unit[functionName];
|
|
82
|
+
throw new Error(`Cannot find '${functionName}' function for ${typeof unit}`);
|
|
83
|
+
}
|
|
84
|
+
_wrapEventMethods({ name, testId, hookId, eventData }) {
|
|
85
|
+
if (name === hook_method_names_1.default.onRequest)
|
|
86
|
+
this._wrapSetMockFn({ testId, hookId, event: eventData });
|
|
87
|
+
else if (name === hook_method_names_1.default._onConfigureResponse)
|
|
88
|
+
this._wrapConfigureResponseEventMethods(eventData);
|
|
89
|
+
}
|
|
90
|
+
_wrapSetMockFn({ testId, hookId, event }) {
|
|
91
|
+
event.setMock = async (mock) => {
|
|
92
|
+
await this.setMock({
|
|
93
|
+
responseEventId: event.id,
|
|
94
|
+
ruleId: event.requestFilterRule.id,
|
|
95
|
+
testId,
|
|
96
|
+
hookId,
|
|
97
|
+
mock
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
_wrapConfigureResponseEventMethods(event) {
|
|
102
|
+
event.setHeader = async (name, value) => {
|
|
103
|
+
await this.setHeaderOnConfigureResponseEvent({
|
|
104
|
+
eventId: event.id,
|
|
105
|
+
headerName: name,
|
|
106
|
+
headerValue: value
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
event.removeHeader = async (name) => {
|
|
110
|
+
await this.removeHeaderOnConfigureResponseEvent({
|
|
111
|
+
eventId: event.id,
|
|
112
|
+
headerName: name
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
_restoreRequestFilterRule(event) {
|
|
117
|
+
event.requestFilterRule = testcafe_hammerhead_1.RequestFilterRule.from(event.requestFilterRule);
|
|
118
|
+
}
|
|
119
|
+
_initializeTestRunProxy(testRunId, test) {
|
|
120
|
+
const testRunProxy = new test_run_proxy_1.default({
|
|
121
|
+
dispatcher: this,
|
|
122
|
+
id: testRunId,
|
|
123
|
+
options: this.state.options,
|
|
124
|
+
test
|
|
125
|
+
});
|
|
126
|
+
this.state.testRuns[testRunId] = testRunProxy;
|
|
127
|
+
}
|
|
128
|
+
_initializeFixtureCtx(test) {
|
|
129
|
+
const fixtureId = test.fixture.id;
|
|
130
|
+
if (this.state.fixtureCtxs[fixtureId])
|
|
131
|
+
return;
|
|
132
|
+
this.state.fixtureCtxs[fixtureId] = Object.create(null);
|
|
133
|
+
}
|
|
134
|
+
async setOptions({ value }) {
|
|
135
|
+
this.state.options = value;
|
|
136
|
+
}
|
|
137
|
+
async ready() {
|
|
138
|
+
this.proxy.call(this.ready);
|
|
139
|
+
}
|
|
140
|
+
async cleanUp() {
|
|
141
|
+
await compiler_1.default.cleanUp();
|
|
142
|
+
}
|
|
143
|
+
async getTests({ sourceList, compilerOptions }) {
|
|
144
|
+
const compiler = new compiler_1.default(sourceList, compilerOptions);
|
|
145
|
+
const tests = await compiler.getTests();
|
|
146
|
+
const units = test_structure_1.flatten(tests);
|
|
147
|
+
Object.assign(this.state.units, units);
|
|
148
|
+
return test_structure_1.serialize(units);
|
|
149
|
+
}
|
|
150
|
+
async runTestFn(args) {
|
|
151
|
+
const { id, functionName } = args;
|
|
152
|
+
const unit = this.state.units[id];
|
|
153
|
+
const context = this._getContext(args, unit);
|
|
154
|
+
const functionObject = this._getFunction(unit, functionName);
|
|
155
|
+
if (!functionObject)
|
|
156
|
+
throw new Error(`Cannot find the "${functionName}" of ${typeof unit}`);
|
|
157
|
+
return await functionObject(context);
|
|
158
|
+
}
|
|
159
|
+
executeActionSync({ id, apiMethodName, command, callsite }) {
|
|
160
|
+
return this.proxy.callSync(this.executeAction, { id, apiMethodName, command, callsite });
|
|
161
|
+
}
|
|
162
|
+
async executeAction({ id, apiMethodName, command, callsite }) {
|
|
163
|
+
return this.proxy.call(this.executeAction, { id, apiMethodName, command, callsite });
|
|
164
|
+
}
|
|
165
|
+
async executeCommand({ command, id }) {
|
|
166
|
+
return this.proxy.call(this.executeCommand, { id, command });
|
|
167
|
+
}
|
|
168
|
+
async onRequestHookEvent({ name, testId, hookId, eventData }) {
|
|
169
|
+
this._wrapEventMethods({ name, testId, hookId, eventData });
|
|
170
|
+
this._restoreRequestFilterRule(eventData);
|
|
171
|
+
const test = this.state.units[testId];
|
|
172
|
+
const targetHook = test.requestHooks.find(hook => hook.id === hookId);
|
|
173
|
+
// @ts-ignore
|
|
174
|
+
await targetHook[name].call(targetHook, eventData);
|
|
175
|
+
if (name === hook_method_names_1.default._onConfigureResponse && targetHook._responseEventConfigureOpts) {
|
|
176
|
+
const { opts, id: eventId } = eventData;
|
|
177
|
+
await this.setConfigureResponseEventOptions({ eventId, opts });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async setMock({ testId, hookId, ruleId, responseEventId, mock }) {
|
|
181
|
+
await this.proxy.call(this.setMock, { testId, hookId, ruleId, responseEventId, mock });
|
|
182
|
+
}
|
|
183
|
+
async setConfigureResponseEventOptions({ eventId, opts }) {
|
|
184
|
+
await this.proxy.call(this.setConfigureResponseEventOptions, { eventId, opts });
|
|
185
|
+
}
|
|
186
|
+
async setHeaderOnConfigureResponseEvent({ eventId, headerName, headerValue }) {
|
|
187
|
+
await this.proxy.call(this.setHeaderOnConfigureResponseEvent, { eventId, headerName, headerValue });
|
|
188
|
+
}
|
|
189
|
+
async removeHeaderOnConfigureResponseEvent({ eventId, headerName }) {
|
|
190
|
+
await this.proxy.call(this.removeHeaderOnConfigureResponseEvent, { eventId, headerName });
|
|
191
|
+
}
|
|
192
|
+
async executeRequestFilterRulePredicate({ testId, hookId, ruleId, requestInfo }) {
|
|
193
|
+
const test = this.state.units[testId];
|
|
194
|
+
const targetHook = test.requestHooks.find(hook => hook.id === hookId);
|
|
195
|
+
const targetRule = targetHook._requestFilterRules.find(rule => rule.id === ruleId);
|
|
196
|
+
const result = await targetRule.options.call(targetRule, requestInfo);
|
|
197
|
+
return !!result;
|
|
198
|
+
}
|
|
199
|
+
async executeMockPredicate({ testId, hookId, ruleId, requestInfo, res }) {
|
|
200
|
+
const test = this.state.units[testId];
|
|
201
|
+
const requestMock = test.requestHooks.find(hook => hook.id === hookId);
|
|
202
|
+
const responseMock = requestMock.mocks.get(ruleId);
|
|
203
|
+
testcafe_hammerhead_1.responseMockSetBodyMethod.add(res);
|
|
204
|
+
res = Object.assign(res, await responseMock.body(requestInfo, res));
|
|
205
|
+
testcafe_hammerhead_1.responseMockSetBodyMethod.remove(res);
|
|
206
|
+
return res;
|
|
207
|
+
}
|
|
208
|
+
async getWarningMessages({ testRunId }) {
|
|
209
|
+
const testRunProxy = this.state.testRuns[testRunId];
|
|
210
|
+
return testRunProxy.warningLog.messages;
|
|
211
|
+
}
|
|
212
|
+
async addRequestEventListeners({ hookId, hookClassName, rules }) {
|
|
213
|
+
return await this.proxy.call(this.addRequestEventListeners, { hookId, hookClassName, rules });
|
|
214
|
+
}
|
|
215
|
+
async removeRequestEventListeners({ rules }) {
|
|
216
|
+
return await this.proxy.call(this.removeRequestEventListeners, { rules });
|
|
217
|
+
}
|
|
218
|
+
async initializeTestRunData({ testRunId, testId }) {
|
|
219
|
+
const test = this.state.units[testId];
|
|
220
|
+
this._initializeTestRunProxy(testRunId, test);
|
|
221
|
+
this._initializeFixtureCtx(test);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
exports.default = new CompilerService();
|
|
106
225
|
module.exports = exports.default;
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb21waWxlci9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLDhEQUFzQztBQUN0QyxzRUFBNEM7QUFFNUMsb0VBT3lDO0FBRXpDLDZCQUljO0FBRWQsOENBQThDO0FBQzlDLHNEQUEwRDtBQUMxRCw0RUFBa0Q7QUFFbEQseUNBU29CO0FBS3BCLHFFQUE0QztBQUU1Qyw0QkFBZ0IsQ0FBQyxPQUFPLENBQUM7SUFDckIsV0FBVyxFQUFlLElBQUk7SUFDOUIsd0JBQXdCLEVBQUUsS0FBSztJQUMvQixXQUFXLEVBQWUsTUFBTTtDQUNuQyxDQUFDLENBQUM7QUFTSCxNQUFNLGVBQWU7SUFJakI7UUFDSSxPQUFPLENBQUMsS0FBSyxHQUFHLHVCQUFZLENBQUMsT0FBTyxDQUFDO1FBRXJDLE1BQU0sS0FBSyxHQUFJLFlBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUscUJBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsc0JBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxnQkFBUSxDQUFDLElBQUksNEJBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxvQkFBZSxDQUFDLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUvQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTyxVQUFVO1FBQ2QsT0FBTztZQUNILFFBQVEsRUFBSyxFQUFFO1lBQ2YsV0FBVyxFQUFFLEVBQUU7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RUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0NBQ0o7QUFFRCxrQkFBZSxJQUFJLGVBQWUsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBDb21waWxlciBmcm9tICcuLi8uLi9jb21waWxlcic7XG5pbXBvcnQgVGVzdFJ1blByb3h5IGZyb20gJy4vdGVzdC1ydW4tcHJveHknO1xuXG5pbXBvcnQge1xuICAgIGZsYXR0ZW4gYXMgZmxhdHRlblRlc3RTdHJ1Y3R1cmUsXG4gICAgaXNGaXh0dXJlLFxuICAgIGlzVGVzdCxcbiAgICBzZXJpYWxpemUgYXMgc2VyaWFsaXplVGVzdFN0cnVjdHVyZSxcbiAgICBVbml0LFxuICAgIFVuaXRzXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vdGVzdC1zdHJ1Y3R1cmUnO1xuXG5pbXBvcnQge1xuICAgIFNFUlZJQ0VfSU5QVVRfRkQsXG4gICAgU0VSVklDRV9PVVRQVVRfRkQsXG4gICAgU0VSVklDRV9TWU5DX0ZEXG59IGZyb20gJy4vaW8nO1xuXG5pbXBvcnQgeyBJUENQcm94eSB9IGZyb20gJy4uL3V0aWxzL2lwYy9wcm94eSc7XG5pbXBvcnQgeyBTZXJ2aWNlVHJhbnNwb3J0IH0gZnJvbSAnLi4vdXRpbHMvaXBjL3RyYW5zcG9ydCc7XG5pbXBvcnQgc291cmNlTWFwU3VwcG9ydCBmcm9tICdzb3VyY2UtbWFwLXN1cHBvcnQnO1xuXG5pbXBvcnQge1xuICAgIENvbXBpbGVyUHJvdG9jb2wsXG4gICAgRXhlY3V0ZUFjdGlvbkFyZ3VtZW50cyxcbiAgICBFeGVjdXRlQ29tbWFuZEFyZ3VtZW50cyxcbiAgICBGdW5jdGlvblByb3BlcnRpZXMsXG4gICAgaXNGaXh0dXJlRnVuY3Rpb25Qcm9wZXJ0eSxcbiAgICBpc1Rlc3RGdW5jdGlvblByb3BlcnR5LFxuICAgIFJ1blRlc3RBcmd1bWVudHMsXG4gICAgU2V0T3B0aW9uc0FyZ3VtZW50c1xufSBmcm9tICcuL3Byb3RvY29sJztcblxuaW1wb3J0IHsgQ29tcGlsZXJBcmd1bWVudHMgfSBmcm9tICcuLi8uLi9jb21waWxlci9pbnRlcmZhY2VzJztcbmltcG9ydCBGaXh0dXJlIGZyb20gJy4uLy4uL2FwaS9zdHJ1Y3R1cmUvZml4dHVyZSc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBQcm9jZXNzVGl0bGUgZnJvbSAnLi4vcHJvY2Vzcy10aXRsZSc7XG5cbnNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7XG4gICAgaG9va1JlcXVpcmU6ICAgICAgICAgICAgICB0cnVlLFxuICAgIGhhbmRsZVVuY2F1Z2h0RXhjZXB0aW9uczogZmFsc2UsXG4gICAgZW52aXJvbm1lbnQ6ICAgICAgICAgICAgICAnbm9kZSdcbn0pO1xuXG5pbnRlcmZhY2UgU2VydmljZVN0YXRlIHtcbiAgICB0ZXN0UnVuczogeyBbaWQ6IHN0cmluZ106IFRlc3RSdW5Qcm94eSB9O1xuICAgIGZpeHR1cmVDdHhzOiB7IFtpZDogc3RyaW5nXTogb2JqZWN0IH07XG4gICAgdW5pdHM6IFVuaXRzO1xuICAgIG9wdGlvbnM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+O1xufVxuXG5jbGFzcyBDb21waWxlclNlcnZpY2UgaW1wbGVtZW50cyBDb21waWxlclByb3RvY29sIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3h5OiBJUENQcm94eTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlOiBTZXJ2aWNlU3RhdGU7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBwcm9jZXNzLnRpdGxlID0gUHJvY2Vzc1RpdGxlLnNlcnZpY2U7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgID0gZnMuY3JlYXRlUmVhZFN0cmVhbSgnJywgeyBmZDogU0VSVklDRV9JTlBVVF9GRCB9KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oJycsIHsgZmQ6IFNFUlZJQ0VfT1VUUFVUX0ZEIH0pO1xuXG4gICAgICAgIHRoaXMucHJveHkgPSBuZXcgSVBDUHJveHkobmV3IFNlcnZpY2VUcmFuc3BvcnQoaW5wdXQsIG91dHB1dCwgU0VSVklDRV9TWU5DX0ZEKSk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLl9pbml0U3RhdGUoKTtcblxuICAgICAgICB0aGlzLl9zZXR1cFJvdXRlcygpO1xuICAgICAgICB0aGlzLnJlYWR5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5pdFN0YXRlICgpOiBTZXJ2aWNlU3RhdGUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGVzdFJ1bnM6ICAgIHt9LFxuICAgICAgICAgICAgZml4dHVyZUN0eHM6IHt9LFxuICAgICAgICAgICAgdW5pdHM6ICAgICAgIHt9LFxuICAgICAgICAgICAgb3B0aW9uczogICAgIHt9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZW5zdXJlVGVzdFJ1blByb3h5ICh0ZXN0UnVuSWQ6IHN0cmluZywgZml4dHVyZUN0eDogdW5rbm93bik6IFRlc3RSdW5Qcm94eSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS50ZXN0UnVuc1t0ZXN0UnVuSWRdKVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS50ZXN0UnVuc1t0ZXN0UnVuSWRdID0gbmV3IFRlc3RSdW5Qcm94eSh0aGlzLCB0ZXN0UnVuSWQsIGZpeHR1cmVDdHgsIHRoaXMuc3RhdGUub3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudGVzdFJ1bnNbdGVzdFJ1bklkXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRGaXh0dXJlQ3R4ICh7IGlkIH06IFJ1blRlc3RBcmd1bWVudHMpOiB1bmtub3duIHtcbiAgICAgICAgY29uc3QgdW5pdCA9IHRoaXMuc3RhdGUudW5pdHNbaWRdO1xuXG4gICAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IGlzVGVzdCh1bml0KSA/IHVuaXQuZml4dHVyZS5pZCA6ICh1bml0IGFzIEZpeHR1cmUpLmlkO1xuXG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5maXh0dXJlQ3R4c1tmaXh0dXJlSWRdKVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5maXh0dXJlQ3R4c1tmaXh0dXJlSWRdID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5maXh0dXJlQ3R4c1tmaXh0dXJlSWRdO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldENvbnRleHQgKGFyZ3M6IFJ1blRlc3RBcmd1bWVudHMpOiB1bmtub3duIHtcbiAgICAgICAgY29uc3QgeyB0ZXN0UnVuSWQgfSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IGZpeHR1cmVDdHggICAgICAgID0gdGhpcy5fZ2V0Rml4dHVyZUN0eChhcmdzKTtcblxuICAgICAgICBpZiAoIXRlc3RSdW5JZClcbiAgICAgICAgICAgIHJldHVybiBmaXh0dXJlQ3R4O1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9lbnN1cmVUZXN0UnVuUHJveHkodGVzdFJ1bklkLCBmaXh0dXJlQ3R4KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXR1cFJvdXRlcyAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJveHkucmVnaXN0ZXIoW1xuICAgICAgICAgICAgdGhpcy5nZXRUZXN0cyxcbiAgICAgICAgICAgIHRoaXMucnVuVGVzdCxcbiAgICAgICAgICAgIHRoaXMuY2xlYW5VcCxcbiAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uc1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRGdW5jdGlvbiAodW5pdDogVW5pdCwgZnVuY3Rpb25OYW1lOiBGdW5jdGlvblByb3BlcnRpZXMpOiBGdW5jdGlvbnxudWxsIHtcbiAgICAgICAgaWYgKGlzVGVzdCh1bml0KSAmJiBpc1Rlc3RGdW5jdGlvblByb3BlcnR5KGZ1bmN0aW9uTmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gdW5pdFtmdW5jdGlvbk5hbWVdO1xuXG4gICAgICAgIGlmIChpc0ZpeHR1cmUodW5pdCkgJiYgaXNGaXh0dXJlRnVuY3Rpb25Qcm9wZXJ0eShmdW5jdGlvbk5hbWUpKVxuICAgICAgICAgICAgcmV0dXJuIHVuaXRbZnVuY3Rpb25OYW1lXTtcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0T3B0aW9ucyAoeyB2YWx1ZSB9OiBTZXRPcHRpb25zQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RhdGUub3B0aW9ucyA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkeSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucHJveHkuY2FsbCh0aGlzLnJlYWR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYW5VcCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IENvbXBpbGVyLmNsZWFuVXAoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VGVzdHMgKHsgc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zIH06IENvbXBpbGVyQXJndW1lbnRzKTogUHJvbWlzZTxVbml0cz4ge1xuICAgICAgICBjb25zdCBjb21waWxlciA9IG5ldyBDb21waWxlcihzb3VyY2VMaXN0LCBjb21waWxlck9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IHRlc3RzID0gYXdhaXQgY29tcGlsZXIuZ2V0VGVzdHMoKTtcbiAgICAgICAgY29uc3QgdW5pdHMgPSBmbGF0dGVuVGVzdFN0cnVjdHVyZSh0ZXN0cyk7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnN0YXRlLnVuaXRzLCB1bml0cyk7XG5cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZVRlc3RTdHJ1Y3R1cmUodW5pdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBydW5UZXN0IChhcmdzOiBSdW5UZXN0QXJndW1lbnRzKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IHsgaWQsIGZ1bmN0aW9uTmFtZSB9ID0gYXJncztcblxuICAgICAgICBjb25zdCB1bml0ICAgID0gdGhpcy5zdGF0ZS51bml0c1tpZF07XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9nZXRDb250ZXh0KGFyZ3MpO1xuXG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uT2JqZWN0ID0gdGhpcy5fZ2V0RnVuY3Rpb24odW5pdCwgZnVuY3Rpb25OYW1lKTtcblxuICAgICAgICBpZiAoIWZ1bmN0aW9uT2JqZWN0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZ1bmN0aW9uT2JqZWN0KGNvbnRleHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQWN0aW9uICh7IGlkLCBhcGlNZXRob2ROYW1lLCBjb21tYW5kLCBjYWxsc2l0ZSB9OiBFeGVjdXRlQWN0aW9uQXJndW1lbnRzKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3h5LmNhbGwodGhpcy5leGVjdXRlQWN0aW9uLCB7IGlkLCBhcGlNZXRob2ROYW1lLCBjb21tYW5kLCBjYWxsc2l0ZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZUNvbW1hbmQgKHsgY29tbWFuZCwgaWQgfTogRXhlY3V0ZUNvbW1hbmRBcmd1bWVudHMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkuY2FsbCh0aGlzLmV4ZWN1dGVDb21tYW5kLCB7IGlkLCBjb21tYW5kIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IENvbXBpbGVyU2VydmljZSgpO1xuIl19
|
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb21waWxlci9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLDhEQUFzQztBQUN0QyxzRUFBNEM7QUFFNUMsb0VBT3lDO0FBRXpDLDZCQUljO0FBRWQsOENBQThDO0FBQzlDLHNEQUEwRDtBQUMxRCw0RUFBa0Q7QUFFbEQseUNBcUJvQjtBQUtwQixxRUFBNEM7QUFFNUMsa0dBQStFO0FBRS9FLDZEQVE2QjtBQUs3Qiw0QkFBZ0IsQ0FBQyxPQUFPLENBQUM7SUFDckIsV0FBVyxFQUFlLElBQUk7SUFDOUIsd0JBQXdCLEVBQUUsS0FBSztJQUMvQixXQUFXLEVBQWUsTUFBTTtDQUNuQyxDQUFDLENBQUM7QUFtQkgsTUFBTSxlQUFlO0lBSWpCO1FBQ0ksT0FBTyxDQUFDLEtBQUssR0FBRyx1QkFBWSxDQUFDLE9BQU8sQ0FBQztRQUVyQyxNQUFNLEtBQUssR0FBSSxZQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLHFCQUFnQixFQUFFLENBQUMsQ0FBQztRQUNqRSxNQUFNLE1BQU0sR0FBRyxZQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLHNCQUFpQixFQUFFLENBQUMsQ0FBQztRQUVuRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksZ0JBQVEsQ0FBQyxJQUFJLDRCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsb0JBQWUsQ0FBQyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8sVUFBVTtRQUNkLE9BQU87WUFDSCxRQUFRLEVB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VUFBVSxDQUFDLFFBQVEsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLHdCQUF3QixDQUFHLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQXFDO1FBQ3ZHLE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVNLEtBQUssQ0FBQywyQkFBMkIsQ0FBRSxFQUFFLEtBQUssRUFBd0M7UUFDckYsT0FBTyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVNLEtBQUssQ0FBQyxxQkFBcUIsQ0FBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQWtDO1FBQ3JGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBUyxDQUFDO1FBRTlDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDSjtBQUVELGtCQUFlLElBQUksZUFBZSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IENvbXBpbGVyIGZyb20gJy4uLy4uL2NvbXBpbGVyJztcbmltcG9ydCBUZXN0UnVuUHJveHkgZnJvbSAnLi90ZXN0LXJ1bi1wcm94eSc7XG5cbmltcG9ydCB7XG4gICAgZmxhdHRlbiBhcyBmbGF0dGVuVGVzdFN0cnVjdHVyZSxcbiAgICBpc0ZpeHR1cmUsXG4gICAgaXNUZXN0LFxuICAgIHNlcmlhbGl6ZSBhcyBzZXJpYWxpemVUZXN0U3RydWN0dXJlLFxuICAgIFVuaXQsXG4gICAgVW5pdHNcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi90ZXN0LXN0cnVjdHVyZSc7XG5cbmltcG9ydCB7XG4gICAgU0VSVklDRV9JTlBVVF9GRCxcbiAgICBTRVJWSUNFX09VVFBVVF9GRCxcbiAgICBTRVJWSUNFX1NZTkNfRkRcbn0gZnJvbSAnLi9pbyc7XG5cbmltcG9ydCB7IElQQ1Byb3h5IH0gZnJvbSAnLi4vdXRpbHMvaXBjL3Byb3h5JztcbmltcG9ydCB7IFNlcnZpY2VUcmFuc3BvcnQgfSBmcm9tICcuLi91dGlscy9pcGMvdHJhbnNwb3J0JztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5cbmltcG9ydCB7XG4gICAgQ29tcGlsZXJQcm90b2NvbCxcbiAgICBFeGVjdXRlQWN0aW9uQXJndW1lbnRzLFxuICAgIEV4ZWN1dGVDb21tYW5kQXJndW1lbnRzLFxuICAgIEV4ZWN1dGVNb2NrUHJlZGljYXRlLFxuICAgIEV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZUFyZ3VtZW50cyxcbiAgICBGdW5jdGlvblByb3BlcnRpZXMsXG4gICAgaXNGaXh0dXJlRnVuY3Rpb25Qcm9wZXJ0eSxcbiAgICBpc1Rlc3RGdW5jdGlvblByb3BlcnR5LFxuICAgIFJlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudEFyZ3VtZW50cyxcbiAgICBSZXF1ZXN0SG9va0V2ZW50QXJndW1lbnRzLFxuICAgIFJlcXVlc3RIb29rTG9jYXRvcixcbiAgICBSdW5UZXN0QXJndW1lbnRzLFxuICAgIFNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zQXJndW1lbnRzLFxuICAgIFNldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudEFyZ3VtZW50cyxcbiAgICBTZXRNb2NrQXJndW1lbnRzLFxuICAgIFNldE9wdGlvbnNBcmd1bWVudHMsXG4gICAgR2V0V2FybmluZ01lc3NhZ2VzQXJndW1lbnRzLFxuICAgIEFkZFJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyxcbiAgICBSZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnNBcmd1bWVudHMsXG4gICAgSW5pdGlhbGl6ZVRlc3RSdW5EYXRhQXJndW1lbnRzXG59IGZyb20gJy4vcHJvdG9jb2wnO1xuXG5pbXBvcnQgeyBDb21waWxlckFyZ3VtZW50cyB9IGZyb20gJy4uLy4uL2NvbXBpbGVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IEZpeHR1cmUgZnJvbSAnLi4vLi4vYXBpL3N0cnVjdHVyZS9maXh0dXJlJztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL2ludGVyZmFjZXMnO1xuaW1wb3J0IFByb2Nlc3NUaXRsZSBmcm9tICcuLi9wcm9jZXNzLXRpdGxlJztcbmltcG9ydCBUZXN0IGZyb20gJy4uLy4uL2FwaS9zdHJ1Y3R1cmUvdGVzdCc7XG5pbXBvcnQgUmVxdWVzdEhvb2tNZXRob2ROYW1lcyBmcm9tICcuLi8uLi9hcGkvcmVxdWVzdC1ob29rcy9ob29rLW1ldGhvZC1uYW1lcyc7XG5cbmltcG9ydCB7XG4gICAgQ29uZmlndXJlUmVzcG9uc2VFdmVudCxcbiAgICBJbmNvbWluZ01lc3NhZ2VMaWtlSW5pdE9wdGlvbnMsXG4gICAgUmVxdWVzdEV2ZW50LFxuICAgIFJlcXVlc3RGaWx0ZXJSdWxlLFxuICAgIFJlc3BvbnNlRXZlbnQsXG4gICAgUmVzcG9uc2VNb2NrLFxuICAgIHJlc3BvbnNlTW9ja1NldEJvZHlNZXRob2Rcbn0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5cbmltcG9ydCBSZXF1ZXN0SG9vayBmcm9tICcuLi8uLi9hcGkvcmVxdWVzdC1ob29rcy9ob29rJztcbmltcG9ydCBSZXF1ZXN0TW9jayBmcm9tICcuLi8uLi9hcGkvcmVxdWVzdC1ob29rcy9yZXF1ZXN0LW1vY2snO1xuXG5zb3VyY2VNYXBTdXBwb3J0Lmluc3RhbGwoe1xuICAgIGhvb2tSZXF1aXJlOiAgICAgICAgICAgICAgdHJ1ZSxcbiAgICBoYW5kbGVVbmNhdWdodEV4Y2VwdGlvbnM6IGZhbHNlLFxuICAgIGVudmlyb25tZW50OiAgICAgICAgICAgICAgJ25vZGUnXG59KTtcblxuaW50ZXJmYWNlIFNlcnZpY2VTdGF0ZSB7XG4gICAgdGVzdFJ1bnM6IHsgW2lkOiBzdHJpbmddOiBUZXN0UnVuUHJveHkgfTtcbiAgICBmaXh0dXJlQ3R4czogeyBbaWQ6IHN0cmluZ106IG9iamVjdCB9O1xuICAgIHVuaXRzOiBVbml0cztcbiAgICBvcHRpb25zOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPjtcbn1cblxuaW50ZXJmYWNlIFRlc3RSdW5Qcm94eUNyZWF0aW9uQXJncyB7XG4gICAgdGVzdFJ1bklkOiBzdHJpbmc7XG4gICAgdGVzdElkOiBzdHJpbmc7XG4gICAgZml4dHVyZUN0eDogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIFdyYXBTZXRNb2NrQXJndW1lbnRzIGV4dGVuZHMgUmVxdWVzdEhvb2tMb2NhdG9yIHtcbiAgICBldmVudDogUmVxdWVzdEV2ZW50O1xufVxuXG5jbGFzcyBDb21waWxlclNlcnZpY2UgaW1wbGVtZW50cyBDb21waWxlclByb3RvY29sIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3h5OiBJUENQcm94eTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlOiBTZXJ2aWNlU3RhdGU7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBwcm9jZXNzLnRpdGxlID0gUHJvY2Vzc1RpdGxlLnNlcnZpY2U7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgID0gZnMuY3JlYXRlUmVhZFN0cmVhbSgnJywgeyBmZDogU0VSVklDRV9JTlBVVF9GRCB9KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oJycsIHsgZmQ6IFNFUlZJQ0VfT1VUUFVUX0ZEIH0pO1xuXG4gICAgICAgIHRoaXMucHJveHkgPSBuZXcgSVBDUHJveHkobmV3IFNlcnZpY2VUcmFuc3BvcnQoaW5wdXQsIG91dHB1dCwgU0VSVklDRV9TWU5DX0ZEKSk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLl9pbml0U3RhdGUoKTtcblxuICAgICAgICB0aGlzLl9zZXR1cFJvdXRlcygpO1xuICAgICAgICB0aGlzLnJlYWR5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5pdFN0YXRlICgpOiBTZXJ2aWNlU3RhdGUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGVzdFJ1bnM6ICAgIHt9LFxuICAgICAgICAgICAgZml4dHVyZUN0eHM6IHt9LFxuICAgICAgICAgICAgdW5pdHM6ICAgICAgIHt9LFxuICAgICAgICAgICAgb3B0aW9uczogICAgIHt9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Rml4dHVyZUN0eCAoeyBpZCB9OiBSdW5UZXN0QXJndW1lbnRzKTogdW5rbm93biB7XG4gICAgICAgIGNvbnN0IHVuaXQgPSB0aGlzLnN0YXRlLnVuaXRzW2lkXTtcblxuICAgICAgICBjb25zdCBmaXh0dXJlSWQgPSBpc1Rlc3QodW5pdCkgPyB1bml0LmZpeHR1cmUuaWQgOiAodW5pdCBhcyBGaXh0dXJlKS5pZDtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5maXh0dXJlQ3R4c1tmaXh0dXJlSWRdO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFRlc3RDdHggKHsgdGVzdFJ1bklkIH06IFJ1blRlc3RBcmd1bWVudHMsIHRlc3Q6IFRlc3QpOiBUZXN0UnVuUHJveHkge1xuICAgICAgICBjb25zdCB0ZXN0UnVuUHJveHkgICAgID0gdGhpcy5zdGF0ZS50ZXN0UnVuc1t0ZXN0UnVuSWRdO1xuICAgICAgICBjb25zdCB0YXJnZXRGaXh0dXJlQ3R4ID0gdGhpcy5zdGF0ZS5maXh0dXJlQ3R4c1t0ZXN0LmZpeHR1cmUuaWRdO1xuXG4gICAgICAgIHRlc3RSdW5Qcm94eS5maXh0dXJlQ3R4ID0gdGFyZ2V0Rml4dHVyZUN0eDtcblxuICAgICAgICByZXR1cm4gdGVzdFJ1blByb3h5O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldENvbnRleHQgKGFyZ3M6IFJ1blRlc3RBcmd1bWVudHMsIHVuaXQ6IFVuaXQpOiBUZXN0UnVuUHJveHkgfCB1bmtub3duIHtcbiAgICAgICAgY29uc3QgeyB0ZXN0UnVuSWQgfSA9IGFyZ3M7XG5cbiAgICAgICAgaWYgKHRlc3RSdW5JZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRUZXN0Q3R4KGFyZ3MsIHVuaXQgYXMgVGVzdCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpeHR1cmVDdHgoYXJncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0dXBSb3V0ZXMgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb3h5LnJlZ2lzdGVyKFtcbiAgICAgICAgICAgIHRoaXMuZ2V0VGVzdHMsXG4gICAgICAgICAgICB0aGlzLnJ1blRlc3RGbixcbiAgICAgICAgICAgIHRoaXMuY2xlYW5VcCxcbiAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9ucyxcbiAgICAgICAgICAgIHRoaXMub25SZXF1ZXN0SG9va0V2ZW50LFxuICAgICAgICAgICAgdGhpcy5zZXRNb2NrLFxuICAgICAgICAgICAgdGhpcy5zZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9ucyxcbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50LFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnQsXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSxcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZU1vY2tQcmVkaWNhdGUsXG4gICAgICAgICAgICB0aGlzLmdldFdhcm5pbmdNZXNzYWdlcyxcbiAgICAgICAgICAgIHRoaXMuYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzLFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMsXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVUZXN0UnVuRGF0YVxuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRGdW5jdGlvbiAodW5pdDogVW5pdCwgZnVuY3Rpb25OYW1lOiBGdW5jdGlvblByb3BlcnRpZXMpOiBGdW5jdGlvbnxudWxsIHtcbiAgICAgICAgaWYgKGlzVGVzdCh1bml0KSAmJiBpc1Rlc3RGdW5jdGlvblByb3BlcnR5KGZ1bmN0aW9uTmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gdW5pdFtmdW5jdGlvbk5hbWVdO1xuXG4gICAgICAgIGlmIChpc0ZpeHR1cmUodW5pdCkgJiYgaXNGaXh0dXJlRnVuY3Rpb25Qcm9wZXJ0eShmdW5jdGlvbk5hbWUpKVxuICAgICAgICAgICAgcmV0dXJuIHVuaXRbZnVuY3Rpb25OYW1lXTtcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kICcke2Z1bmN0aW9uTmFtZX0nIGZ1bmN0aW9uIGZvciAke3R5cGVvZiB1bml0fWApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dyYXBFdmVudE1ldGhvZHMgKHsgbmFtZSwgdGVzdElkLCBob29rSWQsIGV2ZW50RGF0YSB9OiBSZXF1ZXN0SG9va0V2ZW50QXJndW1lbnRzKTogdm9pZCB7XG4gICAgICAgIGlmIChuYW1lID09PSBSZXF1ZXN0SG9va01ldGhvZE5hbWVzLm9uUmVxdWVzdClcbiAgICAgICAgICAgIHRoaXMuX3dyYXBTZXRNb2NrRm4oeyB0ZXN0SWQsIGhvb2tJZCwgZXZlbnQ6IGV2ZW50RGF0YSBhcyBSZXF1ZXN0RXZlbnQgfSk7XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgPT09IFJlcXVlc3RIb29rTWV0aG9kTmFtZXMuX29uQ29uZmlndXJlUmVzcG9uc2UpXG4gICAgICAgICAgICB0aGlzLl93cmFwQ29uZmlndXJlUmVzcG9uc2VFdmVudE1ldGhvZHMoZXZlbnREYXRhIGFzIENvbmZpZ3VyZVJlc3BvbnNlRXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dyYXBTZXRNb2NrRm4gKHsgdGVzdElkLCBob29rSWQsIGV2ZW50IH06IFdyYXBTZXRNb2NrQXJndW1lbnRzKTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnNldE1vY2sgPSBhc3luYyAobW9jazogUmVzcG9uc2VNb2NrKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldE1vY2soe1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlRXZlbnRJZDogZXZlbnQuaWQsXG4gICAgICAgICAgICAgICAgcnVsZUlkOiAgICAgICAgICBldmVudC5yZXF1ZXN0RmlsdGVyUnVsZS5pZCxcbiAgICAgICAgICAgICAgICB0ZXN0SWQsXG4gICAgICAgICAgICAgICAgaG9va0lkLFxuICAgICAgICAgICAgICAgIG1vY2tcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dyYXBDb25maWd1cmVSZXNwb25zZUV2ZW50TWV0aG9kcyAoZXZlbnQ6IENvbmZpZ3VyZVJlc3BvbnNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc2V0SGVhZGVyID0gYXN5bmMgKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnQoe1xuICAgICAgICAgICAgICAgIGV2ZW50SWQ6ICAgICBldmVudC5pZCxcbiAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiAgbmFtZSxcbiAgICAgICAgICAgICAgICBoZWFkZXJWYWx1ZTogdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGV2ZW50LnJlbW92ZUhlYWRlciA9IGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudElkOiAgICBldmVudC5pZCxcbiAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiBuYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXN0b3JlUmVxdWVzdEZpbHRlclJ1bGUgKGV2ZW50OiBSZXF1ZXN0RXZlbnQgfCBDb25maWd1cmVSZXNwb25zZUV2ZW50IHwgUmVzcG9uc2VFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5yZXF1ZXN0RmlsdGVyUnVsZSA9IFJlcXVlc3RGaWx0ZXJSdWxlLmZyb20oZXZlbnQucmVxdWVzdEZpbHRlclJ1bGUgYXMgb2JqZWN0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0aWFsaXplVGVzdFJ1blByb3h5ICh0ZXN0UnVuSWQ6IHN0cmluZywgdGVzdDogVGVzdCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0ZXN0UnVuUHJveHkgPSBuZXcgVGVzdFJ1blByb3h5KHtcbiAgICAgICAgICAgIGRpc3BhdGNoZXI6IHRoaXMsXG4gICAgICAgICAgICBpZDogICAgICAgICB0ZXN0UnVuSWQsXG4gICAgICAgICAgICBvcHRpb25zOiAgICB0aGlzLnN0YXRlLm9wdGlvbnMsXG4gICAgICAgICAgICB0ZXN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3RhdGUudGVzdFJ1bnNbdGVzdFJ1bklkXSA9IHRlc3RSdW5Qcm94eTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0aWFsaXplRml4dHVyZUN0eCAodGVzdDogVGVzdCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaXh0dXJlSWQgPSB0ZXN0LmZpeHR1cmUuaWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZml4dHVyZUN0eHNbZml4dHVyZUlkXSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLnN0YXRlLmZpeHR1cmVDdHhzW2ZpeHR1cmVJZF0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRPcHRpb25zICh7IHZhbHVlIH06IFNldE9wdGlvbnNBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdGF0ZS5vcHRpb25zID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlYWR5ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wcm94eS5jYWxsKHRoaXMucmVhZHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhblVwICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgQ29tcGlsZXIuY2xlYW5VcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRUZXN0cyAoeyBzb3VyY2VMaXN0LCBjb21waWxlck9wdGlvbnMgfTogQ29tcGlsZXJBcmd1bWVudHMpOiBQcm9taXNlPFVuaXRzPiB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKHNvdXJjZUxpc3QsIGNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgdGVzdHMgPSBhd2FpdCBjb21waWxlci5nZXRUZXN0cygpO1xuICAgICAgICBjb25zdCB1bml0cyA9IGZsYXR0ZW5UZXN0U3RydWN0dXJlKHRlc3RzKTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuc3RhdGUudW5pdHMsIHVuaXRzKTtcblxuICAgICAgICByZXR1cm4gc2VyaWFsaXplVGVzdFN0cnVjdHVyZSh1bml0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJ1blRlc3RGbiAoYXJnczogUnVuVGVzdEFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCB7IGlkLCBmdW5jdGlvbk5hbWUgfSA9IGFyZ3M7XG5cbiAgICAgICAgY29uc3QgdW5pdCAgICAgICAgICAgPSB0aGlzLnN0YXRlLnVuaXRzW2lkXTtcbiAgICAgICAgY29uc3QgY29udGV4dCAgICAgICAgPSB0aGlzLl9nZXRDb250ZXh0KGFyZ3MsIHVuaXQpO1xuICAgICAgICBjb25zdCBmdW5jdGlvbk9iamVjdCA9IHRoaXMuX2dldEZ1bmN0aW9uKHVuaXQsIGZ1bmN0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKCFmdW5jdGlvbk9iamVjdClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgdGhlIFwiJHtmdW5jdGlvbk5hbWV9XCIgb2YgJHt0eXBlb2YgdW5pdH1gKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZnVuY3Rpb25PYmplY3QoY29udGV4dCk7XG4gICAgfVxuXG4gICAgcHVibGljIGV4ZWN1dGVBY3Rpb25TeW5jICh7IGlkLCBhcGlNZXRob2ROYW1lLCBjb21tYW5kLCBjYWxsc2l0ZSB9OiBFeGVjdXRlQWN0aW9uQXJndW1lbnRzKTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3h5LmNhbGxTeW5jKHRoaXMuZXhlY3V0ZUFjdGlvbiwgeyBpZCwgYXBpTWV0aG9kTmFtZSwgY29tbWFuZCwgY2FsbHNpdGUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVBY3Rpb24gKHsgaWQsIGFwaU1ldGhvZE5hbWUsIGNvbW1hbmQsIGNhbGxzaXRlIH06IEV4ZWN1dGVBY3Rpb25Bcmd1bWVudHMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkuY2FsbCh0aGlzLmV4ZWN1dGVBY3Rpb24sIHsgaWQsIGFwaU1ldGhvZE5hbWUsIGNvbW1hbmQsIGNhbGxzaXRlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQ29tbWFuZCAoeyBjb21tYW5kLCBpZCB9OiBFeGVjdXRlQ29tbWFuZEFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm94eS5jYWxsKHRoaXMuZXhlY3V0ZUNvbW1hbmQsIHsgaWQsIGNvbW1hbmQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uUmVxdWVzdEhvb2tFdmVudCAoeyBuYW1lLCB0ZXN0SWQsIGhvb2tJZCwgZXZlbnREYXRhIH06IFJlcXVlc3RIb29rRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5fd3JhcEV2ZW50TWV0aG9kcyh7IG5hbWUsIHRlc3RJZCwgaG9va0lkLCBldmVudERhdGEgfSk7XG4gICAgICAgIHRoaXMuX3Jlc3RvcmVSZXF1ZXN0RmlsdGVyUnVsZShldmVudERhdGEpO1xuXG4gICAgICAgIGNvbnN0IHRlc3QgICAgICAgPSB0aGlzLnN0YXRlLnVuaXRzW3Rlc3RJZF0gYXMgVGVzdDtcbiAgICAgICAgY29uc3QgdGFyZ2V0SG9vayA9IHRlc3QucmVxdWVzdEhvb2tzLmZpbmQoaG9vayA9PiBob29rLmlkID09PSBob29rSWQpIGFzIFJlcXVlc3RIb29rO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgYXdhaXQgdGFyZ2V0SG9va1tuYW1lXS5jYWxsKHRhcmdldEhvb2ssIGV2ZW50RGF0YSk7XG5cbiAgICAgICAgaWYgKG5hbWUgPT09IFJlcXVlc3RIb29rTWV0aG9kTmFtZXMuX29uQ29uZmlndXJlUmVzcG9uc2UgJiYgdGFyZ2V0SG9vay5fcmVzcG9uc2VFdmVudENvbmZpZ3VyZU9wdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgb3B0cywgaWQ6IGV2ZW50SWQgfSA9IGV2ZW50RGF0YSBhcyBDb25maWd1cmVSZXNwb25zZUV2ZW50O1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zKHsgZXZlbnRJZCwgb3B0cyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRNb2NrICh7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQsIHJlc3BvbnNlRXZlbnRJZCwgbW9jayB9OiBTZXRNb2NrQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJveHkuY2FsbCh0aGlzLnNldE1vY2ssIHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVzcG9uc2VFdmVudElkLCBtb2NrIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9ucyAoeyBldmVudElkLCBvcHRzIH06IFNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJveHkuY2FsbCh0aGlzLnNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zLCB7IGV2ZW50SWQsIG9wdHMgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCAoeyBldmVudElkLCBoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSB9OiBTZXRIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm94eS5jYWxsKHRoaXMuc2V0SGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50LCB7IGV2ZW50SWQsIGhlYWRlck5hbWUsIGhlYWRlclZhbHVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW1vdmVIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnQgKHsgZXZlbnRJZCwgaGVhZGVyTmFtZSB9OiBSZW1vdmVIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm94eS5jYWxsKHRoaXMucmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50LCB7IGV2ZW50SWQsIGhlYWRlck5hbWUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSAoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbyB9OiBFeGVjdXRlUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGVBcmd1bWVudHMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdGVzdCAgICAgICA9IHRoaXMuc3RhdGUudW5pdHNbdGVzdElkXSBhcyBUZXN0O1xuICAgICAgICBjb25zdCB0YXJnZXRIb29rID0gdGVzdC5yZXF1ZXN0SG9va3MuZmluZChob29rID0+IGhvb2suaWQgPT09IGhvb2tJZCkgYXMgUmVxdWVzdEhvb2s7XG4gICAgICAgIGNvbnN0IHRhcmdldFJ1bGUgPSB0YXJnZXRIb29rLl9yZXF1ZXN0RmlsdGVyUnVsZXMuZmluZChydWxlID0+IHJ1bGUuaWQgPT09IHJ1bGVJZCkgYXMgUmVxdWVzdEZpbHRlclJ1bGU7XG4gICAgICAgIGNvbnN0IHJlc3VsdCAgICAgPSBhd2FpdCB0YXJnZXRSdWxlLm9wdGlvbnMuY2FsbCh0YXJnZXRSdWxlLCByZXF1ZXN0SW5mbyk7XG5cbiAgICAgICAgcmV0dXJuICEhcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlTW9ja1ByZWRpY2F0ZSAoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbywgcmVzIH06IEV4ZWN1dGVNb2NrUHJlZGljYXRlKTogUHJvbWlzZTxJbmNvbWluZ01lc3NhZ2VMaWtlSW5pdE9wdGlvbnM+IHtcbiAgICAgICAgY29uc3QgdGVzdCAgICAgICAgID0gdGhpcy5zdGF0ZS51bml0c1t0ZXN0SWRdIGFzIFRlc3Q7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RNb2NrICA9IHRlc3QucmVxdWVzdEhvb2tzLmZpbmQoaG9vayA9PiBob29rLmlkID09PSBob29rSWQpIGFzIFJlcXVlc3RNb2NrO1xuICAgICAgICBjb25zdCByZXNwb25zZU1vY2sgPSByZXF1ZXN0TW9jay5tb2Nrcy5nZXQocnVsZUlkKSBhcyBSZXNwb25zZU1vY2s7XG5cbiAgICAgICAgcmVzcG9uc2VNb2NrU2V0Qm9keU1ldGhvZC5hZGQocmVzKTtcblxuICAgICAgICByZXMgPSBPYmplY3QuYXNzaWduKHJlcywgYXdhaXQgKHJlc3BvbnNlTW9jay5ib2R5IGFzIEZ1bmN0aW9uKShyZXF1ZXN0SW5mbywgcmVzKSk7XG5cbiAgICAgICAgcmVzcG9uc2VNb2NrU2V0Qm9keU1ldGhvZC5yZW1vdmUocmVzKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRXYXJuaW5nTWVzc2FnZXMgKHsgdGVzdFJ1bklkIH06IEdldFdhcm5pbmdNZXNzYWdlc0FyZ3VtZW50cyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgY29uc3QgdGVzdFJ1blByb3h5ID0gdGhpcy5zdGF0ZS50ZXN0UnVuc1t0ZXN0UnVuSWRdO1xuXG4gICAgICAgIHJldHVybiB0ZXN0UnVuUHJveHkud2FybmluZ0xvZy5tZXNzYWdlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzICggeyBob29rSWQsIGhvb2tDbGFzc05hbWUsIHJ1bGVzIH06IEFkZFJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eS5jYWxsKHRoaXMuYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzLCB7IGhvb2tJZCwgaG9va0NsYXNzTmFtZSwgcnVsZXMgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycyAoeyBydWxlcyB9OiBSZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnNBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHkuY2FsbCh0aGlzLnJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycywgeyBydWxlcyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZVRlc3RSdW5EYXRhICh7IHRlc3RSdW5JZCwgdGVzdElkIH06IEluaXRpYWxpemVUZXN0UnVuRGF0YUFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0ZXN0ID0gdGhpcy5zdGF0ZS51bml0c1t0ZXN0SWRdIGFzIFRlc3Q7XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVRlc3RSdW5Qcm94eSh0ZXN0UnVuSWQsIHRlc3QpO1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplRml4dHVyZUN0eCh0ZXN0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBDb21waWxlclNlcnZpY2UoKTtcbiJdfQ==
|