cyberosa
commited on
Commit
Β·
355fb10
1
Parent(s):
e91be24
first prototype of wow retention graph for different trader types
Browse files
app.py
CHANGED
@@ -9,6 +9,11 @@ from scripts.metrics import (
|
|
9 |
compute_daily_metrics_by_market_creator,
|
10 |
compute_winning_metrics_by_trader,
|
11 |
)
|
|
|
|
|
|
|
|
|
|
|
12 |
from tabs.trader_plots import (
|
13 |
plot_trader_metrics_by_market_creator,
|
14 |
default_trader_metric,
|
@@ -30,6 +35,10 @@ from tabs.market_plots import (
|
|
30 |
plot_kl_div_per_market,
|
31 |
plot_total_bet_amount_per_trader_per_market,
|
32 |
)
|
|
|
|
|
|
|
|
|
33 |
|
34 |
|
35 |
def get_logger():
|
@@ -130,6 +139,9 @@ def prepare_data():
|
|
130 |
|
131 |
|
132 |
traders_data, closed_markets, daily_info, unknown_traders = prepare_data()
|
|
|
|
|
|
|
133 |
|
134 |
demo = gr.Blocks()
|
135 |
# get weekly metrics by market creator: qs, pearl or all.
|
@@ -390,6 +402,19 @@ with demo:
|
|
390 |
inputs=[no_trader_live_details_selector, no_trader_live_details_plot],
|
391 |
outputs=[no_trader_live_details_plot],
|
392 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
393 |
with gr.TabItem("βοΈ Active traders"):
|
394 |
with gr.Row():
|
395 |
gr.Markdown("# Active traders for all markets by trader categories")
|
|
|
9 |
compute_daily_metrics_by_market_creator,
|
10 |
compute_winning_metrics_by_trader,
|
11 |
)
|
12 |
+
from scripts.retention_metrics import (
|
13 |
+
prepare_retention_dataset,
|
14 |
+
calculate_wow_retention_by_type,
|
15 |
+
calculate_cohort_retention,
|
16 |
+
)
|
17 |
from tabs.trader_plots import (
|
18 |
plot_trader_metrics_by_market_creator,
|
19 |
default_trader_metric,
|
|
|
35 |
plot_kl_div_per_market,
|
36 |
plot_total_bet_amount_per_trader_per_market,
|
37 |
)
|
38 |
+
from tabs.retention_plots import (
|
39 |
+
plot_wow_retention_by_type,
|
40 |
+
plot_cohort_retention_heatmap,
|
41 |
+
)
|
42 |
|
43 |
|
44 |
def get_logger():
|
|
|
139 |
|
140 |
|
141 |
traders_data, closed_markets, daily_info, unknown_traders = prepare_data()
|
142 |
+
retention_df = prepare_retention_dataset(
|
143 |
+
traders_df=traders_data, unknown_df=unknown_traders
|
144 |
+
)
|
145 |
|
146 |
demo = gr.Blocks()
|
147 |
# get weekly metrics by market creator: qs, pearl or all.
|
|
|
402 |
inputs=[no_trader_live_details_selector, no_trader_live_details_plot],
|
403 |
outputs=[no_trader_live_details_plot],
|
404 |
)
|
405 |
+
with gr.TabItem("πͺ Retention metrics (WIP)"):
|
406 |
+
with gr.Row():
|
407 |
+
# wow retention
|
408 |
+
gr.Markdown("# Wow retention by trader type")
|
409 |
+
with gr.Row():
|
410 |
+
wow_retention = calculate_wow_retention_by_type(retention_df)
|
411 |
+
wow_retention_plot = plot_wow_retention_by_type(
|
412 |
+
wow_retention=wow_retention
|
413 |
+
)
|
414 |
+
with gr.Row():
|
415 |
+
# cohort retention
|
416 |
+
gr.Markdown("# Cohort retention")
|
417 |
+
|
418 |
with gr.TabItem("βοΈ Active traders"):
|
419 |
with gr.Row():
|
420 |
gr.Markdown("# Active traders for all markets by trader categories")
|
notebooks/closed_markets.ipynb
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
-
"execution_count":
|
6 |
"metadata": {},
|
7 |
"outputs": [],
|
8 |
"source": [
|
@@ -11,7 +11,7 @@
|
|
11 |
},
|
12 |
{
|
13 |
"cell_type": "code",
|
14 |
-
"execution_count":
|
15 |
"metadata": {},
|
16 |
"outputs": [
|
17 |
{
|
@@ -36,7 +36,7 @@
|
|
36 |
},
|
37 |
{
|
38 |
"cell_type": "code",
|
39 |
-
"execution_count":
|
40 |
"metadata": {},
|
41 |
"outputs": [],
|
42 |
"source": [
|
@@ -48,7 +48,7 @@
|
|
48 |
},
|
49 |
{
|
50 |
"cell_type": "code",
|
51 |
-
"execution_count":
|
52 |
"metadata": {},
|
53 |
"outputs": [
|
54 |
{
|
@@ -56,36 +56,38 @@
|
|
56 |
"output_type": "stream",
|
57 |
"text": [
|
58 |
"<class 'pandas.core.frame.DataFrame'>\n",
|
59 |
-
"RangeIndex:
|
60 |
-
"Data columns (total
|
61 |
-
" # Column Non-Null Count
|
62 |
-
"--- ------ --------------
|
63 |
-
" 0 collateralAmount
|
64 |
-
" 1 collateralAmountUSD
|
65 |
-
" 2 collateralToken
|
66 |
-
" 3 creationTimestamp
|
67 |
-
" 4 trader_address
|
68 |
-
" 5 feeAmount
|
69 |
-
" 6 id
|
70 |
-
" 7 oldOutcomeTokenMarginalPrice
|
71 |
-
" 8 outcomeIndex
|
72 |
-
" 9 outcomeTokenMarginalPrice
|
73 |
-
" 10 outcomeTokensTraded
|
74 |
-
" 11 title
|
75 |
-
" 12 transactionHash
|
76 |
-
" 13 type
|
77 |
-
" 14 market_creator
|
78 |
-
" 15 fpmm.answerFinalizedTimestamp
|
79 |
-
" 16 fpmm.arbitrationOccurred
|
80 |
-
" 17 fpmm.currentAnswer
|
81 |
-
" 18 fpmm.id
|
82 |
-
" 19 fpmm.isPendingArbitration
|
83 |
-
" 20 fpmm.openingTimestamp
|
84 |
-
" 21 fpmm.outcomes
|
85 |
-
" 22 fpmm.title
|
86 |
-
" 23 fpmm.condition.id
|
87 |
-
"
|
88 |
-
"
|
|
|
|
|
89 |
]
|
90 |
}
|
91 |
],
|
@@ -93,6 +95,248 @@
|
|
93 |
"markets_df.info()"
|
94 |
]
|
95 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
{
|
97 |
"cell_type": "code",
|
98 |
"execution_count": 6,
|
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
+
"execution_count": 3,
|
6 |
"metadata": {},
|
7 |
"outputs": [],
|
8 |
"source": [
|
|
|
11 |
},
|
12 |
{
|
13 |
"cell_type": "code",
|
14 |
+
"execution_count": 4,
|
15 |
"metadata": {},
|
16 |
"outputs": [
|
17 |
{
|
|
|
36 |
},
|
37 |
{
|
38 |
"cell_type": "code",
|
39 |
+
"execution_count": 9,
|
40 |
"metadata": {},
|
41 |
"outputs": [],
|
42 |
"source": [
|
|
|
48 |
},
|
49 |
{
|
50 |
"cell_type": "code",
|
51 |
+
"execution_count": 6,
|
52 |
"metadata": {},
|
53 |
"outputs": [
|
54 |
{
|
|
|
56 |
"output_type": "stream",
|
57 |
"text": [
|
58 |
"<class 'pandas.core.frame.DataFrame'>\n",
|
59 |
+
"RangeIndex: 118880 entries, 0 to 118879\n",
|
60 |
+
"Data columns (total 26 columns):\n",
|
61 |
+
" # Column Non-Null Count Dtype \n",
|
62 |
+
"--- ------ -------------- ----- \n",
|
63 |
+
" 0 collateralAmount 118880 non-null object \n",
|
64 |
+
" 1 collateralAmountUSD 118880 non-null object \n",
|
65 |
+
" 2 collateralToken 118880 non-null object \n",
|
66 |
+
" 3 creationTimestamp 118880 non-null datetime64[ns, UTC]\n",
|
67 |
+
" 4 trader_address 118880 non-null object \n",
|
68 |
+
" 5 feeAmount 118880 non-null object \n",
|
69 |
+
" 6 id 118880 non-null object \n",
|
70 |
+
" 7 oldOutcomeTokenMarginalPrice 118880 non-null object \n",
|
71 |
+
" 8 outcomeIndex 118880 non-null object \n",
|
72 |
+
" 9 outcomeTokenMarginalPrice 118880 non-null object \n",
|
73 |
+
" 10 outcomeTokensTraded 118880 non-null object \n",
|
74 |
+
" 11 title 118880 non-null object \n",
|
75 |
+
" 12 transactionHash 118880 non-null object \n",
|
76 |
+
" 13 type 118880 non-null object \n",
|
77 |
+
" 14 market_creator 118880 non-null object \n",
|
78 |
+
" 15 fpmm.answerFinalizedTimestamp 78679 non-null object \n",
|
79 |
+
" 16 fpmm.arbitrationOccurred 118880 non-null bool \n",
|
80 |
+
" 17 fpmm.currentAnswer 78679 non-null object \n",
|
81 |
+
" 18 fpmm.id 118880 non-null object \n",
|
82 |
+
" 19 fpmm.isPendingArbitration 118880 non-null bool \n",
|
83 |
+
" 20 fpmm.openingTimestamp 118880 non-null object \n",
|
84 |
+
" 21 fpmm.outcomes 118880 non-null object \n",
|
85 |
+
" 22 fpmm.title 118880 non-null object \n",
|
86 |
+
" 23 fpmm.condition.id 118880 non-null object \n",
|
87 |
+
" 24 creation_timestamp 118880 non-null datetime64[ns, UTC]\n",
|
88 |
+
" 25 creation_date 118880 non-null object \n",
|
89 |
+
"dtypes: bool(2), datetime64[ns, UTC](2), object(22)\n",
|
90 |
+
"memory usage: 22.0+ MB\n"
|
91 |
]
|
92 |
}
|
93 |
],
|
|
|
95 |
"markets_df.info()"
|
96 |
]
|
97 |
},
|
98 |
+
{
|
99 |
+
"cell_type": "code",
|
100 |
+
"execution_count": 10,
|
101 |
+
"metadata": {},
|
102 |
+
"outputs": [],
|
103 |
+
"source": [
|
104 |
+
"markets_df[\"creation_timestamp\"] = pd.to_datetime(markets_df[\"creationTimestamp\"])\n",
|
105 |
+
"markets_df[\"creation_date\"] = markets_df[\"creation_timestamp\"].dt.date\n",
|
106 |
+
"markets_df[\"creation_date\"] = pd.to_datetime(markets_df[\"creation_date\"])"
|
107 |
+
]
|
108 |
+
},
|
109 |
+
{
|
110 |
+
"cell_type": "code",
|
111 |
+
"execution_count": 11,
|
112 |
+
"metadata": {},
|
113 |
+
"outputs": [
|
114 |
+
{
|
115 |
+
"data": {
|
116 |
+
"text/plain": [
|
117 |
+
"Timestamp('2025-01-13 00:00:00')"
|
118 |
+
]
|
119 |
+
},
|
120 |
+
"execution_count": 11,
|
121 |
+
"metadata": {},
|
122 |
+
"output_type": "execute_result"
|
123 |
+
}
|
124 |
+
],
|
125 |
+
"source": [
|
126 |
+
"max(markets_df.creation_date)"
|
127 |
+
]
|
128 |
+
},
|
129 |
+
{
|
130 |
+
"cell_type": "code",
|
131 |
+
"execution_count": 14,
|
132 |
+
"metadata": {},
|
133 |
+
"outputs": [
|
134 |
+
{
|
135 |
+
"data": {
|
136 |
+
"text/plain": [
|
137 |
+
"creation_date\n",
|
138 |
+
"2025-01-11 5275\n",
|
139 |
+
"2024-12-12 5156\n",
|
140 |
+
"2025-01-12 3919\n",
|
141 |
+
"2024-12-21 3849\n",
|
142 |
+
"2024-12-10 3799\n",
|
143 |
+
"2024-12-11 3739\n",
|
144 |
+
"2025-01-10 3711\n",
|
145 |
+
"2024-12-24 3676\n",
|
146 |
+
"2024-12-19 3486\n",
|
147 |
+
"2024-12-20 3189\n",
|
148 |
+
"2024-11-23 3124\n",
|
149 |
+
"2024-11-30 3078\n",
|
150 |
+
"2024-11-18 3069\n",
|
151 |
+
"2024-12-09 3068\n",
|
152 |
+
"2024-12-26 3066\n",
|
153 |
+
"2024-12-23 2921\n",
|
154 |
+
"2024-11-27 2905\n",
|
155 |
+
"2024-11-28 2841\n",
|
156 |
+
"2024-11-22 2840\n",
|
157 |
+
"2024-12-02 2826\n",
|
158 |
+
"2024-12-22 2663\n",
|
159 |
+
"2024-11-24 2626\n",
|
160 |
+
"2024-12-08 2621\n",
|
161 |
+
"2024-12-04 2612\n",
|
162 |
+
"2024-11-26 2549\n",
|
163 |
+
"2024-11-25 2542\n",
|
164 |
+
"2024-11-29 2541\n",
|
165 |
+
"2024-12-01 2521\n",
|
166 |
+
"2025-01-09 2517\n",
|
167 |
+
"2024-11-20 2503\n",
|
168 |
+
"2024-11-16 2502\n",
|
169 |
+
"2024-11-14 2348\n",
|
170 |
+
"2024-11-21 2315\n",
|
171 |
+
"2024-12-07 2242\n",
|
172 |
+
"2025-01-08 2231\n",
|
173 |
+
"2024-11-15 2207\n",
|
174 |
+
"2024-12-06 2203\n",
|
175 |
+
"2024-11-19 2183\n",
|
176 |
+
"2024-12-16 2168\n",
|
177 |
+
"2024-12-14 2144\n",
|
178 |
+
"2024-12-18 2088\n",
|
179 |
+
"2024-12-13 2079\n",
|
180 |
+
"2024-12-05 2060\n",
|
181 |
+
"2024-12-27 1900\n",
|
182 |
+
"Name: count, dtype: int64"
|
183 |
+
]
|
184 |
+
},
|
185 |
+
"execution_count": 14,
|
186 |
+
"metadata": {},
|
187 |
+
"output_type": "execute_result"
|
188 |
+
}
|
189 |
+
],
|
190 |
+
"source": [
|
191 |
+
"markets_df.creation_date.value_counts()"
|
192 |
+
]
|
193 |
+
},
|
194 |
+
{
|
195 |
+
"cell_type": "code",
|
196 |
+
"execution_count": 18,
|
197 |
+
"metadata": {},
|
198 |
+
"outputs": [
|
199 |
+
{
|
200 |
+
"data": {
|
201 |
+
"text/plain": [
|
202 |
+
"<Axes: xlabel='Count', ylabel='creation_date'>"
|
203 |
+
]
|
204 |
+
},
|
205 |
+
"execution_count": 18,
|
206 |
+
"metadata": {},
|
207 |
+
"output_type": "execute_result"
|
208 |
+
},
|
209 |
+
{
|
210 |
+
"data": {
|
211 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAnEAAAGwCAYAAADG0TO0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABZWElEQVR4nO3de1xUdf4/8NdwG0aBAZIBVG6moUKuZop4S4Ggcr2k7Wa2iWZL1EAhbil5AdZcNPumlqnfsrAWSdO831YWBEXRikQFka8lShsM6SIMglyE8/vDHycnLg4jMBx4PR+PeTycz/nM57zPiUfn/TjnvD8fmSAIAoiIiIhIUkyMHQARERERtR6TOCIiIiIJYhJHREREJEFM4oiIiIgkiEkcERERkQQxiSMiIiKSICZxRERERBJkZuwAqP3U19ejsLAQ1tbWkMlkxg6HiIiI9CAIAsrLy9G7d2+YmDR/v41JXBdWWFgIFxcXY4dBREREBvj555/Rt2/fZrczievCrK2tAdz9I7CxsTFyNERERKQPrVYLFxcX8TreLMGI/vGPfwiPP/64YGVlJTg4OAhTp04VLl26pNPn9u3bwuuvvy7Y29sLPXv2FKZPny5oNBpxe1ZWljBz5kyhb9++gqWlpTBw4EBh7dq1OmMcO3ZMANDoU1RU1GJ89fX1wtKlSwUnJyfB0tJS8Pf3F/7v//5Pp8+7774r+Pr6CgqFQlAqlXod9+3bt4Xg4GDB29tbMDU1FaZOndqoj6Ex36usrEwAIJSVlen9GyIiIjIufa/fRi1sSEtLg1qtxunTp5GUlITa2loEBgaioqJC7DN//nzs378fO3bsQFpaGgoLCzF9+nRxe2ZmJlQqFRISEpCTk4PFixcjKioK69evb7S/vLw8FBUViR+VStVifO+99x4+/PBDbNq0CWfOnEHPnj0RFBSEqqoqsU9NTQ3+9Kc/4bXXXtP7uOvq6qBQKPDGG28gICCgxb6tjZmIiIi6iQ5KKvXy66+/CgCEtLQ0QRAEobS0VDA3Nxd27Ngh9snNzRUACBkZGc2O8/rrrwsTJ04Uvzfc1bp586besdTX1wtOTk7C6tWrxbbS0lJBLpcLX331VaP+8fHxet+Ju1dwcHCLd+JaE/Pv8U4cERGR9EjiTtzvlZWVAQDs7e0B3L3LVltbq3O3auDAgXB1dUVGRkaL4zSMca+hQ4fC2dkZTz75JE6ePNliLPn5+dBoNDr7ViqV8PHxaXHfba01MVdXV0Or1ep8iIiIqGvqNElcfX09IiIiMGbMGHh7ewMANBoNLCwsYGtrq9PX0dERGo2myXFOnTqF7du3IyQkRGxzdnbGpk2b8M033+Cbb76Bi4sLJkyYgB9++KHZeBrGd3R01HvfbcmQmOPi4qBUKsUPK1OJiIi6rk5TnapWq5GdnY309HSDx8jOzsbUqVMRHR2NwMBAsd3T0xOenp7i99GjR+Onn37CmjVr8M9//hNbt27Fq6++Km4/fPgwTE1NDY7jXl5eXrh27RoAYNy4cTh8+LBev7tfzE2JiopCZGSk+L2huoWIiIi6nk6RxIWFheHAgQM4fvy4znwoTk5OqKmpQWlpqc7duOLiYjg5OemMcfHiRfj7+yMkJARLliy57z5HjhwpJoxTpkyBj4+PuK1Pnz4oKioS9+Xs7Kyz76FDh+p9bIcOHUJtbS0AQKFQ6P27+8XcFLlcDrlc/kD7ICIiImkwahInCALCw8Oxe/dupKamwsPDQ2f78OHDYW5ujuTkZMyYMQPA3WrNgoIC+Pr6iv1ycnLg5+eH4OBgrFixQq99Z2VlicmZtbV1o7lYPDw84OTkhOTkZDFp02q1OHPmTKsqUd3c3PTu25qYiYiIqHszahKnVquRmJiIvXv3wtraWnzXTKlUQqFQQKlUYt68eYiMjIS9vT1sbGwQHh4OX19fjBo1CsDdR6h+fn4ICgpCZGSkOIapqSkcHBwAAGvXroWHhwe8vLxQVVWFzZs3IyUlBUePHm02NplMhoiICLz77rsYMGAAPDw8sHTpUvTu3RvTpk0T+xUUFKCkpAQFBQWoq6tDVlYWAKB///6wsrJqdvyLFy+ipqYGJSUlKC8vF3/XkDAaEjMRERF1Ix1TLNs0NDGZLQAhPj5e7NMw2a+dnZ3Qo0cP4dlnn9WZ8DY6OrrJMdzc3MQ+q1atEh5++GHB0tJSsLe3FyZMmCCkpKTcN76GyX4dHR0FuVwu+Pv7C3l5eTp9goODm9z/sWPHWhzbzc2tyd89aMz34hQjRERE0qPv9VsmCILQgTkjdSCtVgulUomysjIuu0VERCQR+l6/O80UI0RERESkPyZxRERERBLEJI6IiIhIgpjEEREREUlQp5jsl9rXzJAImFtYGDsMIiIio+jdS4mNH6wydhhtjklcN6DwnQVzRU9jh0FERGQUhelfGDuEdsHHqUREREQSxCSOiIiISIKYxBERERFJEFds6MIaZnx29hoFE1O+/khERN2T3KQO3o8OadMx27NYQt8VG3hl7wZ8/7qchQ1ERERtqDMUS/BxKhEREZEEMYkjIiIikiAmcUREREQSxCSOiIiISIJY2NANZHy6lNWpRET3Ibcwg/cgT2OHQRLRu5fS2CEwiesOWJ1KRHR/t9O/wN4vNxk7DCK98XEqERERkQQxiSMiIiKSICZxRERERBLEd+K6ARY2EBkPX5aXjs7wojpRa/DK3g2wsIHIePiyPBG1Fz5OJSIiIpIgJnFEREREEsQkjoiIiEiCmMQRERERSRALG7oBVqcSNdZRVaOseCSi9mLUK3tcXBx27dqFS5cuQaFQYPTo0Vi1ahU8PX/7H2tVVRUWLFiAbdu2obq6GkFBQdiwYQMcHR0BAOfOncPKlSuRnp6OGzduwN3dHaGhoXjzzTfFMVJTUzFx4sRG+y8qKoKTk1Oz8QmCgOjoaHz66acoLS3FmDFjsHHjRgwYMEDss2LFChw8eBBZWVmwsLBAaWmpXsd+/vx5qNVqfPfdd3BwcEB4eDjefvttnT5r167Fxo0bUVBQgF69euG5555DXFwcLC0t9dpHA1anEjXGqlEikjqjPk5NS0uDWq3G6dOnkZSUhNraWgQGBqKiokLsM3/+fOzfvx87duxAWloaCgsLMX36dHF7ZmYmVCoVEhISkJOTg8WLFyMqKgrr169vtL+8vDwUFRWJH5VK1WJ87733Hj788ENs2rQJZ86cQc+ePREUFISqqiqxT01NDf70pz/htdde0/u4tVotAgMD4ebmhszMTKxevRoxMTH45JNPxD6JiYlYtGgRoqOjkZubi88++wzbt2/HO++8o/d+iIiIqOuSCYIgGDuIBtevX4dKpUJaWhrGjx+PsrIyODg4IDExEc899xwA4NKlSxg0aBAyMjIwatSoJsdRq9XIzc1FSkoKgN/uxN28eRO2trZ6xSIIAnr37o0FCxbgb3/7GwCgrKwMjo6O2LJlC2bOnKnTf8uWLYiIiNDrTtzGjRuxePFiaDQaWFhYAAAWLVqEPXv24NKlSwCAsLAw5ObmIjk5WfzdggULcObMGaSnp+t1DFqtFkqlEtPXJvFOHNHv8E4cEXVWDdfvsrIy2NjYNNuvUxU2lJWVAQDs7e0B3L3LVltbi4CAALHPwIED4erqioyMjBbHaRjjXkOHDoWzszOefPJJnDx5ssVY8vPzodFodPatVCrh4+PT4r71kZGRgfHjx4sJHAAEBQUhLy8PN2/eBACMHj0amZmZ+PbbbwEAV65cwaFDh/DMM880O251dTW0Wq3Oh4iIiLqmTvO2e319PSIiIjBmzBh4e3sDgHin6vd3zxwdHaHRaJoc59SpU9i+fTsOHjwotjk7O2PTpk14/PHHUV1djc2bN2PChAk4c+YMHnvssSbHaRi/4d07ffatL41GAw8Pj0bjNmyzs7PDrFmzcOPGDYwdOxaCIODOnTsIDQ1t8XFqXFwcYmNjG7U/aGEDlw2irogFB0QkdZ0miVOr1cjOztb7UWFTsrOzMXXqVERHRyMwMFBs9/T01CmWGD16NH766SesWbMG//znP7F161a8+uqr4vbDhw/D1NTU4Dju5eXlhWvXrgEAxo0bh8OHD+v1u9TUVPzjH//Ahg0b4OPjgx9//BFvvvkmli9fjqVLlzb5m6ioKERGRorftVotXFxcHriwgY+diIiIOp9OkcSFhYXhwIEDOH78OPr27Su2Ozk5oaamBqWlpTp344qLixtVlV68eBH+/v4ICQnBkiVL7rvPkSNHignjlClT4OPjI27r06cPioqKxH05Ozvr7Hvo0KF6H9uhQ4dQW1sLAFAoFOJxFRcX6/Rr+N5wXEuXLsVLL72EV155BQDw6KOPoqKiAiEhIVi8eDFMTBo/CZfL5ZDL5XrHRkRERNJl1HfiBEFAWFgYdu/ejZSUlEaPGIcPHw5zc3Odl/vz8vJQUFAAX19fsS0nJwcTJ05EcHAwVqxYode+s7KyxOTM2toa/fv3Fz8KhQIeHh5wcnLS2bdWq8WZM2d09n0/bm5u4rh9+vQBAPj6+uL48eNicgcASUlJ8PT0hJ2dHQCgsrKyUaLWcHewE9WiEBERkZEY9U6cWq1GYmIi9u7dC2tra/FdM6VSCYVCAaVSiXnz5iEyMhL29vawsbFBeHg4fH19xcrU7Oxs+Pn5ISgoCJGRkeIYpqamcHBwAHB3vjUPDw94eXmhqqoKmzdvRkpKCo4ePdpsbDKZDBEREXj33XcxYMAAeHh4YOnSpejduzemTZsm9isoKEBJSQkKCgpQV1eHrKwsAED//v1hZWXV5NizZs1CbGws5s2bh4ULFyI7Oxvr1q3DmjVrxD6TJ0/GBx98gGHDhomPU5cuXYrJkye32aNeIiIiki6jJnEbN24EAEyYMEGnPT4+HnPmzAEArFmzBiYmJpgxY4bOZL8Ndu7cievXryMhIQEJCQliu5ubG65evQrg7lxuCxYswC+//IIePXpgyJAh+Pe//93kBMD3evvtt8VHmKWlpRg7diyOHDmiM9nusmXL8MUXX4jfhw0bBgA4duxYo+NqoFQqcfToUajVagwfPhy9evXCsmXLEBISIvZZsmQJZDIZlixZgl9++QUODg6YPHmy3nca73U7IxF37qmEbS2+AE5ERNT5dKp54qht6TvPDBEREXUekpwnjoiIiIj0wySOiIiISIKYxBERERFJEJM4IiIiIgliEkdEREQkQUziiIiIiCSISRwRERGRBDGJIyIiIpIgJnFEREREEsQkjoiIiEiCmMQRERERSRCTOCIiIiIJYhJHREREJEFM4oiIiIgkiEkcERERkQQxiSMiIiKSICZxRERERBLEJI6IiIhIgpjEEREREUkQkzgiIiIiCWISR0RERCRBTOKIiIiIJIhJHBEREZEEMYkjIiIikiAmcUREREQSxCSOiIiISIKYxBERERFJkFGTuLi4OIwYMQLW1tZQqVSYNm0a8vLydPpUVVVBrVbjoYcegpWVFWbMmIHi4mJx+7lz5/DCCy/AxcUFCoUCgwYNwrp163TGSE1NhUwma/TRaDQtxicIApYtWwZnZ2coFAoEBATg8uXLOn1WrFiB0aNHo0ePHrC1tdX72M+fP49x48bB0tISLi4ueO+993S25+TkYMaMGXB3d4dMJsPatWv1HpuIiIi6PqMmcWlpaVCr1Th9+jSSkpJQW1uLwMBAVFRUiH3mz5+P/fv3Y8eOHUhLS0NhYSGmT58ubs/MzIRKpUJCQgJycnKwePFiREVFYf369Y32l5eXh6KiIvGjUqlajO+9997Dhx9+iE2bNuHMmTPo2bMngoKCUFVVJfapqanBn/70J7z22mt6H7dWq0VgYCDc3NyQmZmJ1atXIyYmBp988onYp7KyEv369cPKlSvh5OSk99hERETUTQidyK+//ioAENLS0gRBEITS0lLB3Nxc2LFjh9gnNzdXACBkZGQ0O87rr78uTJw4Ufx+7NgxAYBw8+ZNvWOpr68XnJychNWrV4ttpaWlglwuF7766qtG/ePj4wWlUqnX2Bs2bBDs7OyE6upqsW3hwoWCp6dnk/3d3NyENWvW6B17g7KyMgGAUFZW1urfEhERkXHoe/3uVO/ElZWVAQDs7e0B3L3LVltbi4CAALHPwIED4erqioyMjBbHaRjjXkOHDoWzszOefPJJnDx5ssVY8vPzodFodPatVCrh4+PT4r71kZGRgfHjx8PCwkJsCwoKQl5eHm7evGnwuNXV1dBqtTofIiIi6po6TRJXX1+PiIgIjBkzBt7e3gAAjUYDCwuLRu+aOTo6Nvs+26lTp7B9+3aEhISIbc7Ozti0aRO++eYbfPPNN3BxccGECRPwww8/NBtPw/iOjo5671tfGo2myXHv3a8h4uLioFQqxY+Li8sDxUlERESdV6dJ4tRqNbKzs7Ft2zaDx8jOzsbUqVMRHR2NwMBAsd3T0xOvvvoqhg8fjtGjR+Pzzz/H6NGjsWbNGgDA1q1bYWVlJX5OnDjxwMfTwMvLSxz36aefbrNxmxIVFYWysjLx8/PPP7fr/oiIiMh4zIwdAACEhYXhwIEDOH78OPr27Su2Ozk5oaamBqWlpTp344qLixu97H/x4kX4+/sjJCQES5Ysue8+R44cifT0dADAlClT4OPjI27r06cPioqKxH05Ozvr7Hvo0KF6H9uhQ4dQW1sLAFAoFOJx3Vth2zBuwzZDyeVyyOVyg39PRERE0mHUO3GCICAsLAy7d+9GSkoKPDw8dLYPHz4c5ubmSE5OFtvy8vJQUFAAX19fsS0nJwcTJ05EcHAwVqxYode+s7KyxOTM2toa/fv3Fz8KhQIeHh5wcnLS2bdWq8WZM2d09n0/bm5u4rh9+vQBAPj6+uL48eNicgcASUlJ8PT0hJ2dnd5jExERUfdl1DtxarUaiYmJ2Lt3L6ytrcX3wZRKJRQKBZRKJebNm4fIyEjY29vDxsYG4eHh8PX1xahRowDcfYTq5+eHoKAgREZGimOYmprCwcEBALB27Vp4eHjAy8sLVVVV2Lx5M1JSUnD06NFmY5PJZIiIiMC7776LAQMGwMPDA0uXLkXv3r0xbdo0sV9BQQFKSkpQUFCAuro6ZGVlAQD69+8PKyurJseeNWsWYmNjMW/ePCxcuBDZ2dlYt26d+HgXuDt1ycWLF8V///LLL8jKyoKVlRX69+9v2AknIiKirqNjimWbBqDJT3x8vNjn9u3bwuuvvy7Y2dkJPXr0EJ599lmhqKhI3B4dHd3kGG5ubmKfVatWCQ8//LBgaWkp2NvbCxMmTBBSUlLuG199fb2wdOlSwdHRUZDL5YK/v7+Ql5en0yc4OLjJ/R87dqzFsc+dOyeMHTtWkMvlQp8+fYSVK1fqbM/Pz29y3CeeeOK+cTfgFCNERETSo+/1WyYIgtCBOSN1IK1WC6VSibKyMtjY2Bg7HCIiItKDvtfvTlOdSkRERET6YxJHREREJEFM4oiIiIgkiEkcERERkQQxiSMiIiKSICZxRERERBLEJI6IiIhIgpjEEREREUkQkzgiIiIiCTLq2qnUMWaGRMDcwqLZ7b17KbHxg1UdGBERERE9KCZx3YDCdxbMFT2b3V6Y/kUHRkNERERtgY9TiYiIiCSISRwRERGRBDGJIyIiIpIgJnFEREREEiQTBEEwdhDUPrRaLZRKJZy9RsHEtPkaFrlJHbwfHdKBkRHpYoU0EdFvGq7fZWVlsLGxabYfq1O7Ad+/Lm+xOpXI2FghTUTUenycSkRERCRBTOKIiIiIJIhJHBEREZEEsbChC9O3sIHI2Fhc07mx8ISoY7GwgUQsbCCiB8HCE6LOiY9TiYiIiCSISRwRERGRBDGJIyIiIpIgvhPXDWR8upSFDV2U3MIM3oM8jR0GdXG9eymNHQIRNYFX9m6AhQ1d1+30L7D3y03GDoOIiIyAj1OJiIiIJIhJHBEREZEEMYkjIiIikiAmcUREREQSxGW3ujAuu9X1cbkqogfDJcWoM+KyWyRidSoRUdO4pBhJGR+nEhEREUkQkzgiIiIiCWISR0RERCRBfCeuG+CyW0TUgEu16eKSYiRlvLJ3AyxsIKIGXKqNqOvg41QiIiIiCWISR0RERCRBTOKIiIiIJIhJHBEREZEEsbChG2B1KpG0tGcFKasxiboOXtm7AVanEkkLK0iJSB9GfZwaFxeHESNGwNraGiqVCtOmTUNeXp5On6qqKqjVajz00EOwsrLCjBkzUFxcLG4/d+4cXnjhBbi4uEChUGDQoEFYt25ds/s8efIkzMzMMHTo0PvGt2vXLgQGBuKhhx6CTCZDVlaWzvaSkhKEh4fD09MTCoUCrq6ueOONN1BWVtbiuKmpqZg6dSqcnZ3Rs2dPDB06FFu3btXp8+mnn2LcuHGws7ODnZ0dAgIC8O233943ZiIiIuoejJrEpaWlQa1W4/Tp00hKSkJtbS0CAwNRUVEh9pk/fz7279+PHTt2IC0tDYWFhZg+fbq4PTMzEyqVCgkJCcjJycHixYsRFRWF9evXN9pfaWkpZs+eDX9/f73iq6iowNixY7Fq1aomtxcWFqKwsBDvv/8+srOzsWXLFhw5cgTz5s1rcdxTp05hyJAh+Oabb3D+/HnMnTsXs2fPxoEDB8Q+qampeOGFF3Ds2DFkZGTAxcUFgYGB+OWXX/SKnYiIiLo2mSAIgrGDaHD9+nWoVCqkpaVh/PjxKCsrg4ODAxITE/Hcc88BAC5duoRBgwYhIyMDo0aNanIctVqN3NxcpKSk6LTPnDkTAwYMgKmpKfbs2dPozlpzrl69Cg8PD5w9e/a+d/B27NiBv/zlL6ioqICZmf5PqydNmgRHR0d8/vnnTW6vq6uDnZ0d1q9fj9mzZzfZp7q6GtXV1eJ3rVYLFxcXTF+bxMepRBLCx6lE3ZtWq4VSqURZWRlsbGya7dep3olreAxpb28P4O5dttraWgQEBIh9Bg4cCFdX1xaTuLKyMnGMBvHx8bhy5QoSEhLw7rvvttMRQDzhrUngGn43aNCgZrdXVlaitra20XHdKy4uDrGxsY3aWdhAJC1ykzpMnR1q7DDoPnr3UmLjB00/qSHqCJ3myl5fX4+IiAiMGTMG3t7eAACNRgMLCwvY2trq9HV0dIRGo2lynFOnTmH79u04ePCg2Hb58mUsWrQIJ06caHVy1Ro3btzA8uXLERIS0qrfff311/juu+/wv//7v832WbhwIXr37q2T0P5eVFQUIiMjxe8Nd+JY2EBE1PYK078wdgjUzXWaeeLUajWys7Oxbds2g8fIzs7G1KlTER0djcDAQAB3H0POmjULsbGxeOSRR5r83datW2FlZSV+Tpw40ep9a7VaTJo0CYMHD0ZMTIzY7uXlJY779NNPN/rdsWPHMHfuXHz66afw8vJqcuyVK1di27Zt2L17NywtLZuNQS6Xw8bGRudDREREXVOnuBMXFhaGAwcO4Pjx4+jbt6/Y7uTkhJqaGpSWlurcjSsuLoaTk5POGBcvXoS/vz9CQkKwZMkSsb28vBzff/89zp49i7CwMAB37/oJggAzMzMcPXoUU6ZMgY+Pj/ibPn36tCr+8vJyPPXUU7C2tsbu3bthbm4ubjt06BBqa2sBAAqFQud3aWlpmDx5MtasWdPse27vv/8+Vq5ciX//+98YMmRIq+IiIiKirsvgJO6nn35CfHw8fvrpJ6xbtw4qlQqHDx+Gq6trs3eUfk8QBISHh2P37t1ITU2Fh4eHzvbhw4fD3NwcycnJmDFjBgAgLy8PBQUF8PX1Ffvl5OTAz88PwcHBWLFihc4YNjY2uHDhgk7bhg0bkJKSgp07d8LDwwM9e/aEtbW1IacBWq0WQUFBkMvl2LdvX6M7ZW5ubk3+LjU1FX/84x+xatWqZh+/vvfee1ixYgX+9a9/4fHHHzcoPiIiIuqaDEri0tLS8PTTT2PMmDE4fvw4VqxYAZVKhXPnzuGzzz7Dzp079RpHrVYjMTERe/fuhbW1tfiem1KphEKhgFKpxLx58xAZGQl7e3vY2NggPDwcvr6+YlFDdnY2/Pz8EBQUhMjISHEMU1NTODg4wMTERHzHroFKpYKlpWWj9t8rKSlBQUEBCgsLAUCcw87JyQlOTk7QarUIDAxEZWUlEhISoNVqodVqAQAODg4wNTVtctxjx47hj3/8I958803MmDFDjNnCwkIsXFi1ahWWLVuGxMREuLu7i30aHs0SERFR92bQFCO+vr7405/+hMjISFhbW+PcuXPo168fvv32W0yfPh3/+c9/9Nu5TNZke3x8PObMmQPg7mS/CxYswFdffYXq6moEBQVhw4YN4uPUmJiYJisy3dzccPXq1SbHj4mJ0WuKkS1btmDu3LmN2qOjoxETE4PU1FRMnDixyd/m5+fD3d29yW1z5szBF180fiH2iSeeQGpqKgDA3d0d165da3bf+mgoUXb2GsXqVCLqEO25ZFhnw+pUai/6TjFiUBJnZWWFCxcuwMPDQyeJu3r1KgYOHIiqqqoHCp7aRsMfAeeJI6KOwjnuiB6cvkmcQdWptra2KCoqatR+9uzZVhcFEBEREVHrGZTEzZw5EwsXLoRGo4FMJkN9fT1OnjyJv/3tb81WWRIRERFR2zEoifvHP/6BgQMHwsXFBbdu3cLgwYMxfvx4jB49Wmd6DyIiIiJqHw+0durPP/+MCxcu4NatWxg2bBgGDBjQlrHRA2JhAxF1NLlJHbwf7Zg5LVlYQF1Vu66d+ve//x1/+9vf4OLiAhcXF7H99u3bWL16NZYtW2bIsNROuOwWEXVFXPaKujuDHqfGxsbi1q1bjdorKyubnO6DiIiIiNqWQUmcIAhNzvF27tw5cbJaIiIiImo/rXqcamdnB5lMBplMhkceeUQnkaurq8OtW7cQGhra5kESERERka5WJXFr166FIAh4+eWXERsbC6VSKW6zsLCAu7u7zpqm1DlkfLqUhQ3U5XWnlQLort69lPfvRNSFterKHhwcDADw8PDA6NGjYW5u3i5BUdtiYQN1B1wpgIi6G4NuzzzxxBPiv6uqqlBTU6OzvaVyWCIiIiJ6cAYVNlRWViIsLAwqlQo9e/aEnZ2dzoeIiIiI2pdBSdxbb72FlJQUbNy4EXK5HJs3b0ZsbCx69+6NL7/8sq1jJCIiIqLfMehx6v79+/Hll19iwoQJmDt3LsaNG4f+/fvDzc0NW7duxYsvvtjWcRIRERHRPQxK4kpKStCvXz8Ad99/KykpAQCMHTsWr732WttFR22C1anSw0rL1mOlIhF1NwZd2fv164f8/Hy4urpi4MCB+PrrrzFy5Ejs378ftra2bRwiPShWp0oPKy2JiOh+DHonbu7cuTh37hwAYNGiRfj4449haWmJ+fPn46233mrTAImIiIioMYPuxM2fP1/8d0BAAC5duoTMzEz0798fQ4YMabPgiIiIiKhpbfKilJubG9zc3NpiKCIiIiLSg0wQBEGfjh9++KHeg77xxhsGB0RtR6vVQqlUwtlrFAsbJEZuUgfvR3lXu6307qXExg9WGTsMIiK9NFy/y8rKWlxAQe8r+5o1a3S+X79+HZWVlWIhQ2lpKXr06AGVSsUkrpNhYQN1d4XpXxg7BCKiNqd3YUN+fr74WbFiBYYOHYrc3FyUlJSgpKQEubm5eOyxx7B8+fL2jJeIiIiIYGB16tKlS/HRRx/B0/O3eaw8PT2xZs0aLFmypM2CIyIiIqKmGZTEFRUV4c6dO43a6+rqUFxc/MBBEREREVHLDEri/P398eqrr+KHH34Q2zIzM/Haa68hICCgzYIjIiIioqYZVLL4+eefIzg4GI8//jjMzc0BAHfu3EFQUBA2b97cpgHSg+OyW9SZdcQSY1ySi4i6Ir2nGGnK5cuXkZubCwAYOHAgHnnkkVb9Pi4uDrt27cKlS5egUCgwevRorFq1Suddu6qqKixYsADbtm1DdXU1goKCsGHDBjg6OgIAzp07h5UrVyI9PR03btyAu7s7QkND8eabbza5z5MnT+KJJ56At7c3srKyWoxv165d2LRpEzIzM1FSUoKzZ89i6NCh4vaSkhJER0fj6NGjKCgogIODA6ZNm4bly5dDqWz+olFVVYXQ0FBkZmYiNzcXf/zjH7Fnzx6dPqmpqZg4cWKj3xYVFcHJyanFuBs0lChPX5vE6lTqtLjEGBGRrjafYqQpAwYMwIABA5rdbmNjg6ysLPTr16/J7WlpaVCr1RgxYgTu3LmDd955B4GBgbh48SJ69rybdMyfPx8HDx7Ejh07oFQqERYWhunTp+PkyZMA7j7GValUSEhIgIuLC06dOoWQkBCYmpoiLCxMZ3+lpaWYPXs2/P399Xp3r6KiAmPHjsWf//xn/PWvf220vbCwEIWFhXj//fcxePBgXLt2DaGhoSgsLMTOnTubHbeurg4KhQJvvPEGvvnmmxZjyMvL0/kPqFKp7hs3ERERdX0PdCfufqytrXHu3Llmk7jfu379OlQqFdLS0jB+/HiUlZXBwcEBiYmJeO655wAAly5dwqBBg5CRkYFRo0Y1OY5arUZubi5SUlJ02mfOnIkBAwbA1NQUe/bsue+duAZXr16Fh4dHoztxTdmxYwf+8pe/oKKiAmZm98+R58yZg9LS0mbvxN28eVOci6+1eCeOpIB34oiIdOl7J86gwob2UlZWBgCwt7cHcPcuW21trU6xxMCBA+Hq6oqMjIwWx2kYo0F8fDyuXLmC6Ojodohcd982NjZ6JXD6GDp0KJydnfHkk0+Kdx+bU11dDa1Wq/MhIiKirqnTvO1eX1+PiIgIjBkzBt7e3gAAjUYDCwuLRneiHB0dodFomhzn1KlT2L59Ow4ePCi2Xb58GYsWLcKJEyfaLLlqyo0bN7B8+XKEhIQ88FjOzs7YtGkTHn/8cVRXV2Pz5s2YMGECzpw5g8cee6zJ38TFxSE2NrZROwsbqDOTm9Rh6uzQdhmby20RUVfWaa7sarUa2dnZSE9PN3iM7OxsTJ06FdHR0QgMDARw9/2zWbNmITY2ttnCi61bt+LVV18Vvx8+fBjjxo1r1b61Wi0mTZqEwYMHIyYmRmz38vLCtWvXAADjxo3D4cOH9RrP09NTp8Bj9OjR+Omnn7BmzRr885//bPI3UVFRiIyM1InJxcWFy25Rt8XltoioK2vXJE4mk+nVLywsDAcOHMDx48fRt29fsd3JyQk1NTUoLS3VuRtXXFzcqELz4sWL8Pf3R0hIiM6qEeXl5fj+++9x9uxZsdChvr4egiDAzMwMR48exZQpU+Dj4yP+pk+fPq06zvLycjz11FOwtrbG7t27xWlXAODQoUOora0FACgUilaN+3sjR45sMcmVy+WQy+UPtA8iIiKShnZN4u5XMyEIAsLDw7F7926kpqbCw8NDZ/vw4cNhbm6O5ORkzJgxA8Ddas2CggL4+vqK/XJycuDn54fg4GCsWLFCZwwbGxtcuHBBp23Dhg1ISUnBzp074eHhgZ49e8La2tqgY9RqtQgKCoJcLse+fftgaWmps93Nzc2gcZuSlZUFZ2fnNhuPiIiIpKtdk7jDhw+3eFdLrVYjMTERe/fuhbW1tfiem1KphEKhgFKpxLx58xAZGQl7e3vY2NggPDwcvr6+YmVqdnY2/Pz8EBQUhMjISHEMU1NTODg4wMTERHzHroFKpYKlpWWj9t8rKSlBQUEBCgsLAdxNIIG7dwidnJyg1WoRGBiIyspKJCQk6BQTODg4wNTUtNmxL168iJqaGpSUlKC8vFyslG2ofl27di08PDzg5eWFqqoqbN68GSkpKTh69GiLMRMREVH3YFASV1dXhy1btiA5ORm//vor6uvrdbY3TO0xduzYFsfZuHEjAGDChAk67fHx8ZgzZw4AYM2aNTAxMcGMGTN0JvttsHPnTly/fh0JCQlISEgQ293c3HD16lVDDk+0b98+zJ07V/w+c+ZMAEB0dDRiYmLwww8/4MyZMwCA/v376/w2Pz8f7u7uzY79zDPPiO/KAcCwYcMA/Hb3sqamBgsWLMAvv/yCHj16YMiQIfj3v//d5ATARERE1P0YNE9cWFgYtmzZgkmTJsHZ2bnRu29r1qxpswDJcA3zzDh7jWJ1KnVpzS3dxepUIpKidl2xYdu2bfj666/xzDPPGBwgdRxWp1JXxwmDiag7MmiyXwsLi0aPD4mIiIio4xiUxC1YsADr1q27b/UpEREREbUPgx6npqen49ixYzh8+DC8vLx05kUDgF27drVJcERERETUNIOSOFtbWzz77LNtHQu1Ey67RV1dey7dRUTdh9SKoQy6ssfHx7d1HNSOWNhARER0f1Jbqu+Bbs9cv35dnADX09MTDg4ObRIUEREREbXMoMKGiooKvPzyy3B2dsb48eMxfvx49O7dG/PmzUNlZWVbx0hEREREv2NQEhcZGYm0tDTs378fpaWlKC0txd69e5GWloYFCxa0dYxERERE9DsGrdjQq1cv7Ny5s9FyWceOHcOf//xnXL9+va3iowfAFRuIiFqvuRVAqOvrLIUN7bpiQ2VlJRwdHRu1q1QqPk7thFjYQESkP64AQlJh0ONUX19fREdHo6qqSmy7ffs2YmNj4evr22bBEREREVHTDLoTt27dOgQFBaFv3774wx/+AAA4d+4cLC0t8a9//atNAyQiIiKixgxK4ry9vXH58mVs3boVly5dAgC88MILePHFF6FQKNo0QCIiIiJqzOC33Xv06IG//vWvbRkLEREREelJ7+rUffv24emnn4a5uTn27dvXYt8pU6a0SXD0YFidSkTUenKTOng/OqRRe2epXKSur82rU6dNmwaNRgOVSoVp06Y1208mk6Gurq5VwVL7YnUqEdGDk9qSTNT16Z3E1dfXN/lvIiIiIup4Bk0x8uWXX6K6urpRe01NDb788ssHDoqIiIiIWmZQEjd37lyUlZU1ai8vL8fcuXMfOCgiIiIiaplBb7sLggCZTNao/T//+Q+USuUDB0VtK+PTpSxsICKDcRmqu3r34vWNOpdWXdmHDRsGmUwGmUwGf39/mJn99vO6ujrk5+fjqaeeavMg6cGwsIGIHgSXoSLqnFqVxDVUpWZlZSEoKAhWVlbiNgsLC7i7u2PGjBltGiARERERNdaqJC46OhoA4O7ujueffx6WlpbtEhQRERERtcygF6WCg4PbOg4iIiIiagWDkri6ujqsWbMGX3/9NQoKClBTU6OzvaSkpE2CIyIiIqKmGZTExcbGYvPmzViwYAGWLFmCxYsX4+rVq9izZw+WLVvW1jHSA2J1KlHn1tmrP1mVSdQ56b126r0efvhhfPjhh5g0aRKsra2RlZUltp0+fRqJiYl6jRMXF4ddu3bh0qVLUCgUGD16NFatWgVPz9/+Z1ZVVYUFCxZg27ZtqK6uRlBQEDZs2ABHR0cAwLlz57By5Uqkp6fjxo0bcHd3R2hoKN58880m93ny5Ek88cQT8Pb2RlZWVovx7dq1C5s2bUJmZiZKSkpw9uxZDB06VNxeUlKC6OhoHD16FAUFBXBwcMC0adOwfPny+061cv78eajVanz33XdwcHBAeHg43n77bZ0+a9euxcaNG1FQUIBevXrhueeeQ1xcnN7vIjasvTZ9bRKrU4k6MVZ/EtG99F071aDJfjUaDR599FEAgJWVlTjx7x//+EccPHhQ73HS0tKgVqtx+vRpJCUloba2FoGBgaioqBD7zJ8/H/v378eOHTuQlpaGwsJCTJ8+XdyemZkJlUqFhIQE5OTkYPHixYiKisL69esb7a+0tBSzZ8+Gv7+/XvFVVFRg7NixWLWq6QWPCwsLUVhYiPfffx/Z2dnYsmULjhw5gnnz5rU4rlarRWBgINzc3JCZmYnVq1cjJiYGn3zyidgnMTERixYtQnR0NHJzc/HZZ59h+/bteOedd/SKnYiIiLo2g56x9e3bF0VFRXB1dcXDDz+Mo0eP4rHHHsN3330HuVyu9zhHjhzR+b5lyxaoVCpkZmZi/PjxKCsrw2effYbExET4+fkBAOLj4zFo0CCcPn0ao0aNwssvv6wzRr9+/ZCRkYFdu3YhLCxMZ1toaChmzZoFU1NT7Nmz577xvfTSSwCAq1evNrnd29sb33zzjfj94YcfxooVK/CXv/wFd+7c0ZlH715bt25FTU0NPv/8c1hYWMDLywtZWVn44IMPEBISAgA4deoUxowZg1mzZgG4WxH8wgsv4MyZM/eNm4iIiLo+g+7EPfvss0hOTgYAhIeHY+nSpRgwYABmz57dKKlqjYY7evb29gDu3mWrra1FQECA2GfgwIFwdXVFRkZGi+M0jNEgPj4eV65cEadJaS8Ntz6bS+AAICMjA+PHj4eFhYXYFhQUhLy8PNy8eRMAMHr0aGRmZuLbb78FAFy5cgWHDh3CM8880+y41dXV0Gq1Oh8iIiLqmgy6E7dy5Urx388//7yYVA0YMACTJ082KJD6+npERERgzJgx8Pb2BnD3sa2FhQVsbW11+jo6OkKj0TQ5zqlTp7B9+3adx7qXL1/GokWLcOLEiRaTqwd148YNLF++XLyb1hyNRgMPDw+dtoZ3/DQaDezs7DBr1izcuHEDY8eOhSAIuHPnDkJDQ1t8nBoXF4fY2NhG7SxsIGpaZykoYOEAERmiTa7svr6+8PX1faAx1Go1srOzkZ6ebvAY2dnZmDp1KqKjoxEYGAjg7nQos2bNQmxsLB555JEmf7d161a8+uqr4vfDhw9j3Lhxrdq3VqvFpEmTMHjwYMTExIjtXl5euHbtGgBg3LhxOHz4sF7jpaam4h//+Ac2bNgAHx8f/Pjjj3jzzTexfPlyLF26tMnfREVFITIyUicmFxcXLrtF1AwWFBCRlBmcxP3zn//Epk2bkJ+fj4yMDLi5uWHt2rXw8PDA1KlTWzVWWFgYDhw4gOPHj6Nv375iu5OTE2pqalBaWqpzN664uBhOTk46Y1y8eBH+/v4ICQnBkiVLxPby8nJ8//33OHv2rPiOXH19PQRBgJmZGY4ePYopU6bAx8dH/E2fPn1aFX95eTmeeuopWFtbY/fu3TA3Nxe3HTp0CLW1tQAAhUIhHldxcbHOGA3fG45r6dKleOmll/DKK68AAB599FFUVFQgJCQEixcvholJ4yfhcrm8Ve8kEhERkXQZ9E7cxo0bERkZiWeeeQalpaWoq6sDANja2mLt2rV6jyMIAsLCwrB7926kpKQ0esQ4fPhwmJubi+/fAUBeXh4KCgp07vzl5ORg4sSJCA4OxooVK3TGsLGxwYULF5CVlSV+QkND4enpiaysLPj4+MDa2hr9+/cXPw3Jlj4aKk0tLCywb9++RtN/uLm5ieM2JIe+vr44fvy4mNwBQFJSEjw9PWFnZwcAqKysbJSomZqaiueNiIiIujeD7sR99NFH+PTTTzFt2jSd9+Mef/xx/O1vf9N7HLVajcTEROzduxfW1tbie25KpRIKhQJKpRLz5s1DZGQk7O3tYWNjg/DwcPj6+mLUqFEA7j5C9fPzQ1BQECIjI8UxTE1N4eDgABMTE/EduwYqlQqWlpaN2n+vpKQEBQUFKCwsBHA3gQTu3i1zcnISE7jKykokJCToFBM4ODiISdfvNTzenTdvHhYuXIjs7GysW7cOa9asEftMnjwZH3zwAYYNGyY+Tl26dCkmT57c7LhERETUfRiUxOXn52PYsGGN2uVyuc4cb/ezceNGAMCECRN02uPj4zFnzhwAwJo1a2BiYoIZM2boTPbbYOfOnbh+/ToSEhKQkJAgtru5uTU7NYi+9u3bh7lz54rfZ86cCQCIjo5GTEwMfvjhB3HKj/79++v8Nj8/H+7u7k2Oq1QqcfToUajVagwfPhy9evXCsmXLdAoilixZAplMhiVLluCXX36Bg4MDJk+e3OhOoz5Y2ED0m3uLGVhQQERSZtCKDYMHD0ZcXBymTp0Ka2trnDt3Dv369cNHH32E+Ph4/PDDD+0RK7USV2wgaozFDETU2em7YoNBt2ciIyOhVqtRVVUFQRDw7bff4quvvkJcXBw2b95scNBEREREpB+DkrhXXnkFCoUCS5YsQWVlJWbNmoXevXtj3bp14iNHIiIiImo/rU7i7ty5g8TERAQFBeHFF19EZWUlbt26BZVK1R7xEREREVETWj3FiJmZGUJDQ1FVVQUA6NGjBxM4IiIiog5m0OPUkSNH4uzZs3Bzc2vreKgdsDqVuipDls1iRSoRdRUGXdlff/11LFiwAP/5z38wfPhw9OypW/k4ZMiQNgmO2gaX3aKuipWmRNSdGZTENRQvvPHGG2KbTCaDIAiQyWTiCg5ERERE1D4MnuyXiIiIiIzHoLVTExMTkZycDDc3N51PcnIytm3b1tYxEhEREdHvGLRig7u7OxITEzF69Gid9jNnzmDmzJm8U9dJNMz47Ow1ioUN1CXJTerg/ai038Ht3UuJjR+sMnYYRNSJtOuKDRqNBs7Ozo3aHRwcUFRUZMiQ1I5Y2EDUeRWmf2HsEIhIogx6nOri4oKTJ082aj958iR69+79wEERERERUcsMuhP317/+FREREaitrYWfnx8AIDk5GW+//TYWLFjQpgESERERUWMGJXFvvfUW/vvf/+L1119HTU0NAMDS0hILFy5EVFRUmwZIRERERI0ZlMTJZDKsWrUKS5cuRW5uLhQKBQYMGAC5XN7W8RERERFREx6oZNHKygojRoxoq1ionXDZLeoIhiyBRVwGjIgMxyt7N8DqVOoIXAKLiKhjGVSdSkRERETGxSSOiIiISIKYxBERERFJkEHLbpE0cNkt6khdYQmsroDLeBFJX7suu0XSwsIGou6Dy3gRdR98nEpEREQkQUziiIiIiCSISRwRERGRBDGJIyIiIpIgFjZ0A1x2i8h4Ono5Mi7jRdR9GPXKHhcXh127duHSpUtQKBQYPXo0Vq1aBU/P3/6HV1VVhQULFmDbtm2orq5GUFAQNmzYAEdHRwDAuXPnsHLlSqSnp+PGjRtwd3dHaGgo3nzzzSb3efLkSTzxxBPw9vZGVlZWi/Ht2rULmzZtQmZmJkpKSnD27FkMHTpU3F5SUoLo6GgcPXoUBQUFcHBwwLRp07B8+XIolS3/j/T8+fNQq9X47rvv4ODggPDwcLz99tvi9pycHCxbtgyZmZm4du0a1qxZg4iIiJZPaDNYnUpkPFyOjIjai1Efp6alpUGtVuP06dNISkpCbW0tAgMDUVFRIfaZP38+9u/fjx07diAtLQ2FhYWYPn26uD0zMxMqlQoJCQnIycnB4sWLERUVhfXr1zfaX2lpKWbPng1/f3+94quoqMDYsWOxalXTcy4VFhaisLAQ77//PrKzs7FlyxYcOXIE8+bNa3FcrVaLwMBAuLm5ITMzE6tXr0ZMTAw++eQTsU9lZSX69euHlStXwsnJSa94iYiIqPvoVJP9Xr9+HSqVCmlpaRg/fjzKysrg4OCAxMREPPfccwCAS5cuYdCgQcjIyMCoUaOaHEetViM3NxcpKSk67TNnzsSAAQNgamqKPXv23PdOXIOrV6/Cw8Oj0Z24puzYsQN/+ctfUFFRATOzpm90bty4EYsXL4ZGo4GFhQUAYNGiRdizZw8uXbrUqL+7uzsiIiJafSeuYbLA6WuTeCeOyEh4J46IWkvfyX47VWFDWVkZAMDe3h7A3btstbW1CAgIEPsMHDgQrq6uyMjIaHGchjEaxMfH48qVK4iOjm6HyHX3bWNj02wCBwAZGRkYP368mMABQFBQEPLy8nDz5k2D911dXQ2tVqvzISIioq6p07ztXl9fj4iICIwZMwbe3t4AIN6psrW11enr6OgIjUbT5DinTp3C9u3bcfDgQbHt8uXLWLRoEU6cONFicvWgbty4geXLlyMkJKTFfhqNBh4eHjptDe/4aTQa2NnZGbT/uLg4xMbGNmpnYQOR8chN6jB1dqixw3hgXM6LqPPpNFd2tVqN7OxspKenGzxGdnY2pk6diujoaAQGBgIA6urqMGvWLMTGxuKRRx5p8ndbt27Fq6++Kn4/fPgwxo0b16p9a7VaTJo0CYMHD0ZMTIzY7uXlhWvXrgEAxo0bh8OHD7fyqPQXFRWFyMhInZhcXFxY2EBED4zLeRF1Pp0iiQsLC8OBAwdw/Phx9O3bV2x3cnJCTU0NSktLde7GFRcXN3rZ/+LFi/D390dISAiWLFkitpeXl+P777/H2bNnERYWBuDuXT9BEGBmZoajR49iypQp8PHxEX/Tp0+fVsVfXl6Op556CtbW1ti9ezfMzc3FbYcOHUJtbS0AQKFQiMdVXFysM0bD9wcpYpDL5ZDL5Qb/noiIiKTDqEmcIAgIDw/H7t27kZqa2ugR4/Dhw2Fubo7k5GTMmDEDAJCXl4eCggL4+vqK/XJycuDn54fg4GCsWLFCZwwbGxtcuHBBp23Dhg1ISUnBzp074eHhgZ49e8La2tqgY9BqtQgKCoJcLse+fftgaWmps93Nza3Rb3x9fbF48WLU1taKCV9SUhI8PT0NfpRKRERE3YtRkzi1Wo3ExETs3bsX1tbW4ntuSqUSCoUCSqUS8+bNQ2RkJOzt7WFjY4Pw8HD4+vqKlanZ2dnw8/NDUFAQIiMjxTFMTU3h4OAAExMT8R27BiqVCpaWlo3af6+kpAQFBQUoLCwEcDeBBO7eLXNychKnCqmsrERCQoJOMYGDgwNMTU2bHLfh8e68efOwcOFCZGdnY926dVizZo3Yp6amBhcvXhT//csvvyArKwtWVlbo379/q84zERERdT1GnWJEJpM12R4fH485c+YA+G2y36+++kpnst+Gx44xMTFNvszv5uaGq1evNjl+TEyMXlOMbNmyBXPnzm3UHh0djZiYGKSmpmLixIlN/jY/Px/u7u7Njn3vZL+9evVCeHg4Fi5cKG5vmNbk95544gmkpqa2GHeDhhJlZ69RLGwgMrKOXrmhrbGwgajj6DvFSKeaJ47aFueJI+o8OF8cEelLkvPEEREREZF+mMQRERERSRCTOCIiIiIJYhJHREREJEEsbOjCWJ1K1HnITerg/eiQDtkXK0mJpE3fwgZe2bsBLrtF1L1wiSyi7oGPU4mIiIgkiEkcERERkQQxiSMiIiKSIBY2dGEsbCDqnporomDBA5E0sLCBRCxsICKABQ9EXQ0fpxIRERFJEJM4IiIiIgliEkdEREQkQUziiIiIiCSIhQ3dQManS1mdStQJyC3M4D3I02j7791LabR9E1Hb45W9G2B1KlHncDv9C+z9cpOxwyCiLoKPU4mIiIgkiEkcERERkQQxiSMiIiKSIL4T1w2wsIHI+OQWZggcN9LYYRBRF8IrezfAwgYi47ud/gXXLSWiNsXHqUREREQSxCSOiIiISIKYxBERERFJkEwQBMHYQVD70Gq1UCqVcPYaxcIGIiOTm9TB+9EhzW7v3UvJd+aICMBv1++ysjLY2Ng0249X9m6AhQ1EnV9h+hfGDoGIJIaPU4mIiIgkiEkcERERkQQxiSMiIiKSICZxRERERBLE6tQujNWpRNJxv+rVzobVtETth9WpJGJ1KhG1NVbTEhkfH6cSERERSRCTOCIiIiIJYhJHREREJEF8J64byPh0KQsbiLoRuYUZvAd5tus+evdStuv4RHR/vLJ3AyxsIOpebqd/gb1fbjJ2GETUzoz6ODUuLg4jRoyAtbU1VCoVpk2bhry8PJ0+VVVVUKvVeOihh2BlZYUZM2aguLhY3H7u3Dm88MILcHFxgUKhwKBBg7Bu3bpm93ny5EmYmZlh6NCh941v165dCAwMxEMPPQSZTIasrKxGfT755BNMmDABNjY2kMlkKC0tve+4+sS8a9cuPPnkk3BwcICNjQ18fX3xr3/9675jExERUfdg1CQuLS0NarUap0+fRlJSEmpraxEYGIiKigqxz/z587F//37s2LEDaWlpKCwsxPTp08XtmZmZUKlUSEhIQE5ODhYvXoyoqCisX7++0f5KS0sxe/Zs+Pv76xVfRUUFxo4di1Wrmp8LqbKyEk899RTeeecdvY9bn5iPHz+OJ598EocOHUJmZiYmTpyIyZMn4+zZs3rvh4iIiLquTjXZ7/Xr16FSqZCWlobx48ejrKwMDg4OSExMxHPPPQcAuHTpEgYNGoSMjAyMGjWqyXHUajVyc3ORkpKi0z5z5kwMGDAApqam2LNnT5N31ppy9epVeHh44OzZs83ewUtNTcXEiRNx8+ZN2Nra6nvI9435Xl5eXnj++eexbNkyvcZsmCxw+tokPk4l6kb4OJVI2vSd7LdTVaeWlZUBAOzt7QHcvWNVW1uLgIAAsc/AgQPh6uqKjIyMFsdpGKNBfHw8rly5gujo6HaI/ME1FfO96uvrUV5e3mKf6upqaLVanQ8RERF1TZ2msKG+vh4REREYM2YMvL29AQAajQYWFhaN7mw5OjpCo9E0Oc6pU6ewfft2HDx4UGy7fPkyFi1ahBMnTsDMrNMcsqipmH/v/fffx61bt/DnP/+52T5xcXGIjY1t1M7qVKLW64gKz/bCylGi7qHTXNnVajWys7ORnp5u8BjZ2dmYOnUqoqOjERgYCACoq6vDrFmzEBsbi0ceeaTJ323duhWvvvqq+P3w4cMYN26cwXHc6+mnn8aJEycAAG5ubsjJyblvzL+XmJiI2NhY7N27FyqVqtl9RUVFITIyUvyu1Wrh4uLC6lQiA/CRJBF1dp0iiQsLC8OBAwdw/Phx9O3bV2x3cnJCTU0NSktLde7GFRcXw8nJSWeMixcvwt/fHyEhIViyZInYXl5eju+//x5nz55FWFgYgLt3/QRBgJmZGY4ePYopU6bAx8dH/E2fPn3a7Ng2b96M27dvAwDMzc31ivle27ZtwyuvvIIdO3boPFZuilwuh1wub5vAiYiIqFMzahInCALCw8Oxe/dupKamwsPDQ2f78OHDYW5ujuTkZMyYMQMAkJeXh4KCAvj6+or9cnJy4Ofnh+DgYKxYsUJnDBsbG1y4cEGnbcOGDUhJScHOnTvh4eGBnj17wtraul2OsbmEsKWYG3z11Vd4+eWXsW3bNkyaNKld4iMiIiJpMmoSp1arkZiYiL1798La2lp8z02pVEKhUECpVGLevHmIjIyEvb09bGxsEB4eDl9fX7EyNTs7G35+fggKCkJkZKQ4hqmpKRwcHGBiYiK+Y9dApVLB0tKyUfvvlZSUoKCgAIWFhQAgzmHn5OQk3gnUaDTQaDT48ccfAQAXLlyAtbU1XF1dmy1CuF/MwN1HqMHBwVi3bh18fHzEPg3nhYiIiLo3o04xIpPJmmyPj4/HnDlzANyd7HfBggX46quvUF1djaCgIGzYsEFMomJiYpp8md/NzQ1Xr15tcvyYmBi9phjZsmUL5s6d26g9OjoaMTExLe7/3mNoav/3i3nChAlIS0tr1Cc4OBhbtmxpMe4GDSXKzl6jWNhA1Epykzp4Pzrkgcbo3UuJjR80P88kEVFT9J1ipFPNE0dti/PEERkXiyOIyBCSnCeOiIiIiPTDJI6IiIhIgpjEEREREUkQkzgiIiIiCWLJYjfAZbeIjLOMFpe/IqL2xCt7N8Blt4hYKUpEXQ8fpxIRERFJEJM4IiIiIgliEkdEREQkQVyxoQvjsltEv2mLZbS6Ky4fRtSx9F2xgVf2boCFDUT0IArTvzB2CETUBD5OJSIiIpIgJnFEREREEsQkjoiIiEiC+E5cN8AVG8hQxljlgDofrjxB1Dnxyt4NsLCBDMVVDoiIOi8+TiUiIiKSICZxRERERBLEJI6IiIhIgpjEEREREUkQl93qwrjsFj0oLlX1YLhcFREZgstukYjVqUTGweWqiKg98XEqERERkQQxiSMiIiKSICZxRERERBLEd+K6AS67RfSbjlxKjMtVEVF74pW9G2BhA9FvuJQYEXUVRn2cGhcXhxEjRsDa2hoqlQrTpk1DXl6eTp+qqiqo1Wo89NBDsLKywowZM1BcXCxuP3fuHF544QW4uLhAoVBg0KBBWLduXbP7PHnyJMzMzDB06ND7xrdr1y4EBgbioYcegkwmQ1ZWVqM+n3zyCSZMmAAbGxvIZDKUlpbqdexvvPEGhg8fDrlc3mQsV69ehUwma/Q5ffq0XuMTERFR12bUJC4tLQ1qtRqnT59GUlISamtrERgYiIqKCrHP/PnzsX//fuzYsQNpaWkoLCzE9OnTxe2ZmZlQqVRISEhATk4OFi9ejKioKKxfv77R/kpLSzF79mz4+/vrFV9FRQXGjh2LVauan+epsrISTz31FN55551WHPldL7/8Mp5//vkW+/z73/9GUVGR+Bk+fHir90NERERdj1Efpx45ckTn+5YtW6BSqZCZmYnx48ejrKwMn332GRITE+Hn5wcAiI+Px6BBg3D69GmMGjUKL7/8ss4Y/fr1Q0ZGBnbt2oWwsDCdbaGhoZg1axZMTU2xZ8+e+8b30ksvAbh7V6w5ERERAIDU1NT7jnevDz/8EABw/fp1nD9/vtl+Dz30EJycnFo1NhEREXV9nao6taysDABgb28P4O5dttraWgQEBIh9Bg4cCFdXV2RkZLQ4TsMYDeLj43HlyhVER0e3Q+TtZ8qUKVCpVBg7diz27dvXYt/q6mpotVqdDxEREXVNnaawob6+HhERERgzZgy8vb0BABqNBhYWFrC1tdXp6+joCI1G0+Q4p06dwvbt23Hw4EGx7fLly1i0aBFOnDgBM7NOc8gtsrKywv/8z/9gzJgxMDExwTfffINp06Zhz549mDJlSpO/iYuLQ2xsbKN2VqcS/UZuUoeps0Nb9Rsun0VEnVGnubKr1WpkZ2cjPT3d4DGys7MxdepUREdHIzAwEABQV1eHWbNmITY2Fo888kiTv9u6dSteffVV8fvhw4cxbtw4g+O419NPP40TJ04AANzc3JCTk6PX73r16oXIyEjx+4gRI1BYWIjVq1c3m8RFRUXp/Ear1cLFxYXVqUQPiMtnEVFn1CmSuLCwMBw4cADHjx9H3759xXYnJyfU1NSgtLRU525ccXFxo/fELl68CH9/f4SEhGDJkiVie3l5Ob7//nucPXtWfEeuvr4egiDAzMwMR48exZQpU+Dj4yP+pk+fPm12bJs3b8bt27cBAObm5g80lo+PD5KSkprdLpfLIZfLH2gfREREJA1GTeIEQUB4eDh2796N1NRUeHh46GwfPnw4zM3NkZycjBkzZgAA8vLyUFBQAF9fX7FfTk4O/Pz8EBwcjBUrVuiMYWNjgwsXLui0bdiwASkpKdi5cyc8PDzQs2dPWFtbt8sxtmVCmJWVBWdn5zYbj4iIiKTLqEmcWq1GYmIi9u7dC2tra/E9N6VSCYVCAaVSiXnz5iEyMhL29vawsbFBeHg4fH19MWrUKAB3H6H6+fkhKCgIkZGR4himpqZwcHCAiYmJ+I5dA5VKBUtLy0btv1dSUoKCggIUFhYCgDiHnZOTk3gnUKPRQKPR4McffwQAXLhwAdbW1nB1dW1UXHGvH3/8Ebdu3YJGo8Ht27fFOegGDx4MCwsLfPHFF7CwsMCwYcMA3J2z7vPPP8fmzZv1Pr9ERETUdRk1idu4cSMAYMKECTrt8fHxmDNnDgBgzZo1MDExwYwZM1BdXY2goCBs2LBB7Ltz505cv34dCQkJSEhIENvd3NxanBpEH/v27cPcuXPF7zNnzgQAREdHIyYmBgCwadMmnWKC8ePHNzqGprzyyitIS0sTvzcka/n5+XB3dwcALF++HNeuXYOZmRkGDhyI7du347nnnmv1cbCwoevqyCWkujMun0VEnZFMEATB2EFQ+9BqtVAqlZi+NomFDV0Ul5AiIup6Gq7fZWVlsLGxabZfp5onjoiIiIj0wySOiIiISIKYxBERERFJEJM4IiIiIgliYUMX1vBipLPXKFandlFykzoEThzHJaGIiLoQfQsbeGXvBrjsVtfGJaGIiLonPk4lIiIikiAmcUREREQSxCSOiIiISIL4Tlw3cDsjEXcsLIwdBrUTLglFRNQ9MYnrBrZ9srbF6hYiIiKSHj5OJSIiIpIgJnFEREREEsQkjoiIiEiCmMQRERERSRCTOCIiIiIJYhJHREREJEFM4oiIiIgkiEkcERERkQQxiSMiIiKSICZxRERERBLEJI6IiIhIgpjEEREREUkQkzgiIiIiCWISR0RERCRBZsYOgNqPIAgAAK1Wa+RIiIiISF8N1+2G63hzmMR1Yf/9738BAC4uLkaOhIiIiFqrvLwcSqWy2e1M4rowe3t7AEBBQUGLfwRkOK1WCxcXF/z888+wsbExdjhdFs9z++M57hg8z+2vK5xjQRBQXl6O3r17t9iPSVwXZmJy95VHpVIp2T9kqbCxseE57gA8z+2P57hj8Dy3P6mfY31uvrCwgYiIiEiCmMQRERERSRCTuC5MLpcjOjoacrnc2KF0WTzHHYPnuf3xHHcMnuf2153OsUy4X/0qEREREXU6vBNHREREJEFM4oiIiIgkiEkcERERkQQxiSMiIiKSICZxXdTHH38Md3d3WFpawsfHB99++62xQ+q0jh8/jsmTJ6N3796QyWTYs2ePznZBELBs2TI4OztDoVAgICAAly9f1ulTUlKCF198ETY2NrC1tcW8efNw69YtnT7nz5/HuHHjYGlpCRcXF7z33nvtfWidRlxcHEaMGAFra2uoVCpMmzYNeXl5On2qqqqgVqvx0EMPwcrKCjNmzEBxcbFOn4KCAkyaNAk9evSASqXCW2+9hTt37uj0SU1NxWOPPQa5XI7+/ftjy5Yt7X14ncbGjRsxZMgQcZJTX19fHD58WNzOc9z2Vq5cCZlMhoiICLGN5/nBxcTEQCaT6XwGDhwobuc5/v8E6nK2bdsmWFhYCJ9//rmQk5Mj/PWvfxVsbW2F4uJiY4fWKR06dEhYvHixsGvXLgGAsHv3bp3tK1euFJRKpbBnzx7h3LlzwpQpUwQPDw/h9u3bYp+nnnpK+MMf/iCcPn1aOHHihNC/f3/hhRdeELeXlZUJjo6OwosvvihkZ2cLX331laBQKIT//d//7ajDNKqgoCAhPj5eyM7OFrKysoRnnnlGcHV1FW7duiX2CQ0NFVxcXITk5GTh+++/F0aNGiWMHj1a3H7nzh3B29tbCAgIEM6ePSscOnRI6NWrlxAVFSX2uXLlitCjRw8hMjJSuHjxovDRRx8JpqamwpEjRzr0eI1l3759wsGDB4X/+7//E/Ly8oR33nlHMDc3F7KzswVB4Dlua99++63g7u4uDBkyRHjzzTfFdp7nBxcdHS14eXkJRUVF4uf69evidp7ju5jEdUEjR44U1Gq1+L2urk7o3bu3EBcXZ8SopOH3SVx9fb3g5OQkrF69WmwrLS0V5HK58NVXXwmCIAgXL14UAAjfffed2Ofw4cOCTCYTfvnlF0EQBGHDhg2CnZ2dUF1dLfZZuHCh4Onp2c5H1Dn9+uuvAgAhLS1NEIS759Tc3FzYsWOH2Cc3N1cAIGRkZAiCcDfZNjExETQajdhn48aNgo2NjXhe3377bcHLy0tnX88//7wQFBTU3ofUadnZ2QmbN2/mOW5j5eXlwoABA4SkpCThiSeeEJM4nue2ER0dLfzhD39ochvP8W/4OLWLqampQWZmJgICAsQ2ExMTBAQEICMjw4iRSVN+fj40Go3O+VQqlfDx8RHPZ0ZGBmxtbfH444+LfQICAmBiYoIzZ86IfcaPHw8LCwuxT1BQEPLy8nDz5s0OOprOo6ysDABgb28PAMjMzERtba3OeR44cCBcXV11zvOjjz4KR0dHsU9QUBC0Wi1ycnLEPveO0dCnO/7t19XVYdu2baioqICvry/PcRtTq9WYNGlSo3PB89x2Ll++jN69e6Nfv3548cUXUVBQAIDn+F5M4rqYGzduoK6uTucPFwAcHR2h0WiMFJV0NZyzls6nRqOBSqXS2W5mZgZ7e3udPk2Nce8+uov6+npERERgzJgx8Pb2BnD3HFhYWMDW1lan7+/P8/3OYXN9tFotbt++3R6H0+lcuHABVlZWkMvlCA0Nxe7duzF48GCe4za0bds2/PDDD4iLi2u0jee5bfj4+GDLli04cuQINm7ciPz8fIwbNw7l5eU8x/cwM3YARNS9qNVqZGdnIz093dihdEmenp7IyspCWVkZdu7cieDgYKSlpRk7rC7j559/xptvvomkpCRYWloaO5wu6+mnnxb/PWTIEPj4+MDNzQ1ff/01FAqFESPrXHgnrovp1asXTE1NG1XpFBcXw8nJyUhRSVfDOWvpfDo5OeHXX3/V2X7nzh2UlJTo9GlqjHv30R2EhYXhwIEDOHbsGPr27Su2Ozk5oaamBqWlpTr9f3+e73cOm+tjY2PTbf7Hb2Fhgf79+2P48OGIi4vDH/7wB6xbt47nuI1kZmbi119/xWOPPQYzMzOYmZkhLS0NH374IczMzODo6Mjz3A5sbW3xyCOP4Mcff+Tf8j2YxHUxFhYWGD58OJKTk8W2+vp6JCcnw9fX14iRSZOHhwecnJx0zqdWq8WZM2fE8+nr64vS0lJkZmaKfVJSUlBfXw8fHx+xz/Hjx1FbWyv2SUpKgqenJ+zs7DroaIxHEASEhYVh9+7dSElJgYeHh8724cOHw9zcXOc85+XloaCgQOc8X7hwQSdhTkpKgo2NDQYPHiz2uXeMhj7d+W+/vr4e1dXVPMdtxN/fHxcuXEBWVpb4efzxx/Hiiy+K/+Z5bnu3bt3CTz/9BGdnZ/4t38vYlRXU9rZt2ybI5XJhy5YtwsWLF4WQkBDB1tZWp0qHflNeXi6cPXtWOHv2rABA+OCDD4SzZ88K165dEwTh7hQjtra2wt69e4Xz588LU6dObXKKkWHDhglnzpwR0tPThQEDBuhMMVJaWio4OjoKL730kpCdnS1s27ZN6NGjR7eZYuS1114TlEqlkJqaqjNlQGVlpdgnNDRUcHV1FVJSUoTvv/9e8PX1FXx9fcXtDVMGBAYGCllZWcKRI0cEBweHJqcMeOutt4Tc3Fzh448/ltyUAQ9i0aJFQlpampCfny+cP39eWLRokSCTyYSjR48KgsBz3F7urU4VBJ7ntrBgwQIhNTVVyM/PF06ePCkEBAQIvXr1En799VdBEHiOGzCJ66I++ugjwdXVVbCwsBBGjhwpnD592tghdVrHjh0TADT6BAcHC4Jwd5qRpUuXCo6OjoJcLhf8/f2FvLw8nTH++9//Ci+88IJgZWUl2NjYCHPnzhXKy8t1+pw7d04YO3asIJfLhT59+ggrV67sqEM0uqbOLwAhPj5e7HP79m3h9ddfF+zs7IQePXoIzz77rFBUVKQzztWrV4Wnn35aUCgUQq9evYQFCxYItbW1On2OHTsmDB06VLCwsBD69euns4+u7uWXXxbc3NwECwsLwcHBQfD39xcTOEHgOW4vv0/ieJ4f3PPPPy84OzsLFhYWQp8+fYTnn39e+PHHH8XtPMd3yQRBEIxzD5CIiIiIDMV34oiIiIgkiEkcERERkQQxiSMiIiKSICZxRERERBLEJI6IiIhIgpjEEREREUkQkzgiIiIiCWISR0RERCRBTOKIiIiIJIhJHBFRB9NoNAgPD0e/fv0gl8vh4uKCyZMnN1qMu73JZDLs2bOnQ/dJRG3HzNgBEBF1J1evXsWYMWNga2uL1atX49FHH0VtbS3+9a9/Qa1W49KlS8YOkYgkgmunEhF1oGeeeQbnz59HXl4eevbsqbOttLQUtra2KCgoQHh4OJKTk2FiYoKnnnoKH330ERwdHQEAc+bMQWlpqc5dtIiICGRlZSE1NRUAMGHCBAwZMgSWlpbYvHkzLCwsEBoaipiYGACAu7s7rl27Jv7ezc0NV69ebc9DJ6I2xsepREQdpKSkBEeOHIFarW6UwAGAra0t6uvrMXXqVJSUlCAtLQ1JSUm4cuUKnn/++Vbv74svvkDPnj1x5swZvPfee/j73/+OpKQkAMB3330HAIiPj0dRUZH4nYikg49TiYg6yI8//ghBEDBw4MBm+yQnJ+PChQvIz8+Hi4sLAODLL7+El5cXvvvuO4wYMULv/Q0ZMgTR0dEAgAEDBmD9+vVITk7Gk08+CQcHBwB3E0cnJ6cHOCoiMhbeiSMi6iD6vL2Sm5sLFxcXMYEDgMGDB8PW1ha5ubmt2t+QIUN0vjs7O+PXX39t1RhE1HkxiSMi6iADBgyATCZ74OIFExOTRglhbW1to37m5uY632UyGerr6x9o30TUeTCJIyLqIPb29ggKCsLHH3+MioqKRttLS0sxaNAg/Pzzz/j555/F9osXL6K0tBSDBw8GADg4OKCoqEjnt1lZWa2Ox9zcHHV1da3+HRF1DkziiIg60Mcff4y6ujqMHDkS33zzDS5fvozc3Fx8+OGH8PX1RUBAAB599FG8+OKL+OGHH/Dtt99i9uzZeOKJJ/D4448DAPz8/PD999/jyy+/xOXLlxEdHY3s7OxWx+Lu7o7k5GRoNBrcvHmzrQ+ViNoZkzgiog7Ur18//PDDD5g4cSIWLFgAb29vPPnkk0hOTsbGjRshk8mwd+9e2NnZYfz48QgICEC/fv2wfft2cYygoCAsXboUb7/9NkaMGIHy8nLMnj271bH8z//8D5KSkuDi4oJhw4a15WESUQfgPHFEREREEsQ7cUREREQSxCSOiIiISIKYxBERERFJEJM4IiIiIgliEkdEREQkQUziiIiIiCSISRwRERGRBDGJIyIiIpIgJnFEREREEsQkjoiIiEiCmMQRERERSdD/A8I6pUlDBEsoAAAAAElFTkSuQmCC",
|
212 |
+
"text/plain": [
|
213 |
+
"<Figure size 640x480 with 1 Axes>"
|
214 |
+
]
|
215 |
+
},
|
216 |
+
"metadata": {},
|
217 |
+
"output_type": "display_data"
|
218 |
+
}
|
219 |
+
],
|
220 |
+
"source": [
|
221 |
+
"import seaborn as sns\n",
|
222 |
+
"\n",
|
223 |
+
"sns.histplot(markets_df, y=\"creation_date\")"
|
224 |
+
]
|
225 |
+
},
|
226 |
+
{
|
227 |
+
"cell_type": "code",
|
228 |
+
"execution_count": 25,
|
229 |
+
"metadata": {},
|
230 |
+
"outputs": [],
|
231 |
+
"source": [
|
232 |
+
"from datetime import datetime\n",
|
233 |
+
"cutoff_date1 = \"2024-12-28\"\n",
|
234 |
+
"cutoff_date2 = \"2025-01-08\"\n",
|
235 |
+
"timestamp1 = pd.Timestamp(\n",
|
236 |
+
"datetime.strptime(cutoff_date1, \"%Y-%m-%d\")\n",
|
237 |
+
").tz_localize(\"UTC\")\n",
|
238 |
+
"timestamp2 = pd.Timestamp(\n",
|
239 |
+
"datetime.strptime(cutoff_date2, \"%Y-%m-%d\")\n",
|
240 |
+
").tz_localize(\"UTC\")"
|
241 |
+
]
|
242 |
+
},
|
243 |
+
{
|
244 |
+
"cell_type": "code",
|
245 |
+
"execution_count": 26,
|
246 |
+
"metadata": {},
|
247 |
+
"outputs": [],
|
248 |
+
"source": [
|
249 |
+
"missing_data = markets_df.loc[(markets_df[\"creation_timestamp\"]>=timestamp1) & (markets_df[\"creation_timestamp\"]<=timestamp2)]"
|
250 |
+
]
|
251 |
+
},
|
252 |
+
{
|
253 |
+
"cell_type": "code",
|
254 |
+
"execution_count": 27,
|
255 |
+
"metadata": {},
|
256 |
+
"outputs": [
|
257 |
+
{
|
258 |
+
"data": {
|
259 |
+
"text/plain": [
|
260 |
+
"creation_date\n",
|
261 |
+
"2025-01-07 194\n",
|
262 |
+
"2024-12-28 106\n",
|
263 |
+
"Name: count, dtype: int64"
|
264 |
+
]
|
265 |
+
},
|
266 |
+
"execution_count": 27,
|
267 |
+
"metadata": {},
|
268 |
+
"output_type": "execute_result"
|
269 |
+
}
|
270 |
+
],
|
271 |
+
"source": [
|
272 |
+
"missing_data.creation_date.value_counts()"
|
273 |
+
]
|
274 |
+
},
|
275 |
+
{
|
276 |
+
"cell_type": "code",
|
277 |
+
"execution_count": 28,
|
278 |
+
"metadata": {},
|
279 |
+
"outputs": [
|
280 |
+
{
|
281 |
+
"data": {
|
282 |
+
"text/plain": [
|
283 |
+
"<Axes: xlabel='Count', ylabel='creation_date'>"
|
284 |
+
]
|
285 |
+
},
|
286 |
+
"execution_count": 28,
|
287 |
+
"metadata": {},
|
288 |
+
"output_type": "execute_result"
|
289 |
+
},
|
290 |
+
{
|
291 |
+
"data": {
|
292 |
+
"image/png": "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RntIZIzCYgh1AADY3QUR6iZOnKj33ntPmzZtUtu2ba32yMhIlZeXq7i42ONs3aFDhxQZGekxx+7duzV06FCNHz9e06dPt9qPHj2qzz77TDt27NDEiRMlnTwraIxRkyZN9NFHH+mWW25R3759rXXatGlTp/qPHj2qG264QcHBwVqzZo38/Pysvg8++EAVFRWSTl4+/aWsrCz9+te/1oIFCzR69GiPvlatWuntt99WaWmpfvjhB7Vu3VoPP/yw2rdvX6faAADApaFBQ50xRpMmTdKaNWu0ceNGxcXFefT36tVLfn5+ysjI0MiRIyVJ+fn5KigoUEJCgjVu165dGjJkiMaMGaM5c+Z4zBESEqIvvvjCo+2ZZ55RZmam3nzzTcXFxalZs2YKDg72aR/cbreSk5MVEBCgd955p8bn4GJjY2tdb+PGjfrVr36lxx577LSXawMDA9WmTRtVVFTorbfe0u233+5TnQAAwN4aNNSlpKRoxYoVWrt2rYKDg63PyblcLjmdTrlcLo0bN06pqakKCwtTSEiIJk2apISEBOsmiby8PA0ZMkTJyclKTU215mjcuLFatWqlRo0aWZ/RqxYeHq7AwMAa7f/tyJEjKigo0MGDByXJeoZeZGSkIiMj5Xa7lZSUpBMnTmjZsmVyu91yu92STp5pa9y4ca3zbtiwQb/61a/0xz/+USNHjrRq9vf3t27wyMnJ0bfffqsePXro22+/1axZs1RVVaU///nPdf45AwAA+2vQ59QtWrRIJSUlGjRokKKioqxl5cqV1pgFCxboV7/6lUaOHKmBAwcqMjJSq1evtvrffPNNfffdd1q2bJnHHL179z7r+t555x317NlTN998s6STj0Tp2bOnFi9eLEnavn27cnJy9MUXX6hjx44e2//mm29OOe/LL7+sEydOKD093WOdXz5/r7S0VNOnT9fll1+uESNGqE2bNtq8eXONm0YAAACkC+w5dag/1c+5GfynZxTeqUdDlwOggRwpyNf6OWO1bds2XXXVVQ1dDoAzOJvn1PHdrwAAADZAqAMAALABQh0AAIANEOoAAABsgFAHAABgA4Q6AAAAGyDUAQAA2AChDgAAwAYIdQAAADZAqAMAALABQh0AAIANEOoAAABsgFAHAABgA4Q6AAAAGyDUAQAA2AChDgAAwAYIdQAAADZAqAMAALABQh0AAIANEOoA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",
|
293 |
+
"text/plain": [
|
294 |
+
"<Figure size 640x480 with 1 Axes>"
|
295 |
+
]
|
296 |
+
},
|
297 |
+
"metadata": {},
|
298 |
+
"output_type": "display_data"
|
299 |
+
}
|
300 |
+
],
|
301 |
+
"source": [
|
302 |
+
"sns.histplot(missing_data, y=\"creation_date\")"
|
303 |
+
]
|
304 |
+
},
|
305 |
+
{
|
306 |
+
"cell_type": "code",
|
307 |
+
"execution_count": 24,
|
308 |
+
"metadata": {},
|
309 |
+
"outputs": [
|
310 |
+
{
|
311 |
+
"data": {
|
312 |
+
"text/plain": [
|
313 |
+
"creation_date\n",
|
314 |
+
"2025-01-11 5275\n",
|
315 |
+
"2025-01-12 3919\n",
|
316 |
+
"2025-01-10 3711\n",
|
317 |
+
"2025-01-09 2517\n",
|
318 |
+
"2025-01-08 2231\n",
|
319 |
+
"2025-01-13 1124\n",
|
320 |
+
"2025-01-07 194\n",
|
321 |
+
"Name: count, dtype: int64"
|
322 |
+
]
|
323 |
+
},
|
324 |
+
"execution_count": 24,
|
325 |
+
"metadata": {},
|
326 |
+
"output_type": "execute_result"
|
327 |
+
}
|
328 |
+
],
|
329 |
+
"source": [
|
330 |
+
"markets_df.loc[markets_df[\"creation_timestamp\"]>timestamp2].creation_date.value_counts()"
|
331 |
+
]
|
332 |
+
},
|
333 |
+
{
|
334 |
+
"cell_type": "code",
|
335 |
+
"execution_count": null,
|
336 |
+
"metadata": {},
|
337 |
+
"outputs": [],
|
338 |
+
"source": []
|
339 |
+
},
|
340 |
{
|
341 |
"cell_type": "code",
|
342 |
"execution_count": 6,
|
notebooks/{wow_retention.ipynb β retention_metrics.ipynb}
RENAMED
File without changes
|
scripts/{wow_retentions.py β retention_metrics.py}
RENAMED
@@ -1,6 +1,6 @@
|
|
1 |
import pandas as pd
|
2 |
from datetime import datetime, timedelta
|
3 |
-
from utils import DATA_DIR
|
4 |
|
5 |
|
6 |
# Basic Week over Week Retention
|
@@ -111,10 +111,10 @@ def calculate_cohort_retention(df, max_weeks=12) -> pd.DataFrame:
|
|
111 |
return retention_matrix.round(2)
|
112 |
|
113 |
|
114 |
-
def prepare_retention_dataset(
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
traders_df["trader_type"] = traders_df["staking"].apply(
|
119 |
lambda x: "non_Olas" if x == "non_Olas" else "Olas"
|
120 |
)
|
@@ -132,7 +132,10 @@ def prepare_retention_dataset() -> pd.DataFrame:
|
|
132 |
|
133 |
|
134 |
if __name__ == "__main__":
|
135 |
-
|
|
|
|
|
|
|
136 |
# Usage example:
|
137 |
wow_retention = calculate_wow_retention_by_type(all_traders)
|
138 |
cohort_retention = calculate_cohort_retention(all_traders)
|
|
|
1 |
import pandas as pd
|
2 |
from datetime import datetime, timedelta
|
3 |
+
from scripts.utils import DATA_DIR
|
4 |
|
5 |
|
6 |
# Basic Week over Week Retention
|
|
|
111 |
return retention_matrix.round(2)
|
112 |
|
113 |
|
114 |
+
def prepare_retention_dataset(
|
115 |
+
traders_df: pd.DataFrame, unknown_df: pd.DataFrame
|
116 |
+
) -> pd.DataFrame:
|
117 |
+
|
118 |
traders_df["trader_type"] = traders_df["staking"].apply(
|
119 |
lambda x: "non_Olas" if x == "non_Olas" else "Olas"
|
120 |
)
|
|
|
132 |
|
133 |
|
134 |
if __name__ == "__main__":
|
135 |
+
# read all datasets
|
136 |
+
traders_df = pd.read_parquet(DATA_DIR / "all_trades_profitability.parquet")
|
137 |
+
unknown_df = pd.read_parquet(DATA_DIR / "unknown_traders.parquet")
|
138 |
+
all_traders = prepare_retention_dataset(traders_df, unknown_df)
|
139 |
# Usage example:
|
140 |
wow_retention = calculate_wow_retention_by_type(all_traders)
|
141 |
cohort_retention = calculate_cohort_retention(all_traders)
|
tabs/retention_plots.py
CHANGED
@@ -1,6 +1,8 @@
|
|
1 |
import plotly.express as px
|
|
|
2 |
import plotly.graph_objects as go
|
3 |
import seaborn as sns
|
|
|
4 |
import matplotlib.pyplot as plt
|
5 |
from matplotlib.ticker import PercentFormatter
|
6 |
|
@@ -46,8 +48,9 @@ def plot_wow_retention_by_type(wow_retention):
|
|
46 |
fig.update_traces(
|
47 |
hovertemplate="<b>%{y:.1f}%</b><br>Week: %{x|%Y-%m-%d}<extra></extra>"
|
48 |
)
|
49 |
-
|
50 |
-
|
|
|
51 |
|
52 |
|
53 |
def plot_cohort_retention_heatmap(retention_matrix):
|
@@ -95,4 +98,5 @@ def plot_cohort_retention_heatmap(retention_matrix):
|
|
95 |
# Adjust layout to prevent label cutoff
|
96 |
plt.tight_layout()
|
97 |
|
98 |
-
|
|
|
|
1 |
import plotly.express as px
|
2 |
+
import gradio as gr
|
3 |
import plotly.graph_objects as go
|
4 |
import seaborn as sns
|
5 |
+
import pandas as pd
|
6 |
import matplotlib.pyplot as plt
|
7 |
from matplotlib.ticker import PercentFormatter
|
8 |
|
|
|
48 |
fig.update_traces(
|
49 |
hovertemplate="<b>%{y:.1f}%</b><br>Week: %{x|%Y-%m-%d}<extra></extra>"
|
50 |
)
|
51 |
+
return gr.Plot(
|
52 |
+
value=fig,
|
53 |
+
)
|
54 |
|
55 |
|
56 |
def plot_cohort_retention_heatmap(retention_matrix):
|
|
|
98 |
# Adjust layout to prevent label cutoff
|
99 |
plt.tight_layout()
|
100 |
|
101 |
+
cohort_fig = ax.get_figure()
|
102 |
+
return gr.Plot(value=cohort_fig)
|