@c4tplatform/caminojs
Version:
Camino Platform JS Library
189 lines • 23.6 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Tx = exports.UnsignedTx = exports.SelectTxClass = void 0;
/**
* @packageDocumentation
* @module API-PlatformVM-Transactions
*/
const buffer_1 = require("buffer/");
const create_hash_1 = __importDefault(require("create-hash"));
const common_1 = require("../../common");
const bintools_1 = __importDefault(require("../../utils/bintools"));
const errors_1 = require("../../utils/errors");
const adddepositoffertx_1 = require("./adddepositoffertx");
const addproposaltx_1 = require("./addproposaltx");
const addressstatetx_1 = require("./addressstatetx");
const addsubnetvalidatortx_1 = require("./addsubnetvalidatortx");
const addvotetx_1 = require("./addvotetx");
const basetx_1 = require("./basetx");
const claimtx_1 = require("./claimtx");
const constants_1 = require("./constants");
const createsubnettx_1 = require("./createsubnettx");
const credentials_1 = require("./credentials");
const depositTx_1 = require("./depositTx");
const exporttx_1 = require("./exporttx");
const importtx_1 = require("./importtx");
const multisigaliastx_1 = require("./multisigaliastx");
const registernodetx_1 = require("./registernodetx");
const validationtx_1 = require("./validationtx");
const unlockdeposittx_1 = require("./unlockdeposittx");
/**
* @ignore
*/
const bintools = bintools_1.default.getInstance();
/**
* Takes a buffer representing the output and returns the proper [[BaseTx]] instance.
*
* @param txtype The id of the transaction type
*
* @returns An instance of an [[BaseTx]]-extended class.
*/
const SelectTxClass = (txtype, ...args) => {
if (txtype === constants_1.PlatformVMConstants.BASETX) {
return new basetx_1.BaseTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.IMPORTTX) {
return new importtx_1.ImportTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.EXPORTTX) {
return new exporttx_1.ExportTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.ADDDELEGATORTX) {
return new validationtx_1.AddDelegatorTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.ADDVALIDATORTX) {
return new validationtx_1.AddValidatorTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.CAMINOADDVALIDATORTX) {
return new validationtx_1.CaminoAddValidatorTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.CREATESUBNETTX) {
return new createsubnettx_1.CreateSubnetTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.ADDSUBNETVALIDATORTX) {
return new addsubnetvalidatortx_1.AddSubnetValidatorTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.REGISTERNODETX) {
return new registernodetx_1.RegisterNodeTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.DEPOSITTX) {
return new depositTx_1.DepositTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.ADDRESSSTATETX) {
return new addressstatetx_1.AddressStateTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.CLAIMTX) {
return new claimtx_1.ClaimTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.UNLOCKDEPOSITTX) {
return new unlockdeposittx_1.UnlockDepositTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.MULTISIGALIASTX) {
return new multisigaliastx_1.MultisigAliasTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.ADDDEPOSITOFFERTX) {
return new adddepositoffertx_1.AddDepositOfferTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.ADDPROPOSALTX) {
return new addproposaltx_1.AddProposalTx(...args);
}
else if (txtype === constants_1.PlatformVMConstants.ADDVOTETX) {
return new addvotetx_1.AddVoteTx(...args);
}
/* istanbul ignore next */
throw new errors_1.TransactionError("Error - SelectTxClass: unknown txtype");
};
exports.SelectTxClass = SelectTxClass;
class UnsignedTx extends common_1.StandardUnsignedTx {
constructor() {
super(...arguments);
this._typeName = "UnsignedTx";
this._typeID = undefined;
}
//serialize is inherited
deserialize(fields, encoding = "hex") {
super.deserialize(fields, encoding);
this.transaction = (0, exports.SelectTxClass)(fields["transaction"]["_typeID"]);
this.transaction.deserialize(fields["transaction"], encoding);
}
getTransaction() {
return this.transaction;
}
fromBuffer(bytes, offset = 0) {
this.codecID = bintools.copyFrom(bytes, offset, offset + 2).readUInt16BE(0);
offset += 2;
const txtype = bintools
.copyFrom(bytes, offset, offset + 4)
.readUInt32BE(0);
offset += 4;
this.transaction = (0, exports.SelectTxClass)(txtype);
return this.transaction.fromBuffer(bytes, offset);
}
/**
* Signs this [[UnsignedTx]] and returns signed [[StandardTx]]
*
* @param kc An [[KeyChain]] used in signing
*
* @returns A signed [[StandardTx]]
*/
sign(kc) {
const txbuff = this.toBuffer();
const msg = buffer_1.Buffer.from((0, create_hash_1.default)("sha256").update(txbuff).digest());
const creds = kc instanceof common_1.MultisigKeyChain
? kc.getCredentials()
: this.transaction.sign(msg, kc);
return new Tx(this, creds);
}
}
exports.UnsignedTx = UnsignedTx;
class Tx extends common_1.StandardTx {
constructor() {
super(...arguments);
this._typeName = "Tx";
this._typeID = undefined;
}
//serialize is inherited
deserialize(fields, encoding = "hex") {
super.deserialize(fields, encoding);
this.unsignedTx = new UnsignedTx();
this.unsignedTx.deserialize(fields["unsignedTx"], encoding);
this.credentials = [];
for (let i = 0; i < fields["credentials"].length; i++) {
const cred = (0, credentials_1.SelectCredentialClass)(fields["credentials"][`${i}`]["_typeID"]);
cred.deserialize(fields["credentials"][`${i}`], encoding);
this.credentials.push(cred);
}
}
/**
* Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[Tx]], parses it, populates the class, and returns the length of the Tx in bytes.
*
* @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[Tx]]
* @param offset A number representing the starting point of the bytes to begin parsing
*
* @returns The length of the raw [[Tx]]
*/
fromBuffer(bytes, offset = 0) {
this.unsignedTx = new UnsignedTx();
offset = this.unsignedTx.fromBuffer(bytes, offset);
const numcreds = bintools
.copyFrom(bytes, offset, offset + 4)
.readUInt32BE(0);
offset += 4;
this.credentials = [];
for (let i = 0; i < numcreds; i++) {
const credid = bintools
.copyFrom(bytes, offset, offset + 4)
.readUInt32BE(0);
offset += 4;
const cred = (0, credentials_1.SelectCredentialClass)(credid);
offset = cred.fromBuffer(bytes, offset);
this.credentials.push(cred);
}
return offset;
}
}
exports.Tx = Tx;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpcy9wbGF0Zm9ybXZtL3R4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7R0FHRztBQUNILG9DQUFnQztBQUNoQyw4REFBb0M7QUFDcEMseUNBTXFCO0FBRXJCLG9FQUEyQztBQUMzQywrQ0FBcUQ7QUFFckQsMkRBQXVEO0FBQ3ZELG1EQUErQztBQUMvQyxxREFBaUQ7QUFDakQsaUVBQTZEO0FBQzdELDJDQUF1QztBQUN2QyxxQ0FBaUM7QUFDakMsdUNBQW1DO0FBQ25DLDJDQUFpRDtBQUNqRCxxREFBaUQ7QUFDakQsK0NBQXFEO0FBQ3JELDJDQUF1QztBQUN2Qyx5Q0FBcUM7QUFDckMseUNBQXFDO0FBQ3JDLHVEQUFtRDtBQUNuRCxxREFBaUQ7QUFDakQsaURBSXVCO0FBQ3ZCLHVEQUFtRDtBQUVuRDs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFhLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7QUFFakQ7Ozs7OztHQU1HO0FBQ0ksTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFjLEVBQUUsR0FBRyxJQUFXLEVBQVUsRUFBRTtJQUN0RSxJQUFJLE1BQU0sS0FBSywrQkFBbUIsQ0FBQyxNQUFNLEVBQUU7UUFDekMsT0FBTyxJQUFJLGVBQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO0tBQzNCO1NBQU0sSUFBSSxNQUFNLEtBQUssK0JBQW1CLENBQUMsUUFBUSxFQUFFO1FBQ2xELE9BQU8sSUFBSSxtQkFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUE7S0FDN0I7U0FBTSxJQUFJLE1BQU0sS0FBSywrQkFBbUIsQ0FBQyxRQUFRLEVBQUU7UUFDbEQsT0FBTyxJQUFJLG1CQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtLQUM3QjtTQUFNLElBQUksTUFBTSxLQUFLLCtCQUFtQixDQUFDLGNBQWMsRUFBRTtRQUN4RCxPQUFPLElBQUksNkJBQWMsQ0FB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LEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7YUFDbkMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLENBQUE7UUFDWCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQTtRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sTUFBTSxHQUFXLFFBQVE7aUJBQzVCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7aUJBQ25DLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNsQixNQUFNLElBQUksQ0FBQyxDQUFBO1lBQ1gsTUFBTSxJQUFJLEdBQWUsSUFBQSxtQ0FBcUIsRUFBQyxNQUFNLENBQUMsQ0FBQTtZQUN0RCxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7U0FDNUI7UUFDRCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7Q0FDRjtBQS9DRCxnQkErQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBBUEktUGxhdGZvcm1WTS1UcmFuc2FjdGlvbnNcbiAqL1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlci9cIlxuaW1wb3J0IGNyZWF0ZUhhc2ggZnJvbSBcImNyZWF0ZS1oYXNoXCJcbmltcG9ydCB7XG4gIE11bHRpc2lnS2V5Q2hhaW4sXG4gIFNpZ25lcktleUNoYWluLFxuICBTaWduZXJLZXlQYWlyLFxuICBTdGFuZGFyZFR4LFxuICBTdGFuZGFyZFVuc2lnbmVkVHhcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiXG5pbXBvcnQgeyBDcmVkZW50aWFsIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9jcmVkZW50aWFsc1wiXG5pbXBvcnQgQmluVG9vbHMgZnJvbSBcIi4uLy4uL3V0aWxzL2JpbnRvb2xzXCJcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZXJyb3JzXCJcbmltcG9ydCB7IFNlcmlhbGl6ZWRFbmNvZGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zZXJpYWxpemF0aW9uXCJcbmltcG9ydCB7IEFkZERlcG9zaXRPZmZlclR4IH0gZnJvbSBcIi4vYWRkZGVwb3NpdG9mZmVydHhcIlxuaW1wb3J0IHsgQWRkUHJvcG9zYWxUeCB9IGZyb20gXCIuL2FkZHByb3Bvc2FsdHhcIlxuaW1wb3J0IHsgQWRkcmVzc1N0YXRlVHggfSBmcm9tIFwiLi9hZGRyZXNzc3RhdGV0eFwiXG5pbXBvcnQgeyBBZGRTdWJuZXRWYWxpZGF0b3JUeCB9IGZyb20gXCIuL2FkZHN1Ym5ldHZhbGlkYXRvcnR4XCJcbmltcG9ydCB7IEFkZFZvdGVUeCB9IGZyb20gXCIuL2FkZHZvdGV0eFwiXG5pbXBvcnQgeyBCYXNlVHggfSBmcm9tIFwiLi9iYXNldHhcIlxuaW1wb3J0IHsgQ2xhaW1UeCB9IGZyb20gXCIuL2NsYWltdHhcIlxuaW1wb3J0IHsgUGxhdGZvcm1WTUNvbnN0YW50cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiXG5pbXBvcnQgeyBDcmVhdGVTdWJuZXRUeCB9IGZyb20gXCIuL2NyZWF0ZXN1Ym5ldHR4XCJcbmltcG9ydCB7IFNlbGVjdENyZWRlbnRpYWxDbGFzcyB9IGZyb20gXCIuL2NyZWRlbnRpYWxzXCJcbmltcG9ydCB7IERlcG9zaXRUeCB9IGZyb20gXCIuL2RlcG9zaXRUeFwiXG5pbXBvcnQgeyBFeHBvcnRUeCB9IGZyb20gXCIuL2V4cG9ydHR4XCJcbmltcG9ydCB7IEltcG9ydFR4IH0gZnJvbSBcIi4vaW1wb3J0dHhcIlxuaW1wb3J0IHsgTXVsdGlzaWdBbGlhc1R4IH0gZnJvbSBcIi4vbXVsdGlzaWdhbGlhc3R4XCJcbmltcG9ydCB7IFJlZ2lzdGVyTm9kZVR4IH0gZnJvbSBcIi4vcmVnaXN0ZXJub2RldHhcIlxuaW1wb3J0IHtcbiAgQWRkRGVsZWdhdG9yVHgsXG4gIEFkZFZhbGlkYXRvclR4LFxuICBDYW1pbm9BZGRWYWxpZGF0b3JUeFxufSBmcm9tIFwiLi92YWxpZGF0aW9udHhcIlxuaW1wb3J0IHsgVW5sb2NrRGVwb3NpdFR4IH0gZnJvbSBcIi4vdW5sb2NrZGVwb3NpdHR4XCJcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IGJpbnRvb2xzOiBCaW5Ub29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKClcblxuLyoqXG4gKiBUYWtlcyBhIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG91dHB1dCBhbmQgcmV0dXJucyB0aGUgcHJvcGVyIFtbQmFzZVR4XV0gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHR4dHlwZSBUaGUgaWQgb2YgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAqXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBhbiBbW0Jhc2VUeF1dLWV4dGVuZGVkIGNsYXNzLlxuICovXG5leHBvcnQgY29uc3QgU2VsZWN0VHhDbGFzcyA9ICh0eHR5cGU6IG51bWJlciwgLi4uYXJnczogYW55W10pOiBCYXNlVHggPT4ge1xuICBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLkJBU0VUWCkge1xuICAgIHJldHVybiBuZXcgQmFzZVR4KC4uLmFyZ3MpXG4gIH0gZWxzZSBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLklNUE9SVFRYKSB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRUeCguLi5hcmdzKVxuICB9IGVsc2UgaWYgKHR4dHlwZSA9PT0gUGxhdGZvcm1WTUNvbnN0YW50cy5FWFBPUlRUWCkge1xuICAgIHJldHVybiBuZXcgRXhwb3J0VHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuQUREREVMRUdBVE9SVFgpIHtcbiAgICByZXR1cm4gbmV3IEFkZERlbGVnYXRvclR4KC4uLmFyZ3MpXG4gIH0gZWxzZSBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLkFERFZBTElEQVRPUlRYKSB7XG4gICAgcmV0dXJuIG5ldyBBZGRWYWxpZGF0b3JUeCguLi5hcmdzKVxuICB9IGVsc2UgaWYgKHR4dHlwZSA9PT0gUGxhdGZvcm1WTUNvbnN0YW50cy5DQU1JTk9BRERWQUxJREFUT1JUWCkge1xuICAgIHJldHVybiBuZXcgQ2FtaW5vQWRkVmFsaWRhdG9yVHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuQ1JFQVRFU1VCTkVUVFgpIHtcbiAgICByZXR1cm4gbmV3IENyZWF0ZVN1Ym5ldFR4KC4uLmFyZ3MpXG4gIH0gZWxzZSBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLkFERFNVQk5FVFZBTElEQVRPUlRYKSB7XG4gICAgcmV0dXJuIG5ldyBBZGRTdWJuZXRWYWxpZGF0b3JUeCguLi5hcmdzKVxuICB9IGVsc2UgaWYgKHR4dHlwZSA9PT0gUGxhdGZvcm1WTUNvbnN0YW50cy5SRUdJU1RFUk5PREVUWCkge1xuICAgIHJldHVybiBuZXcgUmVnaXN0ZXJOb2RlVHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuREVQT1NJVFRYKSB7XG4gICAgcmV0dXJuIG5ldyBEZXBvc2l0VHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuQUREUkVTU1NUQVRFVFgpIHtcbiAgICByZXR1cm4gbmV3IEFkZHJlc3NTdGF0ZVR4KC4uLmFyZ3MpXG4gIH0gZWxzZSBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLkNMQUlNVFgpIHtcbiAgICByZXR1cm4gbmV3IENsYWltVHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuVU5MT0NLREVQT1NJVFRYKSB7XG4gICAgcmV0dXJuIG5ldyBVbmxvY2tEZXBvc2l0VHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuTVVMVElTSUdBTElBU1RYKSB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aXNpZ0FsaWFzVHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuQUREREVQT1NJVE9GRkVSVFgpIHtcbiAgICByZXR1cm4gbmV3IEFkZERlcG9zaXRPZmZlclR4KC4uLmFyZ3MpXG4gIH0gZWxzZSBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLkFERFBST1BPU0FMVFgpIHtcbiAgICByZXR1cm4gbmV3IEFkZFByb3Bvc2FsVHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuQUREVk9URVRYKSB7XG4gICAgcmV0dXJuIG5ldyBBZGRWb3RlVHgoLi4uYXJncylcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25FcnJvcihcIkVycm9yIC0gU2VsZWN0VHhDbGFzczogdW5rbm93biB0eHR5cGVcIilcbn1cblxuZXhwb3J0IGNsYXNzIFVuc2lnbmVkVHggZXh0ZW5kcyBTdGFuZGFyZFVuc2lnbmVkVHg8XG4gIFNpZ25lcktleVBhaXIsXG4gIFNpZ25lcktleUNoYWluLFxuICBCYXNlVHhcbj4ge1xuICBwcm90ZWN0ZWQgX3R5cGVOYW1lID0gXCJVbnNpZ25lZFR4XCJcbiAgcHJvdGVjdGVkIF90eXBlSUQgPSB1bmRlZmluZWRcblxuICAvL3NlcmlhbGl6ZSBpcyBpbmhlcml0ZWRcblxuICBkZXNlcmlhbGl6ZShmaWVsZHM6IG9iamVjdCwgZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpIHtcbiAgICBzdXBlci5kZXNlcmlhbGl6ZShmaWVsZHMsIGVuY29kaW5nKVxuICAgIHRoaXMudHJhbnNhY3Rpb24gPSBTZWxlY3RUeENsYXNzKGZpZWxkc1tcInRyYW5zYWN0aW9uXCJdW1wiX3R5cGVJRFwiXSlcbiAgICB0aGlzLnRyYW5zYWN0aW9uLmRlc2VyaWFsaXplKGZpZWxkc1tcInRyYW5zYWN0aW9uXCJdLCBlbmNvZGluZylcbiAgfVxuXG4gIGdldFRyYW5zYWN0aW9uKCk6IEJhc2VUeCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24gYXMgQmFzZVR4XG4gIH1cblxuICBmcm9tQnVmZmVyKGJ5dGVzOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gICAgdGhpcy5jb2RlY0lEID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgMikucmVhZFVJbnQxNkJFKDApXG4gICAgb2Zmc2V0ICs9IDJcbiAgICBjb25zdCB0eHR5cGU6IG51bWJlciA9IGJpbnRvb2xzXG4gICAgICAuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICAgIC5yZWFkVUludDMyQkUoMClcbiAgICBvZmZzZXQgKz0gNFxuICAgIHRoaXMudHJhbnNhY3Rpb24gPSBTZWxlY3RUeENsYXNzKHR4dHlwZSlcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5mcm9tQnVmZmVyKGJ5dGVzLCBvZmZzZXQpXG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhpcyBbW1Vuc2lnbmVkVHhdXSBhbmQgcmV0dXJucyBzaWduZWQgW1tTdGFuZGFyZFR4XV1cbiAgICpcbiAgICogQHBhcmFtIGtjIEFuIFtbS2V5Q2hhaW5dXSB1c2VkIGluIHNpZ25pbmdcbiAgICpcbiAgICogQHJldHVybnMgQSBzaWduZWQgW1tTdGFuZGFyZFR4XV1cbiAgICovXG4gIHNpZ24oa2M6IFNpZ25lcktleUNoYWluKTogVHgge1xuICAgIGNvbnN0IHR4YnVmZiA9IHRoaXMudG9CdWZmZXIoKVxuICAgIGNvbnN0IG1zZzogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZSh0eGJ1ZmYpLmRpZ2VzdCgpXG4gICAgKVxuXG4gICAgY29uc3QgY3JlZHM6IENyZWRlbnRpYWxbXSA9XG4gICAgICBrYyBpbnN0YW5jZW9mIE11bHRpc2lnS2V5Q2hhaW5cbiAgICAgICAgPyBrYy5nZXRDcmVkZW50aWFscygpXG4gICAgICAgIDogdGhpcy50cmFuc2FjdGlvbi5zaWduKG1zZywga2MpXG4gICAgcmV0dXJuIG5ldyBUeCh0aGlzLCBjcmVkcylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHggZXh0ZW5kcyBTdGFuZGFyZFR4PFNpZ25lcktleVBhaXIsIFNpZ25lcktleUNoYWluLCBVbnNpZ25lZFR4PiB7XG4gIHByb3RlY3RlZCBfdHlwZU5hbWUgPSBcIlR4XCJcbiAgcHJvdGVjdGVkIF90eXBlSUQgPSB1bmRlZmluZWRcblxuICAvL3NlcmlhbGl6ZSBpcyBpbmhlcml0ZWRcblxuICBkZXNlcmlhbGl6ZShmaWVsZHM6IG9iamVjdCwgZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpIHtcbiAgICBzdXBlci5kZXNlcmlhbGl6ZShmaWVsZHMsIGVuY29kaW5nKVxuICAgIHRoaXMudW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KClcbiAgICB0aGlzLnVuc2lnbmVkVHguZGVzZXJpYWxpemUoZmllbGRzW1widW5zaWduZWRUeFwiXSwgZW5jb2RpbmcpXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IFtdXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGZpZWxkc1tcImNyZWRlbnRpYWxzXCJdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjcmVkOiBDcmVkZW50aWFsID0gU2VsZWN0Q3JlZGVudGlhbENsYXNzKFxuICAgICAgICBmaWVsZHNbXCJjcmVkZW50aWFsc1wiXVtgJHtpfWBdW1wiX3R5cGVJRFwiXVxuICAgICAgKVxuICAgICAgY3JlZC5kZXNlcmlhbGl6ZShmaWVsZHNbXCJjcmVkZW50aWFsc1wiXVtgJHtpfWBdLCBlbmNvZGluZylcbiAgICAgIHRoaXMuY3JlZGVudGlhbHMucHVzaChjcmVkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgYW4gW1tUeF1dLCBwYXJzZXMgaXQsIHBvcHVsYXRlcyB0aGUgY2xhc3MsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIFR4IGluIGJ5dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gYnl0ZXMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGEgcmF3IFtbVHhdXVxuICAgKiBAcGFyYW0gb2Zmc2V0IEEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGJ5dGVzIHRvIGJlZ2luIHBhcnNpbmdcbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxlbmd0aCBvZiB0aGUgcmF3IFtbVHhdXVxuICAgKi9cbiAgZnJvbUJ1ZmZlcihieXRlczogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXIge1xuICAgIHRoaXMudW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KClcbiAgICBvZmZzZXQgPSB0aGlzLnVuc2lnbmVkVHguZnJvbUJ1ZmZlcihieXRlcywgb2Zmc2V0KVxuICAgIGNvbnN0IG51bWNyZWRzOiBudW1iZXIgPSBiaW50b29sc1xuICAgICAgLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDQpXG4gICAgICAucmVhZFVJbnQzMkJFKDApXG4gICAgb2Zmc2V0ICs9IDRcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gW11cbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbnVtY3JlZHM7IGkrKykge1xuICAgICAgY29uc3QgY3JlZGlkOiBudW1iZXIgPSBiaW50b29sc1xuICAgICAgICAuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICAgICAgLnJlYWRVSW50MzJCRSgwKVxuICAgICAgb2Zmc2V0ICs9IDRcbiAgICAgIGNvbnN0IGNyZWQ6IENyZWRlbnRpYWwgPSBTZWxlY3RDcmVkZW50aWFsQ2xhc3MoY3JlZGlkKVxuICAgICAgb2Zmc2V0ID0gY3JlZC5mcm9tQnVmZmVyKGJ5dGVzLCBvZmZzZXQpXG4gICAgICB0aGlzLmNyZWRlbnRpYWxzLnB1c2goY3JlZClcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG59XG4iXX0=