@caminojs-nikos/caminojs
Version:
Camino Platform JS Library
219 lines • 28.5 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.AddressStateTx = exports.AddressState = void 0;
/**
* @packageDocumentation
* @module API-PlatformVM-AddressStateTx
*/
const buffer_1 = require("buffer/");
const bintools_1 = __importDefault(require("../../utils/bintools"));
const constants_1 = require("./constants");
const basetx_1 = require("./basetx");
const constants_2 = require("../../utils/constants");
const serialization_1 = require("../../utils/serialization");
const common_1 = require("../../common");
const subnetauth_1 = require("../../apis/platformvm/subnetauth");
const credentials_1 = require("./credentials");
/**
* @ignore
*/
const bintools = bintools_1.default.getInstance();
const serialization = serialization_1.Serialization.getInstance();
var AddressState;
(function (AddressState) {
AddressState[AddressState["ROLE_ADMIN"] = 0] = "ROLE_ADMIN";
AddressState[AddressState["ROLE_KYC"] = 1] = "ROLE_KYC";
AddressState[AddressState["ROLE_OFFERS_ADMIN"] = 2] = "ROLE_OFFERS_ADMIN";
AddressState[AddressState["KYC_VERIFIED"] = 32] = "KYC_VERIFIED";
AddressState[AddressState["KYC_EXPIRED"] = 33] = "KYC_EXPIRED";
AddressState[AddressState["CONSORTIUM"] = 38] = "CONSORTIUM";
AddressState[AddressState["NODE_DEFERRED"] = 39] = "NODE_DEFERRED";
AddressState[AddressState["OFFERS_CREATOR"] = 50] = "OFFERS_CREATOR";
})(AddressState = exports.AddressState || (exports.AddressState = {}));
/**
* Class representing an unsigned AdressStateTx transaction.
*/
class AddressStateTx extends basetx_1.BaseTx {
serialize(encoding = "hex") {
let fields = super.serialize(encoding);
let fieldsV1 = {};
if (this.upgradeVersionID.version() > 0) {
fieldsV1 = {
executor: serialization.encoder(this.executor, encoding, "Buffer", "cb58"),
executorAuth: this.executorAuth.serialize(encoding)
};
}
return Object.assign(Object.assign(Object.assign({}, fields), { address: serialization.encoder(this.address, encoding, "Buffer", "cb58"), state: this.state, remove: this.remove }), fieldsV1);
}
deserialize(fields, encoding = "hex") {
super.deserialize(fields, encoding);
this.address = serialization.decoder(fields["address"], encoding, "cb58", "Buffer", 20);
this.state = fields["state"];
this.remove = fields["remove"];
if (this.upgradeVersionID.version() > 0) {
this.executor = serialization.decoder(fields["executor"], encoding, "cb58", "Buffer");
this.executorAuth.deserialize(fields["executorAuth"], encoding);
}
}
/**
* Returns the id of the [[AddressStateTx]]
*/
getTxType() {
return this._typeID;
}
/**
* Returns the address
*/
getAddress() {
return this.address;
}
/**
* Returns the state
*/
getState() {
return this.state;
}
/**
* Returns the remove flag
*/
getRemove() {
return this.remove;
}
getExecutor() {
return this.executor;
}
getExecutorAuth() {
return this.executorAuth;
}
addSignatureIdx(addressIdx, address) {
const addressIndex = buffer_1.Buffer.alloc(4);
addressIndex.writeUInt32BE(addressIdx, 0);
this.executorAuth.addAddressIndex(addressIndex);
const sigidx = new common_1.SigIdx();
sigidx.fromBuffer(addressIndex);
sigidx.setSource(address);
this.sigIdxs.push(sigidx);
}
sign(msg, kc) {
const creds = super.sign(msg, kc);
if (this.upgradeVersionID.version() > 0) {
const cred = (0, credentials_1.SelectCredentialClass)(constants_1.PlatformVMConstants.SECPCREDENTIAL);
for (const sigidx of this.sigIdxs) {
const keypair = kc.getKey(sigidx.getSource());
const signval = keypair.sign(msg);
const sig = new common_1.Signature();
sig.fromBuffer(signval);
cred.addSignature(sig);
}
creds.push(cred);
}
return creds;
}
/**
* Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[AddressStateTx]], parses it, populates the class, and returns the length of the [[AddressStateTx]] in bytes.
*
* @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[AddressStateTx]]
*
* @returns The length of the raw [[AddressStateTx]]
*
* @remarks assume not-checksummed
*/
fromBuffer(bytes, offset = 0) {
this.upgradeVersionID = new common_1.UpgradeVersionID();
offset = this.upgradeVersionID.fromBuffer(bytes, offset);
offset = super.fromBuffer(bytes, offset);
this.address = bintools.copyFrom(bytes, offset, offset + 20);
offset += 20;
this.state = bintools.copyFrom(bytes, offset, offset + 1)[0];
offset += 1;
this.remove = bintools.copyFrom(bytes, offset, offset + 1)[0] != 0;
offset += 1;
if (this.upgradeVersionID.version() > 0) {
this.executor = bintools.copyFrom(bytes, offset, offset + 20);
offset += 20;
let sa = new subnetauth_1.SubnetAuth();
offset += sa.fromBuffer(bintools.copyFrom(bytes, offset));
this.executorAuth = sa;
}
return offset;
}
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} representation of the [[AddressStateTx]].
*/
toBuffer() {
const upgradeBuf = this.upgradeVersionID.toBuffer();
const superbuff = super.toBuffer();
let bsize = upgradeBuf.length + superbuff.length + this.address.length + 2;
const barr = [
upgradeBuf,
superbuff,
this.address,
buffer_1.Buffer.from([this.state]),
buffer_1.Buffer.from([this.remove ? 1 : 0])
];
if (this.upgradeVersionID.version() > 0) {
const authBuffer = this.executorAuth.toBuffer();
bsize += this.executor.length + authBuffer.length;
barr.push(this.executor, authBuffer);
}
return buffer_1.Buffer.concat(barr, bsize);
}
clone() {
const newAddressStateTx = new AddressStateTx();
newAddressStateTx.fromBuffer(this.toBuffer());
return newAddressStateTx;
}
create(...args) {
return new AddressStateTx(...args);
}
/**
* Class representing an unsigned RegisterNode transaction.
*
* @param version Optional. Transaction version number
* @param networkID Optional networkID, [[DefaultNetworkID]]
* @param blockchainID Optional blockchainID, default Buffer.alloc(32, 16)
* @param outs Optional array of the [[TransferableOutput]]s
* @param ins Optional array of the [[TransferableInput]]s
* @param memo Optional {@link https://github.com/feross/buffer|Buffer} for the memo field
* @param address Optional address to alter state.
* @param state Optional state to alter.
* @param remove Optional if true remove the flag, otherwise set
*/
constructor(version = constants_2.DefaultTransactionVersionNumber, networkID = constants_2.DefaultNetworkID, blockchainID = buffer_1.Buffer.alloc(32, 16), outs = undefined, ins = undefined, memo = undefined, address = undefined, state = undefined, remove = undefined, executor = undefined) {
super(networkID, blockchainID, outs, ins, memo);
this._typeName = "AddressStateTx";
this._typeID = constants_1.PlatformVMConstants.ADDRESSSTATETX;
// UpgradeVersionID (since SP1)
this.upgradeVersionID = new common_1.UpgradeVersionID();
// The address to add / remove state
this.address = buffer_1.Buffer.alloc(20);
// The state to set / unset
this.state = 0;
this.executor = buffer_1.Buffer.alloc(20);
this.executorAuth = new subnetauth_1.SubnetAuth();
this.sigIdxs = []; // idxs of signers
this.upgradeVersionID = new common_1.UpgradeVersionID(version);
if (typeof address != "undefined") {
if (typeof address === "string") {
this.address = bintools.stringToAddress(address);
}
else {
this.address = address;
}
}
if (typeof state != "undefined") {
this.state = state;
}
if (typeof remove != "undefined") {
this.remove = remove;
}
if (typeof executor != "undefined") {
this.executor = executor;
}
}
}
exports.AddressStateTx = AddressStateTx;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc3N0YXRldHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpcy9wbGF0Zm9ybXZtL2FkZHJlc3NzdGF0ZXR4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7R0FHRztBQUNILG9DQUFnQztBQUNoQyxvRUFBMkM7QUFDM0MsMkNBQWlEO0FBR2pELHFDQUFpQztBQUNqQyxxREFHOEI7QUFDOUIsNkRBQTZFO0FBQzdFLHlDQUE4RTtBQUM5RSxpRUFBNkQ7QUFFN0QsK0NBQXFEO0FBRXJEOztHQUVHO0FBQ0gsTUFBTSxRQUFRLEdBQWEsa0JBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUNqRCxNQUFNLGFBQWEsR0FBa0IsNkJBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUVoRSxJQUFZLFlBU1g7QUFURCxXQUFZLFlBQVk7SUFDdEIsMkRBQWMsQ0FBQTtJQUNkLHVEQUFZLENBQUE7SUFDWix5RUFBcUIsQ0FBQTtJQUNyQixnRUFBaUIsQ0FBQTtJQUNqQiw4REFBZ0IsQ0FBQTtJQUNoQiw0REFBZSxDQUFBO0lBQ2Ysa0VBQWtCLENBQUE7SUFDbEIsb0VBQW1CLENBQUE7QUFDckIsQ0FBQyxFQVRXLFlBQVksR0FBWixvQkFBWSxLQUFaLG9CQUFZLFFBU3ZCO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGNBQWUsU0FBUSxlQUFNO0lBSXhDLFNBQVMsQ0FBQyxXQUErQixLQUFLO1FBQzVDLElBQUksTUFBTSxHQUFXLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDOUMsSUFBSSxRQUFRLEdBQVcsRUFBRSxDQUFBO1FBQ3pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRTtZQUN2QyxRQUFRLEdBQUc7Z0JBQ1QsUUFBUSxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQzdCLElBQUksQ0FBQyxRQUFRLEVBQ2IsUUFBUSxFQUNSLFFBQVEsRUFDUixN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QUFtQixDQUFDLGNBQWMsQ0FBQTtRQStDdEQsK0JBQStCO1FBQ3JCLHFCQUFnQixHQUFHLElBQUkseUJBQWdCLEVBQUUsQ0FBQTtRQUNuRCxvQ0FBb0M7UUFDMUIsWUFBTyxHQUFHLGVBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDcEMsMkJBQTJCO1FBQ2pCLFVBQUssR0FBRyxDQUFDLENBQUE7UUFHVCxhQUFRLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMzQixpQkFBWSxHQUFlLElBQUksdUJBQVUsRUFBRSxDQUFBO1FBQzNDLFlBQU8sR0FBYSxFQUFFLENBQUEsQ0FBQyxrQkFBa0I7UUE0SmpELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHlCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3JELElBQUksT0FBTyxPQUFPLElBQUksV0FBVyxFQUFFO1lBQ2pDLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO2dCQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7YUFDakQ7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7YUFDdkI7U0FDRjtRQUNELElBQUksT0FBTyxLQUFLLElBQUksV0FBVyxFQUFFO1lBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1NBQ25CO1FBQ0QsSUFBSSxPQUFPLE1BQU0sSUFBSSxXQUFXLEVBQUU7WUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7U0FDckI7UUFDRCxJQUFJLE9BQU8sUUFBUSxJQUFJLFdBQVcsRUFBRTtZQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtTQUN6QjtJQUNILENBQUM7Q0FDRjtBQXpPRCx3Q0F5T0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBBUEktUGxhdGZvcm1WTS1BZGRyZXNzU3RhdGVUeFxuICovXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiYnVmZmVyL1wiXG5pbXBvcnQgQmluVG9vbHMgZnJvbSBcIi4uLy4uL3V0aWxzL2JpbnRvb2xzXCJcbmltcG9ydCB7IFBsYXRmb3JtVk1Db25zdGFudHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIlxuaW1wb3J0IHsgVHJhbnNmZXJhYmxlT3V0cHV0IH0gZnJvbSBcIi4vb3V0cHV0c1wiXG5pbXBvcnQgeyBUcmFuc2ZlcmFibGVJbnB1dCB9IGZyb20gXCIuL2lucHV0c1wiXG5pbXBvcnQgeyBCYXNlVHggfSBmcm9tIFwiLi9iYXNldHhcIlxuaW1wb3J0IHtcbiAgRGVmYXVsdE5ldHdvcmtJRCxcbiAgRGVmYXVsdFRyYW5zYWN0aW9uVmVyc2lvbk51bWJlclxufSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb24sIFNlcmlhbGl6ZWRFbmNvZGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zZXJpYWxpemF0aW9uXCJcbmltcG9ydCB7IENyZWRlbnRpYWwsIFNpZ0lkeCwgU2lnbmF0dXJlLCBVcGdyYWRlVmVyc2lvbklEIH0gZnJvbSBcIi4uLy4uL2NvbW1vblwiXG5pbXBvcnQgeyBTdWJuZXRBdXRoIH0gZnJvbSBcIi4uLy4uL2FwaXMvcGxhdGZvcm12bS9zdWJuZXRhdXRoXCJcbmltcG9ydCB7IEtleUNoYWluLCBLZXlQYWlyIH0gZnJvbSBcIi4va2V5Y2hhaW5cIlxuaW1wb3J0IHsgU2VsZWN0Q3JlZGVudGlhbENsYXNzIH0gZnJvbSBcIi4vY3JlZGVudGlhbHNcIlxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgYmludG9vbHM6IEJpblRvb2xzID0gQmluVG9vbHMuZ2V0SW5zdGFuY2UoKVxuY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IFNlcmlhbGl6YXRpb24uZ2V0SW5zdGFuY2UoKVxuXG5leHBvcnQgZW51bSBBZGRyZXNzU3RhdGUge1xuICBST0xFX0FETUlOID0gMCxcbiAgUk9MRV9LWUMgPSAxLFxuICBST0xFX09GRkVSU19BRE1JTiA9IDIsXG4gIEtZQ19WRVJJRklFRCA9IDMyLFxuICBLWUNfRVhQSVJFRCA9IDMzLFxuICBDT05TT1JUSVVNID0gMzgsXG4gIE5PREVfREVGRVJSRUQgPSAzOSxcbiAgT0ZGRVJTX0NSRUFUT1IgPSA1MFxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhbiB1bnNpZ25lZCBBZHJlc3NTdGF0ZVR4IHRyYW5zYWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQWRkcmVzc1N0YXRlVHggZXh0ZW5kcyBCYXNlVHgge1xuICBwcm90ZWN0ZWQgX3R5cGVOYW1lID0gXCJBZGRyZXNzU3RhdGVUeFwiXG4gIHByb3RlY3RlZCBfdHlwZUlEID0gUGxhdGZvcm1WTUNvbnN0YW50cy5BRERSRVNTU1RBVEVUWFxuXG4gIHNlcmlhbGl6ZShlbmNvZGluZzogU2VyaWFsaXplZEVuY29kaW5nID0gXCJoZXhcIik6IG9iamVjdCB7XG4gICAgbGV0IGZpZWxkczogb2JqZWN0ID0gc3VwZXIuc2VyaWFsaXplKGVuY29kaW5nKVxuICAgIGxldCBmaWVsZHNWMTogb2JqZWN0ID0ge31cbiAgICBpZiAodGhpcy51cGdyYWRlVmVyc2lvbklELnZlcnNpb24oKSA+IDApIHtcbiAgICAgIGZpZWxkc1YxID0ge1xuICAgICAgICBleGVjdXRvcjogc2VyaWFsaXphdGlvbi5lbmNvZGVyKFxuICAgICAgICAgIHRoaXMuZXhlY3V0b3IsXG4gICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgXCJCdWZmZXJcIixcbiAgICAgICAgICBcImNiNThcIlxuICAgICAgICApLFxuICAgICAgICBleGVjdXRvckF1dGg6IHRoaXMuZXhlY3V0b3JBdXRoLnNlcmlhbGl6ZShlbmNvZGluZylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmZpZWxkcyxcbiAgICAgIGFkZHJlc3M6IHNlcmlhbGl6YXRpb24uZW5jb2Rlcih0aGlzLmFkZHJlc3MsIGVuY29kaW5nLCBcIkJ1ZmZlclwiLCBcImNiNThcIiksXG4gICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgIHJlbW92ZTogdGhpcy5yZW1vdmUsXG4gICAgICAuLi5maWVsZHNWMVxuICAgIH1cbiAgfVxuICBkZXNlcmlhbGl6ZShmaWVsZHM6IG9iamVjdCwgZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpIHtcbiAgICBzdXBlci5kZXNlcmlhbGl6ZShmaWVsZHMsIGVuY29kaW5nKVxuICAgIHRoaXMuYWRkcmVzcyA9IHNlcmlhbGl6YXRpb24uZGVjb2RlcihcbiAgICAgIGZpZWxkc1tcImFkZHJlc3NcIl0sXG4gICAgICBlbmNvZGluZyxcbiAgICAgIFwiY2I1OFwiLFxuICAgICAgXCJCdWZmZXJcIixcbiAgICAgIDIwXG4gICAgKVxuICAgIHRoaXMuc3RhdGUgPSBmaWVsZHNbXCJzdGF0ZVwiXVxuICAgIHRoaXMucmVtb3ZlID0gZmllbGRzW1wicmVtb3ZlXCJdXG5cbiAgICBpZiAodGhpcy51cGdyYWRlVmVyc2lvbklELnZlcnNpb24oKSA+IDApIHtcbiAgICAgIHRoaXMuZXhlY3V0b3IgPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICAgIGZpZWxkc1tcImV4ZWN1dG9yXCJdLFxuICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgXCJjYjU4XCIsXG4gICAgICAgIFwiQnVmZmVyXCJcbiAgICAgIClcbiAgICAgIHRoaXMuZXhlY3V0b3JBdXRoLmRlc2VyaWFsaXplKGZpZWxkc1tcImV4ZWN1dG9yQXV0aFwiXSwgZW5jb2RpbmcpXG4gICAgfVxuICB9XG5cbiAgLy8gVXBncmFkZVZlcnNpb25JRCAoc2luY2UgU1AxKVxuICBwcm90ZWN0ZWQgdXBncmFkZVZlcnNpb25JRCA9IG5ldyBVcGdyYWRlVmVyc2lvbklEKClcbiAgLy8gVGhlIGFkZHJlc3MgdG8gYWRkIC8gcmVtb3ZlIHN0YXRlXG4gIHByb3RlY3RlZCBhZGRyZXNzID0gQnVmZmVyLmFsbG9jKDIwKVxuICAvLyBUaGUgc3RhdGUgdG8gc2V0IC8gdW5zZXRcbiAgcHJvdGVjdGVkIHN0YXRlID0gMFxuICAvLyBSZW1vdmUgb3IgYWRkIHRoZSBmbGFnID9cbiAgcHJvdGVjdGVkIHJlbW92ZTogYm9vbGVhblxuICBwcm90ZWN0ZWQgZXhlY3V0b3IgPSBCdWZmZXIuYWxsb2MoMjApXG4gIHByb3RlY3RlZCBleGVjdXRvckF1dGg6IFN1Ym5ldEF1dGggPSBuZXcgU3VibmV0QXV0aCgpXG4gIHByb3RlY3RlZCBzaWdJZHhzOiBTaWdJZHhbXSA9IFtdIC8vIGlkeHMgb2Ygc2lnbmVyc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgW1tBZGRyZXNzU3RhdGVUeF1dXG4gICAqL1xuICBnZXRUeFR5cGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZUlEXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYWRkcmVzc1xuICAgKi9cbiAgZ2V0QWRkcmVzcygpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLmFkZHJlc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdGF0ZVxuICAgKi9cbiAgZ2V0U3RhdGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlbW92ZSBmbGFnXG4gICAqL1xuICBnZXRSZW1vdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlXG4gIH1cblxuICBnZXRFeGVjdXRvcigpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dG9yXG4gIH1cbiAgZ2V0RXhlY3V0b3JBdXRoKCk6IFN1Ym5ldEF1dGgge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dG9yQXV0aFxuICB9XG5cbiAgYWRkU2lnbmF0dXJlSWR4KGFkZHJlc3NJZHg6IG51bWJlciwgYWRkcmVzczogQnVmZmVyKTogdm9pZCB7XG4gICAgY29uc3QgYWRkcmVzc0luZGV4OiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNClcbiAgICBhZGRyZXNzSW5kZXgud3JpdGVVSW50MzJCRShhZGRyZXNzSWR4LCAwKVxuICAgIHRoaXMuZXhlY3V0b3JBdXRoLmFkZEFkZHJlc3NJbmRleChhZGRyZXNzSW5kZXgpXG5cbiAgICBjb25zdCBzaWdpZHg6IFNpZ0lkeCA9IG5ldyBTaWdJZHgoKVxuICAgIHNpZ2lkeC5mcm9tQnVmZmVyKGFkZHJlc3NJbmRleClcbiAgICBzaWdpZHguc2V0U291cmNlKGFkZHJlc3MpXG4gICAgdGhpcy5zaWdJZHhzLnB1c2goc2lnaWR4KVxuICB9XG5cbiAgc2lnbihtc2c6IEJ1ZmZlciwga2M6IEtleUNoYWluKTogQ3JlZGVudGlhbFtdIHtcbiAgICBjb25zdCBjcmVkczogQ3JlZGVudGlhbFtdID0gc3VwZXIuc2lnbihtc2csIGtjKVxuXG4gICAgaWYgKHRoaXMudXBncmFkZVZlcnNpb25JRC52ZXJzaW9uKCkgPiAwKSB7XG4gICAgICBjb25zdCBjcmVkOiBDcmVkZW50aWFsID0gU2VsZWN0Q3JlZGVudGlhbENsYXNzKFxuICAgICAgICBQbGF0Zm9ybVZNQ29uc3RhbnRzLlNFQ1BDUkVERU5USUFMXG4gICAgICApXG4gICAgICBmb3IgKGNvbnN0IHNpZ2lkeCBvZiB0aGlzLnNpZ0lkeHMpIHtcbiAgICAgICAgY29uc3Qga2V5cGFpcjogS2V5UGFpciA9IGtjLmdldEtleShzaWdpZHguZ2V0U291cmNlKCkpXG4gICAgICAgIGNvbnN0IHNpZ252YWw6IEJ1ZmZlciA9IGtleXBhaXIuc2lnbihtc2cpXG4gICAgICAgIGNvbnN0IHNpZzogU2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZSgpXG4gICAgICAgIHNpZy5mcm9tQnVmZmVyKHNpZ252YWwpXG4gICAgICAgIGNyZWQuYWRkU2lnbmF0dXJlKHNpZylcbiAgICAgIH1cbiAgICAgIGNyZWRzLnB1c2goY3JlZClcbiAgICB9XG4gICAgcmV0dXJuIGNyZWRzXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGFuIFtbQWRkcmVzc1N0YXRlVHhdXSwgcGFyc2VzIGl0LCBwb3B1bGF0ZXMgdGhlIGNsYXNzLCBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBbW0FkZHJlc3NTdGF0ZVR4XV0gaW4gYnl0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBieXRlcyBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgYSByYXcgW1tBZGRyZXNzU3RhdGVUeF1dXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsZW5ndGggb2YgdGhlIHJhdyBbW0FkZHJlc3NTdGF0ZVR4XV1cbiAgICpcbiAgICogQHJlbWFya3MgYXNzdW1lIG5vdC1jaGVja3N1bW1lZFxuICAgKi9cbiAgZnJvbUJ1ZmZlcihieXRlczogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXIge1xuICAgIHRoaXMudXBncmFkZVZlcnNpb25JRCA9IG5ldyBVcGdyYWRlVmVyc2lvbklEKClcbiAgICBvZmZzZXQgPSB0aGlzLnVwZ3JhZGVWZXJzaW9uSUQuZnJvbUJ1ZmZlcihieXRlcywgb2Zmc2V0KVxuICAgIG9mZnNldCA9IHN1cGVyLmZyb21CdWZmZXIoYnl0ZXMsIG9mZnNldClcbiAgICB0aGlzLmFkZHJlc3MgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyAyMClcbiAgICBvZmZzZXQgKz0gMjBcbiAgICB0aGlzLnN0YXRlID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgMSlbMF1cbiAgICBvZmZzZXQgKz0gMVxuICAgIHRoaXMucmVtb3ZlID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgMSlbMF0gIT0gMFxuICAgIG9mZnNldCArPSAxXG4gICAgaWYgKHRoaXMudXBncmFkZVZlcnNpb25JRC52ZXJzaW9uKCkgPiAwKSB7XG4gICAgICB0aGlzLmV4ZWN1dG9yID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgMjApXG4gICAgICBvZmZzZXQgKz0gMjBcbiAgICAgIGxldCBzYTogU3VibmV0QXV0aCA9IG5ldyBTdWJuZXRBdXRoKClcbiAgICAgIG9mZnNldCArPSBzYS5mcm9tQnVmZmVyKGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQpKVxuICAgICAgdGhpcy5leGVjdXRvckF1dGggPSBzYVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBbW0FkZHJlc3NTdGF0ZVR4XV0uXG4gICAqL1xuICB0b0J1ZmZlcigpOiBCdWZmZXIge1xuICAgIGNvbnN0IHVwZ3JhZGVCdWYgPSB0aGlzLnVwZ3JhZGVWZXJzaW9uSUQudG9CdWZmZXIoKVxuICAgIGNvbnN0IHN1cGVyYnVmZjogQnVmZmVyID0gc3VwZXIudG9CdWZmZXIoKVxuXG4gICAgbGV0IGJzaXplOiBudW1iZXIgPVxuICAgICAgdXBncmFkZUJ1Zi5sZW5ndGggKyBzdXBlcmJ1ZmYubGVuZ3RoICsgdGhpcy5hZGRyZXNzLmxlbmd0aCArIDJcbiAgICBjb25zdCBiYXJyOiBCdWZmZXJbXSA9IFtcbiAgICAgIHVwZ3JhZGVCdWYsXG4gICAgICBzdXBlcmJ1ZmYsXG4gICAgICB0aGlzLmFkZHJlc3MsXG4gICAgICBCdWZmZXIuZnJvbShbdGhpcy5zdGF0ZV0pLFxuICAgICAgQnVmZmVyLmZyb20oW3RoaXMucmVtb3ZlID8gMSA6IDBdKVxuICAgIF1cbiAgICBpZiAodGhpcy51cGdyYWRlVmVyc2lvbklELnZlcnNpb24oKSA+IDApIHtcbiAgICAgIGNvbnN0IGF1dGhCdWZmZXIgPSB0aGlzLmV4ZWN1dG9yQXV0aC50b0J1ZmZlcigpXG4gICAgICBic2l6ZSArPSB0aGlzLmV4ZWN1dG9yLmxlbmd0aCArIGF1dGhCdWZmZXIubGVuZ3RoXG4gICAgICBiYXJyLnB1c2godGhpcy5leGVjdXRvciwgYXV0aEJ1ZmZlcilcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYmFyciwgYnNpemUpXG4gIH1cblxuICBjbG9uZSgpOiB0aGlzIHtcbiAgICBjb25zdCBuZXdBZGRyZXNzU3RhdGVUeDogQWRkcmVzc1N0YXRlVHggPSBuZXcgQWRkcmVzc1N0YXRlVHgoKVxuICAgIG5ld0FkZHJlc3NTdGF0ZVR4LmZyb21CdWZmZXIodGhpcy50b0J1ZmZlcigpKVxuICAgIHJldHVybiBuZXdBZGRyZXNzU3RhdGVUeCBhcyB0aGlzXG4gIH1cblxuICBjcmVhdGUoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICByZXR1cm4gbmV3IEFkZHJlc3NTdGF0ZVR4KC4uLmFyZ3MpIGFzIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gdW5zaWduZWQgUmVnaXN0ZXJOb2RlIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdmVyc2lvbiBPcHRpb25hbC4gVHJhbnNhY3Rpb24gdmVyc2lvbiBudW1iZXJcbiAgICogQHBhcmFtIG5ldHdvcmtJRCBPcHRpb25hbCBuZXR3b3JrSUQsIFtbRGVmYXVsdE5ldHdvcmtJRF1dXG4gICAqIEBwYXJhbSBibG9ja2NoYWluSUQgT3B0aW9uYWwgYmxvY2tjaGFpbklELCBkZWZhdWx0IEJ1ZmZlci5hbGxvYygzMiwgMTYpXG4gICAqIEBwYXJhbSBvdXRzIE9wdGlvbmFsIGFycmF5IG9mIHRoZSBbW1RyYW5zZmVyYWJsZU91dHB1dF1dc1xuICAgKiBAcGFyYW0gaW5zIE9wdGlvbmFsIGFycmF5IG9mIHRoZSBbW1RyYW5zZmVyYWJsZUlucHV0XV1zXG4gICAqIEBwYXJhbSBtZW1vIE9wdGlvbmFsIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGZvciB0aGUgbWVtbyBmaWVsZFxuICAgKiBAcGFyYW0gYWRkcmVzcyBPcHRpb25hbCBhZGRyZXNzIHRvIGFsdGVyIHN0YXRlLlxuICAgKiBAcGFyYW0gc3RhdGUgT3B0aW9uYWwgc3RhdGUgdG8gYWx0ZXIuXG4gICAqIEBwYXJhbSByZW1vdmUgT3B0aW9uYWwgaWYgdHJ1ZSByZW1vdmUgdGhlIGZsYWcsIG90aGVyd2lzZSBzZXRcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHZlcnNpb246IG51bWJlciA9IERlZmF1bHRUcmFuc2FjdGlvblZlcnNpb25OdW1iZXIsXG4gICAgbmV0d29ya0lEOiBudW1iZXIgPSBEZWZhdWx0TmV0d29ya0lELFxuICAgIGJsb2NrY2hhaW5JRDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDMyLCAxNiksXG4gICAgb3V0czogVHJhbnNmZXJhYmxlT3V0cHV0W10gPSB1bmRlZmluZWQsXG4gICAgaW5zOiBUcmFuc2ZlcmFibGVJbnB1dFtdID0gdW5kZWZpbmVkLFxuICAgIG1lbW86IEJ1ZmZlciA9IHVuZGVmaW5lZCxcbiAgICBhZGRyZXNzOiBCdWZmZXIgPSB1bmRlZmluZWQsXG4gICAgc3RhdGU6IG51bWJlciA9IHVuZGVmaW5lZCxcbiAgICByZW1vdmU6IGJvb2xlYW4gPSB1bmRlZmluZWQsXG4gICAgZXhlY3V0b3I6IEJ1ZmZlciA9IHVuZGVmaW5lZFxuICApIHtcbiAgICBzdXBlcihuZXR3b3JrSUQsIGJsb2NrY2hhaW5JRCwgb3V0cywgaW5zLCBtZW1vKVxuICAgIHRoaXMudXBncmFkZVZlcnNpb25JRCA9IG5ldyBVcGdyYWRlVmVyc2lvbklEKHZlcnNpb24pXG4gICAgaWYgKHR5cGVvZiBhZGRyZXNzICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmICh0eXBlb2YgYWRkcmVzcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLmFkZHJlc3MgPSBiaW50b29scy5zdHJpbmdUb0FkZHJlc3MoYWRkcmVzcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3NcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnN0YXRlID0gc3RhdGVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZW1vdmUgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5yZW1vdmUgPSByZW1vdmVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBleGVjdXRvciAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3JcbiAgICB9XG4gIH1cbn1cbiJdfQ==