tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
348 lines (345 loc) • 43.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Token = exports.TabNameToken = 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.ColInfoToken = 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 ColInfoToken extends Token {
constructor(columns) {
super('COLINFO', 'onColInfo');
this.columns = columns;
}
}
exports.ColInfoToken = ColInfoToken;
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 TabNameToken extends Token {
/**
* The names of the base tables referenced in the query, in the order the
* `COLINFO` token's `tableNum` values refer to them. Each name is given
* as its individual parts (e.g. `['dbo', 'employees']`).
*/
constructor(tableNames) {
super('TABNAME', 'onTabName');
this.tableNames = tableNames;
}
}
exports.TabNameToken = TabNameToken;
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUWVBFIiwiZXhwb3J0cyIsIkFMVE1FVEFEQVRBIiwiQUxUUk9XIiwiQ09MTUVUQURBVEEiLCJDT0xJTkZPIiwiRE9ORSIsIkRPTkVQUk9DIiwiRE9ORUlOUFJPQyIsIkVOVkNIQU5HRSIsIkVSUk9SIiwiRkVBVFVSRUVYVEFDSyIsIkZFREFVVEhJTkZPIiwiSU5GTyIsIkxPR0lOQUNLIiwiTkJDUk9XIiwiT0ZGU0VUIiwiT1JERVIiLCJSRVRVUk5TVEFUVVMiLCJSRVRVUk5WQUxVRSIsIlJPVyIsIlNTUEkiLCJUQUJOQU1FIiwiVG9rZW4iLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJoYW5kbGVyTmFtZSIsIkNvbEluZm9Ub2tlbiIsImNvbHVtbnMiLCJDb2xNZXRhZGF0YVRva2VuIiwiRG9uZVRva2VuIiwibW9yZSIsInNxbEVycm9yIiwiYXR0ZW50aW9uIiwic2VydmVyRXJyb3IiLCJyb3dDb3VudCIsImN1ckNtZCIsIkRvbmVJblByb2NUb2tlbiIsIkRvbmVQcm9jVG9rZW4iLCJEYXRhYmFzZUVudkNoYW5nZVRva2VuIiwibmV3VmFsdWUiLCJvbGRWYWx1ZSIsInR5cGUiLCJMYW5ndWFnZUVudkNoYW5nZVRva2VuIiwiQ2hhcnNldEVudkNoYW5nZVRva2VuIiwiUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuIiwiQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuIiwiQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiIsIlJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiIsIkRhdGFiYXNlTWlycm9yaW5nUGFydG5lckVudkNoYW5nZVRva2VuIiwiUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4iLCJDb2xsYXRpb25DaGFuZ2VUb2tlbiIsIlJvdXRpbmdFbnZDaGFuZ2VUb2tlbiIsIkZlYXR1cmVFeHRBY2tUb2tlbiIsImZlZEF1dGgiLCJ1dGY4U3VwcG9ydCIsIkZlZEF1dGhJbmZvVG9rZW4iLCJzcG4iLCJzdHN1cmwiLCJJbmZvTWVzc2FnZVRva2VuIiwibnVtYmVyIiwic3RhdGUiLCJjbGFzcyIsImNsYXp6IiwibWVzc2FnZSIsInNlcnZlck5hbWUiLCJwcm9jTmFtZSIsImxpbmVOdW1iZXIiLCJFcnJvck1lc3NhZ2VUb2tlbiIsIkxvZ2luQWNrVG9rZW4iLCJpbnRlcmZhY2UiLCJpbnRlcmZhemUiLCJ0ZHNWZXJzaW9uIiwicHJvZ05hbWUiLCJwcm9nVmVyc2lvbiIsIk5CQ1Jvd1Rva2VuIiwiT3JkZXJUb2tlbiIsIm9yZGVyQ29sdW1ucyIsIlJldHVyblN0YXR1c1Rva2VuIiwidmFsdWUiLCJSZXR1cm5WYWx1ZVRva2VuIiwicGFyYW1PcmRpbmFsIiwicGFyYW1OYW1lIiwibWV0YWRhdGEiLCJSb3dUb2tlbiIsIlRhYk5hbWVUb2tlbiIsInRhYmxlTmFtZXMiLCJTU1BJVG9rZW4iLCJudGxtcGFja2V0IiwibnRsbXBhY2tldEJ1ZmZlciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi90b2tlbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2xsYXRpb24gfSBmcm9tICcuLi9jb2xsYXRpb24nO1xuaW1wb3J0IHsgdHlwZSBNZXRhZGF0YSB9IGZyb20gJy4uL21ldGFkYXRhLXBhcnNlcic7XG5pbXBvcnQgeyB0eXBlIENvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi9jb2xtZXRhZGF0YS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgVG9rZW5IYW5kbGVyIH0gZnJvbSAnLi9oYW5kbGVyJztcblxuZXhwb3J0IGNvbnN0IFRZUEUgPSB7XG4gIEFMVE1FVEFEQVRBOiAweDg4LFxuICBBTFRST1c6IDB4RDMsXG4gIENPTE1FVEFEQVRBOiAweDgxLFxuICBDT0xJTkZPOiAweEE1LFxuICBET05FOiAweEZELFxuICBET05FUFJPQzogMHhGRSxcbiAgRE9ORUlOUFJPQzogMHhGRixcbiAgRU5WQ0hBTkdFOiAweEUzLFxuICBFUlJPUjogMHhBQSxcbiAgRkVBVFVSRUVYVEFDSzogMHhBRSxcbiAgRkVEQVVUSElORk86IDB4RUUsXG4gIElORk86IDB4QUIsXG4gIExPR0lOQUNLOiAweEFELFxuICBOQkNST1c6IDB4RDIsXG4gIE9GRlNFVDogMHg3OCxcbiAgT1JERVI6IDB4QTksXG4gIFJFVFVSTlNUQVRVUzogMHg3OSxcbiAgUkVUVVJOVkFMVUU6IDB4QUMsXG4gIFJPVzogMHhEMSxcbiAgU1NQSTogMHhFRCxcbiAgVEFCTkFNRTogMHhBNFxufTtcblxudHlwZSBIYW5kbGVyTmFtZSA9IGtleW9mIFRva2VuSGFuZGxlcjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiBzdHJpbmc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6IGtleW9mIFRva2VuSGFuZGxlcjtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGhhbmRsZXJOYW1lOiBIYW5kbGVyTmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5oYW5kbGVyTmFtZSA9IGhhbmRsZXJOYW1lO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uJ3Mgb3JkaW5hbCBwb3NpdGlvbiBpbiB0aGUgcmVzdWx0IHNldC5cbiAgICovXG4gIGNvbE51bTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHRoZSBiYXNlIHRhYmxlIHRoaXMgY29sdW1uIHdhcyBkZXJpdmVkIGZyb20sIGFzIGFcbiAgICogb25lLWJhc2VkIGluZGV4IGludG8gdGhlIHRhYmxlIGxpc3QgcmVwb3J0ZWQgYnkgdGhlIGBUQUJOQU1FYCB0b2tlbi5cbiAgICogYDBgIGlmIHRoZSBjb2x1bW4gaXMgdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uLlxuICAgKi9cbiAgdGFibGVOdW06IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY29sdW1uIHdhcyB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24uXG4gICAqL1xuICBleHByZXNzaW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgcGFydCBvZiBhIGtleSBmb3IgdGhlIGFzc29jaWF0ZWQgdGFibGUuXG4gICAqL1xuICBrZXk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbHVtbiB3YXMgbm90IHJlcXVlc3RlZCwgYnV0IHdhcyBhZGRlZCBiZWNhdXNlIGl0IHdhc1xuICAgKiBwYXJ0IG9mIGEga2V5IGZvciB0aGUgYXNzb2NpYXRlZCB0YWJsZS5cbiAgICovXG4gIGhpZGRlbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGNvbHVtbidzIG5hbWUgaW4gdGhlIGJhc2UgdGFibGUuIE9ubHkgc2V0IGlmIGl0IGRpZmZlcnMgZnJvbSB0aGVcbiAgICogbmFtZSBpbiB0aGUgcmVzdWx0IHNldCAoZS5nLiBiZWNhdXNlIGEgY29sdW1uIGFsaWFzIHdhcyB1c2VkKS5cbiAgICovXG4gIGNvbE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIENvbEluZm9Ub2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnQ09MSU5GTyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkNvbEluZm8nO1xuXG4gIGRlY2xhcmUgY29sdW1uczogQ29sdW1uSW5mb1tdO1xuXG4gIGNvbnN0cnVjdG9yKGNvbHVtbnM6IENvbHVtbkluZm9bXSkge1xuICAgIHN1cGVyKCdDT0xJTkZPJywgJ29uQ29sSW5mbycpO1xuXG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sTWV0YWRhdGFUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnQ09MTUVUQURBVEEnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25Db2xNZXRhZGF0YSc7XG5cbiAgZGVjbGFyZSBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YVtdO1xuXG4gIGNvbnN0cnVjdG9yKGNvbHVtbnM6IENvbHVtbk1ldGFkYXRhW10pIHtcbiAgICBzdXBlcignQ09MTUVUQURBVEEnLCAnb25Db2xNZXRhZGF0YScpO1xuXG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9uZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdET05FJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uRG9uZSc7XG5cbiAgZGVjbGFyZSBtb3JlOiBib29sZWFuO1xuICBkZWNsYXJlIHNxbEVycm9yOiBib29sZWFuO1xuICBkZWNsYXJlIGF0dGVudGlvbjogYm9vbGVhbjtcbiAgZGVjbGFyZSBzZXJ2ZXJFcnJvcjogYm9vbGVhbjtcbiAgZGVjbGFyZSByb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBkZWNsYXJlIGN1ckNtZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHsgbW9yZSwgc3FsRXJyb3IsIGF0dGVudGlvbiwgc2VydmVyRXJyb3IsIHJvd0NvdW50LCBjdXJDbWQgfTogeyBtb3JlOiBib29sZWFuLCBzcWxFcnJvcjogYm9vbGVhbiwgYXR0ZW50aW9uOiBib29sZWFuLCBzZXJ2ZXJFcnJvcjogYm9vbGVhbiwgcm93Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgY3VyQ21kOiBudW1iZXIgfSkge1xuICAgIHN1cGVyKCdET05FJywgJ29uRG9uZScpO1xuXG4gICAgdGhpcy5tb3JlID0gbW9yZTtcbiAgICB0aGlzLnNxbEVycm9yID0gc3FsRXJyb3I7XG4gICAgdGhpcy5hdHRlbnRpb24gPSBhdHRlbnRpb247XG4gICAgdGhpcy5zZXJ2ZXJFcnJvciA9IHNlcnZlckVycm9yO1xuICAgIHRoaXMucm93Q291bnQgPSByb3dDb3VudDtcbiAgICB0aGlzLmN1ckNtZCA9IGN1ckNtZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9uZUluUHJvY1Rva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdET05FSU5QUk9DJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uRG9uZUluUHJvYyc7XG5cbiAgZGVjbGFyZSBtb3JlOiBib29sZWFuO1xuICBkZWNsYXJlIHNxbEVycm9yOiBib29sZWFuO1xuICBkZWNsYXJlIGF0dGVudGlvbjogYm9vbGVhbjtcbiAgZGVjbGFyZSBzZXJ2ZXJFcnJvcjogYm9vbGVhbjtcbiAgZGVjbGFyZSByb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBkZWNsYXJlIGN1ckNtZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHsgbW9yZSwgc3FsRXJyb3IsIGF0dGVudGlvbiwgc2VydmVyRXJyb3IsIHJvd0NvdW50LCBjdXJDbWQgfTogeyBtb3JlOiBib29sZWFuLCBzcWxFcnJvcjogYm9vbGVhbiwgYXR0ZW50aW9uOiBib29sZWFuLCBzZXJ2ZXJFcnJvcjogYm9vbGVhbiwgcm93Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgY3VyQ21kOiBudW1iZXIgfSkge1xuICAgIHN1cGVyKCdET05FSU5QUk9DJywgJ29uRG9uZUluUHJvYycpO1xuXG4gICAgdGhpcy5tb3JlID0gbW9yZTtcbiAgICB0aGlzLnNxbEVycm9yID0gc3FsRXJyb3I7XG4gICAgdGhpcy5hdHRlbnRpb24gPSBhdHRlbnRpb247XG4gICAgdGhpcy5zZXJ2ZXJFcnJvciA9IHNlcnZlckVycm9yO1xuICAgIHRoaXMucm93Q291bnQgPSByb3dDb3VudDtcbiAgICB0aGlzLmN1ckNtZCA9IGN1ckNtZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9uZVByb2NUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRE9ORVBST0MnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25Eb25lUHJvYyc7XG5cbiAgZGVjbGFyZSBtb3JlOiBib29sZWFuO1xuICBkZWNsYXJlIHNxbEVycm9yOiBib29sZWFuO1xuICBkZWNsYXJlIGF0dGVudGlvbjogYm9vbGVhbjtcbiAgZGVjbGFyZSBzZXJ2ZXJFcnJvcjogYm9vbGVhbjtcbiAgZGVjbGFyZSByb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBkZWNsYXJlIGN1ckNtZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHsgbW9yZSwgc3FsRXJyb3IsIGF0dGVudGlvbiwgc2VydmVyRXJyb3IsIHJvd0NvdW50LCBjdXJDbWQgfTogeyBtb3JlOiBib29sZWFuLCBzcWxFcnJvcjogYm9vbGVhbiwgYXR0ZW50aW9uOiBib29sZWFuLCBzZXJ2ZXJFcnJvcjogYm9vbGVhbiwgcm93Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgY3VyQ21kOiBudW1iZXIgfSkge1xuICAgIHN1cGVyKCdET05FUFJPQycsICdvbkRvbmVQcm9jJyk7XG5cbiAgICB0aGlzLm1vcmUgPSBtb3JlO1xuICAgIHRoaXMuc3FsRXJyb3IgPSBzcWxFcnJvcjtcbiAgICB0aGlzLmF0dGVudGlvbiA9IGF0dGVudGlvbjtcbiAgICB0aGlzLnNlcnZlckVycm9yID0gc2VydmVyRXJyb3I7XG4gICAgdGhpcy5yb3dDb3VudCA9IHJvd0NvdW50O1xuICAgIHRoaXMuY3VyQ21kID0gY3VyQ21kO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUVudkNoYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdFTlZDSEFOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25EYXRhYmFzZUNoYW5nZSc7XG5cbiAgZGVjbGFyZSB0eXBlOiAnREFUQUJBU0UnO1xuICBkZWNsYXJlIG5ld1ZhbHVlOiBzdHJpbmc7XG4gIGRlY2xhcmUgb2xkVmFsdWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogc3RyaW5nLCBvbGRWYWx1ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoJ0VOVkNIQU5HRScsICdvbkRhdGFiYXNlQ2hhbmdlJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnREFUQUJBU0UnO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExhbmd1YWdlRW52Q2hhbmdlVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ0VOVkNIQU5HRSc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkxhbmd1YWdlQ2hhbmdlJztcblxuICBkZWNsYXJlIHR5cGU6ICdMQU5HVUFHRSc7XG4gIGRlY2xhcmUgbmV3VmFsdWU6IHN0cmluZztcbiAgZGVjbGFyZSBvbGRWYWx1ZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG5ld1ZhbHVlOiBzdHJpbmcsIG9sZFZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXBlcignRU5WQ0hBTkdFJywgJ29uTGFuZ3VhZ2VDaGFuZ2UnKTtcblxuICAgIHRoaXMudHlwZSA9ICdMQU5HVUFHRSc7XG4gICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2hhcnNldEVudkNoYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdFTlZDSEFOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25DaGFyc2V0Q2hhbmdlJztcblxuICBkZWNsYXJlIHR5cGU6ICdDSEFSU0VUJztcbiAgZGVjbGFyZSBuZXdWYWx1ZTogc3RyaW5nO1xuICBkZWNsYXJlIG9sZFZhbHVlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobmV3VmFsdWU6IHN0cmluZywgb2xkVmFsdWU6IHN0cmluZykge1xuICAgIHN1cGVyKCdFTlZDSEFOR0UnLCAnb25DaGFyc2V0Q2hhbmdlJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnQ0hBUlNFVCc7XG4gICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdFTlZDSEFOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25QYWNrZXRTaXplQ2hhbmdlJztcblxuICBkZWNsYXJlIHR5cGU6ICdQQUNLRVRfU0laRSc7XG4gIGRlY2xhcmUgbmV3VmFsdWU6IG51bWJlcjtcbiAgZGVjbGFyZSBvbGRWYWx1ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG5ld1ZhbHVlOiBudW1iZXIsIG9sZFZhbHVlOiBudW1iZXIpIHtcbiAgICBzdXBlcignRU5WQ0hBTkdFJywgJ29uUGFja2V0U2l6ZUNoYW5nZScpO1xuXG4gICAgdGhpcy50eXBlID0gJ1BBQ0tFVF9TSVpFJztcbiAgICB0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7XG4gICAgdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ0VOVkNIQU5HRSc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkJlZ2luVHJhbnNhY3Rpb24nO1xuXG4gIGRlY2xhcmUgdHlwZTogJ0JFR0lOX1RYTic7XG4gIGRlY2xhcmUgbmV3VmFsdWU6IEJ1ZmZlcjtcbiAgZGVjbGFyZSBvbGRWYWx1ZTogQnVmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKG5ld1ZhbHVlOiBCdWZmZXIsIG9sZFZhbHVlOiBCdWZmZXIpIHtcbiAgICBzdXBlcignRU5WQ0hBTkdFJywgJ29uQmVnaW5UcmFuc2FjdGlvbicpO1xuXG4gICAgdGhpcy50eXBlID0gJ0JFR0lOX1RYTic7XG4gICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRU5WQ0hBTkdFJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uQ29tbWl0VHJhbnNhY3Rpb24nO1xuXG4gIGRlY2xhcmUgdHlwZTogJ0NPTU1JVF9UWE4nO1xuICBkZWNsYXJlIG5ld1ZhbHVlOiBCdWZmZXI7XG4gIGRlY2xhcmUgb2xkVmFsdWU6IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogQnVmZmVyLCBvbGRWYWx1ZTogQnVmZmVyKSB7XG4gICAgc3VwZXIoJ0VOVkNIQU5HRScsICdvbkNvbW1pdFRyYW5zYWN0aW9uJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnQ09NTUlUX1RYTic7XG4gICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdFTlZDSEFOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25Sb2xsYmFja1RyYW5zYWN0aW9uJztcblxuICBkZWNsYXJlIHR5cGU6ICdST0xMQkFDS19UWE4nO1xuICBkZWNsYXJlIG9sZFZhbHVlOiBCdWZmZXI7XG4gIGRlY2xhcmUgbmV3VmFsdWU6IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogQnVmZmVyLCBvbGRWYWx1ZTogQnVmZmVyKSB7XG4gICAgc3VwZXIoJ0VOVkNIQU5HRScsICdvblJvbGxiYWNrVHJhbnNhY3Rpb24nKTtcblxuICAgIHRoaXMudHlwZSA9ICdST0xMQkFDS19UWE4nO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERhdGFiYXNlTWlycm9yaW5nUGFydG5lckVudkNoYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdFTlZDSEFOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25EYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXInO1xuXG4gIGRlY2xhcmUgdHlwZTogJ0RBVEFCQVNFX01JUlJPUklOR19QQVJUTkVSJztcbiAgZGVjbGFyZSBvbGRWYWx1ZTogc3RyaW5nO1xuICBkZWNsYXJlIG5ld1ZhbHVlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobmV3VmFsdWU6IHN0cmluZywgb2xkVmFsdWU6IHN0cmluZykge1xuICAgIHN1cGVyKCdFTlZDSEFOR0UnLCAnb25EYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXInKTtcblxuICAgIHRoaXMudHlwZSA9ICdEQVRBQkFTRV9NSVJST1JJTkdfUEFSVE5FUic7XG4gICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ0VOVkNIQU5HRSc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvblJlc2V0Q29ubmVjdGlvbic7XG5cbiAgZGVjbGFyZSB0eXBlOiAnUkVTRVRfQ09OTkVDVElPTic7XG4gIGRlY2xhcmUgb2xkVmFsdWU6IEJ1ZmZlcjtcbiAgZGVjbGFyZSBuZXdWYWx1ZTogQnVmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKG5ld1ZhbHVlOiBCdWZmZXIsIG9sZFZhbHVlOiBCdWZmZXIpIHtcbiAgICBzdXBlcignRU5WQ0hBTkdFJywgJ29uUmVzZXRDb25uZWN0aW9uJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnUkVTRVRfQ09OTkVDVElPTic7XG4gICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBFbnZDaGFuZ2VUb2tlbiA9XG4gIERhdGFiYXNlRW52Q2hhbmdlVG9rZW4gfFxuICBMYW5ndWFnZUVudkNoYW5nZVRva2VuIHxcbiAgQ2hhcnNldEVudkNoYW5nZVRva2VuIHxcbiAgUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuIHxcbiAgQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuIHxcbiAgQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiB8XG4gIFJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiB8XG4gIERhdGFiYXNlTWlycm9yaW5nUGFydG5lckVudkNoYW5nZVRva2VuIHxcbiAgUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4gfFxuICBSb3V0aW5nRW52Q2hhbmdlVG9rZW4gfFxuICBDb2xsYXRpb25DaGFuZ2VUb2tlbjtcblxuZXhwb3J0IGNsYXNzIENvbGxhdGlvbkNoYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdFTlZDSEFOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25TcWxDb2xsYXRpb25DaGFuZ2UnO1xuXG4gIGRlY2xhcmUgdHlwZTogJ1NRTF9DT0xMQVRJT04nO1xuICBkZWNsYXJlIG9sZFZhbHVlOiBDb2xsYXRpb24gfCB1bmRlZmluZWQ7XG4gIGRlY2xhcmUgbmV3VmFsdWU6IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogQ29sbGF0aW9uIHwgdW5kZWZpbmVkLCBvbGRWYWx1ZTogQ29sbGF0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgc3VwZXIoJ0VOVkNIQU5HRScsICdvblNxbENvbGxhdGlvbkNoYW5nZScpO1xuXG4gICAgdGhpcy50eXBlID0gJ1NRTF9DT0xMQVRJT04nO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJvdXRpbmdFbnZDaGFuZ2VUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRU5WQ0hBTkdFJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uUm91dGluZ0NoYW5nZSc7XG5cbiAgZGVjbGFyZSB0eXBlOiAnUk9VVElOR19DSEFOR0UnO1xuICBkZWNsYXJlIG5ld1ZhbHVlOiB7IHByb3RvY29sOiBudW1iZXIsIHBvcnQ6IG51bWJlciwgc2VydmVyOiBzdHJpbmcgfTtcbiAgZGVjbGFyZSBvbGRWYWx1ZTogQnVmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKG5ld1ZhbHVlOiB7IHByb3RvY29sOiBudW1iZXIsIHBvcnQ6IG51bWJlciwgc2VydmVyOiBzdHJpbmcgfSwgb2xkVmFsdWU6IEJ1ZmZlcikge1xuICAgIHN1cGVyKCdFTlZDSEFOR0UnLCAnb25Sb3V0aW5nQ2hhbmdlJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnUk9VVElOR19DSEFOR0UnO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZlYXR1cmVFeHRBY2tUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRkVBVFVSRUVYVEFDSyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkZlYXR1cmVFeHRBY2snO1xuXG4gIGRlY2xhcmUgZmVkQXV0aDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBWYWx1ZSBvZiBVVEY4X1NVUFBPUlQgYWNrbm93bGVkZ2VtZW50LlxuICAgKlxuICAgKiB1bmRlZmluZWQgd2hlbiBVVEY4X1NVUFBPUlQgbm90IGluY2x1ZGVkIGluIHRva2VuLiAqL1xuICBkZWNsYXJlIHV0ZjhTdXBwb3J0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGZlZEF1dGg6IEJ1ZmZlciB8IHVuZGVmaW5lZCwgdXRmOFN1cHBvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcignRkVBVFVSRUVYVEFDSycsICdvbkZlYXR1cmVFeHRBY2snKTtcblxuICAgIHRoaXMuZmVkQXV0aCA9IGZlZEF1dGg7XG4gICAgdGhpcy51dGY4U3VwcG9ydCA9IHV0ZjhTdXBwb3J0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGZWRBdXRoSW5mb1Rva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdGRURBVVRISU5GTyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkZlZEF1dGhJbmZvJztcblxuICBkZWNsYXJlIHNwbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBkZWNsYXJlIHN0c3VybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHNwbjogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHN1cmw6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKCdGRURBVVRISU5GTycsICdvbkZlZEF1dGhJbmZvJyk7XG5cbiAgICB0aGlzLnNwbiA9IHNwbjtcbiAgICB0aGlzLnN0c3VybCA9IHN0c3VybDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5mb01lc3NhZ2VUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnSU5GTyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkluZm9NZXNzYWdlJztcblxuICBkZWNsYXJlIG51bWJlcjogbnVtYmVyO1xuICBkZWNsYXJlIHN0YXRlOiBudW1iZXI7XG4gIGRlY2xhcmUgY2xhc3M6IG51bWJlcjtcbiAgZGVjbGFyZSBtZXNzYWdlOiBzdHJpbmc7XG4gIGRlY2xhcmUgc2VydmVyTmFtZTogc3RyaW5nO1xuICBkZWNsYXJlIHByb2NOYW1lOiBzdHJpbmc7XG4gIGRlY2xhcmUgbGluZU51bWJlcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHsgbnVtYmVyLCBzdGF0ZSwgY2xhc3M6IGNsYXp6LCBtZXNzYWdlLCBzZXJ2ZXJOYW1lLCBwcm9jTmFtZSwgbGluZU51bWJlciB9OiB7IG51bWJlcjogbnVtYmVyLCBzdGF0ZTogbnVtYmVyLCBjbGFzczogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIHNlcnZlck5hbWU6IHN0cmluZywgcHJvY05hbWU6IHN0cmluZywgbGluZU51bWJlcjogbnVtYmVyIH0pIHtcbiAgICBzdXBlcignSU5GTycsICdvbkluZm9NZXNzYWdlJyk7XG5cbiAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5jbGFzcyA9IGNsYXp6O1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zZXJ2ZXJOYW1lID0gc2VydmVyTmFtZTtcbiAgICB0aGlzLnByb2NOYW1lID0gcHJvY05hbWU7XG4gICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JNZXNzYWdlVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ0VSUk9SJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uRXJyb3JNZXNzYWdlJztcblxuICBkZWNsYXJlIG51bWJlcjogbnVtYmVyO1xuICBkZWNsYXJlIHN0YXRlOiBudW1iZXI7XG4gIGRlY2xhcmUgY2xhc3M6IG51bWJlcjtcbiAgZGVjbGFyZSBtZXNzYWdlOiBzdHJpbmc7XG4gIGRlY2xhcmUgc2VydmVyTmFtZTogc3RyaW5nO1xuICBkZWNsYXJlIHByb2NOYW1lOiBzdHJpbmc7XG4gIGRlY2xhcmUgbGluZU51bWJlcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHsgbnVtYmVyLCBzdGF0ZSwgY2xhc3M6IGNsYXp6LCBtZXNzYWdlLCBzZXJ2ZXJOYW1lLCBwcm9jTmFtZSwgbGluZU51bWJlciB9OiB7IG51bWJlcjogbnVtYmVyLCBzdGF0ZTogbnVtYmVyLCBjbGFzczogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIHNlcnZlck5hbWU6IHN0cmluZywgcHJvY05hbWU6IHN0cmluZywgbGluZU51bWJlcjogbnVtYmVyIH0pIHtcbiAgICBzdXBlcignRVJST1InLCAnb25FcnJvck1lc3NhZ2UnKTtcblxuICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmNsYXNzID0gY2xheno7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnNlcnZlck5hbWUgPSBzZXJ2ZXJOYW1lO1xuICAgIHRoaXMucHJvY05hbWUgPSBwcm9jTmFtZTtcbiAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dpbkFja1Rva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdMT0dJTkFDSyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkxvZ2luQWNrJztcblxuICBkZWNsYXJlIGludGVyZmFjZTogc3RyaW5nO1xuICBkZWNsYXJlIHRkc1ZlcnNpb246IHN0cmluZztcbiAgZGVjbGFyZSBwcm9nTmFtZTogc3RyaW5nO1xuICBkZWNsYXJlIHByb2dWZXJzaW9uOiB7IG1ham9yOiBudW1iZXIsIG1pbm9yOiBudW1iZXIsIGJ1aWxkTnVtSGk6IG51bWJlciwgYnVpbGROdW1Mb3c6IG51bWJlciB9O1xuXG4gIGNvbnN0cnVjdG9yKHsgaW50ZXJmYWNlOiBpbnRlcmZhemUsIHRkc1ZlcnNpb24sIHByb2dOYW1lLCBwcm9nVmVyc2lvbiB9OiB7IGludGVyZmFjZTogTG9naW5BY2tUb2tlblsnaW50ZXJmYWNlJ10sIHRkc1ZlcnNpb246IExvZ2luQWNrVG9rZW5bJ3Rkc1ZlcnNpb24nXSwgcHJvZ05hbWU6IExvZ2luQWNrVG9rZW5bJ3Byb2dOYW1lJ10sIHByb2dWZXJzaW9uOiBMb2dpbkFja1Rva2VuWydwcm9nVmVyc2lvbiddIH0pIHtcbiAgICBzdXBlcignTE9HSU5BQ0snLCAnb25Mb2dpbkFjaycpO1xuXG4gICAgdGhpcy5pbnRlcmZhY2UgPSBpbnRlcmZhemU7XG4gICAgdGhpcy50ZHNWZXJzaW9uID0gdGRzVmVyc2lvbjtcbiAgICB0aGlzLnByb2dOYW1lID0gcHJvZ05hbWU7XG4gICAgdGhpcy5wcm9nVmVyc2lvbiA9IHByb2dWZXJzaW9uO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOQkNSb3dUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnTkJDUk9XJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uUm93JztcblxuICBkZWNsYXJlIGNvbHVtbnM6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihjb2x1bW5zOiBhbnkpIHtcbiAgICBzdXBlcignTkJDUk9XJywgJ29uUm93Jyk7XG5cbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPcmRlclRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdPUkRFUic7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbk9yZGVyJztcblxuICBkZWNsYXJlIG9yZGVyQ29sdW1uczogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3Iob3JkZXJDb2x1bW5zOiBudW1iZXJbXSkge1xuICAgIHN1cGVyKCdPUkRFUicsICdvbk9yZGVyJyk7XG5cbiAgICB0aGlzLm9yZGVyQ29sdW1ucyA9IG9yZGVyQ29sdW1ucztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmV0dXJuU3RhdHVzVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ1JFVFVSTlNUQVRVUyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvblJldHVyblN0YXR1cyc7XG5cbiAgZGVjbGFyZSB2YWx1ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBudW1iZXIpIHtcbiAgICBzdXBlcignUkVUVVJOU1RBVFVTJywgJ29uUmV0dXJuU3RhdHVzJyk7XG5cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJldHVyblZhbHVlVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ1JFVFVSTlZBTFVFJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uUmV0dXJuVmFsdWUnO1xuXG4gIGRlY2xhcmUgcGFyYW1PcmRpbmFsOiBudW1iZXI7XG4gIGRlY2xhcmUgcGFyYW1OYW1lOiBzdHJpbmc7XG4gIGRlY2xhcmUgbWV0YWRhdGE6IE1ldGFkYXRhO1xuICBkZWNsYXJlIHZhbHVlOiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKHsgcGFyYW1PcmRpbmFsLCBwYXJhbU5hbWUsIG1ldGFkYXRhLCB2YWx1ZSB9OiB7IHBhcmFtT3JkaW5hbDogbnVtYmVyLCBwYXJhbU5hbWU6IHN0cmluZywgbWV0YWRhdGE6IE1ldGFkYXRhLCB2YWx1ZTogdW5rbm93biB9KSB7XG4gICAgc3VwZXIoJ1JFVFVSTlZBTFVFJywgJ29uUmV0dXJuVmFsdWUnKTtcblxuICAgIHRoaXMucGFyYW1PcmRpbmFsID0gcGFyYW1PcmRpbmFsO1xuICAgIHRoaXMucGFyYW1OYW1lID0gcGFyYW1OYW1lO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJvd1Rva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdST1cnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25Sb3cnO1xuXG4gIGRlY2xhcmUgY29sdW1uczogYW55O1xuXG4gIGNvbnN0cnVjdG9yKGNvbHVtbnM6IGFueSkge1xuICAgIHN1cGVyKCdST1cnLCAnb25Sb3cnKTtcblxuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYk5hbWVUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnVEFCTkFNRSc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvblRhYk5hbWUnO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXMgb2YgdGhlIGJhc2UgdGFibGVzIHJlZmVyZW5jZWQgaW4gdGhlIHF1ZXJ5LCBpbiB0aGUgb3JkZXIgdGhlXG4gICAqIGBDT0xJTkZPYCB0b2tlbidzIGB0YWJsZU51bWAgdmFsdWVzIHJlZmVyIHRvIHRoZW0uIEVhY2ggbmFtZSBpcyBnaXZlblxuICAgKiBhcyBpdHMgaW5kaXZpZHVhbCBwYXJ0cyAoZS5nLiBgWydkYm8nLCAnZW1wbG95ZWVzJ11gKS5cbiAgICovXG4gIGRlY2xhcmUgdGFibGVOYW1lczogc3RyaW5nW11bXTtcblxuICBjb25zdHJ1Y3Rvcih0YWJsZU5hbWVzOiBzdHJpbmdbXVtdKSB7XG4gICAgc3VwZXIoJ1RBQk5BTUUnLCAnb25UYWJOYW1lJyk7XG5cbiAgICB0aGlzLnRhYmxlTmFtZXMgPSB0YWJsZU5hbWVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTU1BJVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ1NTUElDSEFMTEVOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25TU1BJJztcblxuICBkZWNsYXJlIG50bG1wYWNrZXQ6IGFueTtcbiAgZGVjbGFyZSBudGxtcGFja2V0QnVmZmVyOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IobnRsbXBhY2tldDogYW55LCBudGxtcGFja2V0QnVmZmVyOiBCdWZmZXIpIHtcbiAgICBzdXBlcignU1NQSUNIQUxMRU5HRScsICdvblNTUEknKTtcblxuICAgIHRoaXMubnRsbXBhY2tldCA9IG50bG1wYWNrZXQ7XG4gICAgdGhpcy5udGxtcGFja2V0QnVmZmVyID0gbnRsbXBhY2tldEJ1ZmZlcjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFLTyxNQUFNQSxJQUFJLEdBQUFDLE9BQUEsQ0FBQUQsSUFBQSxHQUFHO0VBQ2xCRSxXQUFXLEVBQUUsSUFBSTtFQUNqQkMsTUFBTSxFQUFFLElBQUk7RUFDWkMsV0FBVyxFQUFFLElBQUk7RUFDakJDLE9BQU8sRUFBRSxJQUFJO0VBQ2JDLElBQUksRUFBRSxJQUFJO0VBQ1ZDLFFB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