328 lines
39 KiB
JavaScript
328 lines
39 KiB
JavaScript
|
|
"use strict";
|
||
|
|
|
||
|
|
Object.defineProperty(exports, "__esModule", {
|
||
|
|
value: true
|
||
|
|
});
|
||
|
|
exports.Token = exports.TYPE = exports.SSPIToken = exports.RowToken = exports.RoutingEnvChangeToken = exports.RollbackTransactionEnvChangeToken = exports.ReturnValueToken = exports.ReturnStatusToken = exports.ResetConnectionEnvChangeToken = exports.PacketSizeEnvChangeToken = exports.OrderToken = exports.NBCRowToken = exports.LoginAckToken = exports.LanguageEnvChangeToken = exports.InfoMessageToken = exports.FedAuthInfoToken = exports.FeatureExtAckToken = exports.ErrorMessageToken = exports.DoneToken = exports.DoneProcToken = exports.DoneInProcToken = exports.DatabaseMirroringPartnerEnvChangeToken = exports.DatabaseEnvChangeToken = exports.CommitTransactionEnvChangeToken = exports.CollationChangeToken = exports.ColMetadataToken = exports.CharsetEnvChangeToken = exports.BeginTransactionEnvChangeToken = void 0;
|
||
|
|
const TYPE = exports.TYPE = {
|
||
|
|
ALTMETADATA: 0x88,
|
||
|
|
ALTROW: 0xD3,
|
||
|
|
COLMETADATA: 0x81,
|
||
|
|
COLINFO: 0xA5,
|
||
|
|
DONE: 0xFD,
|
||
|
|
DONEPROC: 0xFE,
|
||
|
|
DONEINPROC: 0xFF,
|
||
|
|
ENVCHANGE: 0xE3,
|
||
|
|
ERROR: 0xAA,
|
||
|
|
FEATUREEXTACK: 0xAE,
|
||
|
|
FEDAUTHINFO: 0xEE,
|
||
|
|
INFO: 0xAB,
|
||
|
|
LOGINACK: 0xAD,
|
||
|
|
NBCROW: 0xD2,
|
||
|
|
OFFSET: 0x78,
|
||
|
|
ORDER: 0xA9,
|
||
|
|
RETURNSTATUS: 0x79,
|
||
|
|
RETURNVALUE: 0xAC,
|
||
|
|
ROW: 0xD1,
|
||
|
|
SSPI: 0xED,
|
||
|
|
TABNAME: 0xA4
|
||
|
|
};
|
||
|
|
class Token {
|
||
|
|
constructor(name, handlerName) {
|
||
|
|
this.name = name;
|
||
|
|
this.handlerName = handlerName;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.Token = Token;
|
||
|
|
class ColMetadataToken extends Token {
|
||
|
|
constructor(columns) {
|
||
|
|
super('COLMETADATA', 'onColMetadata');
|
||
|
|
this.columns = columns;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.ColMetadataToken = ColMetadataToken;
|
||
|
|
class DoneToken extends Token {
|
||
|
|
constructor({
|
||
|
|
more,
|
||
|
|
sqlError,
|
||
|
|
attention,
|
||
|
|
serverError,
|
||
|
|
rowCount,
|
||
|
|
curCmd
|
||
|
|
}) {
|
||
|
|
super('DONE', 'onDone');
|
||
|
|
this.more = more;
|
||
|
|
this.sqlError = sqlError;
|
||
|
|
this.attention = attention;
|
||
|
|
this.serverError = serverError;
|
||
|
|
this.rowCount = rowCount;
|
||
|
|
this.curCmd = curCmd;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.DoneToken = DoneToken;
|
||
|
|
class DoneInProcToken extends Token {
|
||
|
|
constructor({
|
||
|
|
more,
|
||
|
|
sqlError,
|
||
|
|
attention,
|
||
|
|
serverError,
|
||
|
|
rowCount,
|
||
|
|
curCmd
|
||
|
|
}) {
|
||
|
|
super('DONEINPROC', 'onDoneInProc');
|
||
|
|
this.more = more;
|
||
|
|
this.sqlError = sqlError;
|
||
|
|
this.attention = attention;
|
||
|
|
this.serverError = serverError;
|
||
|
|
this.rowCount = rowCount;
|
||
|
|
this.curCmd = curCmd;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.DoneInProcToken = DoneInProcToken;
|
||
|
|
class DoneProcToken extends Token {
|
||
|
|
constructor({
|
||
|
|
more,
|
||
|
|
sqlError,
|
||
|
|
attention,
|
||
|
|
serverError,
|
||
|
|
rowCount,
|
||
|
|
curCmd
|
||
|
|
}) {
|
||
|
|
super('DONEPROC', 'onDoneProc');
|
||
|
|
this.more = more;
|
||
|
|
this.sqlError = sqlError;
|
||
|
|
this.attention = attention;
|
||
|
|
this.serverError = serverError;
|
||
|
|
this.rowCount = rowCount;
|
||
|
|
this.curCmd = curCmd;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.DoneProcToken = DoneProcToken;
|
||
|
|
class DatabaseEnvChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onDatabaseChange');
|
||
|
|
this.type = 'DATABASE';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.DatabaseEnvChangeToken = DatabaseEnvChangeToken;
|
||
|
|
class LanguageEnvChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onLanguageChange');
|
||
|
|
this.type = 'LANGUAGE';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.LanguageEnvChangeToken = LanguageEnvChangeToken;
|
||
|
|
class CharsetEnvChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onCharsetChange');
|
||
|
|
this.type = 'CHARSET';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.CharsetEnvChangeToken = CharsetEnvChangeToken;
|
||
|
|
class PacketSizeEnvChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onPacketSizeChange');
|
||
|
|
this.type = 'PACKET_SIZE';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.PacketSizeEnvChangeToken = PacketSizeEnvChangeToken;
|
||
|
|
class BeginTransactionEnvChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onBeginTransaction');
|
||
|
|
this.type = 'BEGIN_TXN';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.BeginTransactionEnvChangeToken = BeginTransactionEnvChangeToken;
|
||
|
|
class CommitTransactionEnvChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onCommitTransaction');
|
||
|
|
this.type = 'COMMIT_TXN';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.CommitTransactionEnvChangeToken = CommitTransactionEnvChangeToken;
|
||
|
|
class RollbackTransactionEnvChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onRollbackTransaction');
|
||
|
|
this.type = 'ROLLBACK_TXN';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.RollbackTransactionEnvChangeToken = RollbackTransactionEnvChangeToken;
|
||
|
|
class DatabaseMirroringPartnerEnvChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onDatabaseMirroringPartner');
|
||
|
|
this.type = 'DATABASE_MIRRORING_PARTNER';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.DatabaseMirroringPartnerEnvChangeToken = DatabaseMirroringPartnerEnvChangeToken;
|
||
|
|
class ResetConnectionEnvChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onResetConnection');
|
||
|
|
this.type = 'RESET_CONNECTION';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.ResetConnectionEnvChangeToken = ResetConnectionEnvChangeToken;
|
||
|
|
class CollationChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onSqlCollationChange');
|
||
|
|
this.type = 'SQL_COLLATION';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.CollationChangeToken = CollationChangeToken;
|
||
|
|
class RoutingEnvChangeToken extends Token {
|
||
|
|
constructor(newValue, oldValue) {
|
||
|
|
super('ENVCHANGE', 'onRoutingChange');
|
||
|
|
this.type = 'ROUTING_CHANGE';
|
||
|
|
this.newValue = newValue;
|
||
|
|
this.oldValue = oldValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.RoutingEnvChangeToken = RoutingEnvChangeToken;
|
||
|
|
class FeatureExtAckToken extends Token {
|
||
|
|
/** Value of UTF8_SUPPORT acknowledgement.
|
||
|
|
*
|
||
|
|
* undefined when UTF8_SUPPORT not included in token. */
|
||
|
|
|
||
|
|
constructor(fedAuth, utf8Support) {
|
||
|
|
super('FEATUREEXTACK', 'onFeatureExtAck');
|
||
|
|
this.fedAuth = fedAuth;
|
||
|
|
this.utf8Support = utf8Support;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.FeatureExtAckToken = FeatureExtAckToken;
|
||
|
|
class FedAuthInfoToken extends Token {
|
||
|
|
constructor(spn, stsurl) {
|
||
|
|
super('FEDAUTHINFO', 'onFedAuthInfo');
|
||
|
|
this.spn = spn;
|
||
|
|
this.stsurl = stsurl;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.FedAuthInfoToken = FedAuthInfoToken;
|
||
|
|
class InfoMessageToken extends Token {
|
||
|
|
constructor({
|
||
|
|
number,
|
||
|
|
state,
|
||
|
|
class: clazz,
|
||
|
|
message,
|
||
|
|
serverName,
|
||
|
|
procName,
|
||
|
|
lineNumber
|
||
|
|
}) {
|
||
|
|
super('INFO', 'onInfoMessage');
|
||
|
|
this.number = number;
|
||
|
|
this.state = state;
|
||
|
|
this.class = clazz;
|
||
|
|
this.message = message;
|
||
|
|
this.serverName = serverName;
|
||
|
|
this.procName = procName;
|
||
|
|
this.lineNumber = lineNumber;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.InfoMessageToken = InfoMessageToken;
|
||
|
|
class ErrorMessageToken extends Token {
|
||
|
|
constructor({
|
||
|
|
number,
|
||
|
|
state,
|
||
|
|
class: clazz,
|
||
|
|
message,
|
||
|
|
serverName,
|
||
|
|
procName,
|
||
|
|
lineNumber
|
||
|
|
}) {
|
||
|
|
super('ERROR', 'onErrorMessage');
|
||
|
|
this.number = number;
|
||
|
|
this.state = state;
|
||
|
|
this.class = clazz;
|
||
|
|
this.message = message;
|
||
|
|
this.serverName = serverName;
|
||
|
|
this.procName = procName;
|
||
|
|
this.lineNumber = lineNumber;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.ErrorMessageToken = ErrorMessageToken;
|
||
|
|
class LoginAckToken extends Token {
|
||
|
|
constructor({
|
||
|
|
interface: interfaze,
|
||
|
|
tdsVersion,
|
||
|
|
progName,
|
||
|
|
progVersion
|
||
|
|
}) {
|
||
|
|
super('LOGINACK', 'onLoginAck');
|
||
|
|
this.interface = interfaze;
|
||
|
|
this.tdsVersion = tdsVersion;
|
||
|
|
this.progName = progName;
|
||
|
|
this.progVersion = progVersion;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.LoginAckToken = LoginAckToken;
|
||
|
|
class NBCRowToken extends Token {
|
||
|
|
constructor(columns) {
|
||
|
|
super('NBCROW', 'onRow');
|
||
|
|
this.columns = columns;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.NBCRowToken = NBCRowToken;
|
||
|
|
class OrderToken extends Token {
|
||
|
|
constructor(orderColumns) {
|
||
|
|
super('ORDER', 'onOrder');
|
||
|
|
this.orderColumns = orderColumns;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.OrderToken = OrderToken;
|
||
|
|
class ReturnStatusToken extends Token {
|
||
|
|
constructor(value) {
|
||
|
|
super('RETURNSTATUS', 'onReturnStatus');
|
||
|
|
this.value = value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.ReturnStatusToken = ReturnStatusToken;
|
||
|
|
class ReturnValueToken extends Token {
|
||
|
|
constructor({
|
||
|
|
paramOrdinal,
|
||
|
|
paramName,
|
||
|
|
metadata,
|
||
|
|
value
|
||
|
|
}) {
|
||
|
|
super('RETURNVALUE', 'onReturnValue');
|
||
|
|
this.paramOrdinal = paramOrdinal;
|
||
|
|
this.paramName = paramName;
|
||
|
|
this.metadata = metadata;
|
||
|
|
this.value = value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.ReturnValueToken = ReturnValueToken;
|
||
|
|
class RowToken extends Token {
|
||
|
|
constructor(columns) {
|
||
|
|
super('ROW', 'onRow');
|
||
|
|
this.columns = columns;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.RowToken = RowToken;
|
||
|
|
class SSPIToken extends Token {
|
||
|
|
constructor(ntlmpacket, ntlmpacketBuffer) {
|
||
|
|
super('SSPICHALLENGE', 'onSSPI');
|
||
|
|
this.ntlmpacket = ntlmpacket;
|
||
|
|
this.ntlmpacketBuffer = ntlmpacketBuffer;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.SSPIToken = SSPIToken;
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUWVBFIiwiZXhwb3J0cyIsIkFMVE1FVEFEQVRBIiwiQUxUUk9XIiwiQ09MTUVUQURBVEEiLCJDT0xJTkZPIiwiRE9ORSIsIkRPTkVQUk9DIiwiRE9ORUlOUFJPQyIsIkVOVkNIQU5HRSIsIkVSUk9SIiwiRkVBVFVSRUVYVEFDSyIsIkZFREFVVEhJTkZPIiwiSU5GTyIsIkxPR0lOQUNLIiwiTkJDUk9XIiwiT0ZGU0VUIiwiT1JERVIiLCJSRVRVUk5TVEFUVVMiLCJSRVRVUk5WQUxVRSIsIlJPVyIsIlNTUEkiLCJUQUJOQU1FIiwiVG9rZW4iLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJoYW5kbGVyTmFtZSIsIkNvbE1ldGFkYXRhVG9rZW4iLCJjb2x1bW5zIiwiRG9uZVRva2VuIiwibW9yZSIsInNxbEVycm9yIiwiYXR0ZW50aW9uIiwic2VydmVyRXJyb3IiLCJyb3dDb3VudCIsImN1ckNtZCIsIkRvbmVJblByb2NUb2tlbiIsIkRvbmVQcm9jVG9rZW4iLCJEYXRhYmFzZUVudkNoYW5nZVRva2VuIiwibmV3VmFsdWUiLCJvbGRWYWx1ZSIsInR5cGUiLCJMYW5ndWFnZUVudkNoYW5nZVRva2VuIiwiQ2hhcnNldEVudkNoYW5nZVRva2VuIiwiUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuIiwiQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuIiwiQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiIsIlJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiIsIkRhdGFiYXNlTWlycm9yaW5nUGFydG5lckVudkNoYW5nZVRva2VuIiwiUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4iLCJDb2xsYXRpb25DaGFuZ2VUb2tlbiIsIlJvdXRpbmdFbnZDaGFuZ2VUb2tlbiIsIkZlYXR1cmVFeHRBY2tUb2tlbiIsImZlZEF1dGgiLCJ1dGY4U3VwcG9ydCIsIkZlZEF1dGhJbmZvVG9rZW4iLCJzcG4iLCJzdHN1cmwiLCJJbmZvTWVzc2FnZVRva2VuIiwibnVtYmVyIiwic3RhdGUiLCJjbGFzcyIsImNsYXp6IiwibWVzc2FnZSIsInNlcnZlck5hbWUiLCJwcm9jTmFtZSIsImxpbmVOdW1iZXIiLCJFcnJvck1lc3NhZ2VUb2tlbiIsIkxvZ2luQWNrVG9rZW4iLCJpbnRlcmZhY2UiLCJpbnRlcmZhemUiLCJ0ZHNWZXJzaW9uIiwicHJvZ05hbWUiLCJwcm9nVmVyc2lvbiIsIk5CQ1Jvd1Rva2VuIiwiT3JkZXJUb2tlbiIsIm9yZGVyQ29sdW1ucyIsIlJldHVyblN0YXR1c1Rva2VuIiwidmFsdWUiLCJSZXR1cm5WYWx1ZVRva2VuIiwicGFyYW1PcmRpbmFsIiwicGFyYW1OYW1lIiwibWV0YWRhdGEiLCJSb3dUb2tlbiIsIlNTUElUb2tlbiIsIm50bG1wYWNrZXQiLCJudGxtcGFja2V0QnVmZmVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rva2VuL3Rva2VuLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbGxhdGlvbiB9IGZyb20gJy4uL2NvbGxhdGlvbic7XG5pbXBvcnQgeyB0eXBlIE1ldGFkYXRhIH0gZnJvbSAnLi4vbWV0YWRhdGEtcGFyc2VyJztcbmltcG9ydCB7IHR5cGUgQ29sdW1uTWV0YWRhdGEgfSBmcm9tICcuL2NvbG1ldGFkYXRhLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgeyBUb2tlbkhhbmRsZXIgfSBmcm9tICcuL2hhbmRsZXInO1xuXG5leHBvcnQgY29uc3QgVFlQRSA9IHtcbiAgQUxUTUVUQURBVEE6IDB4ODgsXG4gIEFMVFJPVzogMHhEMyxcbiAgQ09MTUVUQURBVEE6IDB4ODEsXG4gIENPTElORk86IDB4QTUsXG4gIERPTkU6IDB4RkQsXG4gIERPTkVQUk9DOiAweEZFLFxuICBET05FSU5QUk9DOiAweEZGLFxuICBFTlZDSEFOR0U6IDB4RTMsXG4gIEVSUk9SOiAweEFBLFxuICBGRUFUVVJFRVhUQUNLOiAweEFFLFxuICBGRURBVVRISU5GTzogMHhFRSxcbiAgSU5GTzogMHhBQixcbiAgTE9HSU5BQ0s6IDB4QUQsXG4gIE5CQ1JPVzogMHhEMixcbiAgT0ZGU0VUOiAweDc4LFxuICBPUkRFUjogMHhBOSxcbiAgUkVUVVJOU1RBVFVTOiAweDc5LFxuICBSRVRVUk5WQUxVRTogMHhBQyxcbiAgUk9XOiAweEQxLFxuICBTU1BJOiAweEVELFxuICBUQUJOQU1FOiAweEE0XG59O1xuXG50eXBlIEhhbmRsZXJOYW1lID0ga2V5b2YgVG9rZW5IYW5kbGVyO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6IHN0cmluZztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZToga2V5b2YgVG9rZW5IYW5kbGVyO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgaGFuZGxlck5hbWU6IEhhbmRsZXJOYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmhhbmRsZXJOYW1lID0gaGFuZGxlck5hbWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbE1ldGFkYXRhVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ0NPTE1FVEFEQVRBJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uQ29sTWV0YWRhdGEnO1xuXG4gIGRlY2xhcmUgY29sdW1uczogQ29sdW1uTWV0YWRhdGFbXTtcblxuICBjb25zdHJ1Y3Rvcihjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YVtdKSB7XG4gICAgc3VwZXIoJ0NPTE1FVEFEQVRBJywgJ29uQ29sTWV0YWRhdGEnKTtcblxuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERvbmVUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRE9ORSc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkRvbmUnO1xuXG4gIGRlY2xhcmUgbW9yZTogYm9vbGVhbjtcbiAgZGVjbGFyZSBzcWxFcnJvcjogYm9vbGVhbjtcbiAgZGVjbGFyZSBhdHRlbnRpb246IGJvb2xlYW47XG4gIGRlY2xhcmUgc2VydmVyRXJyb3I6IGJvb2xlYW47XG4gIGRlY2xhcmUgcm93Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZGVjbGFyZSBjdXJDbWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcih7IG1vcmUsIHNxbEVycm9yLCBhdHRlbnRpb24sIHNlcnZlckVycm9yLCByb3dDb3VudCwgY3VyQ21kIH06IHsgbW9yZTogYm9vbGVhbiwgc3FsRXJyb3I6IGJvb2xlYW4sIGF0dGVudGlvbjogYm9vbGVhbiwgc2VydmVyRXJyb3I6IGJvb2xlYW4sIHJvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQsIGN1ckNtZDogbnVtYmVyIH0pIHtcbiAgICBzdXBlcignRE9ORScsICdvbkR
|