diff --git a/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py b/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py
index f3dfa10cbf9..4c21816223e 100644
--- a/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py
+++ b/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py
@@ -519,6 +519,11 @@ def load(
-------
pd.DataFrame
Dataframe consisting of price and volume data
+
+ Examples
+ --------
+ >>> from openbb_terminal.sdk import openbb
+ >>> openbb.crypto.load(symbol="btc",to_symbol="usd",start_date="2019-01-01",source="YahooFinance")
"""
if isinstance(interval, int):
interval = str(interval)
diff --git a/openbb_terminal/cryptocurrency/due_diligence/messari_model.py b/openbb_terminal/cryptocurrency/due_diligence/messari_model.py
index db42333406c..0d0e1db417e 100644
--- a/openbb_terminal/cryptocurrency/due_diligence/messari_model.py
+++ b/openbb_terminal/cryptocurrency/due_diligence/messari_model.py
@@ -102,6 +102,11 @@ def get_marketcap_dominance(
-------
pd.DataFrame
market dominance percentage over time
+
+ Examples
+ --------
+ >>> from openbb_terminal.sdk import openbb
+ >>> mcapdom_df = openbb.crypto.dd.mcapdom(symbol="BTC")
"""
if start_date is None:
@@ -110,13 +115,14 @@ def get_marketcap_dominance(
if end_date is None:
end_date = datetime.now().strftime("%Y-%m-%d")
- df, _ = get_messari_timeseries(
+ messari_timeseries = get_messari_timeseries(
symbol=symbol,
end_date=end_date,
start_date=start_date,
interval=interval,
timeseries_id="mcap.dom",
)
+ df, _ = messari_timeseries if messari_timeseries else (pd.DataFrame(), "")
return df
@@ -653,6 +659,11 @@ def get_fundraising(
Sales rounds,
Treasury Accounts,
Metric Value launch details
+
+ Examples
+ --------
+ >>> from openbb_terminal.sdk import openbb
+ >>> fundraise = openbb.crypto.dd.fr(symbol="BTC")
"""
url = base_url2 + f"assets/{symbol}/profile"
diff --git a/openbb_terminal/reports/templates/crypto.ipynb b/openbb_terminal/reports/templates/crypto.ipynb
index 130ece82da5..8cff5e6ca0d 100644
--- a/openbb_terminal/reports/templates/crypto.ipynb
+++ b/openbb_terminal/reports/templates/crypto.ipynb
@@ -130,10 +130,14 @@
"outputs": [],
"source": [
"news = openbb.crypto.dd.news(symbol=ticker).head(10)\n",
- "news = news.set_index(\"published_at\")\n",
- "news.sort_index()\n",
- "news[\"link\"] = news[\"link\"].apply(lambda x: f'{x}')\n",
- "news"
+ "\n",
+ "if (isinstance(news,pd.DataFrame) and not news.empty) or (not isinstance(news,pd.DataFrame) and news):\n",
+ " news = news.set_index(\"published_at\")\n",
+ " news.sort_index()\n",
+ " news[\"link\"] = news[\"link\"].apply(lambda x: f'{x}')\n",
+ " news\n",
+ "else:\n",
+ " news = pd.DataFrame()"
]
},
{
@@ -145,29 +149,11 @@
"source": [
"links = openbb.crypto.dd.links(ticker)\n",
"\n",
- "if not links.empty:\n",
- " links = links.set_index(\"Name\")\n",
- "\n",
+ "if (isinstance(links,pd.DataFrame) and not links.empty) or (not isinstance(links,pd.DataFrame) and links):\n",
" links[\"Link\"] = links[\"Link\"].apply(lambda x: f'{x}')\n",
- "\n",
- " links"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "9b73e41f",
- "metadata": {},
- "outputs": [],
- "source": [
- "# alt index\n",
- "\n",
- "# fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
- "# openbb.crypto.ov.altindex_chart(external_axes=[ax])\n",
- "# fig.tight_layout()\n",
- "# f = io.BytesIO()\n",
- "# fig.savefig(f, format=\"svg\")\n",
- "# altindex = f.getvalue().decode(\"utf-8\")"
+ " links\n",
+ "else:\n",
+ " links = pd.DataFrame()"
]
},
{
@@ -204,9 +190,14 @@
" for date in dict_of_dates:\n",
" data = openbb.crypto.load(\n",
" symbol=ticker,\n",
+ " to_symbol=\"usd\",\n",
" start_date=dict_of_dates[date],\n",
+ " source=\"YahooFinance\"\n",
" )\n",
"\n",
+ " if data.empty:\n",
+ " continue\n",
+ "\n",
" # we'll be using the adjusted close price as same as close price\n",
" data[\"Adj Close\"] = data[\"Close\"]\n",
"\n",
@@ -269,7 +260,7 @@
" crypto_df=historical_data_one_year,\n",
" symbol=ticker,\n",
" current_currency=\"USDT\",\n",
- " source=\"cctx\",\n",
+ " source=\"YahooFinance\",\n",
" exchange=\"binance\",\n",
" interval=\"1440\",\n",
")\n",
@@ -296,29 +287,6 @@
"headlines = f.getvalue().decode(\"utf-8\")"
]
},
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "3b23868d",
- "metadata": {},
- "outputs": [],
- "source": [
- "# fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(11, 5), dpi=150)\n",
- "# openbb.crypto.chart(\n",
- "# historical_data_one_year,\n",
- "# symbol=ticker,\n",
- "# currency=\"USDT\",\n",
- "# source=\"cctx\",\n",
- "# exchange=\"binance\",\n",
- "# interval=\"1440\",\n",
- "# external_axes=[ax1, ax2],\n",
- "# )\n",
- "# fig.tight_layout()\n",
- "# f = io.BytesIO()\n",
- "# fig.savefig(f, format=\"svg\")\n",
- "# one_year_candle = f.getvalue().decode(\"utf-8\")"
- ]
- },
{
"cell_type": "code",
"execution_count": null,
@@ -331,7 +299,7 @@
" historical_data_one_year,\n",
" to_symbol=ticker,\n",
" from_symbol=\"USDT\",\n",
- " source=\"cctx\",\n",
+ " source=\"YahooFinance\",\n",
" exchange=\"binance\",\n",
" interval=\"1440\",\n",
" external_axes=[ax1, ax2],\n",
@@ -358,14 +326,17 @@
"outputs": [],
"source": [
"# market cap dominance\n",
+ "mcapdom_df = openbb.crypto.dd.mcapdom(symbol=ticker)\n",
"\n",
- "fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
- "openbb.crypto.dd.mcapdom_chart(symbol=ticker, external_axes=[ax])\n",
- "fig.tight_layout()\n",
- "f = io.BytesIO()\n",
- "fig.savefig(f, format=\"svg\")\n",
- "mcapdom = f.getvalue().decode(\"utf-8\")\n",
- "mcapdom_df = openbb.crypto.dd.mcapdom(symbol=ticker)"
+ "if (isinstance(mcapdom_df,pd.DataFrame) and not mcapdom_df.empty) or (not isinstance(mcapdom_df,pd.DataFrame) and mcapdom_df):\n",
+ " fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
+ " openbb.crypto.dd.mcapdom_chart(symbol=ticker, external_axes=[ax])\n",
+ " fig.tight_layout()\n",
+ " f = io.BytesIO()\n",
+ " fig.savefig(f, format=\"svg\")\n",
+ " mcapdom = f.getvalue().decode(\"utf-8\")\n",
+ "else:\n",
+ " mcapdom_df = pd.DataFrame()"
]
},
{
@@ -376,28 +347,22 @@
"outputs": [],
"source": [
"# roadmap\n",
+ "roadmap_model = openbb.crypto.dd.rm(symbol=ticker)\n",
"\n",
- "fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
- "openbb.crypto.dd.rm_chart(symbol=ticker, external_axes=[ax])\n",
- "fig.tight_layout()\n",
- "f = io.BytesIO()\n",
- "fig.savefig(f, format=\"svg\")\n",
- "roadmap_view = f.getvalue().decode(\"utf-8\")\n",
+ "if (isinstance(roadmap_model,pd.DataFrame) and not roadmap_model.empty) or (not isinstance(roadmap_model,pd.DataFrame) and roadmap_model):\n",
"\n",
- "roadmap_model = openbb.crypto.dd.rm(symbol=ticker)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "f496d047",
- "metadata": {},
- "outputs": [],
- "source": [
- "if not roadmap_model.empty:\n",
" roadmap_model = roadmap_model.set_index(\"Date\")\n",
" roadmap_model.sort_index()\n",
- " roadmap_model"
+ "\n",
+ " fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
+ " openbb.crypto.dd.rm_chart(symbol=ticker, external_axes=[ax])\n",
+ " fig.tight_layout()\n",
+ " f = io.BytesIO()\n",
+ " fig.savefig(f, format=\"svg\")\n",
+ " roadmap_view = f.getvalue().decode(\"utf-8\")\n",
+ "\n",
+ "else:\n",
+ " roadmap_model = pd.DataFrame()"
]
},
{
@@ -406,28 +371,24 @@
"id": "9ddbc654",
"metadata": {},
"outputs": [],
- "source": [
- "fig, ax1 = plt.subplots(figsize=(11, 5), dpi=150)\n",
- "ax2 = ax1.twinx()\n",
- "openbb.crypto.dd.tk_chart(symbol=ticker, external_axes=[ax1, ax2])\n",
- "fig.tight_layout()\n",
- "f = io.BytesIO()\n",
- "fig.savefig(f, format=\"svg\")\n",
- "tokenomics_view = f.getvalue().decode(\"utf-8\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "aecd816f",
- "metadata": {},
- "outputs": [],
"source": [
"tokenomics_model = openbb.crypto.dd.rm(symbol=ticker)\n",
- "if not tokenomics_model.empty:\n",
+ "\n",
+ "if (isinstance(tokenomics_model,pd.DataFrame) and not tokenomics_model.empty) or (not isinstance(tokenomics_model,pd.DataFrame) and tokenomics_model):\n",
+ "\n",
" tokenomics_model = tokenomics_model.set_index(\"Date\")\n",
" tokenomics_model.sort_index()\n",
- " tokenomics_model"
+ "\n",
+ " fig, ax1 = plt.subplots(figsize=(11, 5), dpi=150)\n",
+ " ax2 = ax1.twinx()\n",
+ " openbb.crypto.dd.tk_chart(symbol=ticker, external_axes=[ax1, ax2])\n",
+ " fig.tight_layout()\n",
+ " f = io.BytesIO()\n",
+ " fig.savefig(f, format=\"svg\")\n",
+ " tokenomics_view = f.getvalue().decode(\"utf-8\")\n",
+ " \n",
+ "else:\n",
+ " tokenomics_model = pd.DataFrame()"
]
},
{
@@ -438,10 +399,11 @@
"outputs": [],
"source": [
"# fundraise\n",
+ "fundraise = openbb.crypto.dd.fr(symbol=ticker) # this returns a tuple\n",
"\n",
- "fundraise = openbb.crypto.dd.fr(symbol=ticker)\n",
- "fundraise_info = fundraise[0]\n",
- "fundraise_df = fundraise[1]"
+ "if fundraise:\n",
+ " fundraise_info = fundraise[0]\n",
+ " fundraise_df = fundraise[1]"
]
},
{
@@ -452,9 +414,11 @@
"outputs": [],
"source": [
"trading_pair_info = openbb.crypto.dd.trading_pair_info(f\"{ticker}-USDT\")\n",
- "if not trading_pair_info.empty:\n",
+ "if (isinstance(trading_pair_info,pd.DataFrame) and not trading_pair_info.empty) or (not isinstance(trading_pair_info,pd.DataFrame) and trading_pair_info):\n",
" trading_pair_info = trading_pair_info.set_index(\"Metric\")\n",
- " trading_pair_info"
+ " trading_pair_info\n",
+ "else:\n",
+ " trading_pair_info = pd.DataFrame()"
]
},
{
@@ -474,8 +438,7 @@
" ath = coin.get_all_time_high(currency=cg_id)\n",
"\n",
"except Exception as e:\n",
- " # ath = str(\"Reached coingecko API limit\")\n",
- " pass"
+ " print(\"Reached coingecko API limit\")"
]
},
{
@@ -495,8 +458,7 @@
" atl = coin.get_all_time_low(currency=cg_id)\n",
"\n",
"except Exception as e:\n",
- " # atl = str(\"Reached coingecko API limit\")\n",
- " pass"
+ " print(\"Reached coingecko API limit\")"
]
},
{
@@ -510,14 +472,15 @@
"\n",
"market = openbb.crypto.dd.mkt(ticker)\n",
"\n",
- "if not market.empty:\n",
+ "if (isinstance(market,pd.DataFrame) and not market.empty) or (not isinstance(market,pd.DataFrame) and market):\n",
" market = market.set_index(\"exchange\")\n",
"\n",
" market[\"market_url\"] = market[\"market_url\"].apply(\n",
" lambda x: f'{x}'\n",
" )\n",
- "\n",
- " market"
+ " market\n",
+ "else:\n",
+ " market = pd.DataFrame()"
]
},
{
@@ -528,11 +491,13 @@
"outputs": [],
"source": [
"# all exchanges where loaded coin is listed\n",
- "\n",
"ex = openbb.crypto.dd.ex(ticker)\n",
- "if not ex.empty:\n",
+ "\n",
+ "if (isinstance(ex,pd.DataFrame) and not ex.empty) or (not isinstance(ex,pd.DataFrame) and ex):\n",
" ex = ex.set_index(\"id\")\n",
- " ex"
+ " ex\n",
+ "else:\n",
+ " ex = pd.DataFrame()"
]
},
{
@@ -543,10 +508,12 @@
"outputs": [],
"source": [
"# last trades\n",
- "trades = openbb.crypto.dd.trades(symbol=ticker, exchange_id=\"binance\", to_symbol=\"USDT\")\n",
- "if not trades.empty:\n",
+ "trades = openbb.crypto.dd.trades(symbol=ticker, exchange_id=\"gemini\", to_symbol=\"USD\")\n",
+ "if (isinstance(trades,pd.DataFrame) and not trades.empty) or (not isinstance(trades,pd.DataFrame) and trades):\n",
" trades = trades.set_index(\"Date\")\n",
- " trades"
+ " trades\n",
+ "else:\n",
+ " trades = pd.DataFrame()"
]
},
{
@@ -557,28 +524,19 @@
"outputs": [],
"source": [
"# order book\n",
- "\n",
- "fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
- "openbb.crypto.dd.ob_chart(\n",
- " symbol=ticker, exchange=\"binance\", to_symbol=\"USDT\", external_axes=[ax]\n",
- ")\n",
- "fig.tight_layout()\n",
- "f = io.BytesIO()\n",
- "fig.savefig(f, format=\"svg\")\n",
- "order_book = f.getvalue().decode(\"utf-8\")\n",
"order_book_raw = openbb.crypto.dd.ob(\n",
- " symbol=ticker, exchange=\"binance\", to_symbol=\"USDT\"\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "95cdc32e",
- "metadata": {},
- "outputs": [],
- "source": [
- "order_book_raw"
+ " symbol=ticker, exchange=\"gemini\", to_symbol=\"USD\"\n",
+ ") # this returns a dict\n",
+ "\n",
+ "if order_book_raw:\n",
+ " fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
+ " openbb.crypto.dd.ob_chart(\n",
+ " symbol=ticker, exchange=\"gemini\", to_symbol=\"USD\", external_axes=[ax]\n",
+ " )\n",
+ " fig.tight_layout()\n",
+ " f = io.BytesIO()\n",
+ " fig.savefig(f, format=\"svg\")\n",
+ " order_book = f.getvalue().decode(\"utf-8\")"
]
},
{
@@ -591,9 +549,11 @@
"# price and supply related metrics for loaded coin\n",
"\n",
"ps = openbb.crypto.dd.ps(ticker)\n",
- "if not ps.empty:\n",
+ "if (isinstance(ps,pd.DataFrame) and not ps.empty) or (not isinstance(ps,pd.DataFrame) and ps):\n",
" ps = ps.set_index(\"Metric\")\n",
- " ps"
+ " ps\n",
+ "else:\n",
+ " ps = pd.DataFrame()"
]
},
{
@@ -607,12 +567,11 @@
"\n",
"events = openbb.crypto.dd.events(ticker)\n",
"\n",
- "if not events.empty:\n",
+ "if (isinstance(events,pd.DataFrame) and not events.empty) or (not isinstance(events,pd.DataFrame) and events):\n",
" events = events.set_index(\"date\")\n",
- "\n",
" events[\"link\"] = events[\"link\"].apply(lambda x: f'{x}')\n",
- "\n",
- "events"
+ "else:\n",
+ " events = pd.DataFrame()"
]
},
{
@@ -658,13 +617,15 @@
"\n",
"gh_data = openbb.crypto.dd.gh(symbol=ticker)\n",
"\n",
- "if not gh_data.empty:\n",
+ "if (isinstance(gh_data,pd.DataFrame) and not gh_data.empty) or (not isinstance(gh_data,pd.DataFrame) and gh_data):\n",
" fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
" openbb.crypto.dd.gh_chart(symbol=ticker, external_axes=[ax])\n",
" fig.tight_layout()\n",
" f = io.BytesIO()\n",
" fig.savefig(f, format=\"svg\")\n",
- " gh = f.getvalue().decode(\"utf-8\")"
+ " gh = f.getvalue().decode(\"utf-8\")\n",
+ "else:\n",
+ " gh_data = pd.DataFrame()"
]
},
{
@@ -957,7 +918,7 @@
"# rolling mean and std deviation of prices\n",
"\n",
"fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(11, 5), dpi=150)\n",
- "openbb.qa.rolling(\n",
+ "openbb.qa.rolling_chart(\n",
" symbol=ticker,\n",
" data=ticker_data,\n",
" target=\"Close\",\n",
@@ -979,7 +940,7 @@
"# rolling kurtosis of distribution of prices\n",
"\n",
"fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(11, 5), dpi=150)\n",
- "openbb.qa.kurtosis(\n",
+ "openbb.qa.kurtosis_chart(\n",
" symbol=ticker,\n",
" data=ticker_data,\n",
" target=\"Close\",\n",
@@ -1044,9 +1005,8 @@
"if not links.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Links\") + links.to_html(escape=False)])\n",
"\n",
- "htmlcode += widgets.row([widgets.h(3, \"Published news\") + news.to_html(escape=False)])\n",
- "# htmlcode += widgets.row([widgets.h(3, \"Altindex\")])\n",
- "# htmlcode += widgets.row([altindex])\n",
+ "if not news.empty:\n",
+ " htmlcode += widgets.row([widgets.h(3, \"Published news\") + news.to_html(escape=False)])\n",
"\n",
"htmlcode += widgets.row([widgets.h(3, \"Historical data\")])\n",
"for data in historical_data:\n",
@@ -1063,9 +1023,10 @@
"\n",
"# # Due diligence tab\n",
"htmlcode = \"\"\n",
- "htmlcode += widgets.row(\n",
- " [widgets.h(3, f\"Trading pair info {ticker}/USDT\") + trading_pair_info.to_html()]\n",
- ")\n",
+ "if not trading_pair_info.empty:\n",
+ " htmlcode += widgets.row(\n",
+ " [widgets.h(3, f\"Trading pair info {ticker}/USDT\") + trading_pair_info.to_html()]\n",
+ " )\n",
"if not mcapdom_df.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Market cap dominance\")])\n",
" htmlcode += widgets.row([mcapdom])\n",
@@ -1078,7 +1039,7 @@
" htmlcode += widgets.row([widgets.h(3, \"Tokenomics\") + tokenomics_model.to_html()])\n",
" htmlcode += widgets.row([tokenomics_view])\n",
"\n",
- "if not fundraise_df.empty:\n",
+ "if fundraise:\n",
" htmlcode += widgets.row([widgets.h(3, \"Fundraising Details\")])\n",
" htmlcode += widgets.row([widgets.p(fundraise_info)])\n",
" htmlcode += widgets.row([fundraise_df.to_html()])\n",
@@ -1091,29 +1052,38 @@
" htmlcode += widgets.row([widgets.h(3, \"All time low\")])\n",
" htmlcode += widgets.row([atl.to_html()])\n",
"\n",
- "htmlcode += widgets.row([widgets.h(3, \"All markets\")])\n",
- "htmlcode += widgets.row([market.sample(n=20).sort_index().to_html(escape=False)])\n",
- "htmlcode += widgets.row([widgets.h(3, \"Exchanges where loaded coin is listed\")])\n",
- "htmlcode += widgets.row([ex.sample(n=20).sort_index().to_html()])\n",
- "htmlcode += widgets.row([widgets.h(3, \"Last trades\")])\n",
- "htmlcode += widgets.row([trades.tail(20).to_html()])\n",
+ "if not market.empty:\n",
+ " htmlcode += widgets.row([widgets.h(3, \"All markets\")])\n",
+ " htmlcode += widgets.row([market.sample(n=20).sort_index().to_html(escape=False)])\n",
+ "\n",
+ "if not ex.empty:\n",
+ " htmlcode += widgets.row([widgets.h(3, \"Exchanges where loaded coin is listed\")])\n",
+ " htmlcode += widgets.row([ex.sample(n=20).sort_index().to_html()])\n",
+ "\n",
+ "if not trades.empty:\n",
+ " htmlcode += widgets.row([widgets.h(3, \"Last trades\")])\n",
+ " htmlcode += widgets.row([trades.tail(20).to_html()])\n",
"\n",
"if order_book_raw:\n",
" htmlcode += widgets.row([widgets.h(3, \"Order book\")])\n",
" htmlcode += widgets.row([order_book])\n",
"\n",
- "htmlcode += widgets.row(\n",
- " [widgets.h(3, \"Price and supply related metrics for loaded coin\")]\n",
- ")\n",
- "htmlcode += widgets.row([ps.to_html()])\n",
+ "if not ps.empty:\n",
+ " htmlcode += widgets.row(\n",
+ " [widgets.h(3, \"Price and supply related metrics for loaded coin\")]\n",
+ " )\n",
+ " htmlcode += widgets.row([ps.to_html()])\n",
+ "\n",
"if not events.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Events\")])\n",
" htmlcode += widgets.row([events.to_html(escape=False)])\n",
+ "\n",
"# TODO: print rich table\n",
"# htmlcode += widgets.row([widgets.h(3, \"Tweets for loaded coin\")])\n",
"# htmlcode += widgets.row([tweets])\n",
"# htmlcode += widgets.row([widgets.h(3, \"Social media\")])\n",
"# htmlcode += widgets.row([social.to_html()])\n",
+ "\n",
"if not gh_data.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Github activity over time\")])\n",
" htmlcode += widgets.row([gh])\n",
@@ -1171,7 +1141,7 @@
"metadata": {
"celltoolbar": "Tags",
"kernelspec": {
- "display_name": "Python 3.9.6 ('obb')",
+ "display_name": "obb-full",
"language": "python",
"name": "python3"
},
@@ -1189,7 +1159,7 @@
},
"vscode": {
"interpreter": {
- "hash": "cb66ba39c97f15743fbb79e204a841ea03600987d49579cfb0ffc8e8dd934c69"
+ "hash": "73442d10f374b1f81e7aab42e2dddb832a354757dce244164d617e7faf60ecd1"
}
}
},