tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
137 lines (135 loc) • 17.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Transaction = exports.OPERATION_TYPE = exports.ISOLATION_LEVEL = void 0;
exports.assertValidIsolationLevel = assertValidIsolationLevel;
exports.isolationLevelByValue = void 0;
var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));
var _allHeaders = require("./all-headers");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/*
s2.2.6.8
*/
const OPERATION_TYPE = exports.OPERATION_TYPE = {
TM_GET_DTC_ADDRESS: 0x00,
TM_PROPAGATE_XACT: 0x01,
TM_BEGIN_XACT: 0x05,
TM_PROMOTE_XACT: 0x06,
TM_COMMIT_XACT: 0x07,
TM_ROLLBACK_XACT: 0x08,
TM_SAVE_XACT: 0x09
};
const ISOLATION_LEVEL = exports.ISOLATION_LEVEL = {
NO_CHANGE: 0x00,
READ_UNCOMMITTED: 0x01,
READ_COMMITTED: 0x02,
REPEATABLE_READ: 0x03,
SERIALIZABLE: 0x04,
SNAPSHOT: 0x05
};
const isolationLevelByValue = exports.isolationLevelByValue = {};
for (const name in ISOLATION_LEVEL) {
const value = ISOLATION_LEVEL[name];
isolationLevelByValue[value] = name;
}
function assertValidIsolationLevel(isolationLevel, name) {
if (typeof isolationLevel !== 'number') {
throw new TypeError(`The "${name}" ${name.includes('.') ? 'property' : 'argument'} must be of type number. Received type ${typeof isolationLevel} (${isolationLevel})`);
}
if (!Number.isInteger(isolationLevel)) {
throw new RangeError(`The value of "${name}" is out of range. It must be an integer. Received: ${isolationLevel}`);
}
if (!(isolationLevel >= 0 && isolationLevel <= 5)) {
throw new RangeError(`The value of "${name}" is out of range. It must be >= 0 && <= 5. Received: ${isolationLevel}`);
}
}
class Transaction {
constructor(name, isolationLevel = ISOLATION_LEVEL.NO_CHANGE) {
this.name = name;
this.isolationLevel = isolationLevel;
this.outstandingRequestCount = 1;
}
beginPayload(txnDescriptor) {
const buffer = new _writableTrackingBuffer.default();
(0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
buffer.writeUShort(OPERATION_TYPE.TM_BEGIN_XACT);
buffer.writeUInt8(this.isolationLevel);
buffer.writeUInt8(this.name.length * 2);
buffer.writeString(this.name, 'ucs2');
return {
*[Symbol.iterator]() {
yield buffer.data;
},
toString: () => {
return 'Begin Transaction: name=' + this.name + ', isolationLevel=' + isolationLevelByValue[this.isolationLevel];
}
};
}
commitPayload(txnDescriptor) {
const buffer = new _writableTrackingBuffer.default();
(0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
buffer.writeUShort(OPERATION_TYPE.TM_COMMIT_XACT);
buffer.writeUInt8(this.name.length * 2);
buffer.writeString(this.name, 'ucs2');
// No fBeginXact flag, so no new transaction is started.
buffer.writeUInt8(0);
return {
*[Symbol.iterator]() {
yield buffer.data;
},
toString: () => {
return 'Commit Transaction: name=' + this.name;
}
};
}
rollbackPayload(txnDescriptor) {
const buffer = new _writableTrackingBuffer.default();
(0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
buffer.writeUShort(OPERATION_TYPE.TM_ROLLBACK_XACT);
buffer.writeUInt8(this.name.length * 2);
buffer.writeString(this.name, 'ucs2');
// No fBeginXact flag, so no new transaction is started.
buffer.writeUInt8(0);
return {
*[Symbol.iterator]() {
yield buffer.data;
},
toString: () => {
return 'Rollback Transaction: name=' + this.name;
}
};
}
savePayload(txnDescriptor) {
const buffer = new _writableTrackingBuffer.default();
(0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
buffer.writeUShort(OPERATION_TYPE.TM_SAVE_XACT);
buffer.writeUInt8(this.name.length * 2);
buffer.writeString(this.name, 'ucs2');
return {
*[Symbol.iterator]() {
yield buffer.data;
},
toString: () => {
return 'Save Transaction: name=' + this.name;
}
};
}
isolationLevelToTSQL() {
switch (this.isolationLevel) {
case ISOLATION_LEVEL.READ_UNCOMMITTED:
return 'READ UNCOMMITTED';
case ISOLATION_LEVEL.READ_COMMITTED:
return 'READ COMMITTED';
case ISOLATION_LEVEL.REPEATABLE_READ:
return 'REPEATABLE READ';
case ISOLATION_LEVEL.SERIALIZABLE:
return 'SERIALIZABLE';
case ISOLATION_LEVEL.SNAPSHOT:
return 'SNAPSHOT';
}
return '';
}
}
exports.Transaction = Transaction;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2FsbEhlYWRlcnMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJPUEVSQVRJT05fVFlQRSIsImV4cG9ydHMiLCJUTV9HRVRfRFRDX0FERFJFU1MiLCJUTV9QUk9QQUdBVEVfWEFDVCIsIlRNX0JFR0lOX1hBQ1QiLCJUTV9QUk9NT1RFX1hBQ1QiLCJUTV9DT01NSVRfWEFDVCIsIlRNX1JPTExCQUNLX1hBQ1QiLCJUTV9TQVZFX1hBQ1QiLCJJU09MQVRJT05fTEVWRUwiLCJOT19DSEFOR0UiLCJSRUFEX1VOQ09NTUlUVEVEIiwiUkVBRF9DT01NSVRURUQiLCJSRVBFQVRBQkxFX1JFQUQiLCJTRVJJQUxJWkFCTEUiLCJTTkFQU0hPVCIsImlzb2xhdGlvbkxldmVsQnlWYWx1ZSIsIm5hbWUiLCJ2YWx1ZSIsImFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwiLCJpc29sYXRpb25MZXZlbCIsIlR5cGVFcnJvciIsImluY2x1ZGVzIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiUmFuZ2VFcnJvciIsIlRyYW5zYWN0aW9uIiwiY29uc3RydWN0b3IiLCJvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCIsImJlZ2luUGF5bG9hZCIsInR4bkRlc2NyaXB0b3IiLCJidWZmZXIiLCJXcml0YWJsZVRyYWNraW5nQnVmZmVyIiwid3JpdGVUb1RyYWNraW5nQnVmZmVyIiwid3JpdGVVU2hvcnQiLCJ3cml0ZVVJbnQ4IiwibGVuZ3RoIiwid3JpdGVTdHJpbmciLCJTeW1ib2wiLCJpdGVyYXRvciIsImRhdGEiLCJ0b1N0cmluZyIsImNvbW1pdFBheWxvYWQiLCJyb2xsYmFja1BheWxvYWQiLCJzYXZlUGF5bG9hZCIsImlzb2xhdGlvbkxldmVsVG9UU1FMIl0sInNvdXJjZXMiOlsiLi4vc3JjL3RyYW5zYWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBXcml0YWJsZVRyYWNraW5nQnVmZmVyIGZyb20gJy4vdHJhY2tpbmctYnVmZmVyL3dyaXRhYmxlLXRyYWNraW5nLWJ1ZmZlcic7XG5pbXBvcnQgeyB3cml0ZVRvVHJhY2tpbmdCdWZmZXIgfSBmcm9tICcuL2FsbC1oZWFkZXJzJztcblxuLypcbiAgczIuMi42LjhcbiAqL1xuXG5leHBvcnQgY29uc3QgT1BFUkFUSU9OX1RZUEUgPSB7XG4gIFRNX0dFVF9EVENfQUREUkVTUzogMHgwMCxcbiAgVE1fUFJPUEFHQVRFX1hBQ1Q6IDB4MDEsXG4gIFRNX0JFR0lOX1hBQ1Q6IDB4MDUsXG4gIFRNX1BST01PVEVfWEFDVDogMHgwNixcbiAgVE1fQ09NTUlUX1hBQ1Q6IDB4MDcsXG4gIFRNX1JPTExCQUNLX1hBQ1Q6IDB4MDgsXG4gIFRNX1NBVkVfWEFDVDogMHgwOVxufTtcblxuZXhwb3J0IGNvbnN0IElTT0xBVElPTl9MRVZFTDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHtcbiAgTk9fQ0hBTkdFOiAweDAwLFxuICBSRUFEX1VOQ09NTUlUVEVEOiAweDAxLFxuICBSRUFEX0NPTU1JVFRFRDogMHgwMixcbiAgUkVQRUFUQUJMRV9SRUFEOiAweDAzLFxuICBTRVJJQUxJWkFCTEU6IDB4MDQsXG4gIFNOQVBTSE9UOiAweDA1XG59O1xuXG5leHBvcnQgY29uc3QgaXNvbGF0aW9uTGV2ZWxCeVZhbHVlOiB7IFtrZXk6IG51bWJlcl06IHN0cmluZyB9ID0ge307XG5mb3IgKGNvbnN0IG5hbWUgaW4gSVNPTEFUSU9OX0xFVkVMKSB7XG4gIGNvbnN0IHZhbHVlID0gSVNPTEFUSU9OX0xFVkVMW25hbWVdO1xuICBpc29sYXRpb25MZXZlbEJ5VmFsdWVbdmFsdWVdID0gbmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwoaXNvbGF0aW9uTGV2ZWw6IGFueSwgbmFtZTogc3RyaW5nKTogYXNzZXJ0cyBpc29sYXRpb25MZXZlbCBpcyAwIHwgMSB8IDIgfCAzIHwgNCB8IDUge1xuICBpZiAodHlwZW9mIGlzb2xhdGlvbkxldmVsICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBcIiR7bmFtZX1cIiAke25hbWUuaW5jbHVkZXMoJy4nKSA/ICdwcm9wZXJ0eScgOiAnYXJndW1lbnQnfSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIGlzb2xhdGlvbkxldmVsfSAoJHtpc29sYXRpb25MZXZlbH0pYCk7XG4gIH1cblxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoaXNvbGF0aW9uTGV2ZWwpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiBcIiR7bmFtZX1cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYW4gaW50ZWdlci4gUmVjZWl2ZWQ6ICR7aXNvbGF0aW9uTGV2ZWx9YCk7XG4gIH1cblxuICBpZiAoIShpc29sYXRpb25MZXZlbCA+PSAwICYmIGlzb2xhdGlvbkxldmVsIDw9IDUpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiBcIiR7bmFtZX1cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgPj0gMCAmJiA8PSA1LiBSZWNlaXZlZDogJHtpc29sYXRpb25MZXZlbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24ge1xuICBkZWNsYXJlIG5hbWU6IHN0cmluZztcbiAgZGVjbGFyZSBpc29sYXRpb25MZXZlbDogbnVtYmVyO1xuICBkZWNsYXJlIG91dHN0YW5kaW5nUmVxdWVzdENvdW50OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBpc29sYXRpb25MZXZlbCA9IElTT0xBVElPTl9MRVZFTC5OT19DSEFOR0UpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuaXNvbGF0aW9uTGV2ZWwgPSBpc29sYXRpb25MZXZlbDtcbiAgICB0aGlzLm91dHN0YW5kaW5nUmVxdWVzdENvdW50ID0gMTtcbiAgfVxuXG4gIGJlZ2luUGF5bG9hZCh0eG5EZXNjcmlwdG9yOiBCdWZmZXIpIHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigpO1xuICAgIHdyaXRlVG9UcmFja2luZ0J1ZmZlcihidWZmZXIsIHR4bkRlc2NyaXB0b3IsIHRoaXMub3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQpO1xuICAgIGJ1ZmZlci53cml0ZVVTaG9ydChPUEVSQVRJT05fVFlQRS5UTV9CRUdJTl9YQUNUKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLmlzb2xhdGlvbkxldmVsKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLm5hbWUubGVuZ3RoICogMik7XG4gICAgYnVmZmVyLndyaXRlU3RyaW5nKHRoaXMubmFtZSwgJ3VjczInKTtcblxuICAgIHJldHVybiB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkIGJ1ZmZlci5kYXRhO1xuICAgICAgfSxcbiAgICAgIHRvU3RyaW5nOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiAnQmVnaW4gVHJhbnNhY3Rpb246IG5hbWU9JyArIHRoaXMubmFtZSArICcsIGlzb2xhdGlvbkxldmVsPScgKyBpc29sYXRpb25MZXZlbEJ5VmFsdWVbdGhpcy5pc29sYXRpb25MZXZlbF07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNvbW1pdFBheWxvYWQodHhuRGVzY3JpcHRvcjogQnVmZmVyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoKTtcbiAgICB3cml0ZVRvVHJhY2tpbmdCdWZmZXIoYnVmZmVyLCB0eG5EZXNjcmlwdG9yLCB0aGlzLm91dHN0YW5kaW5nUmVxdWVzdENvdW50KTtcbiAgICBidWZmZXIud3JpdGVVU2hvcnQoT1BFUkFUSU9OX1RZUEUuVE1fQ09NTUlUX1hBQ1QpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KHRoaXMubmFtZS5sZW5ndGggKiAyKTtcbiAgICBidWZmZXIud3JpdGVTdHJpbmcodGhpcy5uYW1lLCAndWNzMicpO1xuICAgIC8vIE5vIGZCZWdpblhhY3QgZmxhZywgc28gbm8gbmV3IHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQuXG4gICAgYnVmZmVyLndyaXRlVUludDgoMCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCBidWZmZXIuZGF0YTtcbiAgICAgIH0sXG4gICAgICB0b1N0cmluZzogKCkgPT4ge1xuICAgICAgICByZXR1cm4gJ0NvbW1pdCBUcmFuc2FjdGlvbjogbmFtZT0nICsgdGhpcy5uYW1lO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByb2xsYmFja1BheWxvYWQodHhuRGVzY3JpcHRvcjogQnVmZmVyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoKTtcbiAgICB3cml0ZVRvVHJhY2tpbmdCdWZmZXIoYnVmZmVyLCB0eG5EZXNjcmlwdG9yLCB0aGlzLm91dHN0YW5kaW5nUmVxdWVzdENvdW50KTtcbiAgICBidWZmZXIud3JpdGVVU2hvcnQoT1BFUkFUSU9OX1RZUEUuVE1fUk9MTEJBQ0tfWEFDVCk7XG4gICAgYnVmZmVyLndyaXRlVUludDgodGhpcy5uYW1lLmxlbmd0aCAqIDIpO1xuICAgIGJ1ZmZlci53cml0ZVN0cmluZyh0aGlzLm5hbWUsICd1Y3MyJyk7XG4gICAgLy8gTm8gZkJlZ2luWGFjdCBmbGFnLCBzbyBubyBuZXcgdHJhbnNhY3Rpb24gaXMgc3RhcnRlZC5cbiAgICBidWZmZXIud3JpdGVVSW50OCgwKTtcblxuICAgIHJldHVybiB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkIGJ1ZmZlci5kYXRhO1xuICAgICAgfSxcbiAgICAgIHRvU3RyaW5nOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiAnUm9sbGJhY2sgVHJhbnNhY3Rpb246IG5hbWU9JyArIHRoaXMubmFtZTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2F2ZVBheWxvYWQodHhuRGVzY3JpcHRvcjogQnVmZmVyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoKTtcbiAgICB3cml0ZVRvVHJhY2tpbmdCdWZmZXIoYnVmZmVyLCB0eG5EZXNjcmlwdG9yLCB0aGlzLm91dHN0YW5kaW5nUmVxdWVzdENvdW50KTtcbiAgICBidWZmZXIud3JpdGVVU2hvcnQoT1BFUkFUSU9OX1RZUEUuVE1fU0FWRV9YQUNUKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLm5hbWUubGVuZ3RoICogMik7XG4gICAgYnVmZmVyLndyaXRlU3RyaW5nKHRoaXMubmFtZSwgJ3VjczInKTtcblxuICAgIHJldHVybiB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkIGJ1ZmZlci5kYXRhO1xuICAgICAgfSxcbiAgICAgIHRvU3RyaW5nOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiAnU2F2ZSBUcmFuc2FjdGlvbjogbmFtZT0nICsgdGhpcy5uYW1lO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBpc29sYXRpb25MZXZlbFRvVFNRTCgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlJFQURfVU5DT01NSVRURUQ6XG4gICAgICAgIHJldHVybiAnUkVBRCBVTkNPTU1JVFRFRCc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5SRUFEX0NPTU1JVFRFRDpcbiAgICAgICAgcmV0dXJuICdSRUFEIENPTU1JVFRFRCc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5SRVBFQVRBQkxFX1JFQUQ6XG4gICAgICAgIHJldHVybiAnUkVQRUFUQUJMRSBSRUFEJztcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlNFUklBTElaQUJMRTpcbiAgICAgICAgcmV0dXJuICdTRVJJQUxJWkFCTEUnO1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuU05BUFNIT1Q6XG4gICAgICAgIHJldHVybiAnU05BUFNIT1QnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSx1QkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQXNELFNBQUFELHVCQUFBRyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRXREO0FBQ0E7QUFDQTs7QUFFTyxNQUFNRyxjQUFjLEdBQUFDLE9BQUEsQ0FBQUQsY0FBQSxHQUFHO0VBQzVCRSxrQkFBa0IsRUFBRSxJQUFJO0VBQ3hCQyxpQkFBaUIsRUFBRSxJQUFJO0VBQ3ZCQyxhQUFhLEVBQUUsSUFBSTtFQUNuQkMsZUFBZSxFQUFFLElBQUk7RUFDckJDLGNBQWMsRUFBRSxJQUFJO0VBQ3BCQyxnQkFBZ0IsRUFBRSxJQUFJO0VBQ3RCQyxZQUFZLEVBQUU7QUFDaEIsQ0FBQztBQUVNLE1BQU1DLGVBQTBDLEdBQUFSLE9BQUEsQ0FBQVEsZUFBQSxHQUFHO0VBQ3hEQyxTQUFTLEVBQUUsSUFBSTtFQUNmQyxnQkFBZ0IsRUFBRSxJQUFJO0VBQ3RCQyxjQUFjLEVBQUUsSUFBSTtFQUNwQkMsZUFBZSxFQUFFLElBQUk7RUFDckJDLFlBQVksRUFBRSxJQUFJO0VBQ2xCQyxRQUFRLEVBQUU7QUFDWixDQUFDO0FBRU0sTUFBTUMscUJBQWdELEdBQUFmLE9BQUEsQ0FBQWUscUJBQUEsR0FBRyxDQUFDLENBQUM7QUFDbEUsS0FBSyxNQUFNQyxJQUFJLElBQUlSLGVBQWUsRUFBRTtFQUNsQyxNQUFNUyxLQUFLLEdBQUdULGVBQWUsQ0FBQ1EsSUFBSSxDQUFDO0VBQ25DRCxxQkFBcUIsQ0FBQ0UsS0FBSyxDQUFDLEdBQUdELElBQUk7QUFDckM7QUFFTyxTQUFTRSx5QkFBeUJB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