PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-vet/dist/src/lib/transactionBuilder
Просмотр файла: exitDelegationBuilder.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExitDelegationBuilder = void 0;
const assert_1 = __importDefault(require("assert"));
const sdk_core_1 = require("@bitgo/sdk-core");
const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
const ethereumjs_util_1 = require("ethereumjs-util");
const transactionBuilder_1 = require("./transactionBuilder");
const exitDelegation_1 = require("../transaction/exitDelegation");
const utils_1 = __importDefault(require("../utils"));
const constants_1 = require("../constants");
class ExitDelegationBuilder extends transactionBuilder_1.TransactionBuilder {
/**
* Creates a new ExitDelegationBuilder instance.
*
* @param {Readonly<CoinConfig>} _coinConfig - The coin configuration object
*/
constructor(_coinConfig) {
super(_coinConfig);
this._transaction = new exitDelegation_1.ExitDelegationTransaction(_coinConfig);
}
/**
* Initializes the builder with an existing ExitDelegationTransaction.
*
* @param {ExitDelegationTransaction} tx - The transaction to initialize the builder with
*/
initBuilder(tx) {
this._transaction = tx;
}
/**
* Gets the exit delegation transaction instance.
*
* @returns {ExitDelegationTransaction} The exit delegation transaction
*/
get exitDelegationTransaction() {
return this._transaction;
}
/**
* Gets the transaction type for unstaking.
*
* @returns {TransactionType} The transaction type
*/
get transactionType() {
return sdk_core_1.TransactionType.StakingUnlock;
}
/**
* Validates the transaction clauses for unstaking.
* @param {TransactionClause[]} clauses - The transaction clauses to validate.
* @returns {boolean} - Returns true if the clauses are valid, false otherwise.
*/
isValidTransactionClauses(clauses) {
try {
if (!clauses || !Array.isArray(clauses) || clauses.length === 0) {
return false;
}
const clause = clauses[0];
if (!clause.to || !utils_1.default.isValidAddress(clause.to)) {
return false;
}
// For unstaking transactions, value must be exactly '0x0'
if (clause.value !== 0) {
return false;
}
// Check if the data starts with the exitDelegation method ID
if (!clause.data.startsWith(constants_1.EXIT_DELEGATION_METHOD_ID)) {
return false;
}
return true;
}
catch (e) {
return false;
}
}
/**
* Sets the token ID for this unstaking transaction.
*
* @param {string} tokenId - The ID of the NFT token to unstake
* @returns {ExitDelegationBuilder} This transaction builder
*/
tokenId(tokenId) {
this.exitDelegationTransaction.tokenId = tokenId;
return this;
}
/**
* Sets the delegation contract address for this unstaking transaction.
* If not provided, uses the default address from constants.
*
* @param {string} address - The delegation contract address
* @returns {ExitDelegationBuilder} This transaction builder
*/
delegationContract(address = constants_1.STARGATE_DELEGATION_ADDRESS) {
this.validateAddress({ address });
this.exitDelegationTransaction.contract = address;
return this;
}
/** @inheritdoc */
validateTransaction(transaction) {
if (!transaction) {
throw new Error('transaction not defined');
}
(0, assert_1.default)(transaction.contract, 'Delegation contract address is required');
(0, assert_1.default)(transaction.tokenId, 'Token ID is required');
this.validateAddress({ address: transaction.contract });
}
/** @inheritdoc */
async buildImplementation() {
this.transaction.type = this.transactionType;
await this.exitDelegationTransaction.build();
return this.transaction;
}
/**
* Generates the transaction data for exit delegation by encoding the exitDelegation method call.
*
* @private
* @returns {string} The encoded transaction data as a hex string
*/
getExitDelegationData() {
const methodName = 'exitDelegation';
const types = ['uint256'];
const params = [this.exitDelegationTransaction.tokenId];
const method = ethereumjs_abi_1.default.methodID(methodName, types);
const args = ethereumjs_abi_1.default.rawEncode(types, params);
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
}
}
exports.ExitDelegationBuilder = ExitDelegationBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhpdERlbGVnYXRpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIvZXhpdERlbGVnYXRpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw4Q0FBa0Q7QUFFbEQsb0VBQXlDO0FBQ3pDLHFEQUErQztBQUUvQyw2REFBMEQ7QUFDMUQsa0VBQTBFO0FBRTFFLHFEQUE2QjtBQUM3Qiw0Q0FBc0Y7QUFFdEYsTUFBYSxxQkFBc0IsU0FBUSx1Q0FBa0I7SUFDM0Q7Ozs7T0FJRztJQUNILFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSwwQ0FBeUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxFQUE2QjtRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUkseUJBQXlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFlBQXlDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLGFBQWEsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLHlCQUF5QixDQUFDLE9BQTRCO1FBQzlELElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2hFLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUxQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELDBEQUEwRDtZQUMxRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELDZEQUE2RDtZQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMscUNBQXlCLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLE9BQWU7UUFDckIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsa0JBQWtCLENBQUMsVUFBa0IsdUNBQTJCO1FBQzlELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixtQkFBbUIsQ0FBQyxXQUF1QztRQUN6RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUEsZ0JBQU0sRUFBQyxXQUFXLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1IsS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxxQkFBcUI7UUFDM0IsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4RCxNQUFNLE1BQU0sR0FBRyx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsTUFBTSxJQUFJLEdBQUcsd0JBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWxELE9BQU8sSUFBQSw4QkFBWSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0NBQ0Y7QUFqSUQsc0RBaUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DbGF1c2UgfSBmcm9tICdAdmVjaGFpbi9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCBFdGhlcmV1bUFiaSBmcm9tICdldGhlcmV1bWpzLWFiaSc7XG5pbXBvcnQgeyBhZGRIZXhQcmVmaXggfSBmcm9tICdldGhlcmV1bWpzLXV0aWwnO1xuXG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBFeGl0RGVsZWdhdGlvblRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24vZXhpdERlbGVnYXRpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbi90cmFuc2FjdGlvbic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgRVhJVF9ERUxFR0FUSU9OX01FVEhPRF9JRCwgU1RBUkdBVEVfREVMRUdBVElPTl9BRERSRVNTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIEV4aXREZWxlZ2F0aW9uQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEV4aXREZWxlZ2F0aW9uQnVpbGRlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFkb25seTxDb2luQ29uZmlnPn0gX2NvaW5Db25maWcgLSBUaGUgY29pbiBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gbmV3IEV4aXREZWxlZ2F0aW9uVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBidWlsZGVyIHdpdGggYW4gZXhpc3RpbmcgRXhpdERlbGVnYXRpb25UcmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtFeGl0RGVsZWdhdGlvblRyYW5zYWN0aW9ufSB0eCAtIFRoZSB0cmFuc2FjdGlvbiB0byBpbml0aWFsaXplIHRoZSBidWlsZGVyIHdpdGhcbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBFeGl0RGVsZWdhdGlvblRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBleGl0IGRlbGVnYXRpb24gdHJhbnNhY3Rpb24gaW5zdGFuY2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtFeGl0RGVsZWdhdGlvblRyYW5zYWN0aW9ufSBUaGUgZXhpdCBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uXG4gICAqL1xuICBnZXQgZXhpdERlbGVnYXRpb25UcmFuc2FjdGlvbigpOiBFeGl0RGVsZWdhdGlvblRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24gYXMgRXhpdERlbGVnYXRpb25UcmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0cmFuc2FjdGlvbiB0eXBlIGZvciB1bnN0YWtpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvblR5cGV9IFRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jaztcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHRyYW5zYWN0aW9uIGNsYXVzZXMgZm9yIHVuc3Rha2luZy5cbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkNsYXVzZVtdfSBjbGF1c2VzIC0gVGhlIHRyYW5zYWN0aW9uIGNsYXVzZXMgdG8gdmFsaWRhdGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xhdXNlcyBhcmUgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkVHJhbnNhY3Rpb25DbGF1c2VzKGNsYXVzZXM6IFRyYW5zYWN0aW9uQ2xhdXNlW10pOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFjbGF1c2VzIHx8ICFBcnJheS5pc0FycmF5KGNsYXVzZXMpIHx8IGNsYXVzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xhdXNlID0gY2xhdXNlc1swXTtcblxuICAgICAgaWYgKCFjbGF1c2UudG8gfHwgIXV0aWxzLmlzVmFsaWRBZGRyZXNzKGNsYXVzZS50bykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgdW5zdGFraW5nIHRyYW5zYWN0aW9ucywgdmFsdWUgbXVzdCBiZSBleGFjdGx5ICcweDAnXG4gICAgICBpZiAoY2xhdXNlLnZhbHVlICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGEgc3RhcnRzIHdpdGggdGhlIGV4aXREZWxlZ2F0aW9uIG1ldGhvZCBJRFxuICAgICAgaWYgKCFjbGF1c2UuZGF0YS5zdGFydHNXaXRoKEVYSVRfREVMRUdBVElPTl9NRVRIT0RfSUQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0b2tlbiBJRCBmb3IgdGhpcyB1bnN0YWtpbmcgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlbklkIC0gVGhlIElEIG9mIHRoZSBORlQgdG9rZW4gdG8gdW5zdGFrZVxuICAgKiBAcmV0dXJucyB7RXhpdERlbGVnYXRpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHRva2VuSWQodG9rZW5JZDogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5leGl0RGVsZWdhdGlvblRyYW5zYWN0aW9uLnRva2VuSWQgPSB0b2tlbklkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRlbGVnYXRpb24gY29udHJhY3QgYWRkcmVzcyBmb3IgdGhpcyB1bnN0YWtpbmcgdHJhbnNhY3Rpb24uXG4gICAqIElmIG5vdCBwcm92aWRlZCwgdXNlcyB0aGUgZGVmYXVsdCBhZGRyZXNzIGZyb20gY29uc3RhbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIFRoZSBkZWxlZ2F0aW9uIGNvbnRyYWN0IGFkZHJlc3NcbiAgICogQHJldHVybnMge0V4aXREZWxlZ2F0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBkZWxlZ2F0aW9uQ29udHJhY3QoYWRkcmVzczogc3RyaW5nID0gU1RBUkdBVEVfREVMRUdBVElPTl9BRERSRVNTKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzIH0pO1xuICAgIHRoaXMuZXhpdERlbGVnYXRpb25UcmFuc2FjdGlvbi5jb250cmFjdCA9IGFkZHJlc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbj86IEV4aXREZWxlZ2F0aW9uVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYW5zYWN0aW9uIG5vdCBkZWZpbmVkJyk7XG4gICAgfVxuICAgIGFzc2VydCh0cmFuc2FjdGlvbi5jb250cmFjdCwgJ0RlbGVnYXRpb24gY29udHJhY3QgYWRkcmVzcyBpcyByZXF1aXJlZCcpO1xuICAgIGFzc2VydCh0cmFuc2FjdGlvbi50b2tlbklkLCAnVG9rZW4gSUQgaXMgcmVxdWlyZWQnKTtcblxuICAgIHRoaXMudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogdHJhbnNhY3Rpb24uY29udHJhY3QgfSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIHRoaXMudHJhbnNhY3Rpb24udHlwZSA9IHRoaXMudHJhbnNhY3Rpb25UeXBlO1xuICAgIGF3YWl0IHRoaXMuZXhpdERlbGVnYXRpb25UcmFuc2FjdGlvbi5idWlsZCgpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgdHJhbnNhY3Rpb24gZGF0YSBmb3IgZXhpdCBkZWxlZ2F0aW9uIGJ5IGVuY29kaW5nIHRoZSBleGl0RGVsZWdhdGlvbiBtZXRob2QgY2FsbC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgdHJhbnNhY3Rpb24gZGF0YSBhcyBhIGhleCBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgZ2V0RXhpdERlbGVnYXRpb25EYXRhKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9ICdleGl0RGVsZWdhdGlvbic7XG4gICAgY29uc3QgdHlwZXMgPSBbJ3VpbnQyNTYnXTtcbiAgICBjb25zdCBwYXJhbXMgPSBbdGhpcy5leGl0RGVsZWdhdGlvblRyYW5zYWN0aW9uLnRva2VuSWRdO1xuXG4gICAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQobWV0aG9kTmFtZSwgdHlwZXMpO1xuICAgIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUodHlwZXMsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG4gIH1cbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!