UNPKG

bitgo

Version:
130 lines • 16.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BitGo = void 0; // // BitGo JavaScript SDK // // Copyright 2014, BitGo, Inc. All Rights Reserved. // const pjson = require("../package.json"); const _ = require("lodash"); const sdk_core_1 = require("@bitgo/sdk-core"); const sdk_api_1 = require("@bitgo/sdk-api"); const statics_1 = require("@bitgo/statics"); const coinFactory_1 = require("./v2/coinFactory"); class BitGo extends sdk_api_1.BitGoAPI { /** * Constructor for BitGo Object */ constructor(params = {}) { super(params); if (!sdk_core_1.common.validateParams(params, [], [ 'clientId', 'clientSecret', 'refreshToken', 'accessToken', 'userAgent', 'customRootURI', 'customBitcoinNetwork', 'serverXpub', 'stellarFederationServerUrl', ]) || (params.useProduction && !_.isBoolean(params.useProduction)) || (params.useAms && !_.isBoolean(params.useAms))) { throw new Error('invalid argument'); } if (!params.clientId !== !params.clientSecret) { throw new Error('invalid argument - must provide both client id and secret'); } this._useAms = !!params.useAms; this._version = pjson.version; this._userAgent = params.userAgent || 'BitGoJS/' + this.version(); this._coinFactory = new sdk_core_1.CoinFactory(); } /** * Initialize the coin factory with token configurations * @param tokenConfigMap - A map of token metadata from AMS */ initCoinFactory(tokenConfigMap) { const coinMap = (0, statics_1.createTokenMapUsingTrimmedConfigDetails)(tokenConfigMap); this._coinFactory = new sdk_core_1.CoinFactory(); (0, coinFactory_1.registerCoinConstructors)(this._coinFactory, coinMap); } /** * Fetch all the tokens and initialize the coin factory */ async registerAllTokens() { if (!this._useAms) { throw new Error('registerAllTokens is only supported when useAms is set to true'); } // Fetch mainnet assets for prod and adminProd environments, testnet assets for all other environments const assetEnvironment = ['prod', 'adminProd'].includes(this.getEnv()) ? 'mainnet' : 'testnet'; const url = this.url(`/assets/list/${assetEnvironment}`); const tokenConfigMap = (await this.executeAssetRequest(url)); this.initCoinFactory(tokenConfigMap); } /** * Create a basecoin object * @param coinName */ coin(coinName) { if (this._useAms) { return this._coinFactory.getInstance(this, coinName); } return coinFactory_1.GlobalCoinFactory.getInstance(this, coinName); } /** * Register a token in the coin factory * @param tokenConfig - The token metadata from AMS */ async registerToken(tokenName) { if (!this._useAms) { throw new Error('registerToken is only supported when useAms is set to true'); } //do not register a coin/token if it's already registered if (this._coinFactory.hasCoin(tokenName)) { return; } // Get the coin/token details only if it's not present in statics library let staticsBaseCoin; if (statics_1.coins.has(tokenName)) { staticsBaseCoin = statics_1.coins.get(tokenName); } else { const url = this.url(`/assets/name/${tokenName}`); const tokenConfig = (await this.executeAssetRequest(url)); staticsBaseCoin = (0, statics_1.createToken)(tokenConfig); } if (!staticsBaseCoin) { throw new sdk_core_1.UnsupportedCoinError(tokenName); } if (staticsBaseCoin.isToken) { const formattedTokenConfig = (0, statics_1.getFormattedTokenConfigForCoin)(staticsBaseCoin); if (!formattedTokenConfig) { throw new sdk_core_1.UnsupportedCoinError(tokenName); } const tokenConstructor = (0, coinFactory_1.getTokenConstructor)(formattedTokenConfig); if (!tokenConstructor) { throw new sdk_core_1.UnsupportedCoinError(tokenName); } this._coinFactory.registerToken(staticsBaseCoin, tokenConstructor); } else { const coinConstructor = (0, coinFactory_1.getCoinConstructor)(tokenName); if (!coinConstructor) { throw new sdk_core_1.UnsupportedCoinError(tokenName); } this._coinFactory.registerToken(staticsBaseCoin, coinConstructor); } } /** * Create a basecoin object for a virtual token * @param tokenName */ async token(tokenName) { await this.fetchConstants(); return this.coin(tokenName); } } exports.BitGo = BitGo; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Z28udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsRUFBRTtBQUNGLHVCQUF1QjtBQUN2QixFQUFFO0FBQ0Ysb0RBQW9EO0FBQ3BELEVBQUU7QUFDRix5Q0FBMEM7QUFDMUMsNEJBQTRCO0FBRTVCLDhDQUFzRjtBQUN0Riw0Q0FBMkQ7QUFDM0QsNENBT3dCO0FBQ3hCLGtEQUF3SDtBQU94SCxNQUFhLEtBQU0sU0FBUSxrQkFBUTtJQUdqQzs7T0FFRztJQUNILFlBQVksU0FBdUIsRUFBRTtRQUNuQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDZCxJQUNFLENBQUMsaUJBQU0sQ0FBQyxjQUFjLENBQ3BCLE1BQU0sRUFDTixFQUFFLEVBQ0Y7WUFDRSxVQUFVO1lBQ1YsY0FBYztZQUNkLGNBQWM7WUFDZCxhQUFhO1lBQ2IsV0FBVztZQUNYLGVBQWU7WUFDZixzQkFBc0I7WUFDdEIsWUFBWTtZQUNaLDRCQUE0QjtTQUM3QixDQUNGO1lBQ0QsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDNUQsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDOUMsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQy9CLElB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QThCLEVBQUMsZUFBZSxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSwrQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLGlDQUFtQixFQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSwrQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDckUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLGVBQWUsR0FBRyxJQUFBLGdDQUFrQixFQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLCtCQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQWlCO1FBQzNCLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUFqSUQsc0JBaUlDIiwic291cmNlc0NvbnRlbnQiOlsiLy9cbi8vIEJpdEdvIEphdmFTY3JpcHQgU0RLXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cbmltcG9ydCBwanNvbiA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBCYXNlQ29pbiwgQ29pbkZhY3RvcnksIGNvbW1vbiwgVW5zdXBwb3J0ZWRDb2luRXJyb3IgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQml0R29BUEksIEJpdEdvQVBJT3B0aW9ucyB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7XG4gIGNyZWF0ZVRva2VuTWFwVXNpbmdUcmltbWVkQ29uZmlnRGV0YWlscyxcbiAgVHJpbW1lZEFtc1Rva2VuQ29uZmlnLFxuICBjcmVhdGVUb2tlbixcbiAgZ2V0Rm9ybWF0dGVkVG9rZW5Db25maWdGb3JDb2luLFxuICBjb2lucyxcbiAgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLFxufSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBHbG9iYWxDb2luRmFjdG9yeSwgcmVnaXN0ZXJDb2luQ29uc3RydWN0b3JzLCBnZXRUb2tlbkNvbnN0cnVjdG9yLCBnZXRDb2luQ29uc3RydWN0b3IgfSBmcm9tICcuL3YyL2NvaW5GYWN0b3J5JztcblxuLy8gY29uc3RydWN0b3IgcGFyYW1zIHVzZWQgZXhjbHVzaXZlbHkgZm9yIEJpdEdvIGNsYXNzXG5leHBvcnQgdHlwZSBCaXRHb09wdGlvbnMgPSBCaXRHb0FQSU9wdGlvbnMgJiB7XG4gIHVzZUFtcz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY2xhc3MgQml0R28gZXh0ZW5kcyBCaXRHb0FQSSB7XG4gIHByaXZhdGUgX2NvaW5GYWN0b3J5OiBDb2luRmFjdG9yeTtcbiAgcHJpdmF0ZSBfdXNlQW1zOiBib29sZWFuO1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEJpdEdvIE9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyYW1zOiBCaXRHb09wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcyk7XG4gICAgaWYgKFxuICAgICAgIWNvbW1vbi52YWxpZGF0ZVBhcmFtcyhcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBbXSxcbiAgICAgICAgW1xuICAgICAgICAgICdjbGllbnRJZCcsXG4gICAgICAgICAgJ2NsaWVudFNlY3JldCcsXG4gICAgICAgICAgJ3JlZnJlc2hUb2tlbicsXG4gICAgICAgICAgJ2FjY2Vzc1Rva2VuJyxcbiAgICAgICAgICAndXNlckFnZW50JyxcbiAgICAgICAgICAnY3VzdG9tUm9vdFVSSScsXG4gICAgICAgICAgJ2N1c3RvbUJpdGNvaW5OZXR3b3JrJyxcbiAgICAgICAgICAnc2VydmVyWHB1YicsXG4gICAgICAgICAgJ3N0ZWxsYXJGZWRlcmF0aW9uU2VydmVyVXJsJyxcbiAgICAgICAgXVxuICAgICAgKSB8fFxuICAgICAgKHBhcmFtcy51c2VQcm9kdWN0aW9uICYmICFfLmlzQm9vbGVhbihwYXJhbXMudXNlUHJvZHVjdGlvbikpIHx8XG4gICAgICAocGFyYW1zLnVzZUFtcyAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnVzZUFtcykpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jbGllbnRJZCAhPT0gIXBhcmFtcy5jbGllbnRTZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCAtIG11c3QgcHJvdmlkZSBib3RoIGNsaWVudCBpZCBhbmQgc2VjcmV0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXNlQW1zID0gISFwYXJhbXMudXNlQW1zO1xuICAgIHRoaXMuX3ZlcnNpb24gPSBwanNvbi52ZXJzaW9uO1xuICAgIHRoaXMuX3VzZXJBZ2VudCA9IHBhcmFtcy51c2VyQWdlbnQgfHwgJ0JpdEdvSlMvJyArIHRoaXMudmVyc2lvbigpO1xuICAgIHRoaXMuX2NvaW5GYWN0b3J5ID0gbmV3IENvaW5GYWN0b3J5KCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgY29pbiBmYWN0b3J5IHdpdGggdG9rZW4gY29uZmlndXJhdGlvbnNcbiAgICogQHBhcmFtIHRva2VuQ29uZmlnTWFwIC0gQSBtYXAgb2YgdG9rZW4gbWV0YWRhdGEgZnJvbSBBTVNcbiAgICovXG4gIGluaXRDb2luRmFjdG9yeSh0b2tlbkNvbmZpZ01hcDogUmVjb3JkPHN0cmluZywgVHJpbW1lZEFtc1Rva2VuQ29uZmlnW10+KTogdm9pZCB7XG4gICAgY29uc3QgY29pbk1hcCA9IGNyZWF0ZVRva2VuTWFwVXNpbmdUcmltbWVkQ29uZmlnRGV0YWlscyh0b2tlbkNvbmZpZ01hcCk7XG4gICAgdGhpcy5fY29pbkZhY3RvcnkgPSBuZXcgQ29pbkZhY3RvcnkoKTtcbiAgICByZWdpc3RlckNvaW5Db25zdHJ1Y3RvcnModGhpcy5fY29pbkZhY3RvcnksIGNvaW5NYXApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGFsbCB0aGUgdG9rZW5zIGFuZCBpbml0aWFsaXplIHRoZSBjb2luIGZhY3RvcnlcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyQWxsVG9rZW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5fdXNlQW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlZ2lzdGVyQWxsVG9rZW5zIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdXNlQW1zIGlzIHNldCB0byB0cnVlJyk7XG4gICAgfVxuICAgIC8vIEZldGNoIG1haW5uZXQgYXNzZXRzIGZvciBwcm9kIGFuZCBhZG1pblByb2QgZW52aXJvbm1lbnRzLCB0ZXN0bmV0IGFzc2V0cyBmb3IgYWxsIG90aGVyIGVudmlyb25tZW50c1xuICAgIGNvbnN0IGFzc2V0RW52aXJvbm1lbnQgPSBbJ3Byb2QnLCAnYWRtaW5Qcm9kJ10uaW5jbHVkZXModGhpcy5nZXRFbnYoKSkgPyAnbWFpbm5ldCcgOiAndGVzdG5ldCc7XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9hc3NldHMvbGlzdC8ke2Fzc2V0RW52aXJvbm1lbnR9YCk7XG4gICAgY29uc3QgdG9rZW5Db25maWdNYXAgPSAoYXdhaXQgdGhpcy5leGVjdXRlQXNzZXRSZXF1ZXN0KHVybCkpIGFzIFJlY29yZDxzdHJpbmcsIFRyaW1tZWRBbXNUb2tlbkNvbmZpZ1tdPjtcbiAgICB0aGlzLmluaXRDb2luRmFjdG9yeSh0b2tlbkNvbmZpZ01hcCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFzZWNvaW4gb2JqZWN0XG4gICAqIEBwYXJhbSBjb2luTmFtZVxuICAgKi9cbiAgY29pbihjb2luTmFtZTogc3RyaW5nKTogQmFzZUNvaW4ge1xuICAgIGlmICh0aGlzLl91c2VBbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb2luRmFjdG9yeS5nZXRJbnN0YW5jZSh0aGlzLCBjb2luTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBHbG9iYWxDb2luRmFjdG9yeS5nZXRJbnN0YW5jZSh0aGlzLCBjb2luTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSB0b2tlbiBpbiB0aGUgY29pbiBmYWN0b3J5XG4gICAqIEBwYXJhbSB0b2tlbkNvbmZpZyAtIFRoZSB0b2tlbiBtZXRhZGF0YSBmcm9tIEFNU1xuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJUb2tlbih0b2tlbk5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5fdXNlQW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlZ2lzdGVyVG9rZW4gaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2VBbXMgaXMgc2V0IHRvIHRydWUnKTtcbiAgICB9XG4gICAgLy9kbyBub3QgcmVnaXN0ZXIgYSBjb2luL3Rva2VuIGlmIGl0J3MgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgaWYgKHRoaXMuX2NvaW5GYWN0b3J5Lmhhc0NvaW4odG9rZW5OYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgY29pbi90b2tlbiBkZXRhaWxzIG9ubHkgaWYgaXQncyBub3QgcHJlc2VudCBpbiBzdGF0aWNzIGxpYnJhcnlcbiAgICBsZXQgc3RhdGljc0Jhc2VDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChjb2lucy5oYXModG9rZW5OYW1lKSkge1xuICAgICAgc3RhdGljc0Jhc2VDb2luID0gY29pbnMuZ2V0KHRva2VuTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYXNzZXRzL25hbWUvJHt0b2tlbk5hbWV9YCk7XG4gICAgICBjb25zdCB0b2tlbkNvbmZpZyA9IChhd2FpdCB0aGlzLmV4ZWN1dGVBc3NldFJlcXVlc3QodXJsKSkgYXMgVHJpbW1lZEFtc1Rva2VuQ29uZmlnO1xuICAgICAgc3RhdGljc0Jhc2VDb2luID0gY3JlYXRlVG9rZW4odG9rZW5Db25maWcpO1xuICAgIH1cblxuICAgIGlmICghc3RhdGljc0Jhc2VDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDb2luRXJyb3IodG9rZW5OYW1lKTtcbiAgICB9XG4gICAgaWYgKHN0YXRpY3NCYXNlQ29pbi5pc1Rva2VuKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRUb2tlbkNvbmZpZyA9IGdldEZvcm1hdHRlZFRva2VuQ29uZmlnRm9yQ29pbihzdGF0aWNzQmFzZUNvaW4pO1xuICAgICAgaWYgKCFmb3JtYXR0ZWRUb2tlbkNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDb2luRXJyb3IodG9rZW5OYW1lKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW5Db25zdHJ1Y3RvciA9IGdldFRva2VuQ29uc3RydWN0b3IoZm9ybWF0dGVkVG9rZW5Db25maWcpO1xuICAgICAgaWYgKCF0b2tlbkNvbnN0cnVjdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENvaW5FcnJvcih0b2tlbk5hbWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29pbkZhY3RvcnkucmVnaXN0ZXJUb2tlbihzdGF0aWNzQmFzZUNvaW4sIHRva2VuQ29uc3RydWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb2luQ29uc3RydWN0b3IgPSBnZXRDb2luQ29uc3RydWN0b3IodG9rZW5OYW1lKTtcbiAgICAgIGlmICghY29pbkNvbnN0cnVjdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENvaW5FcnJvcih0b2tlbk5hbWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29pbkZhY3RvcnkucmVnaXN0ZXJUb2tlbihzdGF0aWNzQmFzZUNvaW4sIGNvaW5Db25zdHJ1Y3Rvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhc2Vjb2luIG9iamVjdCBmb3IgYSB2aXJ0dWFsIHRva2VuXG4gICAqIEBwYXJhbSB0b2tlbk5hbWVcbiAgICovXG4gIGFzeW5jIHRva2VuKHRva2VuTmFtZTogc3RyaW5nKTogUHJvbWlzZTxCYXNlQ29pbj4ge1xuICAgIGF3YWl0IHRoaXMuZmV0Y2hDb25zdGFudHMoKTtcbiAgICByZXR1cm4gdGhpcy5jb2luKHRva2VuTmFtZSk7XG4gIH1cbn1cbiJdfQ==