UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

147 lines 18.8 kB
"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 promisify_event_1 = __importDefault(require("promisify-event")); const browser_job_result_1 = __importDefault(require("../../runner/browser-job-result")); const connection_1 = __importDefault(require("../connection")); const warning_message_1 = __importDefault(require("../../notifications/warning-message")); const testcafe_hammerhead_1 = require("testcafe-hammerhead"); const name = Symbol(); class BrowserProviderPluginHost { constructor(providerObject, providerName) { this.JOB_RESULT = (0, lodash_1.assignIn)({}, browser_job_result_1.default); (0, lodash_1.assignIn)(this, providerObject); this[name] = providerName; } // Helpers get providerName() { return this[name]; } async runInitScript(browserId, code) { const connection = connection_1.default.getById(browserId); return connection.runInitScript(`(${code})()`); } calculateWindowId() { return (0, testcafe_hammerhead_1.generateUniqueId)(); } waitForConnectionReady(browserId) { const connection = connection_1.default.getById(browserId); if (connection.isReady()) return Promise.resolve(); return (0, promisify_event_1.default)(connection, 'ready'); } reportWarning(browserId, ...args) { const connection = connection_1.default.getById(browserId); connection.addWarning(...args); } setUserAgentMetaInfo(browserId, message, ...args) { const connection = connection_1.default.getById(browserId); connection.setProviderMetaInfo(message, ...args); } async closeLocalBrowser(browserId) { const connection = connection_1.default.getById(browserId); await connection.provider._ensureBrowserWindowDescriptor(browserId); await connection.provider._closeLocalBrowser(browserId); } async resizeLocalBrowserWindow(browserId, width, height, currentWidth, currentHeight) { const connection = connection_1.default.getById(browserId); await connection.provider._ensureBrowserWindowParameters(browserId); await connection.provider._resizeLocalBrowserWindow(browserId, width, height, currentWidth, currentHeight); } // API // Browser control async openBrowser( /* browserId, pageUrl, browserName */) { throw new Error('Not implemented!'); } async closeBrowser( /* browserId */) { throw new Error('Not implemented!'); } // Initialization async init() { return; } async dispose() { return; } // Browser names handling async getBrowserList() { throw new Error('Not implemented!'); } async isValidBrowserName( /* browserName */) { return true; } // Extra functions // NOTE: // The browserName argument is optional, and must be supplied if the browserId argument is not valid // (browser is not opened) async isLocalBrowser( /* browserId[, browserName] */) { return false; } // NOTE: // The browserName argument is optional, and must be supplied if the browserId argument is not valid // (browser is not opened) isHeadlessBrowser( /* browserId[, browserName] */) { return false; } async hasCustomActionForBrowser( /* browserId */) { return { hasCloseBrowser: this.hasOwnProperty('closeBrowser'), hasResizeWindow: this.hasOwnProperty('resizeWindow'), hasTakeScreenshot: this.hasOwnProperty('takeScreenshot'), hasGetVideoFrameData: this.hasOwnProperty('getVideoFrameData'), hasCanResizeWindowToDimensions: this.hasOwnProperty('canResizeWindowToDimensions'), hasMaximizeWindow: this.hasOwnProperty('maximizeWindow'), hasChromelessScreenshots: false, }; } async resizeWindow(browserId /*, width, height, currentWidth, currentHeight */) { this.reportWarning(browserId, warning_message_1.default.resizeNotSupportedByBrowserProvider, this[name]); } async canResizeWindowToDimensions( /* browserId, width, height */) { return true; } async takeScreenshot(browserId /*, screenshotPath, pageWidth, pageHeight */) { this.reportWarning(browserId, warning_message_1.default.screenshotNotSupportedByBrowserProvider, this[name]); } async maximizeWindow(browserId) { this.reportWarning(browserId, warning_message_1.default.maximizeNotSupportedByBrowserProvider, this[name]); } async startCapturingVideo( /*browserId*/) { } async stopCapturingVideo( /*browserId*/) { } async getVideoFrameData(browserId) { const browserAlias = connection_1.default.getById(browserId).browserInfo.alias; this.reportWarning(browserId, warning_message_1.default.videoNotSupportedByBrowser, browserAlias); } async reportJobResult( /*browserId, status, data*/) { return; } getConfig(value) { return value; } async closeBrowserChildWindow( /*browserId, windowId*/) { return Promise.resolve(); } async getOSInfo( /*browserId*/) { return null; } supportNativeAutomation() { return false; } getNativeAutomation( /*browserId*/) { return null; } getNewWindowIdInNativeAutomation( /*browserId, windowId*/) { return Promise.resolve(); } async getCurrentCDPSession( /*browserId*/) { return Promise.resolve(); } } exports.default = BrowserProviderPluginHost; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnJvd3Nlci9wcm92aWRlci9wbHVnaW4taG9zdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrQztBQUNsQyxzRUFBNkM7QUFDN0MseUZBQWlFO0FBQ2pFLCtEQUE4QztBQUM5QywwRkFBa0U7QUFDbEUsNkRBQXVEO0FBRXZELE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBRXRCLE1BQXFCLHlCQUF5QjtJQUMxQyxZQUFhLGNBQWMsRUFBRSxZQUFZO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBQSxpQkFBUSxFQUFDLEVBQUUsRUFBRSw0QkFBa0IsQ0FBQyxDQUFDO1FBRW5ELElBQUEsaUJBQVEsRUFBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQztJQUM5QixDQUFDO0lBR0QsVUFBVTtJQUNWLElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFFLFNBQVMsRUFBRSxJQUFJO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLG9CQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4RCxPQUFPLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxpQkFBaUI7UUFDYixPQUFPLElBQUEsc0NBQWdCLEdBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsc0JBQXNCLENBQUUsU0FBUztRQUM3QixNQUFNLFVBQVUsR0FBRyxvQkFBaUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFeEQsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFO1lBQ3BCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxD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Q0FBQyxlQUFlLEVBQUUsMkJBQTJCO1FBQzlDLE9BQU87SUFDWCxDQUFDO0lBRUQsU0FBUyxDQUFFLEtBQUs7UUFDWixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixFQUFFLHVCQUF1QjtRQUNsRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsRUFBRSxhQUFhO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCx1QkFBdUI7UUFDbkIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELG1CQUFtQixFQUFFLGFBQWE7UUFDOUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELGdDQUFnQyxFQUFFLHVCQUF1QjtRQUNyRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQixFQUFFLGFBQWE7UUFDckMsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0IsQ0FBQztDQUNKO0FBL0tELDRDQStLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFzc2lnbkluIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwcm9taXNpZnlFdmVudCBmcm9tICdwcm9taXNpZnktZXZlbnQnO1xuaW1wb3J0IEJST1dTRVJfSk9CX1JFU1VMVCBmcm9tICcuLi8uLi9ydW5uZXIvYnJvd3Nlci1qb2ItcmVzdWx0JztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbiBmcm9tICcuLi9jb25uZWN0aW9uJztcbmltcG9ydCBXQVJOSU5HX01FU1NBR0UgZnJvbSAnLi4vLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLW1lc3NhZ2UnO1xuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVJZCB9IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuXG5jb25zdCBuYW1lID0gU3ltYm9sKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJQcm92aWRlclBsdWdpbkhvc3Qge1xuICAgIGNvbnN0cnVjdG9yIChwcm92aWRlck9iamVjdCwgcHJvdmlkZXJOYW1lKSB7XG4gICAgICAgIHRoaXMuSk9CX1JFU1VMVCA9IGFzc2lnbkluKHt9LCBCUk9XU0VSX0pPQl9SRVNVTFQpO1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMsIHByb3ZpZGVyT2JqZWN0KTtcblxuICAgICAgICB0aGlzW25hbWVdID0gcHJvdmlkZXJOYW1lO1xuICAgIH1cblxuXG4gICAgLy8gSGVscGVyc1xuICAgIGdldCBwcm92aWRlck5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tuYW1lXTtcbiAgICB9XG5cbiAgICBhc3luYyBydW5Jbml0U2NyaXB0IChicm93c2VySWQsIGNvZGUpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IEJyb3dzZXJDb25uZWN0aW9uLmdldEJ5SWQoYnJvd3NlcklkKTtcblxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5ydW5Jbml0U2NyaXB0KGAoJHtjb2RlfSkoKWApO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZVdpbmRvd0lkICgpIHtcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlVW5pcXVlSWQoKTtcbiAgICB9XG5cbiAgICB3YWl0Rm9yQ29ubmVjdGlvblJlYWR5IChicm93c2VySWQpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IEJyb3dzZXJDb25uZWN0aW9uLmdldEJ5SWQoYnJvd3NlcklkKTtcblxuICAgICAgICBpZiAoY29ubmVjdGlvbi5pc1JlYWR5KCkpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb21pc2lmeUV2ZW50KGNvbm5lY3Rpb24sICdyZWFkeScpO1xuICAgIH1cblxuICAgIHJlcG9ydFdhcm5pbmcgKGJyb3dzZXJJZCwgLi4uYXJncykge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gQnJvd3NlckNvbm5lY3Rpb24uZ2V0QnlJZChicm93c2VySWQpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24uYWRkV2FybmluZyguLi5hcmdzKTtcbiAgICB9XG5cbiAgICBzZXRVc2VyQWdlbnRNZXRhSW5mbyAoYnJvd3NlcklkLCBtZXNzYWdlLCAuLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBCcm93c2VyQ29ubmVjdGlvbi5nZXRCeUlkKGJyb3dzZXJJZCk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5zZXRQcm92aWRlck1ldGFJbmZvKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsb3NlTG9jYWxCcm93c2VyIChicm93c2VySWQpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IEJyb3dzZXJDb25uZWN0aW9uLmdldEJ5SWQoYnJvd3NlcklkKTtcblxuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnByb3ZpZGVyLl9lbnN1cmVCcm93c2VyV2luZG93RGVzY3JpcHRvcihicm93c2VySWQpO1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnByb3ZpZGVyLl9jbG9zZUxvY2FsQnJvd3Nlcihicm93c2VySWQpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlc2l6ZUxvY2FsQnJvd3NlcldpbmRvdyAoYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IEJyb3dzZXJDb25uZWN0aW9uLmdldEJ5SWQoYnJvd3NlcklkKTtcblxuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnByb3ZpZGVyLl9lbnN1cmVCcm93c2VyV2luZG93UGFyYW1ldGVycyhicm93c2VySWQpO1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnByb3ZpZGVyLl9yZXNpemVMb2NhbEJyb3dzZXJXaW5kb3coYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEFQSVxuICAgIC8vIEJyb3dzZXIgY29udHJvbFxuICAgIGFzeW5jIG9wZW5Ccm93c2VyICgvKiBicm93c2VySWQsIHBhZ2VVcmwsIGJyb3dzZXJOYW1lICovKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkIScpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsb3NlQnJvd3NlciAoLyogYnJvd3NlcklkICovKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkIScpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemF0aW9uXG4gICAgYXN5bmMgaW5pdCAoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhc3luYyBkaXNwb3NlICgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuXG4gICAgLy8gQnJvd3NlciBuYW1lcyBoYW5kbGluZ1xuICAgIGFzeW5jIGdldEJyb3dzZXJMaXN0ICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQhJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgaXNWYWxpZEJyb3dzZXJOYW1lICgvKiBicm93c2VyTmFtZSAqLykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYSBmdW5jdGlvbnNcbiAgICAvLyBOT1RFOlxuICAgIC8vIFRoZSBicm93c2VyTmFtZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIG11c3QgYmUgc3VwcGxpZWQgaWYgdGhlIGJyb3dzZXJJZCBhcmd1bWVudCBpcyBub3QgdmFsaWRcbiAgICAvLyAoYnJvd3NlciBpcyBub3Qgb3BlbmVkKVxuICAgIGFzeW5jIGlzTG9jYWxCcm93c2VyICgvKiBicm93c2VySWRbLCBicm93c2VyTmFtZV0gKi8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE5PVEU6XG4gICAgLy8gVGhlIGJyb3dzZXJOYW1lIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgbXVzdCBiZSBzdXBwbGllZCBpZiB0aGUgYnJvd3NlcklkIGFyZ3VtZW50IGlzIG5vdCB2YWxpZFxuICAgIC8vIChicm93c2VyIGlzIG5vdCBvcGVuZWQpXG4gICAgaXNIZWFkbGVzc0Jyb3dzZXIgKC8qIGJyb3dzZXJJZFssIGJyb3dzZXJOYW1lXSAqLykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgaGFzQ3VzdG9tQWN0aW9uRm9yQnJvd3NlciAoLyogYnJvd3NlcklkICovKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoYXNDbG9zZUJyb3dzZXI6ICAgICAgICAgICAgICAgIHRoaXMuaGFzT3duUHJvcGVydHkoJ2Nsb3NlQnJvd3NlcicpLFxuICAgICAgICAgICAgaGFzUmVzaXplV2luZG93OiAgICAgICAgICAgICAgICB0aGlzLmhhc093blByb3BlcnR5KCdyZXNpemVXaW5kb3cnKSxcbiAgICAgICAgICAgIGhhc1Rha2VTY3JlZW5zaG90OiAgICAgICAgICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eSgndGFrZVNjcmVlbnNob3QnKSxcbiAgICAgICAgICAgIGhhc0dldFZpZGVvRnJhbWVEYXRhOiAgICAgICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eSgnZ2V0VmlkZW9GcmFtZURhdGEnKSxcbiAgICAgICAgICAgIGhhc0NhblJlc2l6ZVdpbmRvd1RvRGltZW5zaW9uczogdGhpcy5oYXNPd25Qcm9wZXJ0eSgnY2FuUmVzaXplV2luZG93VG9EaW1lbnNpb25zJyksXG4gICAgICAgICAgICBoYXNNYXhpbWl6ZVdpbmRvdzogICAgICAgICAgICAgIHRoaXMuaGFzT3duUHJvcGVydHkoJ21heGltaXplV2luZG93JyksXG4gICAgICAgICAgICBoYXNDaHJvbWVsZXNzU2NyZWVuc2hvdHM6ICAgICAgIGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFzeW5jIHJlc2l6ZVdpbmRvdyAoYnJvd3NlcklkLyosIHdpZHRoLCBoZWlnaHQsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCAqLykge1xuICAgICAgICB0aGlzLnJlcG9ydFdhcm5pbmcoYnJvd3NlcklkLCBXQVJOSU5HX01FU1NBR0UucmVzaXplTm90U3VwcG9ydGVkQnlCcm93c2VyUHJvdmlkZXIsIHRoaXNbbmFtZV0pO1xuICAgIH1cblxuICAgIGFzeW5jIGNhblJlc2l6ZVdpbmRvd1RvRGltZW5zaW9ucyAoLyogYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0ICovKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIHRha2VTY3JlZW5zaG90IChicm93c2VySWQvKiwgc2NyZWVuc2hvdFBhdGgsIHBhZ2VXaWR0aCwgcGFnZUhlaWdodCAqLykge1xuICAgICAgICB0aGlzLnJlcG9ydFdhcm5pbmcoYnJvd3NlcklkLCBXQVJOSU5HX01FU1NBR0Uuc2NyZWVuc2hvdE5vdFN1cHBvcnRlZEJ5QnJvd3NlclByb3ZpZGVyLCB0aGlzW25hbWVdKTtcbiAgICB9XG5cbiAgICBhc3luYyBtYXhpbWl6ZVdpbmRvdyAoYnJvd3NlcklkKSB7XG4gICAgICAgIHRoaXMucmVwb3J0V2FybmluZyhicm93c2VySWQsIFdBUk5JTkdfTUVTU0FHRS5tYXhpbWl6ZU5vdFN1cHBvcnRlZEJ5QnJvd3NlclByb3ZpZGVyLCB0aGlzW25hbWVdKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydENhcHR1cmluZ1ZpZGVvICgvKmJyb3dzZXJJZCovKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgc3RvcENhcHR1cmluZ1ZpZGVvICgvKmJyb3dzZXJJZCovKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0VmlkZW9GcmFtZURhdGEgKGJyb3dzZXJJZCkge1xuICAgICAgICBjb25zdCBicm93c2VyQWxpYXMgPSBCcm93c2VyQ29ubmVjdGlvbi5nZXRCeUlkKGJyb3dzZXJJZCkuYnJvd3NlckluZm8uYWxpYXM7XG5cbiAgICAgICAgdGhpcy5yZXBvcnRXYXJuaW5nKGJyb3dzZXJJZCwgV0FSTklOR19NRVNTQUdFLnZpZGVvTm90U3VwcG9ydGVkQnlCcm93c2VyLCBicm93c2VyQWxpYXMpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlcG9ydEpvYlJlc3VsdCAoLypicm93c2VySWQsIHN0YXR1cywgZGF0YSovKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBnZXRDb25maWcgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBjbG9zZUJyb3dzZXJDaGlsZFdpbmRvdyAoLypicm93c2VySWQsIHdpbmRvd0lkKi8pIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE9TSW5mbyAoLypicm93c2VySWQqLykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzdXBwb3J0TmF0aXZlQXV0b21hdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXROYXRpdmVBdXRvbWF0aW9uICgvKmJyb3dzZXJJZCovKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldE5ld1dpbmRvd0lkSW5OYXRpdmVBdXRvbWF0aW9uICgvKmJyb3dzZXJJZCwgd2luZG93SWQqLykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudENEUFNlc3Npb24gKC8qYnJvd3NlcklkKi8pIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbn1cbiJdfQ==