testcafe
Version:
Automated browser testing for the modern web development stack.
131 lines • 17.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = require("../types");
const types_2 = require("./types");
// @ts-ignore
const hammerhead_1 = __importDefault(require("../../client/core/deps/hammerhead"));
const utils_1 = require("./utils");
const send_request_to_frame_1 = __importDefault(require("../../client/core/utils/send-request-to-frame"));
const dom_1 = require("../../client/core/utils/dom");
const style_1 = require("../../client/core/utils/style");
const { utils, eventSandbox, nativeMethods } = hammerhead_1.default;
const messageSandbox = eventSandbox.message;
const MOUSE_EVENT_OPTIONS = {
clickCount: 1,
force: 0.5,
};
const CALCULATE_TOP_LEFT_POINT_REQUEST_CMD = 'native-automation|calculate-top-left-point|request';
const CALCULATE_TOP_LEFT_POINT_RESPONSE_CMD = 'native-automation|calculate-top-left-point|response';
function getLeftTopPoint(driverIframe) {
const rect = driverIframe.getBoundingClientRect();
const borders = (0, style_1.getBordersWidthFloat)(driverIframe);
const paddings = (0, style_1.getElementPaddingFloat)(driverIframe);
return {
x: rect.left + borders.left + paddings.left,
y: rect.top + borders.top + paddings.top,
};
}
// Setup cross-iframe interaction
messageSandbox.on(messageSandbox.SERVICE_MSG_RECEIVED_EVENT, async (e) => {
if (e.message.cmd === CALCULATE_TOP_LEFT_POINT_REQUEST_CMD) {
const iframeWin = e.source;
const { x, y } = await calculateIFrameTopLeftPoint();
const iframe = (0, dom_1.findIframeByWindow)(iframeWin);
const topLeftPoint = getLeftTopPoint(iframe);
const responseMsg = {
cmd: CALCULATE_TOP_LEFT_POINT_RESPONSE_CMD,
topLeftPoint: {
x: topLeftPoint.x + x,
y: topLeftPoint.y + y,
},
};
messageSandbox.sendServiceMsg(responseMsg, iframeWin);
}
});
async function calculateIFrameTopLeftPoint() {
if (window !== window.parent) {
const msg = {
cmd: CALCULATE_TOP_LEFT_POINT_REQUEST_CMD,
};
const { topLeftPoint } = await (0, send_request_to_frame_1.default)(msg, CALCULATE_TOP_LEFT_POINT_RESPONSE_CMD, window.parent);
return topLeftPoint;
}
return { x: 0, y: 0 };
}
class CDPEventDescriptor {
static _isNonCharKeyModifier(modifiers) {
const nonCharModifiers = [types_2.KeyModifierValues.ctrl, types_2.KeyModifierValues.alt, types_2.KeyModifierValues.meta];
return nativeMethods.arrayIndexOf.call(nonCharModifiers, modifiers) > -1;
}
static _getKeyDownEventText(options) {
if (options.isNewLine)
return '\r';
if (options.keyProperty.length === 1 && !CDPEventDescriptor._isNonCharKeyModifier(options.modifiers))
return options.keyProperty;
return '';
}
static createKeyDownOptions(options) {
const text = CDPEventDescriptor._getKeyDownEventText(options);
return {
type: text ? 'keyDown' : 'rawKeyDown',
modifiers: options.modifiers || 0,
windowsVirtualKeyCode: options.keyCode,
key: options.keyProperty,
commands: options.commands,
text,
};
}
static createKeyUpOptions(options) {
return {
type: 'keyUp',
modifiers: options.modifiers || 0,
key: options.keyProperty,
windowsVirtualKeyCode: options.keyCode,
};
}
static async createMouseEventOptions(type, options) {
const { x, y } = await calculateIFrameTopLeftPoint();
return utils.extend({
x: options.options.clientX + x,
y: options.options.clientY + y,
modifiers: (0, utils_1.calculateKeyModifiersValue)(options.options),
button: (0, utils_1.calculateMouseButtonValue)(options.options),
type,
}, MOUSE_EVENT_OPTIONS);
}
static async createTouchEventOptions(type, options) {
const { x, y } = await calculateIFrameTopLeftPoint();
return {
modifiers: (0, utils_1.calculateKeyModifiersValue)(options.options),
touchPoints: [{
x: options.options.clientX + x,
y: options.options.clientY + y,
}],
type,
};
}
static delay(delay) {
return {
type: types_1.EventType.Delay,
options: { delay },
};
}
static keyDown(keyInfo) {
return {
type: types_1.EventType.Keyboard,
options: CDPEventDescriptor.createKeyDownOptions(keyInfo),
};
}
static keyUp(keyInfo) {
return {
type: types_1.EventType.Keyboard,
options: CDPEventDescriptor.createKeyUpOptions(keyInfo),
};
}
}
exports.default = CDPEventDescriptor;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uYXRpdmUtYXV0b21hdGlvbi9jbGllbnQvZXZlbnQtZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9DQUFxQztBQUVyQyxtQ0FBNEM7QUFDNUMsYUFBYTtBQUNiLG1GQUEyRDtBQUMzRCxtQ0FBZ0Y7QUFFaEYsMEdBQStFO0FBQy9FLHFEQUFpRTtBQUNqRSx5REFBNkY7QUFFN0YsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEdBQUcsb0JBQVUsQ0FBQztBQUUxRCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDO0FBRTVDLE1BQU0sbUJBQW1CLEdBQUc7SUFDeEIsVUFBVSxFQUFFLENBQUM7SUFDYixLQUFLLEVBQU8sR0FBRztDQUNsQixDQUFDO0FBRUYsTUFBTSxvQ0FBb0MsR0FBSSxvREFBb0QsQ0FBQztBQUNuRyxNQUFNLHFDQUFxQyxHQUFHLHFEQUFxRCxDQUFDO0FBRXBHLFNBQVMsZUFBZSxDQUFFLFlBQWlCO0lBQ3ZDLE1BQU0sSUFBSSxHQUFPLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3RELE1BQU0sT0FBTyxHQUFJLElBQUEsNEJBQW9CLEVBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBQSw4QkFBc0IsRUFBQyxZQUFZLENBQUMsQ0FBQztJQUV0RCxPQUFPO1FBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSTtRQUMzQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHO0tBQzNDLENBQUM7QUFDTixDQUFDO0FBRUQsaUNBQWlDO0FBQ2pDLGNBQWMsQ0FBQyxFQUFFLENBQUMsY0FB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LEtBQUssRUFBRTtTQUNyQixDQUFDO0lBQ04sQ0FBQztJQUVNLE1BQU0sQ0FBQyxPQUFPLENBQUUsT0FBeUI7UUFDNUMsT0FBTztZQUNILElBQUksRUFBSyxpQkFBUyxDQUFDLFFBQVE7WUFDM0IsT0FBTyxFQUFFLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQztTQUM1RCxDQUFDO0lBQ04sQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUUsT0FBeUI7UUFDMUMsT0FBTztZQUNILElBQUksRUFBSyxpQkFBUyxDQUFDLFFBQVE7WUFDM0IsT0FBTyxFQUFFLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztTQUMxRCxDQUFDO0lBQ04sQ0FBQztDQUNKO0FBcEZELHFDQW9GQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50VHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFNpbXVsYXRlZEtleUluZm8gfSBmcm9tICcuL2tleS1wcmVzcy91dGlscyc7XG5pbXBvcnQgeyBLZXlNb2RpZmllclZhbHVlcyB9IGZyb20gJy4vdHlwZXMnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IGhhbW1lcmhlYWQgZnJvbSAnLi4vLi4vY2xpZW50L2NvcmUvZGVwcy9oYW1tZXJoZWFkJztcbmltcG9ydCB7IGNhbGN1bGF0ZUtleU1vZGlmaWVyc1ZhbHVlLCBjYWxjdWxhdGVNb3VzZUJ1dHRvblZhbHVlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBBeGlzVmFsdWVzRGF0YSB9IGZyb20gJy4uLy4uL2NsaWVudC9jb3JlL3V0aWxzL3ZhbHVlcy9heGlzLXZhbHVlcyc7XG5pbXBvcnQgc2VuZFJlcXVlc3RUb0ZyYW1lIGZyb20gJy4uLy4uL2NsaWVudC9jb3JlL3V0aWxzL3NlbmQtcmVxdWVzdC10by1mcmFtZSc7XG5pbXBvcnQgeyBmaW5kSWZyYW1lQnlXaW5kb3cgfSBmcm9tICcuLi8uLi9jbGllbnQvY29yZS91dGlscy9kb20nO1xuaW1wb3J0IHsgZ2V0Qm9yZGVyc1dpZHRoRmxvYXQsIGdldEVsZW1lbnRQYWRkaW5nRmxvYXQgfSBmcm9tICcuLi8uLi9jbGllbnQvY29yZS91dGlscy9zdHlsZSc7XG5cbmNvbnN0IHsgdXRpbHMsIGV2ZW50U2FuZGJveCwgbmF0aXZlTWV0aG9kcyB9ID0gaGFtbWVyaGVhZDtcblxuY29uc3QgbWVzc2FnZVNhbmRib3ggPSBldmVudFNhbmRib3gubWVzc2FnZTtcblxuY29uc3QgTU9VU0VfRVZFTlRfT1BUSU9OUyA9IHtcbiAgICBjbGlja0NvdW50OiAxLFxuICAgIGZvcmNlOiAgICAgIDAuNSxcbn07XG5cbmNvbnN0IENBTENVTEFURV9UT1BfTEVGVF9QT0lOVF9SRVFVRVNUX0NNRCAgPSAnbmF0aXZlLWF1dG9tYXRpb258Y2FsY3VsYXRlLXRvcC1sZWZ0LXBvaW50fHJlcXVlc3QnO1xuY29uc3QgQ0FMQ1VMQVRFX1RPUF9MRUZUX1BPSU5UX1JFU1BPTlNFX0NNRCA9ICduYXRpdmUtYXV0b21hdGlvbnxjYWxjdWxhdGUtdG9wLWxlZnQtcG9pbnR8cmVzcG9uc2UnO1xuXG5mdW5jdGlvbiBnZXRMZWZ0VG9wUG9pbnQgKGRyaXZlcklmcmFtZTogYW55KTogQXhpc1ZhbHVlc0RhdGE8bnVtYmVyPiB7XG4gICAgY29uc3QgcmVjdCAgICAgPSBkcml2ZXJJZnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgYm9yZGVycyAgPSBnZXRCb3JkZXJzV2lkdGhGbG9hdChkcml2ZXJJZnJhbWUpO1xuICAgIGNvbnN0IHBhZGRpbmdzID0gZ2V0RWxlbWVudFBhZGRpbmdGbG9hdChkcml2ZXJJZnJhbWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcmVjdC5sZWZ0ICsgYm9yZGVycy5sZWZ0ICsgcGFkZGluZ3MubGVmdCxcbiAgICAgICAgeTogcmVjdC50b3AgKyBib3JkZXJzLnRvcCArIHBhZGRpbmdzLnRvcCxcbiAgICB9O1xufVxuXG4vLyBTZXR1cCBjcm9zcy1pZnJhbWUgaW50ZXJhY3Rpb25cbm1lc3NhZ2VTYW5kYm94Lm9uKG1lc3NhZ2VTYW5kYm94LlNFUlZJQ0VfTVNHX1JFQ0VJVkVEX0VWRU5ULCBhc3luYyAoZTphbnkpID0+IHtcbiAgICBpZiAoZS5tZXNzYWdlLmNtZCA9PT0gQ0FMQ1VMQVRFX1RPUF9MRUZUX1BPSU5UX1JFUVVFU1RfQ01EKSB7XG4gICAgICAgIGNvbnN0IGlmcmFtZVdpbiA9IGUuc291cmNlO1xuXG4gICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gYXdhaXQgY2FsY3VsYXRlSUZyYW1lVG9wTGVmdFBvaW50KCk7XG5cbiAgICAgICAgY29uc3QgaWZyYW1lID0gZmluZElmcmFtZUJ5V2luZG93KGlmcmFtZVdpbik7XG4gICAgICAgIGNvbnN0IHRvcExlZnRQb2ludCA9IGdldExlZnRUb3BQb2ludChpZnJhbWUpO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlTXNnID0ge1xuICAgICAgICAgICAgY21kOiAgICAgICAgICBDQUxDVUxBVEVfVE9QX0xFRlRfUE9JTlRfUkVTUE9OU0VfQ01ELFxuICAgICAgICAgICAgdG9wTGVmdFBvaW50OiB7XG4gICAgICAgICAgICAgICAgeDogdG9wTGVmdFBvaW50LnggKyB4LFxuICAgICAgICAgICAgICAgIHk6IHRvcExlZnRQb2ludC55ICsgeSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgbWVzc2FnZVNhbmRib3guc2VuZFNlcnZpY2VNc2cocmVzcG9uc2VNc2csIGlmcmFtZVdpbik7XG4gICAgfVxufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUlGcmFtZVRvcExlZnRQb2ludCAoKTogUHJvbWlzZTxBeGlzVmFsdWVzRGF0YTxudW1iZXI+PiB7XG4gICAgaWYgKHdpbmRvdyAhPT0gd2luZG93LnBhcmVudCkge1xuICAgICAgICBjb25zdCBtc2c6IGFueSA9IHtcbiAgICAgICAgICAgIGNtZDogQ0FMQ1VMQVRFX1RPUF9MRUZUX1BPSU5UX1JFUVVFU1RfQ01ELFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHsgdG9wTGVmdFBvaW50IH0gPSBhd2FpdCBzZW5kUmVxdWVzdFRvRnJhbWUobXNnLCBDQUxDVUxBVEVfVE9QX0xFRlRfUE9JTlRfUkVTUE9OU0VfQ01ELCB3aW5kb3cucGFyZW50KTtcblxuICAgICAgICByZXR1cm4gdG9wTGVmdFBvaW50O1xuICAgIH1cblxuICAgIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0RQRXZlbnREZXNjcmlwdG9yIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaXNOb25DaGFyS2V5TW9kaWZpZXIgKG1vZGlmaWVyczogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG5vbkNoYXJNb2RpZmllcnMgPSBbS2V5TW9kaWZpZXJWYWx1ZXMuY3RybCwgS2V5TW9kaWZpZXJWYWx1ZXMuYWx0LCBLZXlNb2RpZmllclZhbHVlcy5tZXRhXTtcblxuICAgICAgICByZXR1cm4gbmF0aXZlTWV0aG9kcy5hcnJheUluZGV4T2YuY2FsbChub25DaGFyTW9kaWZpZXJzLCBtb2RpZmllcnMpID4gLTE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2dldEtleURvd25FdmVudFRleHQgKG9wdGlvbnM6IFNpbXVsYXRlZEtleUluZm8pOiBhbnkge1xuICAgICAgICBpZiAob3B0aW9ucy5pc05ld0xpbmUpXG4gICAgICAgICAgICByZXR1cm4gJ1xccic7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMua2V5UHJvcGVydHkubGVuZ3RoID09PSAxICYmICFDRFBFdmVudERlc2NyaXB0b3IuX2lzTm9uQ2hhcktleU1vZGlmaWVyKG9wdGlvbnMubW9kaWZpZXJzKSlcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmtleVByb3BlcnR5O1xuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUtleURvd25PcHRpb25zIChvcHRpb25zOiBTaW11bGF0ZWRLZXlJbmZvKTogYW55IHtcbiAgICAgICAgY29uc3QgdGV4dCA9IENEUEV2ZW50RGVzY3JpcHRvci5fZ2V0S2V5RG93bkV2ZW50VGV4dChvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogICAgICAgICAgICAgICAgICB0ZXh0ID8gJ2tleURvd24nIDogJ3Jhd0tleURvd24nLFxuICAgICAgICAgICAgbW9kaWZpZXJzOiAgICAgICAgICAgICBvcHRpb25zLm1vZGlmaWVycyB8fCAwLFxuICAgICAgICAgICAgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBvcHRpb25zLmtleUNvZGUsXG4gICAgICAgICAgICBrZXk6ICAgICAgICAgICAgICAgICAgIG9wdGlvbnMua2V5UHJvcGVydHksXG4gICAgICAgICAgICBjb21tYW5kczogICAgICAgICAgICAgIG9wdGlvbnMuY29tbWFuZHMsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlS2V5VXBPcHRpb25zIChvcHRpb25zOiBTaW11bGF0ZWRLZXlJbmZvKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICAgICAgICAgICAgICAgICAgJ2tleVVwJyxcbiAgICAgICAgICAgIG1vZGlmaWVyczogICAgICAgICAgICAgb3B0aW9ucy5tb2RpZmllcnMgfHwgMCxcbiAgICAgICAgICAgIGtleTogICAgICAgICAgICAgICAgICAgb3B0aW9ucy5rZXlQcm9wZXJ0eSxcbiAgICAgICAgICAgIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogb3B0aW9ucy5rZXlDb2RlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlTW91c2VFdmVudE9wdGlvbnMgKHR5cGU6IHN0cmluZywgb3B0aW9uczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgeyB4LCB5IH0gPSBhd2FpdCBjYWxjdWxhdGVJRnJhbWVUb3BMZWZ0UG9pbnQoKTtcblxuICAgICAgICByZXR1cm4gdXRpbHMuZXh0ZW5kKHtcbiAgICAgICAgICAgIHg6ICAgICAgICAgb3B0aW9ucy5vcHRpb25zLmNsaWVudFggKyB4LFxuICAgICAgICAgICAgeTogICAgICAgICBvcHRpb25zLm9wdGlvbnMuY2xpZW50WSArIHksXG4gICAgICAgICAgICBtb2RpZmllcnM6IGNhbGN1bGF0ZUtleU1vZGlmaWVyc1ZhbHVlKG9wdGlvbnMub3B0aW9ucyksXG4gICAgICAgICAgICBidXR0b246ICAgIGNhbGN1bGF0ZU1vdXNlQnV0dG9uVmFsdWUob3B0aW9ucy5vcHRpb25zKSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgIH0sIE1PVVNFX0VWRU5UX09QVElPTlMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVG91Y2hFdmVudE9wdGlvbnMgKHR5cGU6IHN0cmluZywgb3B0aW9uczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgeyB4LCB5IH0gPSBhd2FpdCBjYWxjdWxhdGVJRnJhbWVUb3BMZWZ0UG9pbnQoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW9kaWZpZXJzOiAgIGNhbGN1bGF0ZUtleU1vZGlmaWVyc1ZhbHVlKG9wdGlvbnMub3B0aW9ucyksXG4gICAgICAgICAgICB0b3VjaFBvaW50czogW3tcbiAgICAgICAgICAgICAgICB4OiBvcHRpb25zLm9wdGlvbnMuY2xpZW50WCArIHgsXG4gICAgICAgICAgICAgICAgeTogb3B0aW9ucy5vcHRpb25zLmNsaWVudFkgKyB5LFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVsYXkgKGRlbGF5OiBudW1iZXIpOiBhbnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogICAgRXZlbnRUeXBlLkRlbGF5LFxuICAgICAgICAgICAgb3B0aW9uczogeyBkZWxheSB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMga2V5RG93biAoa2V5SW5mbzogU2ltdWxhdGVkS2V5SW5mbyk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAgICBFdmVudFR5cGUuS2V5Ym9hcmQsXG4gICAgICAgICAgICBvcHRpb25zOiBDRFBFdmVudERlc2NyaXB0b3IuY3JlYXRlS2V5RG93bk9wdGlvbnMoa2V5SW5mbyksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBrZXlVcCAoa2V5SW5mbzogU2ltdWxhdGVkS2V5SW5mbyk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAgICBFdmVudFR5cGUuS2V5Ym9hcmQsXG4gICAgICAgICAgICBvcHRpb25zOiBDRFBFdmVudERlc2NyaXB0b3IuY3JlYXRlS2V5VXBPcHRpb25zKGtleUluZm8pLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==