PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-baby/dist/src/lib
Просмотр файла: utils.js
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Utils = void 0;
const babylon_proto_ts_1 = require("@babylonlabs-io/babylon-proto-ts");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const abstract_cosmos_1 = require("@bitgo/abstract-cosmos");
const sdk_core_1 = require("@bitgo/sdk-core");
const constants = __importStar(require("./constants"));
class Utils extends abstract_cosmos_1.CosmosUtils {
constructor() {
super();
this.babylonMessageKindToTypeUrl = {
CreateBtcDelegation: constants.createBTCDelegationMsgTypeUrl,
WithdrawReward: constants.withdrawRewardMsgTypeUrl,
};
this.babylonMessageTypeUrlToKind = Object.fromEntries(Object.entries(this.babylonMessageKindToTypeUrl).map(([key, value]) => [value, key]));
this.wrappedMsgTypeUrls = new Set([
constants.wrappedDelegateMsgTypeUrl,
constants.wrappedUndelegateMsgTypeUrl,
constants.wrappedBeginRedelegateTypeUrl,
]);
this.customMsgTypeUrls = new Set([constants.createBTCDelegationMsgTypeUrl]);
this.registry.register(constants.wrappedDelegateMsgTypeUrl, babylon_proto_ts_1.epochingtx.MsgWrappedDelegate);
this.registry.register(constants.wrappedUndelegateMsgTypeUrl, babylon_proto_ts_1.epochingtx.MsgWrappedUndelegate);
this.registry.register(constants.wrappedBeginRedelegateTypeUrl, babylon_proto_ts_1.epochingtx.MsgWrappedBeginRedelegate);
this.registry.register(constants.createBTCDelegationMsgTypeUrl, babylon_proto_ts_1.btcstakingtx.MsgCreateBTCDelegation);
this.registry.register(constants.withdrawRewardMsgTypeUrl, babylon_proto_ts_1.incentivetx.MsgWithdrawReward);
}
/** @inheritdoc */
getDelegateOrUndelegateMessageDataFromDecodedTx(decodedTx) {
return decodedTx.body.messages.map((message) => {
const value = this.registry.decode(message).msg;
return {
typeUrl: message.typeUrl,
value: {
delegatorAddress: value.delegatorAddress,
validatorAddress: value.validatorAddress,
amount: value.amount,
},
};
});
}
/** @inheritdoc */
getRedelegateMessageDataFromDecodedTx(decodedTx) {
return decodedTx.body.messages.map((message) => {
const value = this.registry.decode(message).msg;
return {
typeUrl: message.typeUrl,
value: {
delegatorAddress: value.delegatorAddress,
validatorSrcAddress: value.validatorSrcAddress,
validatorDstAddress: value.validatorDstAddress,
amount: value.amount,
},
};
});
}
/** @inheritdoc */
getCustomMessageDataFromDecodedTx(decodedTx) {
return decodedTx.body.messages.map((message) => {
const value = this.registry.decode(message);
return {
typeUrl: message.typeUrl,
value: {
_kind: this.babylonMessageTypeUrlToKind[message.typeUrl],
...value,
},
};
});
}
/** @inheritdoc */
getTransactionTypeFromTypeUrl(typeUrl) {
switch (typeUrl) {
case constants.wrappedDelegateMsgTypeUrl:
return sdk_core_1.TransactionType.StakingActivate;
case constants.wrappedUndelegateMsgTypeUrl:
return sdk_core_1.TransactionType.StakingDeactivate;
case constants.wrappedBeginRedelegateTypeUrl:
return sdk_core_1.TransactionType.StakingRedelegate;
case constants.createBTCDelegationMsgTypeUrl:
case constants.withdrawRewardMsgTypeUrl:
return sdk_core_1.TransactionType.CustomTx;
default:
return super.getTransactionTypeFromTypeUrl(typeUrl);
}
}
/** @inheritdoc */
getSendMessagesForEncodingTx(cosmosLikeTransaction) {
return cosmosLikeTransaction.sendMessages.map(({ typeUrl, value }) => {
let valueToEncode = value;
if (this.wrappedMsgTypeUrls.has(typeUrl)) {
valueToEncode = { msg: value };
}
else if (this.customMsgTypeUrls.has(typeUrl)) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { _kind, ...rest } = value;
valueToEncode = rest;
}
return { typeUrl, value: valueToEncode };
});
}
/** @inheritdoc */
validateCustomMessage(customMessage) {
switch (customMessage._kind) {
case 'CreateBtcDelegation':
this.validateCreateBtcDelegationMessage(customMessage);
break;
case 'WithdrawReward':
this.validateWithdrawRewardMessage(customMessage);
break;
default:
throw new sdk_core_1.InvalidTransactionError(`Unsupported BabylonSpecificMessages message`);
}
}
validateCreateBtcDelegationMessage(createBtcDelegationMessage) {
if (createBtcDelegationMessage._kind !== 'CreateBtcDelegation') {
throw new sdk_core_1.InvalidTransactionError(`Invalid CreateBtcDelegationMessage kind: ${createBtcDelegationMessage._kind}`);
}
// TODO: check the other fields more thoroughly
this.isObjPropertyNull(createBtcDelegationMessage, [
'stakerAddr',
// 'pop',
'btcPk',
'fpBtcPkList',
'stakingTime',
'stakingValue',
'stakingTx',
// 'stakingTxInclusionProof',
'slashingTx',
'delegatorSlashingSig',
'unbondingTime',
'unbondingTx',
'unbondingValue',
'unbondingSlashingTx',
'delegatorUnbondingSlashingSig',
]);
if (createBtcDelegationMessage.pop) {
this.isObjPropertyNull(createBtcDelegationMessage.pop, ['btcSigType', 'btcSig']);
}
if (createBtcDelegationMessage.stakingTxInclusionProof) {
this.isObjPropertyNull(createBtcDelegationMessage.stakingTxInclusionProof, ['key', 'proof']);
if (createBtcDelegationMessage.stakingTxInclusionProof.key) {
this.isObjPropertyNull(createBtcDelegationMessage.stakingTxInclusionProof.key, ['index', 'hash']);
}
}
if (!this.isValidAddress(createBtcDelegationMessage.stakerAddr)) {
throw new sdk_core_1.InvalidTransactionError(`Invalid CreateBtcDelegationMessage stakerAddr: ${createBtcDelegationMessage.stakerAddr}`);
}
}
validateWithdrawRewardMessage(withdrawRewardMessage) {
if (withdrawRewardMessage._kind !== 'WithdrawReward') {
throw new sdk_core_1.InvalidTransactionError(`Invalid WithdrawRewardMessage kind: ${withdrawRewardMessage._kind}`);
}
this.isObjPropertyNull(withdrawRewardMessage, ['type', 'address']);
if (!['finality_provider', 'btc_staker'].includes(withdrawRewardMessage.type)) {
throw new sdk_core_1.InvalidTransactionError(`Invalid WithdrawRewardMessage type: ${withdrawRewardMessage.type}`);
}
if (!this.isValidAddress(withdrawRewardMessage.address)) {
throw new sdk_core_1.InvalidTransactionError(`Invalid WithdrawRewardMessage address: ${withdrawRewardMessage.address}`);
}
}
/** @inheritdoc */
isValidAddress(address) {
return this.isValidCosmosLikeAddressWithMemoId(address, constants.accountAddressRegex);
}
/** @inheritdoc */
isValidValidatorAddress(address) {
return this.isValidBech32AddressMatchingRegex(address, constants.validatorAddressRegex);
}
/** @inheritdoc */
isValidContractAddress(address) {
return this.isValidBech32AddressMatchingRegex(address, constants.contractAddressRegex);
}
/** @inheritdoc */
validateAmount(amount) {
const amountBig = (0, bignumber_js_1.default)(amount.amount);
if (amountBig.isLessThanOrEqualTo(0)) {
throw new sdk_core_1.InvalidTransactionError('transactionBuilder: validateAmount: Invalid amount: ' + amount.amount);
}
if (!constants.validDenoms.find((denom) => denom === amount.denom)) {
throw new sdk_core_1.InvalidTransactionError('transactionBuilder: validateAmount: Invalid denom: ' + amount.denom);
}
}
}
exports.Utils = Utils;
const utils = new Utils();
exports.default = utils;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVFQUF5RjtBQUd6RixnRUFBcUM7QUFRckMsNERBQWtFO0FBQ2xFLDhDQUEyRTtBQUMzRSx1REFBeUM7QUFFekMsTUFBYSxLQUFNLFNBQVEsNkJBQW9DO0lBZ0I3RDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBaEJILGdDQUEyQixHQUErQztZQUMvRSxtQkFBbUIsRUFBRSxTQUFTLENBQUMsNkJBQTZCO1lBQzVELGNBQWMsRUFBRSxTQUFTLENBQUMsd0JBQXdCO1NBQ25ELENBQUM7UUFDSyxnQ0FBMkIsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUNyRCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUN2QyxDQUFDO1FBRXRDLHVCQUFrQixHQUFHLElBQUksR0FBRyxDQUFTO1lBQzdDLFNBQVMsQ0FBQyx5QkFBeUI7WUFDbkMsU0FBUyxDQUFDLDJCQUEyQjtZQUNyQyxTQUFTLENBQUMsNkJBQTZCO1NBQ3hDLENBQUMsQ0FBQztRQUNPLHNCQUFpQixHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQztRQUl2RixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMseUJBQXlCLEVBQUUsNkJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsRUFBRSw2QkFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDL0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLDZCQUE2QixFQUFFLDZCQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLEVBQUUsK0JBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3JHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSw4QkFBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVELGtCQUFrQjtJQUNsQiwrQ0FBK0MsQ0FBQyxTQUF1QjtRQUNyRSxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNoRCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDeEIsS0FBSyxFQUFFO29CQUNMLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtpQkFDckI7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLHFDQUFxQyxDQUFDLFNBQXVCO1FBQzNELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2hELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2dCQUN4QixLQUFLLEVBQUU7b0JBQ0wsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtvQkFDeEMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtvQkFDOUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtvQkFDOUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2lCQUNyQjthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUNBQWlDLENBQUMsU0FBdUI7UUFDdkQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxPQUFPO2dCQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDeEIsS0FBSyxFQUFFO29CQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztvQkFDeEQsR0FBRyxLQUFLO2lCQUNUO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQjtJQUNsQiw2QkFBNkIsQ0FBQyxPQUFlO1FBQzNDLFFBQVEsT0FBTyxFQUFFLENBQUM7WUFDaEIsS0FBSyxTQUFTLENBQUMseUJBQXlCO2dCQUN0QyxPQUFPLDBCQUFlLENBQUMsZUFBZSxDQUFDO1lBQ3pDLEtBQUssU0FBUyxDQUFDLDJCQUEyQjtnQkFDeEMsT0FBTywwQkFBZSxDQUFDLGlCQUFpQixDQUFDO1lBQzNDLEtBQUssU0FBUyxDQUFDLDZCQUE2QjtnQkFDMUMsT0FBTywwQkFBZSxDQUFDLGlCQUFpQixDQUFDO1lBQzNDLEtBQUssU0FBUyxDQUFDLDZCQUE2QixDQUFDO1lBQzdDLEtBQUssU0FBUyxDQUFDLHdCQUF3QjtnQkFDckMsT0FBTywwQkFBZSxDQUFDLFFBQVEsQ0FBQztZQUNsQztnQkFDRSxPQUFPLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQiw0QkFBNEIsQ0FDMUIscUJBQTBHO1FBRTFHLE9BQU8scUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDbkUsSUFBSSxhQUFhLEdBQVksS0FBSyxDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxhQUFhLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDakMsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsNkRBQTZEO2dCQUM3RCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsS0FBZ0MsQ0FBQztnQkFDNUQsYUFBYSxHQUFHLElBQUksQ0FBQztZQUN2QixDQUFDO1lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDM0MsQ0FBQyxDQUFxQixDQUFDO0lBQ3pCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIscUJBQXFCLENBQUMsYUFBc0M7UUFDMUQsUUFBUSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsS0FBSyxxQkFBcUI7Z0JBQ3hCLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDdkQsTUFBTTtZQUNSLEtBQUssZ0JBQWdCO2dCQUNuQixJQUFJLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xELE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksa0NBQXVCLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNyRixDQUFDO0lBQ0gsQ0FBQztJQUVELGtDQUFrQyxDQUFDLDBCQUFzRDtRQUN2RixJQUFJLDBCQUEwQixDQUFDLEtBQUssS0FBSyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9ELE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyw0Q0FBNEMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwSCxDQUFDO1FBRUQsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsRUFBRTtZQUNqRCxZQUFZO1lBQ1osU0FBUztZQUNULE9BQU87WUFDUCxhQUFhO1lBQ2IsYUFBYTtZQUNiLGNBQWM7WUFDZCxXQUFXO1lBQ1gsNkJBQTZCO1lBQzdCLFlBQVk7WUFDWixzQkFBc0I7WUFDdEIsZUFBZTtZQUNmLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIscUJBQXFCO1lBQ3JCLCtCQUErQjtTQUNoQyxDQUFDLENBQUM7UUFFSCxJQUFJLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsSUFBSSwwQkFBMEIsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBRTdGLElBQUksMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNwRyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDaEUsTUFBTSxJQUFJLGtDQUF1QixDQUMvQixrREFBa0QsMEJBQTBCLENBQUMsVUFBVSxFQUFFLENBQzFGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELDZCQUE2QixDQUFDLHFCQUE0QztRQUN4RSxJQUFJLHFCQUFxQixDQUFDLEtBQUssS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JELE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyx1Q0FBdUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMxRyxDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUUsTUFBTSxJQUFJLGtDQUF1QixDQUFDLHVDQUF1QyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hELE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQywwQ0FBMEMscUJBQXFCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvRyxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjLENBQUMsT0FBZTtRQUM1QixPQUFPLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELGtCQUFrQjtJQUNsQix1QkFBdUIsQ0FBQyxPQUFlO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLHNCQUFzQixDQUFDLE9BQWU7UUFDcEMsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLE1BQVk7UUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBQSxzQkFBUyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxJQUFJLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxzREFBc0QsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUcsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25FLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxxREFBcUQsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUcsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFNRCxzQkEwTUM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBRTFCLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVwb2NoaW5ndHgsIGJ0Y3N0YWtpbmd0eCwgaW5jZW50aXZldHggfSBmcm9tICdAYmFieWxvbmxhYnMtaW8vYmFieWxvbi1wcm90by10cyc7XG5pbXBvcnQgeyBEZWNvZGVkVHhSYXcgfSBmcm9tICdAY29zbWpzL3Byb3RvLXNpZ25pbmcnO1xuaW1wb3J0IHsgQ29pbiB9IGZyb20gJ0Bjb3NtanMvc3RhcmdhdGUnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgQW55IH0gZnJvbSAnY29zbWpzLXR5cGVzL2dvb2dsZS9wcm90b2J1Zi9hbnknO1xuaW1wb3J0IHtcbiAgQmFieWxvblNwZWNpZmljTWVzc2FnZUtpbmQsXG4gIEJhYnlsb25TcGVjaWZpY01lc3NhZ2VzLFxuICBDcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZSxcbiAgV2l0aGRyYXdSZXdhcmRNZXNzYWdlLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IENvc21vc1V0aWxzLCBNZXNzYWdlRGF0YSB9IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1jb3Ntb3MnO1xuaW1wb3J0IHsgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgVXRpbHMgZXh0ZW5kcyBDb3Ntb3NVdGlsczxCYWJ5bG9uU3BlY2lmaWNNZXNzYWdlcz4ge1xuICBwdWJsaWMgYmFieWxvbk1lc3NhZ2VLaW5kVG9UeXBlVXJsOiBSZWNvcmQ8QmFieWxvblNwZWNpZmljTWVzc2FnZUtpbmQsIHN0cmluZz4gPSB7XG4gICAgQ3JlYXRlQnRjRGVsZWdhdGlvbjogY29uc3RhbnRzLmNyZWF0ZUJUQ0RlbGVnYXRpb25Nc2dUeXBlVXJsLFxuICAgIFdpdGhkcmF3UmV3YXJkOiBjb25zdGFudHMud2l0aGRyYXdSZXdhcmRNc2dUeXBlVXJsLFxuICB9O1xuICBwdWJsaWMgYmFieWxvbk1lc3NhZ2VUeXBlVXJsVG9LaW5kID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuYmFieWxvbk1lc3NhZ2VLaW5kVG9UeXBlVXJsKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW3ZhbHVlLCBrZXldKVxuICApIGFzIFJlY29yZDxzdHJpbmcsIEJhYnlsb25TcGVjaWZpY01lc3NhZ2VLaW5kPjtcblxuICBwcm90ZWN0ZWQgd3JhcHBlZE1zZ1R5cGVVcmxzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICBjb25zdGFudHMud3JhcHBlZERlbGVnYXRlTXNnVHlwZVVybCxcbiAgICBjb25zdGFudHMud3JhcHBlZFVuZGVsZWdhdGVNc2dUeXBlVXJsLFxuICAgIGNvbnN0YW50cy53cmFwcGVkQmVnaW5SZWRlbGVnYXRlVHlwZVVybCxcbiAgXSk7XG4gIHByb3RlY3RlZCBjdXN0b21Nc2dUeXBlVXJscyA9IG5ldyBTZXQ8c3RyaW5nPihbY29uc3RhbnRzLmNyZWF0ZUJUQ0RlbGVnYXRpb25Nc2dUeXBlVXJsXSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKGNvbnN0YW50cy53cmFwcGVkRGVsZWdhdGVNc2dUeXBlVXJsLCBlcG9jaGluZ3R4Lk1zZ1dyYXBwZWREZWxlZ2F0ZSk7XG4gICAgdGhpcy5yZWdpc3RyeS5yZWdpc3Rlcihjb25zdGFudHMud3JhcHBlZFVuZGVsZWdhdGVNc2dUeXBlVXJsLCBlcG9jaGluZ3R4Lk1zZ1dyYXBwZWRVbmRlbGVnYXRlKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKGNvbnN0YW50cy53cmFwcGVkQmVnaW5SZWRlbGVnYXRlVHlwZVVybCwgZXBvY2hpbmd0eC5Nc2dXcmFwcGVkQmVnaW5SZWRlbGVnYXRlKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKGNvbnN0YW50cy5jcmVhdGVCVENEZWxlZ2F0aW9uTXNnVHlwZVVybCwgYnRjc3Rha2luZ3R4Lk1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24pO1xuICAgIHRoaXMucmVnaXN0cnkucmVnaXN0ZXIoY29uc3RhbnRzLndpdGhkcmF3UmV3YXJkTXNnVHlwZVVybCwgaW5jZW50aXZldHguTXNnV2l0aGRyYXdSZXdhcmQpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldERlbGVnYXRlT3JVbmRlbGVnYXRlTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGE8QmFieWxvblNwZWNpZmljTWVzc2FnZXM+W10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSkubXNnO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZVVybDogbWVzc2FnZS50eXBlVXJsLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGRlbGVnYXRvckFkZHJlc3M6IHZhbHVlLmRlbGVnYXRvckFkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogdmFsdWUudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0UmVkZWxlZ2F0ZU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IE1lc3NhZ2VEYXRhPEJhYnlsb25TcGVjaWZpY01lc3NhZ2VzPltdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpLm1zZztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBkZWxlZ2F0b3JBZGRyZXNzOiB2YWx1ZS5kZWxlZ2F0b3JBZGRyZXNzLFxuICAgICAgICAgIHZhbGlkYXRvclNyY0FkZHJlc3M6IHZhbHVlLnZhbGlkYXRvclNyY0FkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yRHN0QWRkcmVzczogdmFsdWUudmFsaWRhdG9yRHN0QWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0Q3VzdG9tTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGE8QmFieWxvblNwZWNpZmljTWVzc2FnZXM+W10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgX2tpbmQ6IHRoaXMuYmFieWxvbk1lc3NhZ2VUeXBlVXJsVG9LaW5kW21lc3NhZ2UudHlwZVVybF0sXG4gICAgICAgICAgLi4udmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFRyYW5zYWN0aW9uVHlwZUZyb21UeXBlVXJsKHR5cGVVcmw6IHN0cmluZyk6IFRyYW5zYWN0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh0eXBlVXJsKSB7XG4gICAgICBjYXNlIGNvbnN0YW50cy53cmFwcGVkRGVsZWdhdGVNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTtcbiAgICAgIGNhc2UgY29uc3RhbnRzLndyYXBwZWRVbmRlbGVnYXRlTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTtcbiAgICAgIGNhc2UgY29uc3RhbnRzLndyYXBwZWRCZWdpblJlZGVsZWdhdGVUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdSZWRlbGVnYXRlO1xuICAgICAgY2FzZSBjb25zdGFudHMuY3JlYXRlQlRDRGVsZWdhdGlvbk1zZ1R5cGVVcmw6XG4gICAgICBjYXNlIGNvbnN0YW50cy53aXRoZHJhd1Jld2FyZE1zZ1R5cGVVcmw6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbVR5cGVVcmwodHlwZVVybCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFNlbmRNZXNzYWdlc0ZvckVuY29kaW5nVHgoXG4gICAgY29zbW9zTGlrZVRyYW5zYWN0aW9uOiBQYXJhbWV0ZXJzPENvc21vc1V0aWxzPEJhYnlsb25TcGVjaWZpY01lc3NhZ2VzPlsnZ2V0U2VuZE1lc3NhZ2VzRm9yRW5jb2RpbmdUeCddPlswXVxuICApOiBBbnlbXSB7XG4gICAgcmV0dXJuIGNvc21vc0xpa2VUcmFuc2FjdGlvbi5zZW5kTWVzc2FnZXMubWFwKCh7IHR5cGVVcmwsIHZhbHVlIH0pID0+IHtcbiAgICAgIGxldCB2YWx1ZVRvRW5jb2RlOiB1bmtub3duID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy53cmFwcGVkTXNnVHlwZVVybHMuaGFzKHR5cGVVcmwpKSB7XG4gICAgICAgIHZhbHVlVG9FbmNvZGUgPSB7IG1zZzogdmFsdWUgfTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXN0b21Nc2dUeXBlVXJscy5oYXModHlwZVVybCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICBjb25zdCB7IF9raW5kLCAuLi5yZXN0IH0gPSB2YWx1ZSBhcyBCYWJ5bG9uU3BlY2lmaWNNZXNzYWdlcztcbiAgICAgICAgdmFsdWVUb0VuY29kZSA9IHJlc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB0eXBlVXJsLCB2YWx1ZTogdmFsdWVUb0VuY29kZSB9O1xuICAgIH0pIGFzIHVua25vd24gYXMgQW55W107XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVDdXN0b21NZXNzYWdlKGN1c3RvbU1lc3NhZ2U6IEJhYnlsb25TcGVjaWZpY01lc3NhZ2VzKTogdm9pZCB7XG4gICAgc3dpdGNoIChjdXN0b21NZXNzYWdlLl9raW5kKSB7XG4gICAgICBjYXNlICdDcmVhdGVCdGNEZWxlZ2F0aW9uJzpcbiAgICAgICAgdGhpcy52YWxpZGF0ZUNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlKGN1c3RvbU1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dpdGhkcmF3UmV3YXJkJzpcbiAgICAgICAgdGhpcy52YWxpZGF0ZVdpdGhkcmF3UmV3YXJkTWVzc2FnZShjdXN0b21NZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYFVuc3VwcG9ydGVkIEJhYnlsb25TcGVjaWZpY01lc3NhZ2VzIG1lc3NhZ2VgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlOiBDcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZSk6IHZvaWQge1xuICAgIGlmIChjcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZS5fa2luZCAhPT0gJ0NyZWF0ZUJ0Y0RlbGVnYXRpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgQ3JlYXRlQnRjRGVsZWdhdGlvbk1lc3NhZ2Uga2luZDogJHtjcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZS5fa2luZH1gKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBjaGVjayB0aGUgb3RoZXIgZmllbGRzIG1vcmUgdGhvcm91Z2hseVxuICAgIHRoaXMuaXNPYmpQcm9wZXJ0eU51bGwoY3JlYXRlQnRjRGVsZWdhdGlvbk1lc3NhZ2UsIFtcbiAgICAgICdzdGFrZXJBZGRyJyxcbiAgICAgIC8vICdwb3AnLFxuICAgICAgJ2J0Y1BrJyxcbiAgICAgICdmcEJ0Y1BrTGlzdCcsXG4gICAgICAnc3Rha2luZ1RpbWUnLFxuICAgICAgJ3N0YWtpbmdWYWx1ZScsXG4gICAgICAnc3Rha2luZ1R4JyxcbiAgICAgIC8vICdzdGFraW5nVHhJbmNsdXNpb25Qcm9vZicsXG4gICAgICAnc2xhc2hpbmdUeCcsXG4gICAgICAnZGVsZWdhdG9yU2xhc2hpbmdTaWcnLFxuICAgICAgJ3VuYm9uZGluZ1RpbWUnLFxuICAgICAgJ3VuYm9uZGluZ1R4JyxcbiAgICAgICd1bmJvbmRpbmdWYWx1ZScsXG4gICAgICAndW5ib25kaW5nU2xhc2hpbmdUeCcsXG4gICAgICAnZGVsZWdhdG9yVW5ib25kaW5nU2xhc2hpbmdTaWcnLFxuICAgIF0pO1xuXG4gICAgaWYgKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnBvcCkge1xuICAgICAgdGhpcy5pc09ialByb3BlcnR5TnVsbChjcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZS5wb3AsIFsnYnRjU2lnVHlwZScsICdidGNTaWcnXSk7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnN0YWtpbmdUeEluY2x1c2lvblByb29mKSB7XG4gICAgICB0aGlzLmlzT2JqUHJvcGVydHlOdWxsKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnN0YWtpbmdUeEluY2x1c2lvblByb29mLCBbJ2tleScsICdwcm9vZiddKTtcblxuICAgICAgaWYgKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnN0YWtpbmdUeEluY2x1c2lvblByb29mLmtleSkge1xuICAgICAgICB0aGlzLmlzT2JqUHJvcGVydHlOdWxsKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnN0YWtpbmdUeEluY2x1c2lvblByb29mLmtleSwgWydpbmRleCcsICdoYXNoJ10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhjcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZS5zdGFrZXJBZGRyKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBDcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZSBzdGFrZXJBZGRyOiAke2NyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnN0YWtlckFkZHJ9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVdpdGhkcmF3UmV3YXJkTWVzc2FnZSh3aXRoZHJhd1Jld2FyZE1lc3NhZ2U6IFdpdGhkcmF3UmV3YXJkTWVzc2FnZSk6IHZvaWQge1xuICAgIGlmICh3aXRoZHJhd1Jld2FyZE1lc3NhZ2UuX2tpbmQgIT09ICdXaXRoZHJhd1Jld2FyZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBXaXRoZHJhd1Jld2FyZE1lc3NhZ2Uga2luZDogJHt3aXRoZHJhd1Jld2FyZE1lc3NhZ2UuX2tpbmR9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc09ialByb3BlcnR5TnVsbCh3aXRoZHJhd1Jld2FyZE1lc3NhZ2UsIFsndHlwZScsICdhZGRyZXNzJ10pO1xuXG4gICAgaWYgKCFbJ2ZpbmFsaXR5X3Byb3ZpZGVyJywgJ2J0Y19zdGFrZXInXS5pbmNsdWRlcyh3aXRoZHJhd1Jld2FyZE1lc3NhZ2UudHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBXaXRoZHJhd1Jld2FyZE1lc3NhZ2UgdHlwZTogJHt3aXRoZHJhd1Jld2FyZE1lc3NhZ2UudHlwZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3Mod2l0aGRyYXdSZXdhcmRNZXNzYWdlLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgV2l0aGRyYXdSZXdhcmRNZXNzYWdlIGFkZHJlc3M6ICR7d2l0aGRyYXdSZXdhcmRNZXNzYWdlLmFkZHJlc3N9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRDb3Ntb3NMaWtlQWRkcmVzc1dpdGhNZW1vSWQoYWRkcmVzcywgY29uc3RhbnRzLmFjY291bnRBZGRyZXNzUmVnZXgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRCZWNoMzJBZGRyZXNzTWF0Y2hpbmdSZWdleChhZGRyZXNzLCBjb25zdGFudHMudmFsaWRhdG9yQWRkcmVzc1JlZ2V4KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQ29udHJhY3RBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRCZWNoMzJBZGRyZXNzTWF0Y2hpbmdSZWdleChhZGRyZXNzLCBjb25zdGFudHMuY29udHJhY3RBZGRyZXNzUmVnZXgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlQW1vdW50KGFtb3VudDogQ29pbik6IHZvaWQge1xuICAgIGNvbnN0IGFtb3VudEJpZyA9IEJpZ051bWJlcihhbW91bnQuYW1vdW50KTtcbiAgICBpZiAoYW1vdW50QmlnLmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcigndHJhbnNhY3Rpb25CdWlsZGVyOiB2YWxpZGF0ZUFtb3VudDogSW52YWxpZCBhbW91bnQ6ICcgKyBhbW91bnQuYW1vdW50KTtcbiAgICB9XG4gICAgaWYgKCFjb25zdGFudHMudmFsaWREZW5vbXMuZmluZCgoZGVub20pID0+IGRlbm9tID09PSBhbW91bnQuZGVub20pKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ3RyYW5zYWN0aW9uQnVpbGRlcjogdmFsaWRhdGVBbW91bnQ6IEludmFsaWQgZGVub206ICcgKyBhbW91bnQuZGVub20pO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!