"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = require("lodash"); const testing_unit_1 = __importDefault(require("./testing-unit")); const unit_type_1 = __importDefault(require("./unit-type")); const type_assertions_1 = require("../../errors/runtime/type-assertions"); const wrap_test_function_1 = __importDefault(require("../wrap-test-function")); const assert_type_1 = __importDefault(require("../request-hooks/assert-type")); const assert_type_2 = __importDefault(require("../../custom-client-scripts/assert-type")); const types_1 = require("../../errors/types"); const runtime_1 = require("../../errors/runtime"); const option_names_1 = __importDefault(require("../../configuration/option-names")); const testcafe_hammerhead_1 = require("testcafe-hammerhead"); const test_timeout_1 = __importDefault(require("./test-timeout")); const esm_runtime_holder_name_1 = __importDefault(require("../../services/compiler/esm-runtime-holder-name")); class Test extends testing_unit_1.default { constructor(testFile, isCompilerServiceMode = false, baseUrl, returnApiOrigin = true) { // NOTE: 'fixture' directive can be missing const fixture = testFile.currentFixture; const pageUrl = (fixture === null || fixture === void 0 ? void 0 : fixture.pageUrl) || testcafe_hammerhead_1.SPECIAL_BLANK_PAGE; super(testFile, unit_type_1.default.test, pageUrl, baseUrl); this.fixture = null; this.fn = null; this.beforeFn = null; this.afterFn = null; this.globalBeforeFn = null; this.globalAfterFn = null; this.timeouts = null; this._isCompilerService = isCompilerServiceMode; this._initFixture(testFile); // NOTE: This is internal data of 'esm' module // @ts-ignore this.esmRuntime = global[esm_runtime_holder_name_1.default] || null; if (returnApiOrigin) return this.apiOrigin; } static init({ testFile, baseUrl, isCompilerServiceMode }) { return testing_unit_1.default.init(Test, testFile, isCompilerServiceMode, baseUrl); } _initFixture(testFile) { this.fixture = testFile.currentFixture; if (!this.fixture) return; this.pageUrl = this.fixture.pageUrl || testcafe_hammerhead_1.SPECIAL_BLANK_PAGE; this.requestHooks = this.fixture.requestHooks.slice(); this.clientScripts = this.fixture.clientScripts.slice(); this.skipJsErrorsOptions = this.fixture.skipJsErrorsOptions; } _add(name, fn) { if (this._isCompilerService && !this.fixture) this._initFixture(this.testFile); (0, type_assertions_1.assertType)(type_assertions_1.is.string, 'apiOrigin', 'The test name', name); (0, type_assertions_1.assertType)(type_assertions_1.is.function, 'apiOrigin', 'The test body', fn); (0, type_assertions_1.assertType)(type_assertions_1.is.nonNullObject, 'apiOrigin', `The fixture of '${name}' test`, this.fixture); this.name = name; this.fn = (0, wrap_test_function_1.default)(fn); if (!this.testFile.collectedTests.includes(this)) this.testFile.collectedTests.push(this); return this.apiOrigin; } _before$(fn) { (0, type_assertions_1.assertType)(type_assertions_1.is.function, 'before', 'The test.before hook', fn); this.beforeFn = (0, wrap_test_function_1.default)(fn); return this.apiOrigin; } _after$(fn) { (0, type_assertions_1.assertType)(type_assertions_1.is.function, 'after', 'The test.after hook', fn); this.afterFn = (0, wrap_test_function_1.default)(fn); return this.apiOrigin; } _requestHooks$(...hooks) { if (this.apiMethodWasCalled.requestHooks) throw new runtime_1.APIError(option_names_1.default.requestHooks, types_1.RUNTIME_ERRORS.multipleAPIMethodCallForbidden, option_names_1.default.requestHooks); hooks = (0, lodash_1.flattenDeep)(hooks); (0, assert_type_1.default)(hooks); this.requestHooks = (0, lodash_1.union)(this.requestHooks, hooks); this.apiMethodWasCalled.requestHooks = true; return this.apiOrigin; } _clientScripts$(...scripts) { if (this.apiMethodWasCalled.clientScripts) throw new runtime_1.APIError(option_names_1.default.clientScripts, types_1.RUNTIME_ERRORS.multipleAPIMethodCallForbidden, option_names_1.default.clientScripts); scripts = (0, lodash_1.flattenDeep)(scripts); (0, assert_type_2.default)(scripts); this.clientScripts = (0, lodash_1.union)(this.clientScripts, scripts); this.apiMethodWasCalled.clientScripts = true; return this.apiOrigin; } _timeouts$(timeouts) { (0, type_assertions_1.assertType)(type_assertions_1.is.testTimeouts, 'timeouts', 'test.timeouts', timeouts); Object.keys(test_timeout_1.default) .filter(timeout => timeout in timeouts) .forEach(timeout => { (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumber, 'timeouts', `test.timeouts.${timeout}`, timeouts[timeout]); }); this.timeouts = timeouts; return this.apiOrigin; } } exports.default = Test; testing_unit_1.default.makeAPIListForChildClass(Test); module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvc3RydWN0dXJlL3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBdUQ7QUFDdkQsa0VBQXlDO0FBQ3pDLDREQUFtQztBQUNuQywwRUFBc0U7QUFDdEUsK0VBQXFEO0FBQ3JELCtFQUFpRTtBQUNqRSwwRkFBNkU7QUFDN0UsOENBQW9EO0FBQ3BELGtEQUFnRDtBQUNoRCxvRkFBNEQ7QUFLNUQsNkRBQXlEO0FBRXpELGtFQUF5QztBQUN6Qyw4R0FBc0Y7QUFRdEYsTUFBcUIsSUFBSyxTQUFRLHNCQUFXO0lBV3pDLFlBQW9CLFFBQWtCLEVBQUUscUJBQXFCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsZUFBZSxHQUFHLElBQUk7UUFDM0csMkNBQTJDO1FBQzNDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxjQUF5QixDQUFDO1FBQ25ELE1BQU0sT0FBTyxHQUFHLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8sS0FBSSx3Q0FBa0IsQ0FBQztRQUV2RCxLQUFLLENBQUMsUUFBUSxFQUFFLG1CQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsT0FBTyxHQUFVLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsRUFBRSxHQUFlLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFTLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFVLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFJLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFTLElBQUksQ0FBQztRQUUzQixJQUFJLENBQUMsa0JBQWtCLEdBQUcscUJBQXFCLENBQUM7UUFFaEQsSUFBSSxD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QUFNLENBQUMsSUFBSSxDQUFDLHNCQUFXLENBQUM7YUFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQzthQUN0QyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDZixJQUFBLDRCQUFVLEVBQUMsb0JBQUUsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLE9BQU8sRUFBRSxFQUFFLFFBQVEsQ0FBQyxPQUE2QixDQUFDLENBQUMsQ0FBQztRQUN0SCxDQUFDLENBQUMsQ0FBQztRQUVQLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBRXpCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0NBQ0o7QUFoSUQsdUJBZ0lDO0FBRUQsc0JBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZsYXR0ZW5EZWVwIGFzIGZsYXR0ZW4sIHVuaW9uIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBUZXN0aW5nVW5pdCBmcm9tICcuL3Rlc3RpbmctdW5pdCc7XG5pbXBvcnQgVW5pdFR5cGUgZnJvbSAnLi91bml0LXR5cGUnO1xuaW1wb3J0IHsgYXNzZXJ0VHlwZSwgaXMgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZS90eXBlLWFzc2VydGlvbnMnO1xuaW1wb3J0IHdyYXBUZXN0RnVuY3Rpb24gZnJvbSAnLi4vd3JhcC10ZXN0LWZ1bmN0aW9uJztcbmltcG9ydCBhc3NlcnRSZXF1ZXN0SG9va1R5cGUgZnJvbSAnLi4vcmVxdWVzdC1ob29rcy9hc3NlcnQtdHlwZSc7XG5pbXBvcnQgYXNzZXJ0Q2xpZW50U2NyaXB0VHlwZSBmcm9tICcuLi8uLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvYXNzZXJ0LXR5cGUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi8uLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IHsgQVBJRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgT1BUSU9OX05BTUVTIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vb3B0aW9uLW5hbWVzJztcbmltcG9ydCBUZXN0RmlsZSBmcm9tICcuL3Rlc3QtZmlsZSc7XG5pbXBvcnQgRml4dHVyZSBmcm9tICcuL2ZpeHR1cmUnO1xuaW1wb3J0IFJlcXVlc3RIb29rIGZyb20gJy4uL3JlcXVlc3QtaG9va3MvaG9vayc7XG5pbXBvcnQgQ2xpZW50U2NyaXB0SW5pdCBmcm9tICcuLi8uLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvY2xpZW50LXNjcmlwdC1pbml0JztcbmltcG9ydCB7IFNQRUNJQUxfQkxBTktfUEFHRSB9IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuaW1wb3J0IHsgVGVzdFRpbWVvdXRzIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCBUZXN0VGltZW91dCBmcm9tICcuL3Rlc3QtdGltZW91dCc7XG5pbXBvcnQgRVNNX1JVTlRJTUVfSE9MREVSX05BTUUgZnJvbSAnLi4vLi4vc2VydmljZXMvY29tcGlsZXIvZXNtLXJ1bnRpbWUtaG9sZGVyLW5hbWUnO1xuXG5pbnRlcmZhY2UgVGVzdEluaXRPcHRpb25zIHtcbiAgICB0ZXN0RmlsZTogVGVzdEZpbGU7XG4gICAgYmFzZVVybD86IHN0cmluZztcbiAgICBpc0NvbXBpbGVyU2VydmljZU1vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXN0IGV4dGVuZHMgVGVzdGluZ1VuaXQge1xuICAgIHB1YmxpYyBmaXh0dXJlOiBGaXh0dXJlIHwgbnVsbDtcbiAgICBwdWJsaWMgZm46IEZ1bmN0aW9uIHwgbnVsbDtcbiAgICBwdWJsaWMgYmVmb3JlRm46IEZ1bmN0aW9uIHwgbnVsbDtcbiAgICBwdWJsaWMgYWZ0ZXJGbjogRnVuY3Rpb24gfCBudWxsO1xuICAgIHB1YmxpYyBnbG9iYWxCZWZvcmVGbjogRnVuY3Rpb24gfCBudWxsO1xuICAgIHB1YmxpYyBnbG9iYWxBZnRlckZuOiBGdW5jdGlvbiB8IG51bGw7XG4gICAgcHVibGljIHRpbWVvdXRzOiBUZXN0VGltZW91dHMgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2lzQ29tcGlsZXJTZXJ2aWNlOiBib29sZWFuO1xuICAgIHB1YmxpYyByZWFkb25seSBlc21SdW50aW1lOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHRlc3RGaWxlOiBUZXN0RmlsZSwgaXNDb21waWxlclNlcnZpY2VNb2RlID0gZmFsc2UsIGJhc2VVcmw/OiBzdHJpbmcsIHJldHVybkFwaU9yaWdpbiA9IHRydWUpIHtcbiAgICAgICAgLy8gTk9URTogJ2ZpeHR1cmUnIGRpcmVjdGl2ZSBjYW4gYmUgbWlzc2luZ1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gdGVzdEZpbGUuY3VycmVudEZpeHR1cmUgYXMgRml4dHVyZTtcbiAgICAgICAgY29uc3QgcGFnZVVybCA9IGZpeHR1cmU/LnBhZ2VVcmwgfHwgU1BFQ0lBTF9CTEFOS19QQUdFO1xuXG4gICAgICAgIHN1cGVyKHRlc3RGaWxlLCBVbml0VHlwZS50ZXN0LCBwYWdlVXJsLCBiYXNlVXJsKTtcblxuICAgICAgICB0aGlzLmZpeHR1cmUgICAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5mbiAgICAgICAgICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMuYmVmb3JlRm4gICAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLmFmdGVyRm4gICAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5nbG9iYWxCZWZvcmVGbiA9IG51bGw7XG4gICAgICAgIHRoaXMuZ2xvYmFsQWZ0ZXJGbiAgPSBudWxsO1xuICAgICAgICB0aGlzLnRpbWVvdXRzICAgICAgID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9pc0NvbXBpbGVyU2VydmljZSA9IGlzQ29tcGlsZXJTZXJ2aWNlTW9kZTtcblxuICAgICAgICB0aGlzLl9pbml0Rml4dHVyZSh0ZXN0RmlsZSk7XG5cbiAgICAgICAgLy8gTk9URTogVGhpcyBpcyBpbnRlcm5hbCBkYXRhIG9mICdlc20nIG1vZHVsZVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZXNtUnVudGltZSA9IGdsb2JhbFtFU01fUlVOVElNRV9IT0xERVJfTkFNRV0gfHwgbnVsbDtcblxuICAgICAgICBpZiAocmV0dXJuQXBpT3JpZ2luKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpT3JpZ2luIGFzIHVua25vd24gYXMgVGVzdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGluaXQgKHsgdGVzdEZpbGUsIGJhc2VVcmwsIGlzQ29tcGlsZXJTZXJ2aWNlTW9kZSB9OiBUZXN0SW5pdE9wdGlvbnMpOiBUZXN0IHtcbiAgICAgICAgcmV0dXJuIFRlc3RpbmdVbml0LmluaXQoVGVzdCwgdGVzdEZpbGUsIGlzQ29tcGlsZXJTZXJ2aWNlTW9kZSwgYmFzZVVybCkgYXMgdW5rbm93biBhcyBUZXN0O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRGaXh0dXJlICh0ZXN0RmlsZTogVGVzdEZpbGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maXh0dXJlID0gdGVzdEZpbGUuY3VycmVudEZpeHR1cmU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpeHR1cmUpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5wYWdlVXJsICAgICAgICAgICAgID0gdGhpcy5maXh0dXJlLnBhZ2VVcmwgfHwgU1BFQ0lBTF9CTEFOS19QQUdFO1xuICAgICAgICB0aGlzLnJlcXVlc3RIb29rcyAgICAgICAgPSB0aGlzLmZpeHR1cmUucmVxdWVzdEhvb2tzLnNsaWNlKCk7XG4gICAgICAgIHRoaXMuY2xpZW50U2NyaXB0cyAgICAgICA9IHRoaXMuZml4dHVyZS5jbGllbnRTY3JpcHRzLnNsaWNlKCk7XG4gICAgICAgIHRoaXMuc2tpcEpzRXJyb3JzT3B0aW9ucyA9IHRoaXMuZml4dHVyZS5za2lwSnNFcnJvcnNPcHRpb25zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfYWRkIChuYW1lOiBzdHJpbmcsIGZuOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29tcGlsZXJTZXJ2aWNlICYmICF0aGlzLmZpeHR1cmUpXG4gICAgICAgICAgICB0aGlzLl9pbml0Rml4dHVyZSh0aGlzLnRlc3RGaWxlKTtcblxuICAgICAgICBhc3NlcnRUeXBlKGlzLnN0cmluZywgJ2FwaU9yaWdpbicsICdUaGUgdGVzdCBuYW1lJywgbmFtZSk7XG4gICAgICAgIGFzc2VydFR5cGUoaXMuZnVuY3Rpb24sICdhcGlPcmlnaW4nLCAnVGhlIHRlc3QgYm9keScsIGZuKTtcbiAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OdWxsT2JqZWN0LCAnYXBpT3JpZ2luJywgYFRoZSBmaXh0dXJlIG9mICcke25hbWV9JyB0ZXN0YCwgdGhpcy5maXh0dXJlKTtcblxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmZuICAgPSB3cmFwVGVzdEZ1bmN0aW9uKGZuKTtcblxuICAgICAgICBpZiAoIXRoaXMudGVzdEZpbGUuY29sbGVjdGVkVGVzdHMuaW5jbHVkZXModGhpcykpXG4gICAgICAgICAgICB0aGlzLnRlc3RGaWxlLmNvbGxlY3RlZFRlc3RzLnB1c2godGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpT3JpZ2luO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2JlZm9yZSQgKGZuOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgICAgICAgYXNzZXJ0VHlwZShpcy5mdW5jdGlvbiwgJ2JlZm9yZScsICdUaGUgdGVzdC5iZWZvcmUgaG9vaycsIGZuKTtcblxuICAgICAgICB0aGlzLmJlZm9yZUZuID0gd3JhcFRlc3RGdW5jdGlvbihmbik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpT3JpZ2luO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FmdGVyJCAoZm46IEZ1bmN0aW9uKTogRnVuY3Rpb24ge1xuICAgICAgICBhc3NlcnRUeXBlKGlzLmZ1bmN0aW9uLCAnYWZ0ZXInLCAnVGhlIHRlc3QuYWZ0ZXIgaG9vaycsIGZuKTtcblxuICAgICAgICB0aGlzLmFmdGVyRm4gPSB3cmFwVGVzdEZ1bmN0aW9uKGZuKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcGlPcmlnaW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVxdWVzdEhvb2tzJCAoLi4uaG9va3M6IFJlcXVlc3RIb29rW10pOiBGdW5jdGlvbiB7XG4gICAgICAgIGlmICh0aGlzLmFwaU1ldGhvZFdhc0NhbGxlZC5yZXF1ZXN0SG9va3MpXG4gICAgICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoT1BUSU9OX05BTUVTLnJlcXVlc3RIb29rcywgUlVOVElNRV9FUlJPUlMubXVsdGlwbGVBUElNZXRob2RDYWxsRm9yYmlkZGVuLCBPUFRJT05fTkFNRVMucmVxdWVzdEhvb2tzKTtcblxuICAgICAgICBob29rcyA9IGZsYXR0ZW4oaG9va3MpO1xuXG4gICAgICAgIGFzc2VydFJlcXVlc3RIb29rVHlwZShob29rcyk7XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SG9va3MgICAgICAgICAgICAgICAgICAgID0gdW5pb24odGhpcy5yZXF1ZXN0SG9va3MsIGhvb2tzKTtcbiAgICAgICAgdGhpcy5hcGlNZXRob2RXYXNDYWxsZWQucmVxdWVzdEhvb2tzID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcGlPcmlnaW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2xpZW50U2NyaXB0cyQgKC4uLnNjcmlwdHM6IENsaWVudFNjcmlwdEluaXRbXSk6IEZ1bmN0aW9uIHtcbiAgICAgICAgaWYgKHRoaXMuYXBpTWV0aG9kV2FzQ2FsbGVkLmNsaWVudFNjcmlwdHMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoT1BUSU9OX05BTUVTLmNsaWVudFNjcmlwdHMsIFJVTlRJTUVfRVJST1JTLm11bHRpcGxlQVBJTWV0aG9kQ2FsbEZvcmJpZGRlbiwgT1BUSU9OX05BTUVTLmNsaWVudFNjcmlwdHMpO1xuXG4gICAgICAgIHNjcmlwdHMgPSBmbGF0dGVuKHNjcmlwdHMpO1xuXG4gICAgICAgIGFzc2VydENsaWVudFNjcmlwdFR5cGUoc2NyaXB0cyk7XG5cbiAgICAgICAgdGhpcy5jbGllbnRTY3JpcHRzICAgICAgICAgICAgICAgICAgICA9IHVuaW9uKHRoaXMuY2xpZW50U2NyaXB0cywgc2NyaXB0cyk7XG4gICAgICAgIHRoaXMuYXBpTWV0aG9kV2FzQ2FsbGVkLmNsaWVudFNjcmlwdHMgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwaU9yaWdpbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF90aW1lb3V0cyQgKHRpbWVvdXRzOiBUZXN0VGltZW91dHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGFzc2VydFR5cGUoaXMudGVzdFRpbWVvdXRzLCAndGltZW91dHMnLCAndGVzdC50aW1lb3V0cycsIHRpbWVvdXRzKTtcblxuICAgICAgICBPYmplY3Qua2V5cyhUZXN0VGltZW91dClcbiAgICAgICAgICAgIC5maWx0ZXIodGltZW91dCA9PiB0aW1lb3V0IGluIHRpbWVvdXRzKVxuICAgICAgICAgICAgLmZvckVhY2godGltZW91dCA9PiB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlciwgJ3RpbWVvdXRzJywgYHRlc3QudGltZW91dHMuJHt0aW1lb3V0fWAsIHRpbWVvdXRzW3RpbWVvdXQgYXMga2V5b2YgVGVzdFRpbWVvdXRzXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRpbWVvdXRzID0gdGltZW91dHM7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpT3JpZ2luO1xuICAgIH1cbn1cblxuVGVzdGluZ1VuaXQubWFrZUFQSUxpc3RGb3JDaGlsZENsYXNzKFRlc3QpO1xuIl19