bitgo
Version:
BitGo JavaScript SDK
141 lines • 17.7 kB
JavaScript
;
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");
const coins_1 = require("./v2/coins");
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));
try {
this.initCoinFactory(tokenConfigMap);
}
catch (e) {
throw new Error(`Failed to initialize coin factory from AMS token metadata: ${e.message}`);
}
}
/**
* 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;
}
//ofc is not present in statics coin map
if (tokenName === 'ofc') {
this._coinFactory.register(tokenName, coins_1.Ofc.createInstance);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Z28udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsRUFBRTtBQUNGLHVCQUF1QjtBQUN2QixFQUFFO0FBQ0Ysb0RBQW9EO0FBQ3BELEVBQUU7QUFDRix5Q0FBMEM7QUFDMUMsNEJBQTRCO0FBRTVCLDhDQUFzRjtBQUN0Riw0Q0FBMkQ7QUFDM0QsNENBT3dCO0FBQ3hCLGtEQUF3SDtBQUN4SCxzQ0FBaUM7QUFPakMsTUFBYSxLQUFNLFNBQVEsa0JBQVE7SUFHakM7O09BRUc7SUFDSCxZQUFZLFNBQXVCLEVBQUU7UUFDbkMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsSUFDRSxDQUFDLGlCQUFNLENBQUMsY0FBYyxDQUNwQixNQUFNLEVBQ04sRUFBRSxFQUNGO1lBQ0UsVUFBVTtZQUNWLGNBQWM7WUFDZCxjQUFjO1lBQ2QsYUFBYTtZQUNiLFdBQVc7WUFDWCxlQUFlO1lBQ2Ysc0JBQXNCO1lBQ3RCLFlBQVk7WUFDWiw0QkFBNEI7U0FDN0IsQ0FDRjtZQUNELENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVELENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQzlDLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0s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QWMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUExSUQsc0JBMElDIiwic291cmNlc0NvbnRlbnQiOlsiLy9cbi8vIEJpdEdvIEphdmFTY3JpcHQgU0RLXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cbmltcG9ydCBwanNvbiA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBCYXNlQ29pbiwgQ29pbkZhY3RvcnksIGNvbW1vbiwgVW5zdXBwb3J0ZWRDb2luRXJyb3IgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQml0R29BUEksIEJpdEdvQVBJT3B0aW9ucyB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7XG4gIGNyZWF0ZVRva2VuTWFwVXNpbmdUcmltbWVkQ29uZmlnRGV0YWlscyxcbiAgVHJpbW1lZEFtc1Rva2VuQ29uZmlnLFxuICBjcmVhdGVUb2tlbixcbiAgZ2V0Rm9ybWF0dGVkVG9rZW5Db25maWdGb3JDb2luLFxuICBjb2lucyxcbiAgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLFxufSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBHbG9iYWxDb2luRmFjdG9yeSwgcmVnaXN0ZXJDb2luQ29uc3RydWN0b3JzLCBnZXRUb2tlbkNvbnN0cnVjdG9yLCBnZXRDb2luQ29uc3RydWN0b3IgfSBmcm9tICcuL3YyL2NvaW5GYWN0b3J5JztcbmltcG9ydCB7IE9mYyB9IGZyb20gJy4vdjIvY29pbnMnO1xuXG4vLyBjb25zdHJ1Y3RvciBwYXJhbXMgdXNlZCBleGNsdXNpdmVseSBmb3IgQml0R28gY2xhc3NcbmV4cG9ydCB0eXBlIEJpdEdvT3B0aW9ucyA9IEJpdEdvQVBJT3B0aW9ucyAmIHtcbiAgdXNlQW1zPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBCaXRHbyBleHRlbmRzIEJpdEdvQVBJIHtcbiAgcHJpdmF0ZSBfY29pbkZhY3Rvcnk6IENvaW5GYWN0b3J5O1xuICBwcml2YXRlIF91c2VBbXM6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQml0R28gT2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJhbXM6IEJpdEdvT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgICBpZiAoXG4gICAgICAhY29tbW9uLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIFtdLFxuICAgICAgICBbXG4gICAgICAgICAgJ2NsaWVudElkJyxcbiAgICAgICAgICAnY2xpZW50U2VjcmV0JyxcbiAgICAgICAgICAncmVmcmVzaFRva2VuJyxcbiAgICAgICAgICAnYWNjZXNzVG9rZW4nLFxuICAgICAgICAgICd1c2VyQWdlbnQnLFxuICAgICAgICAgICdjdXN0b21Sb290VVJJJyxcbiAgICAgICAgICAnY3VzdG9tQml0Y29pbk5ldHdvcmsnLFxuICAgICAgICAgICdzZXJ2ZXJYcHViJyxcbiAgICAgICAgICAnc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmwnLFxuICAgICAgICBdXG4gICAgICApIHx8XG4gICAgICAocGFyYW1zLnVzZVByb2R1Y3Rpb24gJiYgIV8uaXNCb29sZWFuKHBhcmFtcy51c2VQcm9kdWN0aW9uKSkgfHxcbiAgICAgIChwYXJhbXMudXNlQW1zICYmICFfLmlzQm9vbGVhbihwYXJhbXMudXNlQW1zKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmNsaWVudElkICE9PSAhcGFyYW1zLmNsaWVudFNlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IC0gbXVzdCBwcm92aWRlIGJvdGggY2xpZW50IGlkIGFuZCBzZWNyZXQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl91c2VBbXMgPSAhIXBhcmFtcy51c2VBbXM7XG4gICAgdGhpcy5fdmVyc2lvbiA9IHBqc29uLnZlcnNpb247XG4gICAgdGhpcy5fdXNlckFnZW50ID0gcGFyYW1zLnVzZXJBZ2VudCB8fCAnQml0R29KUy8nICsgdGhpcy52ZXJzaW9uKCk7XG4gICAgdGhpcy5fY29pbkZhY3RvcnkgPSBuZXcgQ29pbkZhY3RvcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjb2luIGZhY3Rvcnkgd2l0aCB0b2tlbiBjb25maWd1cmF0aW9uc1xuICAgKiBAcGFyYW0gdG9rZW5Db25maWdNYXAgLSBBIG1hcCBvZiB0b2tlbiBtZXRhZGF0YSBmcm9tIEFNU1xuICAgKi9cbiAgaW5pdENvaW5GYWN0b3J5KHRva2VuQ29uZmlnTWFwOiBSZWNvcmQ8c3RyaW5nLCBUcmltbWVkQW1zVG9rZW5Db25maWdbXT4pOiB2b2lkIHtcbiAgICBjb25zdCBjb2luTWFwID0gY3JlYXRlVG9rZW5NYXBVc2luZ1RyaW1tZWRDb25maWdEZXRhaWxzKHRva2VuQ29uZmlnTWFwKTtcbiAgICB0aGlzLl9jb2luRmFjdG9yeSA9IG5ldyBDb2luRmFjdG9yeSgpO1xuICAgIHJlZ2lzdGVyQ29pbkNvbnN0cnVjdG9ycyh0aGlzLl9jb2luRmFjdG9yeSwgY29pbk1hcCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYWxsIHRoZSB0b2tlbnMgYW5kIGluaXRpYWxpemUgdGhlIGNvaW4gZmFjdG9yeVxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJBbGxUb2tlbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl91c2VBbXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVnaXN0ZXJBbGxUb2tlbnMgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2VBbXMgaXMgc2V0IHRvIHRydWUnKTtcbiAgICB9XG4gICAgLy8gRmV0Y2ggbWFpbm5ldCBhc3NldHMgZm9yIHByb2QgYW5kIGFkbWluUHJvZCBlbnZpcm9ubWVudHMsIHRlc3RuZXQgYXNzZXRzIGZvciBhbGwgb3RoZXIgZW52aXJvbm1lbnRzXG4gICAgY29uc3QgYXNzZXRFbnZpcm9ubWVudCA9IFsncHJvZCcsICdhZG1pblByb2QnXS5pbmNsdWRlcyh0aGlzLmdldEVudigpKSA/ICdtYWlubmV0JyA6ICd0ZXN0bmV0JztcbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2Fzc2V0cy9saXN0LyR7YXNzZXRFbnZpcm9ubWVudH1gKTtcbiAgICBjb25zdCB0b2tlbkNvbmZpZ01hcCA9IChhd2FpdCB0aGlzLmV4ZWN1dGVBc3NldFJlcXVlc3QodXJsKSkgYXMgUmVjb3JkPHN0cmluZywgVHJpbW1lZEFtc1Rva2VuQ29uZmlnW10+O1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmluaXRDb2luRmFjdG9yeSh0b2tlbkNvbmZpZ01hcCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb2luIGZhY3RvcnkgZnJvbSBBTVMgdG9rZW4gbWV0YWRhdGE6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhc2Vjb2luIG9iamVjdFxuICAgKiBAcGFyYW0gY29pbk5hbWVcbiAgICovXG4gIGNvaW4oY29pbk5hbWU6IHN0cmluZyk6IEJhc2VDb2luIHtcbiAgICBpZiAodGhpcy5fdXNlQW1zKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29pbkZhY3RvcnkuZ2V0SW5zdGFuY2UodGhpcywgY29pbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gR2xvYmFsQ29pbkZhY3RvcnkuZ2V0SW5zdGFuY2UodGhpcywgY29pbk5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgdG9rZW4gaW4gdGhlIGNvaW4gZmFjdG9yeVxuICAgKiBAcGFyYW0gdG9rZW5Db25maWcgLSBUaGUgdG9rZW4gbWV0YWRhdGEgZnJvbSBBTVNcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyVG9rZW4odG9rZW5OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX3VzZUFtcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWdpc3RlclRva2VuIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdXNlQW1zIGlzIHNldCB0byB0cnVlJyk7XG4gICAgfVxuICAgIC8vZG8gbm90IHJlZ2lzdGVyIGEgY29pbi90b2tlbiBpZiBpdCdzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLl9jb2luRmFjdG9yeS5oYXNDb2luKHRva2VuTmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvL29mYyBpcyBub3QgcHJlc2VudCBpbiBzdGF0aWNzIGNvaW4gbWFwXG4gICAgaWYgKHRva2VuTmFtZSA9PT0gJ29mYycpIHtcbiAgICAgIHRoaXMuX2NvaW5GYWN0b3J5LnJlZ2lzdGVyKHRva2VuTmFtZSwgT2ZjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBjb2luL3Rva2VuIGRldGFpbHMgb25seSBpZiBpdCdzIG5vdCBwcmVzZW50IGluIHN0YXRpY3MgbGlicmFyeVxuICAgIGxldCBzdGF0aWNzQmFzZUNvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGNvaW5zLmhhcyh0b2tlbk5hbWUpKSB7XG4gICAgICBzdGF0aWNzQmFzZUNvaW4gPSBjb2lucy5nZXQodG9rZW5OYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9hc3NldHMvbmFtZS8ke3Rva2VuTmFtZX1gKTtcbiAgICAgIGNvbnN0IHRva2VuQ29uZmlnID0gKGF3YWl0IHRoaXMuZXhlY3V0ZUFzc2V0UmVxdWVzdCh1cmwpKSBhcyBUcmltbWVkQW1zVG9rZW5Db25maWc7XG4gICAgICBzdGF0aWNzQmFzZUNvaW4gPSBjcmVhdGVUb2tlbih0b2tlbkNvbmZpZyk7XG4gICAgfVxuXG4gICAgaWYgKCFzdGF0aWNzQmFzZUNvaW4pIHtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENvaW5FcnJvcih0b2tlbk5hbWUpO1xuICAgIH1cbiAgICBpZiAoc3RhdGljc0Jhc2VDb2luLmlzVG9rZW4pIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFRva2VuQ29uZmlnID0gZ2V0Rm9ybWF0dGVkVG9rZW5Db25maWdGb3JDb2luKHN0YXRpY3NCYXNlQ29pbik7XG4gICAgICBpZiAoIWZvcm1hdHRlZFRva2VuQ29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENvaW5FcnJvcih0b2tlbk5hbWUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbkNvbnN0cnVjdG9yID0gZ2V0VG9rZW5Db25zdHJ1Y3Rvcihmb3JtYXR0ZWRUb2tlbkNvbmZpZyk7XG4gICAgICBpZiAoIXRva2VuQ29uc3RydWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ29pbkVycm9yKHRva2VuTmFtZSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb2luRmFjdG9yeS5yZWdpc3RlclRva2VuKHN0YXRpY3NCYXNlQ29pbiwgdG9rZW5Db25zdHJ1Y3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvaW5Db25zdHJ1Y3RvciA9IGdldENvaW5Db25zdHJ1Y3Rvcih0b2tlbk5hbWUpO1xuICAgICAgaWYgKCFjb2luQ29uc3RydWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ29pbkVycm9yKHRva2VuTmFtZSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb2luRmFjdG9yeS5yZWdpc3RlclRva2VuKHN0YXRpY3NCYXNlQ29pbiwgY29pbkNvbnN0cnVjdG9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFzZWNvaW4gb2JqZWN0IGZvciBhIHZpcnR1YWwgdG9rZW5cbiAgICogQHBhcmFtIHRva2VuTmFtZVxuICAgKi9cbiAgYXN5bmMgdG9rZW4odG9rZW5OYW1lOiBzdHJpbmcpOiBQcm9taXNlPEJhc2VDb2luPiB7XG4gICAgYXdhaXQgdGhpcy5mZXRjaENvbnN0YW50cygpO1xuICAgIHJldHVybiB0aGlzLmNvaW4odG9rZW5OYW1lKTtcbiAgfVxufVxuIl19