UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

359 lines (358 loc) • 32.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.readCollation = readCollation; exports.readMetadata = readMetadata; var _collation = require("./collation"); var _dataType = require("./data-type"); var _formatHex = require("./format-hex"); var _helpers = require("./token/helpers"); function readCollation(buf, offset) { offset = +offset; if (buf.length < offset + 5) { throw new _helpers.NotEnoughDataError(offset + 5); } const collation = _collation.Collation.fromBuffer(buf.slice(offset, offset + 5)); return new _helpers.Result(collation, offset + 5); } function readSchema(buf, offset) { offset = +offset; let schemaPresent; ({ offset, value: schemaPresent } = (0, _helpers.readUInt8)(buf, offset)); if (schemaPresent !== 0x01) { return new _helpers.Result(undefined, offset); } let dbname; ({ offset, value: dbname } = (0, _helpers.readBVarChar)(buf, offset)); let owningSchema; ({ offset, value: owningSchema } = (0, _helpers.readBVarChar)(buf, offset)); let xmlSchemaCollection; ({ offset, value: xmlSchemaCollection } = (0, _helpers.readUsVarChar)(buf, offset)); return new _helpers.Result({ dbname, owningSchema, xmlSchemaCollection }, offset); } function readUDTInfo(buf, offset) { let maxByteSize; ({ offset, value: maxByteSize } = (0, _helpers.readUInt16LE)(buf, offset)); let dbname; ({ offset, value: dbname } = (0, _helpers.readBVarChar)(buf, offset)); let owningSchema; ({ offset, value: owningSchema } = (0, _helpers.readBVarChar)(buf, offset)); let typeName; ({ offset, value: typeName } = (0, _helpers.readBVarChar)(buf, offset)); let assemblyName; ({ offset, value: assemblyName } = (0, _helpers.readUsVarChar)(buf, offset)); return new _helpers.Result({ maxByteSize: maxByteSize, dbname: dbname, owningSchema: owningSchema, typeName: typeName, assemblyName: assemblyName }, offset); } function readMetadata(buf, offset, options) { let userType; ({ offset, value: userType } = (options.tdsVersion < '7_2' ? _helpers.readUInt16LE : _helpers.readUInt32LE)(buf, offset)); let flags; ({ offset, value: flags } = (0, _helpers.readUInt16LE)(buf, offset)); let typeNumber; ({ offset, value: typeNumber } = (0, _helpers.readUInt8)(buf, offset)); const type = _dataType.TYPE[typeNumber]; if (!type) { throw new Error(`Unrecognised data type 0x${(0, _formatHex.formatHex)(typeNumber, 2)}`); } switch (type.name) { case 'Null': case 'TinyInt': case 'SmallInt': case 'Int': case 'BigInt': case 'Real': case 'Float': case 'SmallMoney': case 'Money': case 'Bit': case 'SmallDateTime': case 'DateTime': case 'Date': return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: undefined, precision: undefined, scale: undefined, dataLength: undefined, schema: undefined, udtInfo: undefined }, offset); case 'IntN': case 'FloatN': case 'MoneyN': case 'BitN': case 'UniqueIdentifier': case 'DateTimeN': { let dataLength; ({ offset, value: dataLength } = (0, _helpers.readUInt8)(buf, offset)); return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: undefined, precision: undefined, scale: undefined, dataLength: dataLength, schema: undefined, udtInfo: undefined }, offset); } case 'Variant': { let dataLength; ({ offset, value: dataLength } = (0, _helpers.readUInt32LE)(buf, offset)); return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: undefined, precision: undefined, scale: undefined, dataLength: dataLength, schema: undefined, udtInfo: undefined }, offset); } case 'VarChar': case 'Char': case 'NVarChar': case 'NChar': { let dataLength; ({ offset, value: dataLength } = (0, _helpers.readUInt16LE)(buf, offset)); let collation; ({ offset, value: collation } = readCollation(buf, offset)); return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: collation, precision: undefined, scale: undefined, dataLength: dataLength, schema: undefined, udtInfo: undefined }, offset); } case 'Text': case 'NText': { let dataLength; ({ offset, value: dataLength } = (0, _helpers.readUInt32LE)(buf, offset)); let collation; ({ offset, value: collation } = readCollation(buf, offset)); return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: collation, precision: undefined, scale: undefined, dataLength: dataLength, schema: undefined, udtInfo: undefined }, offset); } case 'VarBinary': case 'Binary': { let dataLength; ({ offset, value: dataLength } = (0, _helpers.readUInt16LE)(buf, offset)); return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: undefined, precision: undefined, scale: undefined, dataLength: dataLength, schema: undefined, udtInfo: undefined }, offset); } case 'Image': { let dataLength; ({ offset, value: dataLength } = (0, _helpers.readUInt32LE)(buf, offset)); return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: undefined, precision: undefined, scale: undefined, dataLength: dataLength, schema: undefined, udtInfo: undefined }, offset); } case 'Xml': { let schema; ({ offset, value: schema } = readSchema(buf, offset)); return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: undefined, precision: undefined, scale: undefined, dataLength: undefined, schema: schema, udtInfo: undefined }, offset); } case 'Time': case 'DateTime2': case 'DateTimeOffset': { let scale; ({ offset, value: scale } = (0, _helpers.readUInt8)(buf, offset)); return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: undefined, precision: undefined, scale: scale, dataLength: undefined, schema: undefined, udtInfo: undefined }, offset); } case 'NumericN': case 'DecimalN': { let dataLength; ({ offset, value: dataLength } = (0, _helpers.readUInt8)(buf, offset)); let precision; ({ offset, value: precision } = (0, _helpers.readUInt8)(buf, offset)); let scale; ({ offset, value: scale } = (0, _helpers.readUInt8)(buf, offset)); return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: undefined, precision: precision, scale: scale, dataLength: dataLength, schema: undefined, udtInfo: undefined }, offset); } case 'UDT': { let udtInfo; ({ offset, value: udtInfo } = readUDTInfo(buf, offset)); return new _helpers.Result({ userType: userType, flags: flags, type: type, collation: undefined, precision: undefined, scale: undefined, dataLength: undefined, schema: undefined, udtInfo: udtInfo }, offset); } default: throw new Error(`Unrecognised type ${type.name}`); } } module.exports.readCollation = readCollation; module.exports.readMetadata = readMetadata; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29sbGF0aW9uIiwicmVxdWlyZSIsIl9kYXRhVHlwZSIsIl9mb3JtYXRIZXgiLCJfaGVscGVycyIsInJlYWRDb2xsYXRpb24iLCJidWYiLCJvZmZzZXQiLCJsZW5ndGgiLCJOb3RFbm91Z2hEYXRhRXJyb3IiLCJjb2xsYXRpb24iLCJDb2xsYXRpb24iLCJmcm9tQnVmZmVyIiwic2xpY2UiLCJSZXN1bHQiLCJyZWFkU2NoZW1hIiwic2NoZW1hUHJlc2VudCIsInZhbHVlIiwicmVhZFVJbnQ4IiwidW5kZWZpbmVkIiwiZGJuYW1lIiwicmVhZEJWYXJDaGFyIiwib3duaW5nU2NoZW1hIiwieG1sU2NoZW1hQ29sbGVjdGlvbiIsInJlYWRVc1ZhckNoYXIiLCJyZWFkVURUSW5mbyIsIm1heEJ5dGVTaXplIiwicmVhZFVJbnQxNkxFIiwidHlwZU5hbWUiLCJhc3NlbWJseU5hbWUiLCJyZWFkTWV0YWRhdGEiLCJvcHRpb25zIiwidXNlclR5cGUiLCJ0ZHNWZXJzaW9uIiwicmVhZFVJbnQzMkxFIiwiZmxhZ3MiLCJ0eXBlTnVtYmVyIiwidHlwZSIsIlRZUEUiLCJFcnJvciIsImZvcm1hdEhleCIsIm5hbWUiLCJwcmVjaXNpb24iLCJzY2FsZSIsImRhdGFMZW5ndGgiLCJzY2hlbWEiLCJ1ZHRJbmZvIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXRhZGF0YS1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuaW1wb3J0IHsgdHlwZSBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi90b2tlbi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IFRZUEUsIHR5cGUgRGF0YVR5cGUgfSBmcm9tICcuL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyB0eXBlIENyeXB0b01ldGFkYXRhIH0gZnJvbSAnLi9hbHdheXMtZW5jcnlwdGVkL3R5cGVzJztcblxuaW1wb3J0IHsgZm9ybWF0SGV4IH0gZnJvbSAnLi9mb3JtYXQtaGV4JztcblxuaW1wb3J0IHsgUmVzdWx0LCBOb3RFbm91Z2hEYXRhRXJyb3IsIHJlYWRVSW50OCwgcmVhZEJWYXJDaGFyLCByZWFkVXNWYXJDaGFyLCByZWFkVUludDE2TEUsIHJlYWRVSW50MzJMRSB9IGZyb20gJy4vdG9rZW4vaGVscGVycyc7XG5cbmludGVyZmFjZSBYbWxTY2hlbWEge1xuICBkYm5hbWU6IHN0cmluZztcbiAgb3duaW5nU2NoZW1hOiBzdHJpbmc7XG4gIHhtbFNjaGVtYUNvbGxlY3Rpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFVkdEluZm8ge1xuICBtYXhCeXRlU2l6ZTogbnVtYmVyO1xuICBkYm5hbWU6IHN0cmluZztcbiAgb3duaW5nU2NoZW1hOiBzdHJpbmc7XG4gIHR5cGVOYW1lOiBzdHJpbmc7XG4gIGFzc2VtYmx5TmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBCYXNlTWV0YWRhdGEgPSB7XG4gIHVzZXJUeXBlOiBudW1iZXI7XG5cbiAgZmxhZ3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4ncyB0eXBlLCBzdWNoIGFzIFZhckNoYXIsIEludCBvciBCaW5hcnkuXG4gICAqL1xuICB0eXBlOiBEYXRhVHlwZTtcblxuICBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBwcmVjaXNpb24uIE9ubHkgYXBwbGljYWJsZSB0byBudW1lcmljIGFuZCBkZWNpbWFsLlxuICAgKi9cbiAgcHJlY2lzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzY2FsZS4gT25seSBhcHBsaWNhYmxlIHRvIG51bWVyaWMsIGRlY2ltYWwsIHRpbWUsIGRhdGV0aW1lMiBhbmQgZGF0ZXRpbWVvZmZzZXQuXG4gICAqL1xuICBzY2FsZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbGVuZ3RoLCBmb3IgY2hhciwgdmFyY2hhciwgbnZhcmNoYXIgYW5kIHZhcmJpbmFyeS5cbiAgICovXG4gIGRhdGFMZW5ndGg6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBzY2hlbWE6IFhtbFNjaGVtYSB8IHVuZGVmaW5lZDtcblxuICB1ZHRJbmZvOiBVZHRJbmZvIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBNZXRhZGF0YSA9IHtcbiAgY3J5cHRvTWV0YWRhdGE/OiBDcnlwdG9NZXRhZGF0YTtcbn0gJiBCYXNlTWV0YWRhdGE7XG5cbmZ1bmN0aW9uIHJlYWRDb2xsYXRpb24oYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PENvbGxhdGlvbj4ge1xuICBvZmZzZXQgPSArb2Zmc2V0O1xuXG4gIGlmIChidWYubGVuZ3RoIDwgb2Zmc2V0ICsgNSkge1xuICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Iob2Zmc2V0ICsgNSk7XG4gIH1cblxuICBjb25zdCBjb2xsYXRpb24gPSBDb2xsYXRpb24uZnJvbUJ1ZmZlcihidWYuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyA1KSk7XG4gIHJldHVybiBuZXcgUmVzdWx0KGNvbGxhdGlvbiwgb2Zmc2V0ICsgNSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTY2hlbWEoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PFhtbFNjaGVtYSB8IHVuZGVmaW5lZD4ge1xuICBvZmZzZXQgPSArb2Zmc2V0O1xuXG4gIGxldCBzY2hlbWFQcmVzZW50O1xuICAoeyBvZmZzZXQsIHZhbHVlOiBzY2hlbWFQcmVzZW50IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBpZiAoc2NoZW1hUHJlc2VudCAhPT0gMHgwMSkge1xuICAgIHJldHVybiBuZXcgUmVzdWx0KHVuZGVmaW5lZCwgb2Zmc2V0KTtcbiAgfVxuXG4gIGxldCBkYm5hbWU7XG4gICh7IG9mZnNldCwgdmFsdWU6IGRibmFtZSB9ID0gcmVhZEJWYXJDaGFyKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IG93bmluZ1NjaGVtYTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogb3duaW5nU2NoZW1hIH0gPSByZWFkQlZhckNoYXIoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgeG1sU2NoZW1hQ29sbGVjdGlvbjtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogeG1sU2NoZW1hQ29sbGVjdGlvbiB9ID0gcmVhZFVzVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KHsgZGJuYW1lLCBvd25pbmdTY2hlbWEsIHhtbFNjaGVtYUNvbGxlY3Rpb24gfSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFVEVEluZm8oYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PFVkdEluZm8+IHtcbiAgbGV0IG1heEJ5dGVTaXplO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBtYXhCeXRlU2l6ZSB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IGRibmFtZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGJuYW1lIH0gPSByZWFkQlZhckNoYXIoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgb3duaW5nU2NoZW1hO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBvd25pbmdTY2hlbWEgfSA9IHJlYWRCVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIGxldCB0eXBlTmFtZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdHlwZU5hbWUgfSA9IHJlYWRCVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIGxldCBhc3NlbWJseU5hbWU7XG4gICh7IG9mZnNldCwgdmFsdWU6IGFzc2VtYmx5TmFtZSB9ID0gcmVhZFVzVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICBtYXhCeXRlU2l6ZTogbWF4Qnl0ZVNpemUsXG4gICAgZGJuYW1lOiBkYm5hbWUsXG4gICAgb3duaW5nU2NoZW1hOiBvd25pbmdTY2hlbWEsXG4gICAgdHlwZU5hbWU6IHR5cGVOYW1lLFxuICAgIGFzc2VtYmx5TmFtZTogYXNzZW1ibHlOYW1lXG4gIH0sIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRNZXRhZGF0YShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMpOiBSZXN1bHQ8TWV0YWRhdGE+IHtcbiAgbGV0IHVzZXJUeXBlO1xuICAoeyBvZmZzZXQsIHZhbHVlOiB1c2VyVHlwZSB9ID0gKG9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInID8gcmVhZFVJbnQxNkxFIDogcmVhZFVJbnQzMkxFKShidWYsIG9mZnNldCkpO1xuXG4gIGxldCBmbGFncztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZmxhZ3MgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gIGxldCB0eXBlTnVtYmVyO1xuICAoeyBvZmZzZXQsIHZhbHVlOiB0eXBlTnVtYmVyIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBjb25zdCB0eXBlOiBEYXRhVHlwZSA9IFRZUEVbdHlwZU51bWJlcl07XG4gIGlmICghdHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pc2VkIGRhdGEgdHlwZSAweCR7Zm9ybWF0SGV4KHR5cGVOdW1iZXIsIDIpfWApO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlLm5hbWUpIHtcbiAgICBjYXNlICdOdWxsJzpcbiAgICBjYXNlICdUaW55SW50JzpcbiAgICBjYXNlICdTbWFsbEludCc6XG4gICAgY2FzZSAnSW50JzpcbiAgICBjYXNlICdCaWdJbnQnOlxuICAgIGNhc2UgJ1JlYWwnOlxuICAgIGNhc2UgJ0Zsb2F0JzpcbiAgICBjYXNlICdTbWFsbE1vbmV5JzpcbiAgICBjYXNlICdNb25leSc6XG4gICAgY2FzZSAnQml0JzpcbiAgICBjYXNlICdTbWFsbERhdGVUaW1lJzpcbiAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGFMZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ0ludE4nOlxuICAgIGNhc2UgJ0Zsb2F0Tic6XG4gICAgY2FzZSAnTW9uZXlOJzpcbiAgICBjYXNlICdCaXROJzpcbiAgICBjYXNlICdVbmlxdWVJZGVudGlmaWVyJzpcbiAgICBjYXNlICdEYXRlVGltZU4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGFMZW5ndGg6IGRhdGFMZW5ndGgsXG4gICAgICAgIHNjaGVtYTogdW5kZWZpbmVkLFxuICAgICAgICB1ZHRJbmZvOiB1bmRlZmluZWRcbiAgICAgIH0sIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnVmFyaWFudCc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YUxlbmd0aDogZGF0YUxlbmd0aCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdWYXJDaGFyJzpcbiAgICBjYXNlICdDaGFyJzpcbiAgICBjYXNlICdOVmFyQ2hhcic6XG4gICAgY2FzZSAnTkNoYXInOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICBsZXQgY29sbGF0aW9uO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogY29sbGF0aW9uIH0gPSByZWFkQ29sbGF0aW9uKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNvbGxhdGlvbjogY29sbGF0aW9uLFxuICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YUxlbmd0aDogZGF0YUxlbmd0aCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdUZXh0JzpcbiAgICBjYXNlICdOVGV4dCc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGxldCBjb2xsYXRpb247XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBjb2xsYXRpb24gfSA9IHJlYWRDb2xsYXRpb24oYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiBjb2xsYXRpb24sXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ1ZhckJpbmFyeSc6XG4gICAgY2FzZSAnQmluYXJ5Jzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0ltYWdlJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ1htbCc6IHtcbiAgICAgIGxldCBzY2hlbWE7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBzY2hlbWEgfSA9IHJlYWRTY2hlbWEoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICB1ZHRJbmZvOiB1bmRlZmluZWRcbiAgICAgIH0sIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnVGltZSc6XG4gICAgY2FzZSAnRGF0ZVRpbWUyJzpcbiAgICBjYXNlICdEYXRlVGltZU9mZnNldCc6IHtcbiAgICAgIGxldCBzY2FsZTtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IHNjYWxlIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogc2NhbGUsXG4gICAgICAgIGRhdGFMZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdOdW1lcmljTic6XG4gICAgY2FzZSAnRGVjaW1hbE4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBsZXQgcHJlY2lzaW9uO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogcHJlY2lzaW9uIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgbGV0IHNjYWxlO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogc2NhbGUgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiBwcmVjaXNpb24sXG4gICAgICAgIHNjYWxlOiBzY2FsZSxcbiAgICAgICAgZGF0YUxlbmd0aDogZGF0YUxlbmd0aCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdVRFQnOiB7XG4gICAgICBsZXQgdWR0SW5mbztcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IHVkdEluZm8gfSA9IHJlYWRVRFRJbmZvKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YUxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdWR0SW5mb1xuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbmlzZWQgdHlwZSAke3R5cGUubmFtZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgeyByZWFkQ29sbGF0aW9uLCByZWFkTWV0YWRhdGEgfTtcblxubW9kdWxlLmV4cG9ydHMucmVhZENvbGxhdGlvbiA9IHJlYWRDb2xsYXRpb247XG5tb2R1bGUuZXhwb3J0cy5yZWFkTWV0YWRhdGEgPSByZWFkTWV0YWRhdGE7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFHQSxJQUFBRSxVQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFrREEsU0FBU0ksYUFBYUEsQ0FB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