testcafe
Version:
Automated browser testing for the modern web development stack.
161 lines • 21.3 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const pinkie_1 = __importDefault(require("pinkie"));
const lodash_1 = require("lodash");
const test_run_controller_1 = __importDefault(require("./test-run-controller"));
const controller_1 = __importDefault(require("./controller"));
const runner_1 = __importDefault(require("../runner"));
const bootstrapper_1 = __importDefault(require("./bootstrapper"));
const parse_file_list_1 = __importDefault(require("../utils/parse-file-list"));
const runtime_1 = require("../errors/runtime");
const types_1 = require("../errors/types");
class LiveModeRunner extends runner_1.default {
constructor(proxy, browserConnectionGateway, options) {
super(proxy, browserConnectionGateway, options);
/* EVENTS */
this.TEST_RUN_DONE_EVENT = 'test-run-done';
this.REQUIRED_MODULE_FOUND_EVENT = 'require-module-found';
this.stopping = false;
this.tcRunnerTaskPromise = null;
this.stopInfiniteWaiting = lodash_1.noop;
this.rejectInfiniteWaiting = lodash_1.noop;
this.preventRunCall = false;
this.assets = null;
this.testRunController = new test_run_controller_1.default();
this.embeddingOptions({
TestRunCtor: this.testRunController.TestRunCtor,
assets: []
});
this.controller = this._createController();
}
runTests(isFirstRun = false) {
let runError = null;
return this._finishPreviousTestRuns()
.then(() => {
return this._validateRunnableConfiguration(isFirstRun);
})
.then(() => {
this.testRunController.setExpectedTestCount(this.liveConfigurationCache.tests.filter(t => !t.skip).length);
})
.then(() => {
this.tcRunnerTaskPromise = super.run(this.opts);
return this.tcRunnerTaskPromise;
})
.catch(err => {
this.setBootstrappingError(null);
runError = err;
})
.then(() => {
this.tcRunnerTaskPromise = null;
this.emit(this.TEST_RUN_DONE_EVENT, { err: runError });
});
}
_validateRunOptions() {
return super._validateRunOptions()
.catch(err => {
this.rejectInfiniteWaiting(err);
});
}
_createRunnableConfiguration() {
if (this.liveConfigurationCache)
return pinkie_1.default.resolve(this.liveConfigurationCache);
return super._createRunnableConfiguration()
.then(configuration => {
this.liveConfigurationCache = configuration;
return configuration;
})
.catch(err => {
this.rejectInfiniteWaiting(err);
});
}
setBootstrappingError(err) {
this.bootstrappingError = err;
}
run(options) {
if (this.preventRunCall)
throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotRunLiveModeRunnerMultipleTimes);
this.preventRunCall = true;
this.opts = Object.assign({}, this.opts, options);
this._setBootstrapperOptions();
const fileListPromise = parse_file_list_1.default(this.bootstrapper.sources, process.cwd());
fileListPromise
.then(files => this.controller.init(files))
.then(() => this._createRunnableConfiguration())
.then(() => this.runTests(true));
return this._waitUntilExit()
.then(() => {
return this._dispose();
})
.then(() => {
this.preventRunCall = false;
});
}
suspend() {
if (!this.tcRunnerTaskPromise)
return pinkie_1.default.resolve();
this.stopping = true;
this.testRunController.stop();
this.tcRunnerTaskPromise.cancel();
return this.testRunController.allTestsCompletePromise
.then(() => {
this.stopping = false;
this.emit(this.TEST_RUN_DONE_EVENT, {});
});
}
exit() {
if (this.tcRunnerTaskPromise)
this.tcRunnerTaskPromise.cancel();
return pinkie_1.default.resolve()
.then(() => this.stopInfiniteWaiting());
}
async _finishPreviousTestRuns() {
if (!this.liveConfigurationCache.tests)
return;
this.testRunController.run();
}
_validateRunnableConfiguration(isFirstRun) {
if (isFirstRun) {
if (this.bootstrappingError)
return pinkie_1.default.reject(this.bootstrappingError);
return pinkie_1.default.resolve();
}
return this.bootstrapper._getTests()
.then(tests => {
this.liveConfigurationCache.tests = tests;
return this.bootstrappingError ? pinkie_1.default.reject(this.bootstrappingError) : pinkie_1.default.resolve();
});
}
_createTask(tests, browserConnectionGroups, proxy, opts) {
opts.live = true;
return super._createTask(tests, browserConnectionGroups, proxy, opts);
}
_createBootstrapper(browserConnectionGateway) {
return new bootstrapper_1.default(this, browserConnectionGateway);
}
_createController() {
return new controller_1.default(this);
}
_waitUntilExit() {
return new pinkie_1.default((resolve, reject) => {
this.stopInfiniteWaiting = resolve;
this.rejectInfiniteWaiting = reject;
});
}
_disposeAssets(browserSet, reporters, testedApp) {
this.assets = { browserSet, reporters, testedApp };
return pinkie_1.default.resolve();
}
_dispose() {
this.controller.dispose();
if (!this.assets)
return pinkie_1.default.resolve();
const { browserSet, reporters, testedApp } = this.assets;
return super._disposeAssets(browserSet, reporters, testedApp);
}
}
exports.default = LiveModeRunner;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGl2ZS90ZXN0LXJ1bm5lci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE2QjtBQUM3QixtQ0FBOEI7QUFDOUIsZ0ZBQThEO0FBQzlELDhEQUE4QztBQUM5Qyx1REFBK0I7QUFDL0Isa0VBQWtEO0FBQ2xELCtFQUFxRDtBQUNyRCwrQ0FBaUQ7QUFDakQsMkNBQWlEO0FBRWpELE1BQU0sY0FBZSxTQUFRLGdCQUFNO0lBQy9CLFlBQWEsS0FBSyxFQUFFLHdCQUF3QixFQUFFLE9BQU87UUFDakQsS0FBSyxDQUFDLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVoRCxZQUFZO1FBQ1osSUFBSSxDQUFDLG1CQUFtQixHQUFXLGVBQWUsQ0FBQztRQUNuRCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsc0JBQXNCLENBQUM7UUFFMUQsSUFBSSxDQUFDLFFBQVEsR0FBZ0IsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxtQkFBbUIsR0FBSyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixHQUFLLGFBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsYUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQVUsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQWtCLElBQUksQ0FBQztRQUVsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSw2QkFBeUIsRUFBRSxDQUFDO1FBRXpELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUNsQixXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVc7WUFDL0MsTUFBTSxFQUFPLEVBQUU7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRUQsUUFB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Q0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxjQUFjO1FBQ1YsT0FBTyxJQUFJLGdCQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLG1CQUFtQixHQUFLLE9BQU8sQ0FBQztZQUNyQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGNBQWMsQ0FBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFFbkQsT0FBTyxnQkFBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDWixPQUFPLGdCQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFN0IsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUV6RCxPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNsRSxDQUFDO0NBQ0o7QUFFRCxrQkFBZSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvbWlzZSBmcm9tICdwaW5raWUnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgTGl2ZU1vZGVUZXN0UnVuQ29udHJvbGxlciBmcm9tICcuL3Rlc3QtcnVuLWNvbnRyb2xsZXInO1xuaW1wb3J0IExpdmVNb2RlQ29udHJvbGxlciBmcm9tICcuL2NvbnRyb2xsZXInO1xuaW1wb3J0IFJ1bm5lciBmcm9tICcuLi9ydW5uZXInO1xuaW1wb3J0IExpdmVNb2RlQm9vdHN0cmFwcGVyIGZyb20gJy4vYm9vdHN0cmFwcGVyJztcbmltcG9ydCBwYXJzZUZpbGVMaXN0IGZyb20gJy4uL3V0aWxzL3BhcnNlLWZpbGUtbGlzdCc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uL2Vycm9ycy90eXBlcyc7XG5cbmNsYXNzIExpdmVNb2RlUnVubmVyIGV4dGVuZHMgUnVubmVyIHtcbiAgICBjb25zdHJ1Y3RvciAocHJveHksIGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihwcm94eSwgYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCBvcHRpb25zKTtcblxuICAgICAgICAvKiBFVkVOVFMgKi9cbiAgICAgICAgdGhpcy5URVNUX1JVTl9ET05FX0VWRU5UICAgICAgICAgPSAndGVzdC1ydW4tZG9uZSc7XG4gICAgICAgIHRoaXMuUkVRVUlSRURfTU9EVUxFX0ZPVU5EX0VWRU5UID0gJ3JlcXVpcmUtbW9kdWxlLWZvdW5kJztcblxuICAgICAgICB0aGlzLnN0b3BwaW5nICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRjUnVubmVyVGFza1Byb21pc2UgICA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RvcEluZmluaXRlV2FpdGluZyAgID0gbm9vcDtcbiAgICAgICAgdGhpcy5yZWplY3RJbmZpbml0ZVdhaXRpbmcgPSBub29wO1xuICAgICAgICB0aGlzLnByZXZlbnRSdW5DYWxsICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFzc2V0cyAgICAgICAgICAgICAgICA9IG51bGw7XG5cbiAgICAgICAgdGhpcy50ZXN0UnVuQ29udHJvbGxlciA9IG5ldyBMaXZlTW9kZVRlc3RSdW5Db250cm9sbGVyKCk7XG5cbiAgICAgICAgdGhpcy5lbWJlZGRpbmdPcHRpb25zKHtcbiAgICAgICAgICAgIFRlc3RSdW5DdG9yOiB0aGlzLnRlc3RSdW5Db250cm9sbGVyLlRlc3RSdW5DdG9yLFxuICAgICAgICAgICAgYXNzZXRzOiAgICAgIFtdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IHRoaXMuX2NyZWF0ZUNvbnRyb2xsZXIoKTtcbiAgICB9XG5cbiAgICBydW5UZXN0cyAoaXNGaXJzdFJ1biA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBydW5FcnJvciA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaFByZXZpb3VzVGVzdFJ1bnMoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVJ1bm5hYmxlQ29uZmlndXJhdGlvbihpc0ZpcnN0UnVuKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXN0UnVuQ29udHJvbGxlci5zZXRFeHBlY3RlZFRlc3RDb3VudCh0aGlzLmxpdmVDb25maWd1cmF0aW9uQ2FjaGUudGVzdHMuZmlsdGVyKHQgPT4gIXQuc2tpcCkubGVuZ3RoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50Y1J1bm5lclRhc2tQcm9taXNlID0gc3VwZXIucnVuKHRoaXMub3B0cyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50Y1J1bm5lclRhc2tQcm9taXNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Qm9vdHN0cmFwcGluZ0Vycm9yKG51bGwpO1xuXG4gICAgICAgICAgICAgICAgcnVuRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGNSdW5uZXJUYXNrUHJvbWlzZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQodGhpcy5URVNUX1JVTl9ET05FX0VWRU5ULCB7IGVycjogcnVuRXJyb3IgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVSdW5PcHRpb25zICgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLl92YWxpZGF0ZVJ1bk9wdGlvbnMoKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3RJbmZpbml0ZVdhaXRpbmcoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jcmVhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5saXZlQ29uZmlndXJhdGlvbkNhY2hlKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmxpdmVDb25maWd1cmF0aW9uQ2FjaGUpO1xuXG4gICAgICAgIHJldHVybiBzdXBlci5fY3JlYXRlUnVubmFibGVDb25maWd1cmF0aW9uKClcbiAgICAgICAgICAgIC50aGVuKGNvbmZpZ3VyYXRpb24gPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubGl2ZUNvbmZpZ3VyYXRpb25DYWNoZSA9IGNvbmZpZ3VyYXRpb247XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlamVjdEluZmluaXRlV2FpdGluZyhlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0Qm9vdHN0cmFwcGluZ0Vycm9yIChlcnIpIHtcbiAgICAgICAgdGhpcy5ib290c3RyYXBwaW5nRXJyb3IgPSBlcnI7XG4gICAgfVxuXG4gICAgcnVuIChvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLnByZXZlbnRSdW5DYWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3RSdW5MaXZlTW9kZVJ1bm5lck11bHRpcGxlVGltZXMpO1xuXG4gICAgICAgIHRoaXMucHJldmVudFJ1bkNhbGwgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMub3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5fc2V0Qm9vdHN0cmFwcGVyT3B0aW9ucygpO1xuXG4gICAgICAgIGNvbnN0IGZpbGVMaXN0UHJvbWlzZSA9IHBhcnNlRmlsZUxpc3QodGhpcy5ib290c3RyYXBwZXIuc291cmNlcywgcHJvY2Vzcy5jd2QoKSk7XG5cbiAgICAgICAgZmlsZUxpc3RQcm9taXNlXG4gICAgICAgICAgICAudGhlbihmaWxlcyA9PiB0aGlzLmNvbnRyb2xsZXIuaW5pdChmaWxlcykpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLl9jcmVhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24oKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucnVuVGVzdHModHJ1ZSkpO1xuXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhaXRVbnRpbEV4aXQoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXNwb3NlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmVudFJ1bkNhbGwgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1c3BlbmQgKCkge1xuICAgICAgICBpZiAoIXRoaXMudGNSdW5uZXJUYXNrUHJvbWlzZSlcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICB0aGlzLnN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZXN0UnVuQ29udHJvbGxlci5zdG9wKCk7XG4gICAgICAgIHRoaXMudGNSdW5uZXJUYXNrUHJvbWlzZS5jYW5jZWwoKTtcblxuXG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RSdW5Db250cm9sbGVyLmFsbFRlc3RzQ29tcGxldGVQcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wcGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KHRoaXMuVEVTVF9SVU5fRE9ORV9FVkVOVCwge30pO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXhpdCAoKSB7XG4gICAgICAgIGlmICh0aGlzLnRjUnVubmVyVGFza1Byb21pc2UpXG4gICAgICAgICAgICB0aGlzLnRjUnVubmVyVGFza1Byb21pc2UuY2FuY2VsKCk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnN0b3BJbmZpbml0ZVdhaXRpbmcoKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgX2ZpbmlzaFByZXZpb3VzVGVzdFJ1bnMgKCkge1xuICAgICAgICBpZiAoIXRoaXMubGl2ZUNvbmZpZ3VyYXRpb25DYWNoZS50ZXN0cykgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMudGVzdFJ1bkNvbnRyb2xsZXIucnVuKCk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlUnVubmFibGVDb25maWd1cmF0aW9uIChpc0ZpcnN0UnVuKSB7XG4gICAgICAgIGlmIChpc0ZpcnN0UnVuKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ib290c3RyYXBwaW5nRXJyb3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHRoaXMuYm9vdHN0cmFwcGluZ0Vycm9yKTtcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYm9vdHN0cmFwcGVyLl9nZXRUZXN0cygpXG4gICAgICAgICAgICAudGhlbih0ZXN0cyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXZlQ29uZmlndXJhdGlvbkNhY2hlLnRlc3RzID0gdGVzdHM7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ib290c3RyYXBwaW5nRXJyb3IgPyBQcm9taXNlLnJlamVjdCh0aGlzLmJvb3RzdHJhcHBpbmdFcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jcmVhdGVUYXNrICh0ZXN0cywgYnJvd3NlckNvbm5lY3Rpb25Hcm91cHMsIHByb3h5LCBvcHRzKSB7XG4gICAgICAgIG9wdHMubGl2ZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9jcmVhdGVUYXNrKHRlc3RzLCBicm93c2VyQ29ubmVjdGlvbkdyb3VwcywgcHJveHksIG9wdHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVCb290c3RyYXBwZXIgKGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSkge1xuICAgICAgICByZXR1cm4gbmV3IExpdmVNb2RlQm9vdHN0cmFwcGVyKHRoaXMsIGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNvbnRyb2xsZXIgKCkge1xuICAgICAgICByZXR1cm4gbmV3IExpdmVNb2RlQ29udHJvbGxlcih0aGlzKTtcbiAgICB9XG5cbiAgICBfd2FpdFVudGlsRXhpdCAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0b3BJbmZpbml0ZVdhaXRpbmcgICA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLnJlamVjdEluZmluaXRlV2FpdGluZyA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2Rpc3Bvc2VBc3NldHMgKGJyb3dzZXJTZXQsIHJlcG9ydGVycywgdGVzdGVkQXBwKSB7XG4gICAgICAgIHRoaXMuYXNzZXRzID0geyBicm93c2VyU2V0LCByZXBvcnRlcnMsIHRlc3RlZEFwcCB9O1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBfZGlzcG9zZSAoKSB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kaXNwb3NlKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFzc2V0cylcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICBjb25zdCB7IGJyb3dzZXJTZXQsIHJlcG9ydGVycywgdGVzdGVkQXBwIH0gPSB0aGlzLmFzc2V0cztcblxuICAgICAgICByZXR1cm4gc3VwZXIuX2Rpc3Bvc2VBc3NldHMoYnJvd3NlclNldCwgcmVwb3J0ZXJzLCB0ZXN0ZWRBcHApO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGl2ZU1vZGVSdW5uZXI7XG4iXX0=