UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

192 lines (191 loc) • 23.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TYPE = exports.Packet = exports.OFFSET = exports.HEADER_LENGTH = void 0; exports.isPacketComplete = isPacketComplete; exports.packetLength = packetLength; var _formatHex = require("./format-hex"); const HEADER_LENGTH = exports.HEADER_LENGTH = 8; const TYPE = exports.TYPE = { SQL_BATCH: 0x01, RPC_REQUEST: 0x03, TABULAR_RESULT: 0x04, ATTENTION: 0x06, BULK_LOAD: 0x07, TRANSACTION_MANAGER: 0x0E, LOGIN7: 0x10, NTLMAUTH_PKT: 0x11, PRELOGIN: 0x12, FEDAUTH_TOKEN: 0x08 }; const typeByValue = {}; for (const name in TYPE) { typeByValue[TYPE[name]] = name; } const STATUS = { NORMAL: 0x00, EOM: 0x01, IGNORE: 0x02, RESETCONNECTION: 0x08, RESETCONNECTIONSKIPTRAN: 0x10 }; const OFFSET = exports.OFFSET = { Type: 0, Status: 1, Length: 2, SPID: 4, PacketID: 6, Window: 7 }; const DEFAULT_SPID = 0; const DEFAULT_PACKETID = 1; const DEFAULT_WINDOW = 0; const NL = '\n'; class Packet { constructor(typeOrBuffer) { if (typeOrBuffer instanceof Buffer) { this.buffer = typeOrBuffer; } else { const type = typeOrBuffer; this.buffer = Buffer.alloc(HEADER_LENGTH, 0); this.buffer.writeUInt8(type, OFFSET.Type); this.buffer.writeUInt8(STATUS.NORMAL, OFFSET.Status); this.buffer.writeUInt16BE(DEFAULT_SPID, OFFSET.SPID); this.buffer.writeUInt8(DEFAULT_PACKETID, OFFSET.PacketID); this.buffer.writeUInt8(DEFAULT_WINDOW, OFFSET.Window); this.setLength(); } } setLength() { this.buffer.writeUInt16BE(this.buffer.length, OFFSET.Length); } length() { return this.buffer.readUInt16BE(OFFSET.Length); } resetConnection(reset) { let status = this.buffer.readUInt8(OFFSET.Status); if (reset) { status |= STATUS.RESETCONNECTION; } else { status &= 0xFF - STATUS.RESETCONNECTION; } this.buffer.writeUInt8(status, OFFSET.Status); } last(last) { let status = this.buffer.readUInt8(OFFSET.Status); if (arguments.length > 0) { if (last) { status |= STATUS.EOM; } else { status &= 0xFF - STATUS.EOM; } this.buffer.writeUInt8(status, OFFSET.Status); } return this.isLast(); } ignore(last) { let status = this.buffer.readUInt8(OFFSET.Status); if (last) { status |= STATUS.IGNORE; } else { status &= 0xFF - STATUS.IGNORE; } this.buffer.writeUInt8(status, OFFSET.Status); } isLast() { return !!(this.buffer.readUInt8(OFFSET.Status) & STATUS.EOM); } packetId(packetId) { if (packetId) { this.buffer.writeUInt8(packetId % 256, OFFSET.PacketID); } return this.buffer.readUInt8(OFFSET.PacketID); } addData(data) { this.buffer = Buffer.concat([this.buffer, data]); this.setLength(); return this; } data() { return this.buffer.slice(HEADER_LENGTH); } type() { return this.buffer.readUInt8(OFFSET.Type); } statusAsString() { const status = this.buffer.readUInt8(OFFSET.Status); const statuses = []; for (const name in STATUS) { const value = STATUS[name]; if (status & value) { statuses.push(name); } else { statuses.push(undefined); } } return statuses.join(' ').trim(); } headerToString(indent = '') { const type = this.buffer.readUInt8(OFFSET.Type); const text = `type:0x${(0, _formatHex.formatHex)(type, 2)}(${typeByValue[type]}), status:0x${(0, _formatHex.formatHex)(this.buffer.readUInt8(OFFSET.Status), 2)}(${this.statusAsString()}), length:0x${(0, _formatHex.formatHex)(this.buffer.readUInt16BE(OFFSET.Length), 4)}, spid:0x${(0, _formatHex.formatHex)(this.buffer.readUInt16BE(OFFSET.SPID), 4)}, packetId:0x${(0, _formatHex.formatHex)(this.buffer.readUInt8(OFFSET.PacketID), 2)}, window:0x${(0, _formatHex.formatHex)(this.buffer.readUInt8(OFFSET.Window), 2)}`; return indent + text; } dataToString(indent = '') { const BYTES_PER_GROUP = 0x04; const CHARS_PER_GROUP = 0x08; const BYTES_PER_LINE = 0x20; const data = this.data(); let dataDump = ''; let chars = ''; for (let offset = 0; offset < data.length; offset++) { if (offset % BYTES_PER_LINE === 0) { dataDump += indent; dataDump += (0, _formatHex.formatHex)(offset, 4) + ' '; } if (data[offset] < 0x20 || data[offset] > 0x7E) { chars += '.'; if ((offset + 1) % CHARS_PER_GROUP === 0 && !((offset + 1) % BYTES_PER_LINE === 0)) { chars += ' '; } } else { chars += String.fromCharCode(data[offset]); } if (data[offset] != null) { dataDump += (0, _formatHex.formatHex)(data[offset], 2); } if ((offset + 1) % BYTES_PER_GROUP === 0 && !((offset + 1) % BYTES_PER_LINE === 0)) { dataDump += ' '; } if ((offset + 1) % BYTES_PER_LINE === 0) { dataDump += ' ' + chars; chars = ''; if (offset < data.length - 1) { dataDump += NL; } } } if (chars.length) { dataDump += ' ' + chars; } return dataDump; } toString(indent = '') { return this.headerToString(indent) + '\n' + this.dataToString(indent + indent); } payloadString() { return ''; } } exports.Packet = Packet; function isPacketComplete(potentialPacketBuffer) { if (potentialPacketBuffer.length < HEADER_LENGTH) { return false; } else { return potentialPacketBuffer.length >= potentialPacketBuffer.readUInt16BE(OFFSET.Length); } } function packetLength(potentialPacketBuffer) { return potentialPacketBuffer.readUInt16BE(OFFSET.Length); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZm9ybWF0SGV4IiwicmVxdWlyZSIsIkhFQURFUl9MRU5HVEgiLCJleHBvcnRzIiwiVFlQRSIsIlNRTF9CQVRDSCIsIlJQQ19SRVFVRVNUIiwiVEFCVUxBUl9SRVNVTFQiLCJBVFRFTlRJT04iLCJCVUxLX0xPQUQiLCJUUkFOU0FDVElPTl9NQU5BR0VSIiwiTE9HSU43IiwiTlRMTUFVVEhfUEtUIiwiUFJFTE9HSU4iLCJGRURBVVRIX1RPS0VOIiwidHlwZUJ5VmFsdWUiLCJuYW1lIiwiU1RBVFVTIiwiTk9STUFMIiwiRU9NIiwiSUdOT1JFIiwiUkVTRVRDT05ORUNUSU9OIiwiUkVTRVRDT05ORUNUSU9OU0tJUFRSQU4iLCJPRkZTRVQiLCJUeXBlIiwiU3RhdHVzIiwiTGVuZ3RoIiwiU1BJRCIsIlBhY2tldElEIiwiV2luZG93IiwiREVGQVVMVF9TUElEIiwiREVGQVVMVF9QQUNLRVRJRCIsIkRFRkFVTFRfV0lORE9XIiwiTkwiLCJQYWNrZXQiLCJjb25zdHJ1Y3RvciIsInR5cGVPckJ1ZmZlciIsIkJ1ZmZlciIsImJ1ZmZlciIsInR5cGUiLCJhbGxvYyIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkJFIiwic2V0TGVuZ3RoIiwibGVuZ3RoIiwicmVhZFVJbnQxNkJFIiwicmVzZXRDb25uZWN0aW9uIiwicmVzZXQiLCJzdGF0dXMiLCJyZWFkVUludDgiLCJsYXN0IiwiYXJndW1lbnRzIiwiaXNMYXN0IiwiaWdub3JlIiwicGFja2V0SWQiLCJhZGREYXRhIiwiZGF0YSIsImNvbmNhdCIsInNsaWNlIiwic3RhdHVzQXNTdHJpbmciLCJzdGF0dXNlcyIsInZhbHVlIiwicHVzaCIsInVuZGVmaW5lZCIsImpvaW4iLCJ0cmltIiwiaGVhZGVyVG9TdHJpbmciLCJpbmRlbnQiLCJ0ZXh0IiwiZm9ybWF0SGV4IiwiZGF0YVRvU3RyaW5nIiwiQllURVNfUEVSX0dST1VQIiwiQ0hBUlNfUEVSX0dST1VQIiwiQllURVNfUEVSX0xJTkUiLCJkYXRhRHVtcCIsImNoYXJzIiwib2Zmc2V0IiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwidG9TdHJpbmciLCJwYXlsb2FkU3RyaW5nIiwiaXNQYWNrZXRDb21wbGV0ZSIsInBvdGVudGlhbFBhY2tldEJ1ZmZlciIsInBhY2tldExlbmd0aCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9wYWNrZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0SGV4IH0gZnJvbSAnLi9mb3JtYXQtaGV4JztcblxuZXhwb3J0IGNvbnN0IEhFQURFUl9MRU5HVEggPSA4O1xuXG5leHBvcnQgY29uc3QgVFlQRTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHtcbiAgU1FMX0JBVENIOiAweDAxLFxuICBSUENfUkVRVUVTVDogMHgwMyxcbiAgVEFCVUxBUl9SRVNVTFQ6IDB4MDQsXG4gIEFUVEVOVElPTjogMHgwNixcbiAgQlVMS19MT0FEOiAweDA3LFxuICBUUkFOU0FDVElPTl9NQU5BR0VSOiAweDBFLFxuICBMT0dJTjc6IDB4MTAsXG4gIE5UTE1BVVRIX1BLVDogMHgxMSxcbiAgUFJFTE9HSU46IDB4MTIsXG4gIEZFREFVVEhfVE9LRU46IDB4MDhcbn07XG5cbmNvbnN0IHR5cGVCeVZhbHVlOiB7IFtrZXk6IG51bWJlcl06IHN0cmluZyB9ID0ge307XG5cbmZvciAoY29uc3QgbmFtZSBpbiBUWVBFKSB7XG4gIHR5cGVCeVZhbHVlW1RZUEVbbmFtZV1dID0gbmFtZTtcbn1cblxuY29uc3QgU1RBVFVTOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge1xuICBOT1JNQUw6IDB4MDAsXG4gIEVPTTogMHgwMSxcbiAgSUdOT1JFOiAweDAyLFxuICBSRVNFVENPTk5FQ1RJT046IDB4MDgsXG4gIFJFU0VUQ09OTkVDVElPTlNLSVBUUkFOOiAweDEwXG59O1xuXG5leHBvcnQgY29uc3QgT0ZGU0VUID0ge1xuICBUeXBlOiAwLFxuICBTdGF0dXM6IDEsXG4gIExlbmd0aDogMixcbiAgU1BJRDogNCxcbiAgUGFja2V0SUQ6IDYsXG4gIFdpbmRvdzogN1xufTtcblxuY29uc3QgREVGQVVMVF9TUElEID0gMDtcblxuY29uc3QgREVGQVVMVF9QQUNLRVRJRCA9IDE7XG5cbmNvbnN0IERFRkFVTFRfV0lORE9XID0gMDtcblxuY29uc3QgTkwgPSAnXFxuJztcblxuZXhwb3J0IGNsYXNzIFBhY2tldCB7XG4gIGRlY2xhcmUgYnVmZmVyOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IodHlwZU9yQnVmZmVyOiBCdWZmZXIgfCBudW1iZXIpIHtcbiAgICBpZiAodHlwZU9yQnVmZmVyIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IHR5cGVPckJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9IHR5cGVPckJ1ZmZlciBhcyBudW1iZXI7XG4gICAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhIRUFERVJfTEVOR1RILCAwKTtcbiAgICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDgodHlwZSwgT0ZGU0VULlR5cGUpO1xuICAgICAgdGhpcy5idWZmZXIud3JpdGVVSW50OChTVEFUVVMuTk9STUFMLCBPRkZTRVQuU3RhdHVzKTtcbiAgICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDE2QkUoREVGQVVMVF9TUElELCBPRkZTRVQuU1BJRCk7XG4gICAgICB0aGlzLmJ1ZmZlci53cml0ZVVJbnQ4KERFRkFVTFRfUEFDS0VUSUQsIE9GRlNFVC5QYWNrZXRJRCk7XG4gICAgICB0aGlzLmJ1ZmZlci53cml0ZVVJbnQ4KERFRkFVTFRfV0lORE9XLCBPRkZTRVQuV2luZG93KTtcbiAgICAgIHRoaXMuc2V0TGVuZ3RoKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0TGVuZ3RoKCkge1xuICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDE2QkUodGhpcy5idWZmZXIubGVuZ3RoLCBPRkZTRVQuTGVuZ3RoKTtcbiAgfVxuXG4gIGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIucmVhZFVJbnQxNkJFKE9GRlNFVC5MZW5ndGgpO1xuICB9XG5cbiAgcmVzZXRDb25uZWN0aW9uKHJlc2V0OiBib29sZWFuKSB7XG4gICAgbGV0IHN0YXR1cyA9IHRoaXMuYnVmZmVyLnJlYWRVSW50OChPRkZTRVQuU3RhdHVzKTtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHN0YXR1cyB8PSBTVEFUVVMuUkVTRVRDT05ORUNUSU9OO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXMgJj0gMHhGRiAtIFNUQVRVUy5SRVNFVENPTk5FQ1RJT047XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDgoc3RhdHVzLCBPRkZTRVQuU3RhdHVzKTtcbiAgfVxuXG4gIGxhc3QobGFzdD86IGJvb2xlYW4pIHtcbiAgICBsZXQgc3RhdHVzID0gdGhpcy5idWZmZXIucmVhZFVJbnQ4KE9GRlNFVC5TdGF0dXMpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgc3RhdHVzIHw9IFNUQVRVUy5FT007XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXMgJj0gMHhGRiAtIFNUQVRVUy5FT007XG4gICAgICB9XG4gICAgICB0aGlzLmJ1ZmZlci53cml0ZVVJbnQ4KHN0YXR1cywgT0ZGU0VULlN0YXR1cyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmlzTGFzdCgpO1xuICB9XG5cbiAgaWdub3JlKGxhc3Q6IGJvb2xlYW4pIHtcbiAgICBsZXQgc3RhdHVzID0gdGhpcy5idWZmZXIucmVhZFVJbnQ4KE9GRlNFVC5TdGF0dXMpO1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBzdGF0dXMgfD0gU1RBVFVTLklHTk9SRTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdHVzICY9IDB4RkYgLSBTVEFUVVMuSUdOT1JFO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlci53cml0ZVVJbnQ4KHN0YXR1cywgT0ZGU0VULlN0YXR1cyk7XG4gIH1cblxuICBpc0xhc3QoKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuYnVmZmVyLnJlYWRVSW50OChPRkZTRVQuU3RhdHVzKSAmIFNUQVRVUy5FT00pO1xuICB9XG5cbiAgcGFja2V0SWQocGFja2V0SWQ/OiBudW1iZXIpIHtcbiAgICBpZiAocGFja2V0SWQpIHtcbiAgICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDgocGFja2V0SWQgJSAyNTYsIE9GRlNFVC5QYWNrZXRJRCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5yZWFkVUludDgoT0ZGU0VULlBhY2tldElEKTtcbiAgfVxuXG4gIGFkZERhdGEoZGF0YTogQnVmZmVyKSB7XG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZmZlciwgZGF0YV0pO1xuICAgIHRoaXMuc2V0TGVuZ3RoKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZShIRUFERVJfTEVOR1RIKTtcbiAgfVxuXG4gIHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyLnJlYWRVSW50OChPRkZTRVQuVHlwZSk7XG4gIH1cblxuICBzdGF0dXNBc1N0cmluZygpIHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDgoT0ZGU0VULlN0YXR1cyk7XG4gICAgY29uc3Qgc3RhdHVzZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgbmFtZSBpbiBTVEFUVVMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gU1RBVFVTW25hbWVdO1xuXG4gICAgICBpZiAoc3RhdHVzICYgdmFsdWUpIHtcbiAgICAgICAgc3RhdHVzZXMucHVzaChuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1c2VzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdHVzZXMuam9pbignICcpLnRyaW0oKTtcbiAgfVxuXG4gIGhlYWRlclRvU3RyaW5nKGluZGVudCA9ICcnKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuYnVmZmVyLnJlYWRVSW50OChPRkZTRVQuVHlwZSk7XG4gICAgY29uc3QgdGV4dCA9IGB0eXBlOjB4JHtmb3JtYXRIZXgodHlwZSwgMil9KCR7dHlwZUJ5VmFsdWVbdHlwZV19KSwgc3RhdHVzOjB4JHtmb3JtYXRIZXgodGhpcy5idWZmZXIucmVhZFVJbnQ4KE9GRlNFVC5TdGF0dXMpLCAyKX0oJHt0aGlzLnN0YXR1c0FzU3RyaW5nKCl9KSwgbGVuZ3RoOjB4JHtmb3JtYXRIZXgodGhpcy5idWZmZXIucmVhZFVJbnQxNkJFKE9GRlNFVC5MZW5ndGgpLCA0KX0sIHNwaWQ6MHgke2Zvcm1hdEhleCh0aGlzLmJ1ZmZlci5yZWFkVUludDE2QkUoT0ZGU0VULlNQSUQpLCA0KX0sIHBhY2tldElkOjB4JHtmb3JtYXRIZXgodGhpcy5idWZmZXIucmVhZFVJbnQ4KE9GRlNFVC5QYWNrZXRJRCksIDIpfSwgd2luZG93OjB4JHtmb3JtYXRIZXgodGhpcy5idWZmZXIucmVhZFVJbnQ4KE9GRlNFVC5XaW5kb3cpLCAyKX1gO1xuICAgIHJldHVybiBpbmRlbnQgKyB0ZXh0O1xuICB9XG5cbiAgZGF0YVRvU3RyaW5nKGluZGVudCA9ICcnKSB7XG4gICAgY29uc3QgQllURVNfUEVSX0dST1VQID0gMHgwNDtcbiAgICBjb25zdCBDSEFSU19QRVJfR1JPVVAgPSAweDA4O1xuICAgIGNvbnN0IEJZVEVTX1BFUl9MSU5FID0gMHgyMDtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhKCk7XG5cbiAgICBsZXQgZGF0YUR1bXAgPSAnJztcbiAgICBsZXQgY2hhcnMgPSAnJztcblxuXG4gICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGF0YS5sZW5ndGg7IG9mZnNldCsrKSB7XG4gICAgICBpZiAob2Zmc2V0ICUgQllURVNfUEVSX0xJTkUgPT09IDApIHtcbiAgICAgICAgZGF0YUR1bXAgKz0gaW5kZW50O1xuICAgICAgICBkYXRhRHVtcCArPSBmb3JtYXRIZXgob2Zmc2V0LCA0KSArICcgICc7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW29mZnNldF0gPCAweDIwIHx8IGRhdGFbb2Zmc2V0XSA+IDB4N0UpIHtcbiAgICAgICAgY2hhcnMgKz0gJy4nO1xuICAgICAgICBpZiAoKChvZmZzZXQgKyAxKSAlIENIQVJTX1BFUl9HUk9VUCA9PT0gMCkgJiYgISgob2Zmc2V0ICsgMSkgJSBCWVRFU19QRVJfTElORSA9PT0gMCkpIHtcbiAgICAgICAgICBjaGFycyArPSAnICc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoYXJzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZGF0YVtvZmZzZXRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbb2Zmc2V0XSAhPSBudWxsKSB7XG4gICAgICAgIGRhdGFEdW1wICs9IGZvcm1hdEhleChkYXRhW29mZnNldF0sIDIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKChvZmZzZXQgKyAxKSAlIEJZVEVTX1BFUl9HUk9VUCA9PT0gMCkgJiYgISgob2Zmc2V0ICsgMSkgJSBCWVRFU19QRVJfTElORSA9PT0gMCkpIHtcbiAgICAgICAgZGF0YUR1bXAgKz0gJyAnO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG9mZnNldCArIDEpICUgQllURVNfUEVSX0xJTkUgPT09IDApIHtcbiAgICAgICAgZGF0YUR1bXAgKz0gJyAgJyArIGNoYXJzO1xuICAgICAgICBjaGFycyA9ICcnO1xuICAgICAgICBpZiAob2Zmc2V0IDwgZGF0YS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgZGF0YUR1bXAgKz0gTkw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhcnMubGVuZ3RoKSB7XG4gICAgICBkYXRhRHVtcCArPSAnICAnICsgY2hhcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFEdW1wO1xuICB9XG5cbiAgdG9TdHJpbmcoaW5kZW50ID0gJycpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJUb1N0cmluZyhpbmRlbnQpICsgJ1xcbicgKyB0aGlzLmRhdGFUb1N0cmluZyhpbmRlbnQgKyBpbmRlbnQpO1xuICB9XG5cbiAgcGF5bG9hZFN0cmluZygpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUGFja2V0Q29tcGxldGUocG90ZW50aWFsUGFja2V0QnVmZmVyOiBCdWZmZXIpIHtcbiAgaWYgKHBvdGVudGlhbFBhY2tldEJ1ZmZlci5sZW5ndGggPCBIRUFERVJfTEVOR1RIKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwb3RlbnRpYWxQYWNrZXRCdWZmZXIubGVuZ3RoID49IHBvdGVudGlhbFBhY2tldEJ1ZmZlci5yZWFkVUludDE2QkUoT0ZGU0VULkxlbmd0aCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2tldExlbmd0aChwb3RlbnRpYWxQYWNrZXRCdWZmZXI6IEJ1ZmZlcikge1xuICByZXR1cm4gcG90ZW50aWFsUGFja2V0QnVmZmVyLnJlYWRVSW50MTZCRShPRkZTRVQuTGVuZ3RoKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFFTyxNQUFNQyxhQUFhLEdBQUFDLE9BQUEsQ0FBQUQsYUFBQSxHQUFHLENBQUM7QUFFdkIsTUFBTUUsSUFBK0IsR0FBQUQsT0FBQSxDQUFBQyxJQUFBLEdBQUc7RUFDN0NDLFNBQVMsRUFBRSxJQUFJO0VBQ2ZDLFdBQVcsRUFBRSxJQUFJO0VBQ2pCQyxjQUFjLEVBQUUsSUFBSTtFQUNwQkMsU0FBUyxFQUFFLElBQUk7RUFDZkMsU0FBUyxFQUFFLElBQUk7RUFDZkMsbUJBQW1CLEVBQUUsSUFBSTtFQUN6QkMsTUFBTSxFQUFFLElBQUk7RUFDWkMsWUFBWSxFQUFFLElBQUk7RUFDbEJDLFFBQVEsRUFBRSxJQUFJO0VBQ2RDLGFBQWEsRUFBRTtBQUNqQixDQUFDO0FBRUQsTUFBTUMsV0FBc0MsR0FBRyxDQUFDLENBQUM7QUFFakQsS0FBSyxNQUFNQyxJ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