UNPKG

15.9 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5var __importStar = (this && this.__importStar) || function (mod) {
6 if (mod && mod.__esModule) return mod;
7 var result = {};
8 if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
9 result["default"] = mod;
10 return result;
11};
12Object.defineProperty(exports, "__esModule", { value: true });
13const runtime_1 = require("./errors/runtime");
14const types_1 = require("./errors/types");
15const content_types_1 = __importDefault(require("./assets/content-types"));
16const option_names_1 = __importDefault(require("./configuration/option-names"));
17const INJECTABLES = __importStar(require("./assets/injectables"));
18const lazyRequire = require('import-lazy')(require);
19const sourceMapSupport = lazyRequire('source-map-support');
20const hammerhead = lazyRequire('testcafe-hammerhead');
21const loadAssets = lazyRequire('./load-assets');
22const errorHandlers = lazyRequire('./utils/handle-errors');
23const BrowserConnectionGateway = lazyRequire('./browser/connection/gateway');
24const BrowserConnection = lazyRequire('./browser/connection');
25const browserProviderPool = lazyRequire('./browser/provider/pool');
26const Runner = lazyRequire('./runner');
27const LiveModeRunner = lazyRequire('./live/test-runner');
28// NOTE: CoffeeScript can't be loaded lazily, because it will break stack traces
29require('coffeescript');
30class TestCafe {
31 constructor(configuration) {
32 this._setupSourceMapsSupport();
33 errorHandlers.registerErrorHandlers();
34 const { hostname, port1, port2, options } = configuration.startOptions;
35 this.closed = false;
36 this.proxy = new hammerhead.Proxy(hostname, port1, port2, options);
37 this.browserConnectionGateway = new BrowserConnectionGateway(this.proxy, { retryTestPages: configuration.getOption(option_names_1.default.retryTestPages) });
38 this.runners = [];
39 this.configuration = configuration;
40 this._registerAssets(options.developmentMode);
41 }
42 _registerAssets(developmentMode) {
43 const { favIcon, coreScript, driverScript, uiScript, uiStyle, uiSprite, automationScript, legacyRunnerScript } = loadAssets(developmentMode);
44 this.proxy.GET(INJECTABLES.TESTCAFE_CORE, { content: coreScript, contentType: content_types_1.default.javascript });
45 this.proxy.GET(INJECTABLES.TESTCAFE_DRIVER, { content: driverScript, contentType: content_types_1.default.javascript });
46 this.proxy.GET(INJECTABLES.TESTCAFE_LEGACY_RUNNER, {
47 content: legacyRunnerScript,
48 contentType: content_types_1.default.javascript
49 });
50 this.proxy.GET(INJECTABLES.TESTCAFE_AUTOMATION, { content: automationScript, contentType: content_types_1.default.javascript });
51 this.proxy.GET(INJECTABLES.TESTCAFE_UI, { content: uiScript, contentType: content_types_1.default.javascript });
52 this.proxy.GET(INJECTABLES.TESTCAFE_UI_SPRITE, { content: uiSprite, contentType: content_types_1.default.png });
53 this.proxy.GET(INJECTABLES.TESTCAFE_ICON, { content: favIcon, contentType: content_types_1.default.icon });
54 this.proxy.GET(INJECTABLES.TESTCAFE_UI_STYLES, {
55 content: uiStyle,
56 contentType: content_types_1.default.css,
57 isShadowUIStylesheet: true
58 });
59 }
60 _setupSourceMapsSupport() {
61 sourceMapSupport.install({
62 hookRequire: true,
63 handleUncaughtExceptions: false,
64 environment: 'node'
65 });
66 }
67 _createRunner(isLiveMode) {
68 const Ctor = isLiveMode ? LiveModeRunner : Runner;
69 const newRunner = new Ctor(this.proxy, this.browserConnectionGateway, this.configuration.clone());
70 this.runners.push(newRunner);
71 return newRunner;
72 }
73 // API
74 async createBrowserConnection() {
75 const browserInfo = await browserProviderPool.getBrowserInfo('remote');
76 return new BrowserConnection(this.browserConnectionGateway, browserInfo, true);
77 }
78 createRunner() {
79 return this._createRunner(false);
80 }
81 createLiveModeRunner() {
82 if (this.runners.some(runner => runner instanceof LiveModeRunner))
83 throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotCreateMultipleLiveModeRunners);
84 return this._createRunner(true);
85 }
86 async close() {
87 if (this.closed)
88 return;
89 this.closed = true;
90 await Promise.all(this.runners.map(runner => runner.stop()));
91 await browserProviderPool.dispose();
92 this.browserConnectionGateway.close();
93 this.proxy.close();
94 }
95}
96exports.default = TestCafe;
97module.exports = exports.default;
98//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGNhZmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGVzdGNhZmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsOENBQWdEO0FBQ2hELDBDQUFnRDtBQUNoRCwyRUFBbUQ7QUFDbkQsZ0ZBQXdEO0FBQ3hELGtFQUFvRDtBQUVwRCxNQUFNLFdBQVcsR0FBZ0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sZ0JBQWdCLEdBQVcsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDbkUsTUFBTSxVQUFVLEdBQWlCLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sVUFBVSxHQUFpQixXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDOUQsTUFBTSxhQUFhLEdBQWMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDdEUsTUFBTSx3QkFBd0IsR0FBRyxXQUFXLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUM3RSxNQUFNLGlCQUFpQixHQUFVLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sbUJBQW1CLEdBQVEsV0FBVyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDeEUsTUFBTSxNQUFNLEdBQXFCLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN6RCxNQUFNLGNBQWMsR0FBYSxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUVuRSxnRkFBZ0Y7QUFDaEYsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXhCLE1BQXFCLFFBQVE7SUFDekIsWUFBYSxhQUFhO1FBQ3RCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRXRDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDO1FBRXZFLElBQUksQ0FBQyxNQUFNLEdBQXFCLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsS0FBSyxHQUFzQixJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLHNCQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25KLElBQUksQ0FBQyxPQUFPLEdBQW9CLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFjLGFBQWEsQ0FBQztRQUU5QyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsZUFBZSxDQUFFLGVBQWU7UUFDNUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU1RixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsdUJBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSx1QkFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFOUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLHNCQUFzQixFQUFFO1lBQy9DLE9BQU8sRUFBTSxrQkFBa0I7WUFDL0IsV0FBVyxFQUFFLHVCQUFhLENBQUMsVUFBVTtTQUN4QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLHVCQUFhLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN0SCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsdUJBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLHVCQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsdUJBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWpHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQyxPQUFPLEVBQWUsT0FBTztZQUM3QixXQUFXLEVBQVcsdUJBQWEsQ0FBQyxHQUFHO1lBQ3ZDLG9CQUFvQixFQUFFLElBQUk7U0FDN0IsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHVCQUF1QjtRQUNuQixnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7WUFDckIsV0FBVyxFQUFlLElBQUk7WUFDOUIsd0JBQXdCLEVBQUUsS0FBSztZQUMvQixXQUFXLEVBQWUsTUFBTTtTQUNuQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsYUFBYSxDQUFFLFVBQVU7UUFDckIsTUFBTSxJQUFJLEdBQVEsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFbEcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0IsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU07SUFDTixLQUFLLENBQUMsdUJBQXVCO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLE1BQU0sbUJBQW1CLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXZFLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxZQUFZO1FBQ1IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxvQkFBb0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sWUFBWSxjQUFjLENBQUM7WUFDN0QsTUFBTSxJQUFJLHNCQUFZLENBQUMsc0JBQWMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBRS9FLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDUCxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQ1gsT0FBTztRQUVYLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRW5CLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFN0QsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVwQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0NBQ0o7QUF4RkQsMkJBd0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCBDT05URU5UX1RZUEVTIGZyb20gJy4vYXNzZXRzL2NvbnRlbnQtdHlwZXMnO1xuaW1wb3J0IE9QVElPTl9OQU1FUyBmcm9tICcuL2NvbmZpZ3VyYXRpb24vb3B0aW9uLW5hbWVzJztcbmltcG9ydCAqIGFzIElOSkVDVEFCTEVTIGZyb20gJy4vYXNzZXRzL2luamVjdGFibGVzJztcblxuY29uc3QgbGF6eVJlcXVpcmUgICAgICAgICAgICAgID0gcmVxdWlyZSgnaW1wb3J0LWxhenknKShyZXF1aXJlKTtcbmNvbnN0IHNvdXJjZU1hcFN1cHBvcnQgICAgICAgICA9IGxhenlSZXF1aXJlKCdzb3VyY2UtbWFwLXN1cHBvcnQnKTtcbmNvbnN0IGhhbW1lcmhlYWQgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCd0ZXN0Y2FmZS1oYW1tZXJoZWFkJyk7XG5jb25zdCBsb2FkQXNzZXRzICAgICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi9sb2FkLWFzc2V0cycpO1xuY29uc3QgZXJyb3JIYW5kbGVycyAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vdXRpbHMvaGFuZGxlLWVycm9ycycpO1xuY29uc3QgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5ID0gbGF6eVJlcXVpcmUoJy4vYnJvd3Nlci9jb25uZWN0aW9uL2dhdGV3YXknKTtcbmNvbnN0IEJyb3dzZXJDb25uZWN0aW9uICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2Jyb3dzZXIvY29ubmVjdGlvbicpO1xuY29uc3QgYnJvd3NlclByb3ZpZGVyUG9vbCAgICAgID0gbGF6eVJlcXVpcmUoJy4vYnJvd3Nlci9wcm92aWRlci9wb29sJyk7XG5jb25zdCBSdW5uZXIgICAgICAgICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi9ydW5uZXInKTtcbmNvbnN0IExpdmVNb2RlUnVubmVyICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2xpdmUvdGVzdC1ydW5uZXInKTtcblxuLy8gTk9URTogQ29mZmVlU2NyaXB0IGNhbid0IGJlIGxvYWRlZCBsYXppbHksIGJlY2F1c2UgaXQgd2lsbCBicmVhayBzdGFjayB0cmFjZXNcbnJlcXVpcmUoJ2NvZmZlZXNjcmlwdCcpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXN0Q2FmZSB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgdGhpcy5fc2V0dXBTb3VyY2VNYXBzU3VwcG9ydCgpO1xuICAgICAgICBlcnJvckhhbmRsZXJzLnJlZ2lzdGVyRXJyb3JIYW5kbGVycygpO1xuXG4gICAgICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBvcnQxLCBwb3J0Miwgb3B0aW9ucyB9ID0gY29uZmlndXJhdGlvbi5zdGFydE9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy5jbG9zZWQgICAgICAgICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcm94eSAgICAgICAgICAgICAgICAgICAgPSBuZXcgaGFtbWVyaGVhZC5Qcm94eShob3N0bmFtZSwgcG9ydDEsIHBvcnQyLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgPSBuZXcgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5KHRoaXMucHJveHksIHsgcmV0cnlUZXN0UGFnZXM6IGNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5yZXRyeVRlc3RQYWdlcykgfSk7XG4gICAgICAgIHRoaXMucnVubmVycyAgICAgICAgICAgICAgICAgID0gW107XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiAgICAgICAgICAgID0gY29uZmlndXJhdGlvbjtcblxuICAgICAgICB0aGlzLl9yZWdpc3RlckFzc2V0cyhvcHRpb25zLmRldmVsb3BtZW50TW9kZSk7XG4gICAgfVxuXG4gICAgX3JlZ2lzdGVyQXNzZXRzIChkZXZlbG9wbWVudE1vZGUpIHtcbiAgICAgICAgY29uc3QgeyBmYXZJY29uLCBjb3JlU2NyaXB0LCBkcml2ZXJTY3JpcHQsIHVpU2NyaXB0LFxuICAgICAgICAgICAgdWlTdHlsZSwgdWlTcHJpdGUsIGF1dG9tYXRpb25TY3JpcHQsIGxlZ2FjeVJ1bm5lclNjcmlwdCB9ID0gbG9hZEFzc2V0cyhkZXZlbG9wbWVudE1vZGUpO1xuXG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX0NPUkUsIHsgY29udGVudDogY29yZVNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfRFJJVkVSLCB7IGNvbnRlbnQ6IGRyaXZlclNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9MRUdBQ1lfUlVOTkVSLCB7XG4gICAgICAgICAgICBjb250ZW50OiAgICAgbGVnYWN5UnVubmVyU2NyaXB0LFxuICAgICAgICAgICAgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9BVVRPTUFUSU9OLCB7IGNvbnRlbnQ6IGF1dG9tYXRpb25TY3JpcHQsIGNvbnRlbnRUeXBlOiBDT05URU5UX1RZUEVTLmphdmFzY3JpcHQgfSk7XG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX1VJLCB7IGNvbnRlbnQ6IHVpU2NyaXB0LCBjb250ZW50VHlwZTogQ09OVEVOVF9UWVBFUy5qYXZhc2NyaXB0IH0pO1xuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9VSV9TUFJJVEUsIHsgY29udGVudDogdWlTcHJpdGUsIGNvbnRlbnRUeXBlOiBDT05URU5UX1RZUEVTLnBuZyB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfSUNPTiwgeyBjb250ZW50OiBmYXZJY29uLCBjb250ZW50VHlwZTogQ09OVEVOVF9UWVBFUy5pY29uIH0pO1xuXG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX1VJX1NUWUxFUywge1xuICAgICAgICAgICAgY29udGVudDogICAgICAgICAgICAgIHVpU3R5bGUsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogICAgICAgICAgQ09OVEVOVF9UWVBFUy5jc3MsXG4gICAgICAgICAgICBpc1NoYWRvd1VJU3R5bGVzaGVldDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfc2V0dXBTb3VyY2VNYXBzU3VwcG9ydCAoKSB7XG4gICAgICAgIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7XG4gICAgICAgICAgICBob29rUmVxdWlyZTogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBoYW5kbGVVbmNhdWdodEV4Y2VwdGlvbnM6IGZhbHNlLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6ICAgICAgICAgICAgICAnbm9kZSdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVJ1bm5lciAoaXNMaXZlTW9kZSkge1xuICAgICAgICBjb25zdCBDdG9yICAgICAgPSBpc0xpdmVNb2RlID8gTGl2ZU1vZGVSdW5uZXIgOiBSdW5uZXI7XG4gICAgICAgIGNvbnN0IG5ld1J1bm5lciA9IG5ldyBDdG9yKHRoaXMucHJveHksIHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCB0aGlzLmNvbmZpZ3VyYXRpb24uY2xvbmUoKSk7XG5cbiAgICAgICAgdGhpcy5ydW5uZXJzLnB1c2gobmV3UnVubmVyKTtcblxuICAgICAgICByZXR1cm4gbmV3UnVubmVyO1xuICAgIH1cblxuICAgIC8vIEFQSVxuICAgIGFzeW5jIGNyZWF0ZUJyb3dzZXJDb25uZWN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlckluZm8gPSBhd2FpdCBicm93c2VyUHJvdmlkZXJQb29sLmdldEJyb3dzZXJJbmZvKCdyZW1vdGUnKTtcblxuICAgICAgICByZXR1cm4gbmV3IEJyb3dzZXJDb25uZWN0aW9uKHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCBicm93c2VySW5mbywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlUnVubmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVJ1bm5lcihmYWxzZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlTGl2ZU1vZGVSdW5uZXIgKCkge1xuICAgICAgICBpZiAodGhpcy5ydW5uZXJzLnNvbWUocnVubmVyID0+IHJ1bm5lciBpbnN0YW5jZW9mIExpdmVNb2RlUnVubmVyKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90Q3JlYXRlTXVsdGlwbGVMaXZlTW9kZVJ1bm5lcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVSdW5uZXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xvc2UgKCkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucnVubmVycy5tYXAocnVubmVyID0+IHJ1bm5lci5zdG9wKCkpKTtcblxuICAgICAgICBhd2FpdCBicm93c2VyUHJvdmlkZXJQb29sLmRpc3Bvc2UoKTtcblxuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5jbG9zZSgpO1xuICAgICAgICB0aGlzLnByb3h5LmNsb3NlKCk7XG4gICAgfVxufVxuIl19
\No newline at end of file