UNPKG

@c4tplatform/caminojs

Version:
426 lines 68 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AddDepositOfferTx = exports.Offer = exports.OfferFlag = void 0; /** * @packageDocumentation * @module API-PlatformVM-DepositTx */ 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 bn_js_1 = __importDefault(require("bn.js")); const subnetauth_1 = require("../../apis/platformvm/subnetauth"); const common_1 = require("../../common"); const credentials_1 = require("../../apis/platformvm/credentials"); /** * @ignore */ const bintools = bintools_1.default.getInstance(); const serialization = serialization_1.Serialization.getInstance(); var OfferFlag; (function (OfferFlag) { OfferFlag["NONE"] = "0"; OfferFlag["LOCKED"] = "1"; })(OfferFlag = exports.OfferFlag || (exports.OfferFlag = {})); class Offer { constructor(upgradeVersion = undefined, interestRateNominator = undefined, start = undefined, end = undefined, minAmount = undefined, totalMaxAmount = undefined, depositedAmount = undefined, minDuration = undefined, maxDuration = undefined, unlockPeriodDuration = undefined, noRewardsPeriodDuration = undefined, memo = undefined, flag = undefined, totalMaxRewardAmount = undefined, rewardedAmount = undefined, ownerAddress = undefined) { this.interestRateNominator = buffer_1.Buffer.alloc(8); this.start = buffer_1.Buffer.alloc(8); this.end = buffer_1.Buffer.alloc(8); this.minAmount = buffer_1.Buffer.alloc(8); this.totalMaxAmount = buffer_1.Buffer.alloc(8); this.depositedAmount = buffer_1.Buffer.alloc(8); this.minDuration = buffer_1.Buffer.alloc(4); this.maxDuration = buffer_1.Buffer.alloc(4); this.unlockPeriodDuration = buffer_1.Buffer.alloc(4); this.noRewardsPeriodDuration = buffer_1.Buffer.alloc(4); this.memo = buffer_1.Buffer.alloc(0); this.flags = buffer_1.Buffer.alloc(8); this.totalMaxRewardAmount = buffer_1.Buffer.alloc(8); this.rewardedAmount = buffer_1.Buffer.alloc(8); this.ownerAddress = buffer_1.Buffer.alloc(20); this.upgradeVersionID = new common_1.UpgradeVersionID(upgradeVersion !== null && upgradeVersion !== void 0 ? upgradeVersion : 0); this.interestRateNominator = bintools.fromBNToBuffer(new bn_js_1.default(interestRateNominator), 8); if (typeof start !== "undefined") { this.start = bintools.fromBNToBuffer(new bn_js_1.default(start), 8); } if (typeof end !== "undefined") { this.end = bintools.fromBNToBuffer(new bn_js_1.default(end), 8); } if (typeof minAmount !== "undefined") { this.minAmount = bintools.fromBNToBuffer(new bn_js_1.default(minAmount), 8); } if (typeof totalMaxAmount !== "undefined") { this.totalMaxAmount = bintools.fromBNToBuffer(new bn_js_1.default(totalMaxAmount), 8); } if (typeof depositedAmount !== "undefined") { this.depositedAmount = bintools.fromBNToBuffer(new bn_js_1.default(depositedAmount), 8); } if (typeof minDuration !== "undefined") { this.minDuration.writeUInt32BE(minDuration, 0); } if (typeof maxDuration !== "undefined") { this.maxDuration.writeUInt32BE(maxDuration, 0); } if (typeof unlockPeriodDuration !== "undefined") { this.unlockPeriodDuration.writeUInt32BE(unlockPeriodDuration, 0); } if (typeof noRewardsPeriodDuration !== "undefined") { this.noRewardsPeriodDuration.writeUInt32BE(noRewardsPeriodDuration, 0); } if (typeof memo !== "undefined") { this.memo = memo; } if (typeof flag != "undefined") { if (flag instanceof bn_js_1.default) { this.flags = bintools.fromBNToBuffer(flag, 8); } else { this.flags = bintools.fromBNToBuffer(new bn_js_1.default(flag), 8); } } if (this.upgradeVersionID.version() > 0) { if (typeof totalMaxRewardAmount !== "undefined") { this.totalMaxRewardAmount = bintools.fromBNToBuffer(new bn_js_1.default(totalMaxRewardAmount), 8); } if (typeof rewardedAmount !== "undefined") { this.rewardedAmount = bintools.fromBNToBuffer(new bn_js_1.default(rewardedAmount), 8); } if (typeof ownerAddress != "undefined") { this.ownerAddress = ownerAddress; } } } deserialize(fields, encoding = "hex") { const upgradeVersion = serialization.decoder(fields["upgradeVersion"], encoding, "decimalString", "Buffer"); this.upgradeVersionID = new common_1.UpgradeVersionID(upgradeVersion); this.interestRateNominator = serialization.decoder(fields["interestRateNominator"], encoding, "decimalString", "Buffer"); this.start = serialization.decoder(fields["start"], encoding, "decimalString", "Buffer"); this.end = serialization.decoder(fields["end"], encoding, "decimalString", "Buffer"); this.minAmount = serialization.decoder(fields["minAmount"], encoding, "decimalString", "Buffer"); this.totalMaxAmount = serialization.decoder(fields["totalMaxAmount"], encoding, "decimalString", "Buffer"); this.depositedAmount = serialization.decoder(fields["depositedAmount"], encoding, "decimalString", "Buffer"); this.minDuration = serialization.decoder(fields["minDuration"], encoding, "decimalString", "Buffer"); this.maxDuration = serialization.decoder(fields["maxDuration"], encoding, "decimalString", "Buffer"); this.unlockPeriodDuration = serialization.decoder(fields["unlockPeriodDuration"], encoding, "decimalString", "Buffer"); this.noRewardsPeriodDuration = serialization.decoder(fields["noRewardsPeriodDuration"], encoding, "decimalString", "Buffer"); this.memo = serialization.decoder(fields["memo"], encoding, "utf8", "Buffer"); this.flags = serialization.decoder(fields["flags"], encoding, "decimalString", "Buffer"); if (this.upgradeVersionID.version() > 0) { this.totalMaxRewardAmount = serialization.decoder(fields["totalMaxRewardAmount"], encoding, "decimalString", "Buffer"); this.rewardedAmount = serialization.decoder(fields["rewardedAmount"], encoding, "decimalString", "Buffer"); this.ownerAddress = serialization.decoder(fields["ownerAddress"], encoding, "cb58", "Buffer"); } return this; } serialize(encoding = "hex") { let fields = { upgradeVersion: serialization.encoder(this.upgradeVersionID.version(), encoding, "Buffer", "decimalString"), interestRateNominator: serialization.encoder(this.interestRateNominator, encoding, "Buffer", "decimalString"), start: serialization.encoder(this.start, encoding, "Buffer", "decimalString"), end: serialization.encoder(this.end, encoding, "Buffer", "decimalString"), minAmount: serialization.encoder(this.minAmount, encoding, "Buffer", "decimalString"), totalMaxAmount: serialization.encoder(this.totalMaxAmount, encoding, "Buffer", "decimalString"), depositedAmount: serialization.encoder(this.depositedAmount, encoding, "Buffer", "decimalString"), minDuration: serialization.encoder(this.minDuration, encoding, "Buffer", "decimalString"), maxDuration: serialization.encoder(this.maxDuration, encoding, "Buffer", "decimalString"), unlockPeriodDuration: serialization.encoder(this.unlockPeriodDuration, encoding, "Buffer", "decimalString"), noRewardsPeriodDuration: serialization.encoder(this.noRewardsPeriodDuration, encoding, "Buffer", "decimalString"), memo: serialization.encoder(this.memo, encoding, "Buffer", "utf8"), flags: serialization.encoder(this.flags, encoding, "Buffer", "decimalString") }; if (this.upgradeVersionID.version() > 0) { return Object.assign(Object.assign({}, fields), { totalMaxRewardAmount: serialization.encoder(this.totalMaxRewardAmount, encoding, "Buffer", "decimalString"), rewardedAmount: serialization.encoder(this.rewardedAmount, encoding, "Buffer", "decimalString"), ownerAddress: serialization.encoder(this.ownerAddress, encoding, "Buffer", "cb58") }); } return fields; } fromBuffer(bytes, offset = 0) { offset = this.upgradeVersionID.fromBuffer(bytes, offset); this.interestRateNominator = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.start = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.end = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.minAmount = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.totalMaxAmount = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.depositedAmount = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.minDuration = bintools.copyFrom(bytes, offset, offset + 4); offset += 4; this.maxDuration = bintools.copyFrom(bytes, offset, offset + 4); offset += 4; this.unlockPeriodDuration = bintools.copyFrom(bytes, offset, offset + 4); offset += 4; this.noRewardsPeriodDuration = bintools.copyFrom(bytes, offset, offset + 4); offset += 4; const memoLen = bintools .copyFrom(bytes, offset, offset + 4) .readUInt32BE(0); offset += 4; this.memo = bintools.copyFrom(bytes, offset, offset + memoLen); offset += memoLen; this.flags = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; if (this.upgradeVersionID.version() > 0) { this.totalMaxRewardAmount = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.rewardedAmount = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.ownerAddress = bintools.copyFrom(bytes, offset, offset + 20); offset += 20; } return offset; } toBuffer() { let memoLength = buffer_1.Buffer.alloc(4); memoLength.writeUInt32BE(this.memo.length, 0); let upgradeBuffer = this.upgradeVersionID.toBuffer(); let bsize = upgradeBuffer.length + this.interestRateNominator.length + this.start.length + this.end.length + this.minAmount.length + this.totalMaxAmount.length + this.depositedAmount.length + this.minDuration.length + this.maxDuration.length + this.unlockPeriodDuration.length + this.noRewardsPeriodDuration.length + memoLength.length + this.memo.length + this.flags.length; const buffer = [ upgradeBuffer, this.interestRateNominator, this.start, this.end, this.minAmount, this.totalMaxAmount, this.depositedAmount, this.minDuration, this.maxDuration, this.unlockPeriodDuration, this.noRewardsPeriodDuration, memoLength, this.memo, this.flags ]; if (this.upgradeVersionID.version() > 0) { bsize += this.totalMaxRewardAmount.length + this.rewardedAmount.length + this.ownerAddress.length; buffer.push(this.totalMaxRewardAmount, this.rewardedAmount, this.ownerAddress); } return buffer_1.Buffer.concat(buffer, bsize); } getUpgradeVersionID() { return this.upgradeVersionID; } getInterestRateNominator() { return this.interestRateNominator; } getStart() { return this.start; } getEnd() { return this.end; } getMinAmount() { return this.minAmount; } getTotalMaxAmount() { return this.totalMaxAmount; } getDepositedAmount() { return this.depositedAmount; } getMinDuration() { return this.minDuration; } getMaxDuration() { return this.maxDuration; } getUnlockPeriodDuration() { return this.unlockPeriodDuration; } getNoRewardsPeriodDuration() { return this.noRewardsPeriodDuration; } getMemo() { return this.memo; } getFlags() { return this.flags; } getTotalMaxRewardAmount() { return this.totalMaxRewardAmount; } getRewardedAmount() { return this.rewardedAmount; } getOwnerAddress() { return this.ownerAddress; } } exports.Offer = Offer; /** * Class representing an unsigned AddDepositOfferTx transaction. */ class AddDepositOfferTx extends basetx_1.BaseTx { serialize(encoding = "hex") { let fields = super.serialize(encoding); return Object.assign(Object.assign({}, fields), { depositOffer: this.depositOffer.serialize(encoding), depositOfferCreatorAddress: serialization.encoder(this.depositOfferCreatorAddress, encoding, "Buffer", "cb58"), depositOfferCreatorAuth: this.depositOfferCreatorAuth.serialize(encoding) }); } deserialize(fields, encoding = "hex") { super.deserialize(fields, encoding); this.depositOffer = new Offer().deserialize(fields["depositOffer"], encoding); this.depositOfferCreatorAddress = serialization.decoder(fields["depositOfferCreatorAddress"], encoding, "cb58", "Buffer"); this.depositOfferCreatorAuth.deserialize(fields["depositOfferCreatorAuth"], encoding); } /** * Creates and adds a [[SigIdx]] to the [[AddDepositOfferTx]]. * * @param addressIdx The index of the address to reference in the signatures * @param address The address of the source of the signature */ addSignatureIdx(addressIdx, address) { const addressIndex = buffer_1.Buffer.alloc(4); addressIndex.writeUIntBE(addressIdx, 0, 4); this.depositOfferCreatorAuth.addAddressIndex(addressIndex); const sigidx = new common_1.SigIdx(); const b = buffer_1.Buffer.alloc(4); b.writeUInt32BE(addressIdx, 0); sigidx.fromBuffer(b); sigidx.setSource(address); this.sigIdxs.push(sigidx); this.sigCount.writeUInt32BE(this.sigIdxs.length, 0); } /** * Returns the id of the [[RegisterNodeTx]] */ getTxType() { return this._typeID; } getDepositOffer() { return this.depositOffer; } getDepositOfferCreatorAddress() { return this.depositOfferCreatorAddress; } getDepositOfferCreatorAuth() { return this.depositOfferCreatorAuth; } getSigIdxs() { return this.sigIdxs; } /** * Takes the bytes of an [[UnsignedTx]] and returns an array of [[Credential]]s * * @param msg A Buffer for the [[UnsignedTx]] * @param kc An [[KeyChain]] used in signing * * @returns An array of [[Credential]]s */ sign(msg, kc) { const creds = super.sign(msg, kc); 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 a [[AddDepositOfferTx]], parses it, populates the class, and returns the length of the [[AddDepositOfferTx]] in bytes. * * @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[AddDepositOfferTx]] * * @returns The length of the raw [[AddDepositOfferTx]] * * @remarks assume not-checksummed */ fromBuffer(bytes, offset = 0) { offset = super.fromBuffer(bytes, offset); const depositOffer = new Offer(); offset = depositOffer.fromBuffer(bytes, offset); this.depositOffer = depositOffer; this.depositOfferCreatorAddress = bintools.copyFrom(bytes, offset, offset + 20); offset += 20; const sa = new subnetauth_1.SubnetAuth(); offset += sa.fromBuffer(bintools.copyFrom(bytes, offset)); this.depositOfferCreatorAuth = sa; return offset; } /** * Returns a {@link https://github.com/feross/buffer|Buffer} representation of the [[AddDepositOfferTx]]. */ toBuffer() { const superbuff = super.toBuffer(); let bsize = superbuff.length; const depositOfferBuffer = this.depositOffer.toBuffer(); bsize += depositOfferBuffer.length; const authBuffer = this.depositOfferCreatorAuth.toBuffer(); bsize += authBuffer.length; const barr = [ superbuff, depositOfferBuffer, this.depositOfferCreatorAddress, authBuffer ]; return buffer_1.Buffer.concat(barr, bsize + 20); } clone() { const newAddDepositOfferTx = new AddDepositOfferTx(); newAddDepositOfferTx.fromBuffer(this.toBuffer()); return newAddDepositOfferTx; } create(...args) { return new AddDepositOfferTx(...args); } /** * Class representing an unsigned AddDepositOfferTx transaction. * * @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 depositOffer Offer to be used for this deposit * @param depositOfferCreatorAddress Address of the node that created the offer */ constructor(networkID = constants_2.DefaultNetworkID, blockchainID = buffer_1.Buffer.alloc(32, 16), outs = undefined, ins = undefined, memo = undefined, depositOffer = undefined, depositOfferCreatorAddress = undefined) { super(networkID, blockchainID, outs, ins, memo); this._typeName = "AddDepositOfferTx"; this._typeID = constants_1.PlatformVMConstants.ADDDEPOSITOFFERTX; // The address of the account that creates the deposit offer this.depositOfferCreatorAddress = buffer_1.Buffer.alloc(20); this.sigCount = buffer_1.Buffer.alloc(4); this.sigIdxs = []; // idxs of signers if (typeof depositOffer !== "undefined") { this.depositOffer = depositOffer; } else { this.depositOffer = new Offer(); } if (typeof depositOfferCreatorAddress != "undefined") { this.depositOfferCreatorAddress = depositOfferCreatorAddress; } this.depositOfferCreatorAuth = new subnetauth_1.SubnetAuth(); } } exports.AddDepositOfferTx = AddDepositOfferTx; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkZGVwb3NpdG9mZmVydHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpcy9wbGF0Zm9ybXZtL2FkZGRlcG9zaXRvZmZlcnR4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7R0FHRztBQUNILG9DQUFnQztBQUNoQyxvRUFBMkM7QUFDM0MsMkNBQWlEO0FBR2pELHFDQUFpQztBQUNqQyxxREFBd0Q7QUFDeEQsNkRBQTZFO0FBQzdFLGtEQUFzQjtBQUN0QixpRUFBNkQ7QUFDN0QseUNBQThFO0FBRTlFLG1FQUF5RTtBQUV6RTs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFhLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7QUFDakQsTUFBTSxhQUFhLEdBQWtCLDZCQUFhLENBQUMsV0FBVyxFQUFFLENBQUE7QUFFaEUsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ25CLHVCQUFVLENBQUE7SUFDVix5QkFBWSxDQUFBO0FBQ2QsQ0FBQyxFQUhXLFNBQVMsR0FBVCxpQkFBUyxLQUFULGlCQUFTLFFBR3BCO0FBRUQsTUFBYSxLQUFLO0lBa0JoQixZQUNFLGlCQUF5QixTQUFTLEVBQ2xDLHdCQUE0QixTQUFTLEVBQ3JDLFFBQVksU0FBUyxFQUNyQixNQUFVLFNBQVMsRUFDbkIsWUFBZ0IsU0FBUyxFQUN6QixpQkFBcUIsU0FBUyxFQUM5QixrQkFBc0IsU0FBUyxFQUMvQixjQUFzQixTQUFTLEVBQy9CLGNBQXNCLFNBQVMsRUFDL0IsdUJBQStCLFNBQVMsRUFDeEMsMEJBQWtDLFNBQVMsRUFDM0MsT0FBZSxTQUFTLEVBQ3hCLE9BQXVCLFNBQVMsRUFDaEMsdUJBQTJCLFNBQVMsRUFDcEMsaUJBQXFCLFNBQVMsRUFDOUIsZUFBdUIsU0FBUztRQWhDeEIsMEJBQXFCLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN2QyxVQUFLLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxD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dkMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUE7U0FDakM7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQTtTQUNoQztRQUVELElBQUksT0FBTywwQkFBMEIsSUFBSSxXQUFXLEVBQUU7WUFDcEQsSUFBSSxDQUFDLDBCQUEwQixHQUFHLDBCQUEwQixDQUFBO1NBQzdEO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksdUJBQVUsRUFBRSxDQUFBO0lBQ2pELENBQUM7Q0FDRjtBQTdNRCw4Q0E2TUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBBUEktUGxhdGZvcm1WTS1EZXBvc2l0VHhcbiAqL1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlci9cIlxuaW1wb3J0IEJpblRvb2xzIGZyb20gXCIuLi8uLi91dGlscy9iaW50b29sc1wiXG5pbXBvcnQgeyBQbGF0Zm9ybVZNQ29uc3RhbnRzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCJcbmltcG9ydCB7IFRyYW5zZmVyYWJsZU91dHB1dCB9IGZyb20gXCIuL291dHB1dHNcIlxuaW1wb3J0IHsgVHJhbnNmZXJhYmxlSW5wdXQgfSBmcm9tIFwiLi9pbnB1dHNcIlxuaW1wb3J0IHsgQmFzZVR4IH0gZnJvbSBcIi4vYmFzZXR4XCJcbmltcG9ydCB7IERlZmF1bHROZXR3b3JrSUQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb24sIFNlcmlhbGl6ZWRFbmNvZGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zZXJpYWxpemF0aW9uXCJcbmltcG9ydCBCTiBmcm9tIFwiYm4uanNcIlxuaW1wb3J0IHsgU3VibmV0QXV0aCB9IGZyb20gXCIuLi8uLi9hcGlzL3BsYXRmb3Jtdm0vc3VibmV0YXV0aFwiXG5pbXBvcnQgeyBDcmVkZW50aWFsLCBTaWdJZHgsIFNpZ25hdHVyZSwgVXBncmFkZVZlcnNpb25JRCB9IGZyb20gXCIuLi8uLi9jb21tb25cIlxuaW1wb3J0IHsgS2V5Q2hhaW4sIEtleVBhaXIgfSBmcm9tIFwiLi4vLi4vYXBpcy9wbGF0Zm9ybXZtL2tleWNoYWluXCJcbmltcG9ydCB7IFNlbGVjdENyZWRlbnRpYWxDbGFzcyB9IGZyb20gXCIuLi8uLi9hcGlzL3BsYXRmb3Jtdm0vY3JlZGVudGlhbHNcIlxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgYmludG9vbHM6IEJpblRvb2xzID0gQmluVG9vbHMuZ2V0SW5zdGFuY2UoKVxuY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IFNlcmlhbGl6YXRpb24uZ2V0SW5zdGFuY2UoKVxuXG5leHBvcnQgZW51bSBPZmZlckZsYWcge1xuICBOT05FID0gXCIwXCIsXG4gIExPQ0tFRCA9IFwiMVwiXG59XG5cbmV4cG9ydCBjbGFzcyBPZmZlciB7XG4gIHByb3RlY3RlZCB1cGdyYWRlVmVyc2lvbklEOiBVcGdyYWRlVmVyc2lvbklEXG4gIHByb3RlY3RlZCBpbnRlcmVzdFJhdGVOb21pbmF0b3IgPSBCdWZmZXIuYWxsb2MoOClcbiAgcHJvdGVjdGVkIHN0YXJ0ID0gQnVmZmVyLmFsbG9jKDgpXG4gIHByb3RlY3RlZCBlbmQgPSBCdWZmZXIuYWxsb2MoOClcbiAgcHJvdGVjdGVkIG1pbkFtb3VudCA9IEJ1ZmZlci5hbGxvYyg4KVxuICBwcm90ZWN0ZWQgdG90YWxNYXhBbW91bnQgPSBCdWZmZXIuYWxsb2MoOClcbiAgcHJvdGVjdGVkIGRlcG9zaXRlZEFtb3VudCA9IEJ1ZmZlci5hbGxvYyg4KVxuICBwcm90ZWN0ZWQgbWluRHVyYXRpb24gPSBCdWZmZXIuYWxsb2MoNClcbiAgcHJvdGVjdGVkIG1heER1cmF0aW9uID0gQnVmZmVyLmFsbG9jKDQpXG4gIHByb3RlY3RlZCB1bmxvY2tQZXJpb2REdXJhdGlvbiA9IEJ1ZmZlci5hbGxvYyg0KVxuICBwcm90ZWN0ZWQgbm9SZXdhcmRzUGVyaW9kRHVyYXRpb24gPSBCdWZmZXIuYWxsb2MoNClcbiAgcHJvdGVjdGVkIG1lbW8gPSBCdWZmZXIuYWxsb2MoMClcbiAgcHJvdGVjdGVkIGZsYWdzID0gQnVmZmVyLmFsbG9jKDgpXG4gIHByb3RlY3RlZCB0b3RhbE1heFJld2FyZEFtb3VudCA9IEJ1ZmZlci5hbGxvYyg4KVxuICBwcm90ZWN0ZWQgcmV3YXJkZWRBbW91bnQgPSBCdWZmZXIuYWxsb2MoOClcbiAgcHJvdGVjdGVkIG93bmVyQWRkcmVzcyA9IEJ1ZmZlci5hbGxvYygyMClcblxuICBjb25zdHJ1Y3RvcihcbiAgICB1cGdyYWRlVmVyc2lvbjogbnVtYmVyID0gdW5kZWZpbmVkLFxuICAgIGludGVyZXN0UmF0ZU5vbWluYXRvcjogQk4gPSB1bmRlZmluZWQsXG4gICAgc3RhcnQ6IEJOID0gdW5kZWZpbmVkLFxuICAgIGVuZDogQk4gPSB1bmRlZmluZWQsXG4gICAgbWluQW1vdW50OiBCTiA9IHVuZGVmaW5lZCxcbiAgICB0b3RhbE1heEFtb3VudDogQk4gPSB1bmRlZmluZWQsXG4gICAgZGVwb3NpdGVkQW1vdW50OiBCTiA9IHVuZGVmaW5lZCxcbiAgICBtaW5EdXJhdGlvbjogbnVtYmVyID0gdW5kZWZpbmVkLFxuICAgIG1heER1cmF0aW9uOiBudW1iZXIgPSB1bmRlZmluZWQsXG4gICAgdW5sb2NrUGVyaW9kRHVyYXRpb246IG51bWJlciA9IHVuZGVmaW5lZCxcbiAgICBub1Jld2FyZHNQZXJpb2REdXJhdGlvbjogbnVtYmVyID0gdW5kZWZpbmVkLFxuICAgIG1lbW86IEJ1ZmZlciA9IHVuZGVmaW5lZCxcbiAgICBmbGFnOiBPZmZlckZsYWcgfCBCTiA9IHVuZGVmaW5lZCxcbiAgICB0b3RhbE1heFJld2FyZEFtb3VudDogQk4gPSB1bmRlZmluZWQsXG4gICAgcmV3YXJkZWRBbW91bnQ6IEJOID0gdW5kZWZpbmVkLFxuICAgIG93bmVyQWRkcmVzczogQnVmZmVyID0gdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMudXBncmFkZVZlcnNpb25JRCA9IG5ldyBVcGdyYWRlVmVyc2lvbklEKHVwZ3JhZGVWZXJzaW9uID8/IDApXG4gICAgdGhpcy5pbnRlcmVzdFJhdGVOb21pbmF0b3IgPSBiaW50b29scy5mcm9tQk5Ub0J1ZmZlcihcbiAgICAgIG5ldyBCTihpbnRlcmVzdFJhdGVOb21pbmF0b3IpLFxuICAgICAgOFxuICAgIClcbiAgICBpZiAodHlwZW9mIHN0YXJ0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnN0YXJ0ID0gYmludG9vbHMuZnJvbUJOVG9CdWZmZXIobmV3IEJOKHN0YXJ0KSwgOClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuZW5kID0gYmludG9vbHMuZnJvbUJOVG9CdWZmZXIobmV3IEJOKGVuZCksIDgpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgbWluQW1vdW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLm1pbkFtb3VudCA9IGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKG5ldyBCTihtaW5BbW91bnQpLCA4KVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHRvdGFsTWF4QW1vdW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnRvdGFsTWF4QW1vdW50ID0gYmludG9vbHMuZnJvbUJOVG9CdWZmZXIobmV3IEJOKHRvdGFsTWF4QW1vdW50KSwgOClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkZXBvc2l0ZWRBbW91bnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuZGVwb3NpdGVkQW1vdW50ID0gYmludG9vbHMuZnJvbUJOVG9CdWZmZXIobmV3IEJOKGRlcG9zaXRlZEFtb3VudCksIDgpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgbWluRHVyYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMubWluRHVyYXRpb24ud3JpdGVVSW50MzJCRShtaW5EdXJhdGlvbiwgMClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBtYXhEdXJhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5tYXhEdXJhdGlvbi53cml0ZVVJbnQzMkJFKG1heER1cmF0aW9uLCAwKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHVubG9ja1BlcmlvZER1cmF0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnVubG9ja1BlcmlvZER1cmF0aW9uLndyaXRlVUludDMyQkUodW5sb2NrUGVyaW9kRHVyYXRpb24sIDApXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygbm9SZXdhcmRzUGVyaW9kRHVyYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMubm9SZXdhcmRzUGVyaW9kRHVyYXRpb24ud3JpdGVVSW50MzJCRShub1Jld2FyZHNQZXJpb2REdXJhdGlvbiwgMClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBtZW1vICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLm1lbW8gPSBtZW1vXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZmxhZyAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoZmxhZyBpbnN0YW5jZW9mIEJOKSB7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBiaW50b29scy5mcm9tQk5Ub0J1ZmZlcihmbGFnLCA4KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mbGFncyA9IGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKG5ldyBCTihmbGFnKSwgOClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMudXBncmFkZVZlcnNpb25JRC52ZXJzaW9uKCkgPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIHRvdGFsTWF4UmV3YXJkQW1vdW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRoaXMudG90YWxNYXhSZXdhcmRBbW91bnQgPSBiaW50b29scy5mcm9tQk5Ub0J1ZmZlcihcbiAgICAgICAgICBuZXcgQk4odG90YWxNYXhSZXdhcmRBbW91bnQpLFxuICAgICAgICAgIDhcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXdhcmRlZEFtb3VudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGlzLnJld2FyZGVkQW1vdW50ID0gYmludG9vbHMuZnJvbUJOVG9CdWZmZXIobmV3IEJOKHJld2FyZGVkQW1vdW50KSwgOClcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3duZXJBZGRyZXNzICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5vd25lckFkZHJlc3MgPSBvd25lckFkZHJlc3NcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZXNlcmlhbGl6ZShmaWVsZHM6IG9iamVjdCwgZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpOiB0aGlzIHtcbiAgICBjb25zdCB1cGdyYWRlVmVyc2lvbiA9IHNlcmlhbGl6YXRpb24uZGVjb2RlcihcbiAgICAgIGZpZWxkc1tcInVwZ3JhZGVWZXJzaW9uXCJdLFxuICAgICAgZW5jb2RpbmcsXG4gICAgICBcImRlY2ltYWxTdHJpbmdcIixcbiAgICAgIFwiQnVmZmVyXCJcbiAgICApXG4gICAgdGhpcy51cGdyYWRlVmVyc2lvbklEID0gbmV3IFVwZ3JhZGVWZXJzaW9uSUQodXBncmFkZVZlcnNpb24pXG5cbiAgICB0aGlzLmludGVyZXN0UmF0ZU5vbWluYXRvciA9IHNlcmlhbGl6YXRpb24uZGVjb2RlcihcbiAgICAgIGZpZWxkc1tcImludGVyZXN0UmF0ZU5vbWluYXRvclwiXSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgXCJkZWNpbWFsU3RyaW5nXCIsXG4gICAgICBcIkJ1ZmZlclwiXG4gICAgKVxuICAgIHRoaXMuc3RhcnQgPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICBmaWVsZHNbXCJzdGFydFwiXSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgXCJkZWNpbWFsU3RyaW5nXCIsXG4gICAgICBcIkJ1ZmZlclwiXG4gICAgKVxuICAgIHRoaXMuZW5kID0gc2VyaWFsaXphdGlvbi5kZWNvZGVyKFxuICAgICAgZmllbGRzW1wiZW5kXCJdLFxuICAgICAgZW5jb2RpbmcsXG4gICAgICBcImRlY2ltYWxTdHJpbmdcIixcbiAgICAgIFwiQnVmZmVyXCJcbiAgICApXG4gICAgdGhpcy5taW5BbW91bnQgPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICBmaWVsZHNbXCJtaW5BbW91bnRcIl0sXG4gICAgICBlbmNvZGluZyxcbiAgICAgIFwiZGVjaW1hbFN0cmluZ1wiLFxuICAgICAgXCJCdWZmZXJcIlxuICAgIClcbiAgICB0aGlzLnRvdGFsTWF4QW1vdW50ID0gc2VyaWFsaXphdGlvbi5kZWNvZGVyKFxuICAgICAgZmllbGRzW1widG90YWxNYXhBbW91bnRcIl0sXG4gICAgICBlbmNvZGluZyxcbiAgICAgIFwiZGVjaW1hbFN0cmluZ1wiLFxuICAgICAgXCJCdWZmZXJcIlxuICAgIClcbiAgICB0aGlzLmRlcG9zaXRlZEFtb3VudCA9IHNlcmlhbGl6YXRpb24uZGVjb2RlcihcbiAgICAgIGZpZWxkc1tcImRlcG9zaXRlZEFtb3VudFwiXSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgXCJkZWNpbWFsU3RyaW5nXCIsXG4gICAgICBcIkJ1ZmZlclwiXG4gICAgKVxuICAgIHRoaXMubWluRHVyYXRpb24gPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICBmaWVsZHNbXCJtaW5EdXJhdGlvblwiXSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgXCJkZWNpbWFsU3RyaW5nXCIsXG4gICAgICBcIkJ1ZmZlclwiXG4gICAgKVxuICAgIHRoaXMubWF4RHVyYXRpb24gPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICBmaWVsZHNbXCJtYXhEdXJhdGlvblwiXSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgXCJkZWNpbWFsU3RyaW5nXCIsXG4gICAgICBcIkJ1ZmZlclwiXG4gICAgKVxuICAgIHRoaXMudW5sb2NrUGVyaW9kRHVyYXRpb24gPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICBmaWVsZHNbXCJ1bmxvY2tQZXJpb2REdXJhdGlvblwiXSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgXCJkZWNpbWFsU3RyaW5nXCIsXG4gICAgICBcIkJ1ZmZlclwiXG4gICAgKVxuICAgIHRoaXMubm9SZXdhcmRzUGVyaW9kRHVyYXRpb24gPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICBmaWVsZHNbXCJub1Jld2FyZHNQZXJpb2REdXJhdGlvblwiXSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgXCJkZWNpbWFsU3RyaW5nXCIsXG4gICAgICBcIkJ1ZmZlclwiXG4gICAgKVxuICAgIHRoaXMubWVtbyA9IHNlcmlhbGl6YXRpb24uZGVjb2RlcihcbiAgICAgIGZpZWxkc1tcIm1lbW9cIl0sXG4gICAgICBlbmNvZGluZyxcbiAgICAgIFwidXRmOFwiLFxuICAgICAgXCJCdWZmZXJcIlxuICAgIClcbiAgICB0aGlzLmZsYWdzID0gc2VyaWFsaXphdGlvbi5kZWNvZGVyKFxuICAgICAgZmllbGRzW1wiZmxhZ3NcIl0sXG4gICAgICBlbmNvZGluZyxcbiAgICAgIFwiZGVjaW1hbFN0cmluZ1wiLFxuICAgICAgXCJCdWZmZXJcIlxuICAgIClcbiAgICBpZiAodGhpcy51cGdyYWRlVmVyc2lvbklELnZlcnNpb24oKSA+IDApIHtcbiAgICAgIHRoaXMudG90YWxNYXhSZXdhcmRBbW91bnQgPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICAgIGZpZWxkc1tcInRvdGFsTWF4UmV3YXJkQW1vdW50XCJdLFxuICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgXCJkZWNpbWFsU3RyaW5nXCIsXG4gICAgICAgIFwiQnVmZmVyXCJcbiAgICAgIClcbiAgICAgIHRoaXMucmV3YXJkZWRBbW91bnQgPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICAgIGZpZWxkc1tcInJld2FyZGVkQW1vdW50XCJdLFxuICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgXCJkZWNpbWFsU3RyaW5nXCIsXG4gICAgICAgIFwiQnVmZmVyXCJcbiAgICAgIClcblxuICAgICAgdGhpcy5vd25lckFkZHJlc3MgPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICAgIGZpZWxkc1tcIm93bmVyQWRkcmVzc1wiXSxcbiAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgIFwiY2I1OFwiLFxuICAgICAgICBcIkJ1ZmZlclwiXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuX