Skip to content

Instantly share code, notes, and snippets.

@calebrob6
Last active January 13, 2025 22:09
Show Gist options
  • Save calebrob6/74954c94feab25a67014a9e8cfa82daa to your computer and use it in GitHub Desktop.
Save calebrob6/74954c94feab25a67014a9e8cfa82daa to your computer and use it in GitHub Desktop.
Small experiment showing KNN performance on EuroSAT with MOSAIKS features and different numbers of training samples per class.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from torchgeo.datasets import EuroSAT\n",
"from torch.utils.data import DataLoader\n",
"import matplotlib.pyplot as plt\n",
"from torchgeo.models import RCF\n",
"import torch\n",
"import numpy as np\n",
"from tqdm import tqdm"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"device = torch.device(\"cuda:0\")"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"train_ds = EuroSAT(root=\"data/EuroSAT/\", split=\"train\")\n",
"test_ds = EuroSAT(root=\"data/EuroSAT/\", split=\"test\")\n",
"\n",
"train_dl = DataLoader(train_ds, batch_size=64, num_workers=8, shuffle=False)\n",
"test_dl = DataLoader(test_ds, batch_size=32, num_workers=8, shuffle=False)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"model = RCF(in_channels=13, features=128).to(device)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"def features(dl, model, device):\n",
" model.eval()\n",
" features = []\n",
" labels = []\n",
" for data in tqdm(dl):\n",
" x = data[\"image\"].to(device)\n",
" y = data[\"label\"].numpy()\n",
" with torch.inference_mode():\n",
" f = model(x).cpu().numpy()\n",
" features.append(f)\n",
" labels.append(y)\n",
" features = np.concatenate(features, axis=0)\n",
" labels = np.concatenate(labels, axis=0)\n",
" return features, labels"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 254/254 [00:17<00:00, 14.65it/s]\n"
]
}
],
"source": [
"x_train, y_train = features(train_dl, model, device)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 169/169 [00:08<00:00, 18.92it/s]\n"
]
}
],
"source": [
"x_test, y_test = features(test_dl, model, device)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsClassifier"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-2 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: #000;\n",
" --sklearn-color-text-muted: #666;\n",
" --sklearn-color-line: gray;\n",
" /* Definition of color scheme for unfitted estimators */\n",
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
" --sklearn-color-unfitted-level-3: chocolate;\n",
" /* Definition of color scheme for fitted estimators */\n",
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
" --sklearn-color-fitted-level-1: #d4ebff;\n",
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
"\n",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-2 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-2 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-2 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-2 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-2 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: flex;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
" align-items: start;\n",
" justify-content: space-between;\n",
" gap: 0.5em;\n",
"}\n",
"\n",
"#sk-container-id-2 label.sk-toggleable__label .caption {\n",
" font-size: 0.6rem;\n",
" font-weight: lighter;\n",
" color: var(--sklearn-color-text-muted);\n",
"}\n",
"\n",
"#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-2 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-2 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-2 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-2 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 0.5em;\n",
" text-align: center;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted,\n",
"a:link.sk-estimator-doc-link.fitted,\n",
"a:visited.sk-estimator-doc-link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n",
" display: block;\n",
"}\n",
"\n",
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
"\n",
"#sk-container-id-2 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-2 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-2 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=3)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>KNeighborsClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier(n_neighbors=3)</pre></div> </div></div></div></div>"
],
"text/plain": [
"KNeighborsClassifier(n_neighbors=3)"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"knn = KNeighborsClassifier(n_neighbors=3)\n",
"knn.fit(x_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.807962962962963"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"score_with_all_training = knn.score(x_test, y_test)\n",
"score_with_all_training"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"classes = np.unique(y_train)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1620.0"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x_train.shape[0] / len(classes)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"K=1 shots, 0.37 +/- 0.04\n",
"K=5 shots, 0.45 +/- 0.03\n",
"K=10 shots, 0.51 +/- 0.02\n",
"K=20 shots, 0.55 +/- 0.01\n",
"K=50 shots, 0.62 +/- 0.01\n",
"K=100 shots, 0.66 +/- 0.01\n",
"K=200 shots, 0.70 +/- 0.00\n",
"K=400 shots, 0.74 +/- 0.01\n",
"K=800 shots, 0.78 +/- 0.00\n"
]
}
],
"source": [
"\n",
"num_shots_list = [1, 5, 10, 20, 50, 100, 200, 400, 800]\n",
"num_trials = 20\n",
"\n",
"\n",
"mean_scores_per_shot = []\n",
"std_scores_per_shot = []\n",
"for num_shots in num_shots_list:\n",
" scores = []\n",
" for i in range(num_trials):\n",
"\n",
" t_x_train = []\n",
" t_y_train = []\n",
"\n",
" for c in classes:\n",
" # find all the samples with class c\n",
" idxs = np.where(y_train == c)[0]\n",
" # select 5 at random\n",
" idxs = np.random.choice(idxs, num_shots, replace=False)\n",
" t_x_train.append(x_train[idxs])\n",
" t_y_train.append(y_train[idxs])\n",
" t_x_train = np.concatenate(t_x_train, axis=0)\n",
" t_y_train = np.concatenate(t_y_train, axis=0)\n",
"\n",
" n_neighbors = min(3, num_shots)\n",
"\n",
" knn = KNeighborsClassifier(n_neighbors=n_neighbors)\n",
" knn.fit(t_x_train, t_y_train)\n",
"\n",
" scores.append(knn.score(x_test, y_test))\n",
" print(f\"K={num_shots} shots, {np.mean(scores):.2f} +/- {np.std(scores):.2f}\")\n",
" mean_scores_per_shot.append(np.mean(scores))\n",
" std_scores_per_shot.append(np.std(scores))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"mean_scores_per_shot = np.array(mean_scores_per_shot)\n",
"std_scores_per_shot = np.array(std_scores_per_shot)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAj8AAAG4CAYAAACq8YbKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAh1RJREFUeJzt3Xd8U1X/B/BPmrYZTfcuhQId7KFgGQJlCgiiQEFAZYiCbFQUeWSKiI+oKIIIimxBLSqKA+EBBAEBfwwRxLLKhu6ZJk2T8/ujzaVp0tKWjrT9vF+vviDnnntzzm3Gt2fKhBACRERERLWEQ1UXgIiIiKgyMfghIiKiWoXBDxEREdUqDH6IiIioVmHwQ0RERLUKgx8iIiKqVRj8EBERUa3C4McGIQTS09PBJZCIiIhqHgY/NmRkZMDd3R0ZGRlVXRQiIiIqZwx+iIiIqFZh8ENERES1CoMfIiIiqlUY/BAREVGtwuCHiIiIahUGP0RERFSrMPghIiKiWoXBDxEREdUqDH6IiIioVmHwQ0RERLUKgx8iIiKqVRj8EBERUa3C4IeIiIhqFQY/REREVKs4VnUBap2srKKPyeWAUlmyvA4OgEpVtrxaLSCE7bwyGaBWly1vdjZgMhVdDheXsuXV6QCjsXzyqtV55QYAvR7IzS2fvCpV3n0GgJwcwGAon7xKZd7rorR5DYa8/EVRKABHx9Lnzc3NuxdFcXYGnJxKn9dozPvdFcXJKS9/afOaTHmvtfLI6+iYdy+AvPeEVls+eUvzvudnhO28/IwofV57+IyoSoKspKWlCQAiLS2t/C+e9zFh++fRRy3zqtVF542Ksszr41N03rZtLfOGhBSdt2lTy7xNmxadNyTEMm/btkXn9fGxzBsVVXRetdoy76OPFn/fCoqOLj5vZubdvKNGFZ83Pv5u3okTi897+fLdvDNmFJ/377/v5p03r/i8R4/ezfvOO8Xn3bv3bt7ly4vPu2PH3bxr1xaf96uv7ub96qvi865dezfvjh3F512+/G7evXuLz/vOO3fzHj1afN558+7m/fvv4vPOmHE37+XLxeedOPFu3vj44vOOGnU3b2Zm8Xmjo4WF4vLyMyLvh58Rd3+q82dEFbK7bi+9Xo+ZM2ciKCgIKpUK7dq1w65du0p07u7du9GtWzf4+PjAw8MDkZGR2LhxYwWXmIiIiKoTmRBCVHUhCho+fDhiYmIwffp0hIeHY926dTh27Bj27t2LTp06FXne999/jyeeeAIdOnTA8OHDIZPJ8NVXX2H//v14//338eKLL5a4DOnp6XB3d0daWhrc3NzKo1p3sUm79HnZpF36vPbQpM1ur5LlZbfXXfyMKH3e6vwZUYXsKvg5evQo2rVrhyVLlmDGjBkAAJ1Oh+bNm8PPzw+HDh0q8txHHnkEZ86cwaVLl6DI/9DJzc1F48aN4eLiglOnTpW4HBUa/BAREVGVsqtur5iYGMjlcowbN05KUyqVGDt2LA4fPoxr164VeW56ejo8PT2lwAcAHB0d4ePjA1XBv2iIiIioVrOr4OfEiROIiIiwam2JjIwEAJw8ebLIc7t27YozZ85gzpw5uHDhAi5evIiFCxfizz//xKuvvlqRxSYiIqJqxK6mut+6dQuBgYFW6ea0mzdvFnnunDlzcPnyZSxatAhvvvkmAECtVmPbtm14/PHHi31evV4PfYE+yvT09LIUn4iIiKoBu2r5yc7Otui2MlPmD/DLLmYwokKhQEREBKKjo7FlyxZs2rQJbdu2xdNPP40//vij2OddvHgx3N3dpZ+6deveX0WIiIjIbtlVy49KpbJogTHT5c/sKG7szuTJk/HHH3/g+PHjcMgfJT906FA0a9YM06ZNw5EjR4o8d9asWXjppZekx+np6QyAiIiIaii7avkJDAzErVu3rNLNaUFBQTbPy8nJwZo1a9CvXz8p8AEAJycn9O3bF3/++Sdyipmmp1Ao4ObmZvFDRERENZNdBT+tW7dGbGys1Zgbc6tN69atbZ6XlJSE3NxcGG2s3WAwGGAymWweIyIiotrHroKf6OhoGI1GrF69WkrT6/VYu3Yt2rVrJ3VFXb16FefOnZPy+Pn5wcPDA99++61FC09mZiZ++OEHNG7cmNPdiYiICICdjflp164dhgwZglmzZiE+Ph5hYWFYv3494uLisGbNGinfyJEj8dtvv8G8PqNcLseMGTMwe/ZstG/fHiNHjoTRaMSaNWtw/fp1bNq0qaqqRERERHbGroIfANiwYQPmzJmDjRs3IiUlBS1btsSOHTvQpUuXYs97/fXX0aBBA3z44YdYsGAB9Ho9WrZsiZiYGAwePLiSSk9ERET2zq62t7AX3N6CiIio5rKrMT9EREREFY3BDxEREdUqDH6IiIioVmHwQ0RERLUKgx8iIiKqVexuqjsRERHVDEII6HNN0BtM0Oca8/6fa0KYn6ZKy8Xgh4iIiErNYDTlBzZ3gxqd+f/5/xqMJgiRFwRl5RiRkpWDlOwc1PNyQXSb4CorO4MfIiIikphMAjnGu601OotWG2N+uglGU94ygUIIZOmNSNHmIFmbkxfgaA1IzspBitb8Y0BOrkl6DpkMeLx1EJzkVTP6hsEPERFRLVGwtUaXa0KOjdaagkGKEAKZ+lykaA15wY05oMky5P+bH9gYTcU8612uSkd4qp0R4a+BNscIdxWDHyIiIiqD0rbWAAUCmyxDXotNEa02BmPJNoIwBzZeamd4ujjBU+0MTxfLx05yBzg4AN0b+1fUrSgRBj9ERER2rHBrTcExNrZaawAbgU1+MJOc32pjTss1lTKwcXGGp9op/19nKc1D7SR1YTk4AEpHORRODlA4yqF0kkPlLIfS0QFKJzkUjlU/0ZzBDxERURUwt9bc7Xa6d2sNkBfYZOhypbE0BVtpkvNbbkoT2LgpHe+20OS30njlt9p4qi0DGwBwzg9ilE75/zrm/V+Rn6ZwlJfrfaoIDH6IiIjKmaFgUFPC1hoAMAmBTF1u0QOH88falCawkVppzK02xQQ2cgcZFIWCmrxAJ///jnI4OMjK7T5VFQY/REREJVTW1hogL7CRWmxsBDbJWTlI1RpKFNjIALipnOCpdpICmYJja7xcnOGhcoJjgcBGJivQalMgsCkY7DjbQZdUZWDwQ0REhOJba8zpBhutNUCBwCbLsvupYHBTlsCm8Ngac7BTOLABAEe5TBpTY26tURXonlI4OkAmq/6tNuWBwQ8REdVoJpO42zJTytYa4G5gk2wR2BSY7p0/9qao8wuSAXBXOd3tgioQ3JjH2rirneDoYBnYODggf/Dw3UHEFl1Sjg5WwRAVjcEPERFVWzkFg5pSttYAeYFNerbBspXGPGi4QFeUUZQ8sLk7xsapRIENADg5OkizoQoPJs6bNcVWm/LE4IeIiOxOca01d7umjDAVs7aeySSQrjNI07vNgU3BxyUObGSAh8rJYuDw3a6ovH/dVI42A5u7U7+tW2vM/5fXgEHE1QmDHyIiqlS2Wmt0hTa+LK61BsgLbNJ0hiIHDqdoDUgrY2BTeOCwp9oZ7iqnIgMURYExNdJgYufaN4i4OmHwQ0RE5cJWa41OGlNTstYa83XSdAaLsTUFF+pLyTIgNTsHJZntbQ5sbI2t8SxBYCOXy4qc8m0OeGrC1O/ahsEPERHdU3m01gB5gU1qdqEuKK2hTIGNgwzwUFlupVBwELGXizPclEUHNjLZ3UHESifbg4mrauNNqlgMfoiIarHyaq0BAKNJIK1wYJNluSFmWrah5IGN2vZWCubp3u5Kp2JbXcxTvwu31nDqNzH4ISKqoQq31ugMhYOakrXWAHcDm6K2UkjR5iA124ASDLGBXCaDu7TSsGUXlPmx2z0Cm4KDiM1jbQruH8VBxFQcBj9ERNVMwdYai66nMrTWAECuyYQ0rcFq4HDBVps0XckDGw+LmVBOpQ5sgJqxfxTZLwY/RER2JOeeQU3JW2uAu4FNcuFF+QoMIi5xYOMgk6Z4e9qYEeWpdoKbygkO9+hKqi37R5H9YvBDRFQJyru1BigQ2BRalK/gbt/p2QaUZAvMwoFNwVYbc7eUq9LxnoEN94+i6oDBDxHRfbpXa43OYESusWS7cJvlGk15s6IKDxwusAJxaQMbmwOHSxHYANaDiBWO3D+Kqh8GP0RERTCZRIGZT+XTWgPkBTbmlhqLgcNlCGwcHWRWWykUHmtT0sCG+0dRbcHgh4hqJZuBzH221gB5O4OnaouY7p2flq7LLdG1HB1kNrdSKNiK46p0LHFLC/ePIsrD4IeIarwMnUEKSDJ0uWVqrQEsAxvLHb7vpmWUMrCx2Eqh0PYKGkXJAxvuH0VUcgx+iKhGEUIgXZebP3U7L0ApSQuOwWiymt5tMStKW/LAxkkuK3JsTVkCGwBWs6MU3D+KqMwY/BBRtWbeudvcIpOabYDRRrBjEgI3U7NxLSXbYiuFsgQ2hRflK9wlVdrAhvtHEVUuBj9EVK2YCm6hkD8w2Ghjv4RckwlXk7U4fycTsXcycD4+E9ocY7HXdpY7WAwUtprurXaGi0JeqsCG+0cR2R8GP0Rk13KNpvxgx4BUbQ7SdQab43Vyck24nJiF2PgMxN7JwKWELOgLLQaocHRAiLcaPhqFzS4pF+fSBTYA948iqo4Y/BCRXTEPKk7Nb9nJKGL14ewcIy4m5LXqxN7JRFxSFnILtQCpneWI8HNFuL8GEf6uqOulgqNDyVtZOIiYqGZi8ENEVSon1yQFOinaHGTpc20GOxk6A2LvZOJ8fF6wcy1Fa5XPXeWECH8NIvxcEeHvikAPZbHr23D/KKLaicEPEVUqncF4d3Cy1oAsve2BxslZOfmtOnnjdW6l6azy+LoqEO6X16oT4a+Br0Zhs4vJUS6Dh9oZHqq8vae4fxRR7cbgh4gqVHaOEanZeTOrUrU5NgcdCyFwJ0OfF+jkt+4kZuZY5avjoUKEvwbh+V1Znmpnm8+pcHKAp9oZ7ioneKid4Kp0Kvd6EVH1xeCHiMqVNic3rwsrK69lR2ewDnZMJoEbqdl5LTvxmTh/J8Nq1WMHGVDPS53fquOKMF8NNErbH1lqhRweqrxp5x4qZ6ic2V1FREVj8ENE9yVTnysFOinaHOTkWk/FyjWacCVZW6BlJxPZhYIiRwcZGvq6SAOUQ301UDpZBzEyGeCqzGvR8VA5wV3txLE5RFQqDH6IqMSEEMjQ5yI16+6CggYbwY4+14hLCVk4H58pTTvPMVrmUzo5INQ3f7yOnwb1fVxsrncjd5DBTeUojdlxVzlxc00iui8MfoioSEIIpGfnSttEpGUbbG4Voc3JxYX4TGk2VlyS1mrhQY3CEeH+GmmAcl1Ptc1p4gUHJ0s7knNgMhGVIwY/RCQpuHpyarYBaVrbqyenZRukKefn72Tgeko2CufyVDshwt9VCnYC3G1PO+fgZCKqbAx+iGoxo0lIa+ykZee17NhaPTkpU4/Y/G0iYuMzcCddb5XH31WB8Pwp5+F+rvDRONucds7ByURU1Rj8ENUiuUYTUrMtV08uHOwIIXArTSeN1zl/JxPJWstp5zIAdTxV+YsJahDu7wp3lXWLjcXgZHVesMPdx4moqjH4IarBcnJNSM3On4mVlYNMG6snm0wC11K00nid8/GZVjucy2UyhHirpW0iwnw1cFFYf3xwcDIRVQcMfohqEH3u3dWTU7Jsr55sMJoQl5SVt9t5fAYuxmdZTTt3kssQ6nt3cHJDHxcobEw7Nw9O9sxv1eHgZCKqDhj8EFVjOoNRCnSKWj1ZbzDiYsLd3c4vJ2bBUGjGlspJjjA/jTRep7632maLTcHByZ4uztDYaP0hIrJ3/OQiqkZKsnpypj5v2vn5/NWTryZpYSzU1+WqdLy727mfK4I9VTZbbDg4mYhqIgY/RHbMvHqyefq53mA9FStVmyMNTo69k4kbqdlWebxcnC12O/d3s94AlIOTiai2YPBDZCdKsnqyEAKJmTnSTuexdzIQn2E97TzATSnNworw08Bbo7DKkzc4ucA2ERycTES1BIMfoioihEC6Lleadp6qzbFaPdmUP+284G7nKVqDRR4ZgLpeamlwcpifxua0cw5OJiLKw+CHqJKYTALpOkPemJ38rSKMhYIdo0ngWrI2f3ByJi7EZyKz0IwtuYMM9b3VCM9fYyfMTwO1s/VbWekkh4faiYOTiYgK4achUQUxFtwqQmt79WSD0YTLiVlSy86FhEzoC3V1OcsdEOrrkrdVhL8GDXxcbO5irlbI4al2hoc6b08sWzuiExERgx+iclOS1ZN1BmPeTKz88TqXE7OQW2jvLLVz/rTz/NlYIV7W0845OJmIqOwY/BCVkcFoym/VKXr15AydIW+38/yp51eTtSi8T6ib0hER/q5Sy04dD5XVBqCFByd7qJ1t7ohORET3xuCHqISEEEjI1CMlfzZWps569eQUbY405fx8fAZupuqs8vhonKXxOhH+rvBztZ527iiXSV1YHJxMRFS+7C740ev1mDt3LjZu3IiUlBS0bNkSb775Jnr16lXsefXr18eVK1dsHgsLC8P58+crorhUS8Rn6HAxPstiuwghBOIz9NI2EefvZCIh03raeZC7UppyHu7vCi8XZ6s85sHJeT8cnExEVJHs7hN29OjRiImJwfTp0xEeHo5169bh0Ucfxd69e9GpU6ciz/vggw+QmZlpkXblyhXMnj0bjzzySEUXm2qo5KwcXIjPRHq2AUII3EjNRuydTGmdnbTsQtPOZUA9L7U0XifcTwNXpfW0cw5OJiKqOjIhCo9SqDpHjx5Fu3btsGTJEsyYMQMAoNPp0Lx5c/j5+eHQoUOlut6bb76JOXPm4ODBg+jYsWOJz0tPT4e7uzvS0tLg5uZWquekmiEtO2+sTkpWDgDg/J0MfP1/13EpMcsin6ODDA18XKRtIkJ9NVZbQHBwMhGRfbGrlp+YmBjI5XKMGzdOSlMqlRg7diz+85//4Nq1a6hbt26Jr/fFF1+gQYMGpQp8qHbL1OfiYnwmEvJXTb6drsO2/7uOE9dSAeTtdl5wvE4DHxc4FZqJVXBwsnkTUA5OJiKyH3YV/Jw4cQIRERFWrS2RkZEAgJMnT5Y4+Dlx4gT++ecfvP766/fMq9frodffHauRnp5eilJTTZCdY8TFhEzcSddBiLxZWt+fuon9sYkwCgGZDOgc5oMBrYLgobYcs8PByURE1YtdBT+3bt1CYGCgVbo57ebNmyW+1ubNmwEATz311D3zLl68GAsWLCjxtanm0OcacTkxCzdTs2Ey5T3e/U88fv77FnT5m4i2rOOOwW2CUcdDBYCDk4mIqju7+tTOzs6GQmG9AaNSqZSOl4TJZMLWrVvxwAMPoEmTJvfMP2vWLLz00kvS4/T09FJ1r1H1YzCacCUpC9eSs2E0CZhMAocvJeG7kzekvbPqeakxtG0wGgfktUT6uykR6udicysJIiKqPuzqU1ylUll0P5npdDrpeEn89ttvuHHjBl588cUS5VcoFDaDLqp5jCaBq8laXEnKkjYRPXMzDTH/dx3XUvKCay8XZwx6oA4iG3jBQSaDq9IRjQJcrbq7iIioerKr4CcwMBA3btywSr916xYAICgoqETX2bx5MxwcHDB8+PByLR9VXyZT3jT1y4lZyMnfO+taihYx/3cdZ27mjfFSOcnRr0UgejTxg5PcAc6ODgj10yDIXWm1CCEREVVfdhX8tG7dGnv37kV6errFoOcjR45Ix+9Fr9dj27Zt6Nq1a4mDJaq5hBC4labD5cQsZOcYAeStwvzdiRs4dDEJAnmzs7o18kX/FkHQKB3h4ADU9VSjgY+L1Z5aRERU/dnVJ3t0dDSMRiNWr14tpen1eqxduxbt2rWTxuFcvXoV586ds3mNn376CampqSUa6Ew1W3y6Dn9cSsbZm+nIzjFCZzDiuxM38Pq3f+NgfuDTNsQTCx9vhmEP1YNG6QgfVwXaN/RGuL8rAx8iohrKrlp+2rVrhyFDhmDWrFmIj49HWFgY1q9fj7i4OKxZs0bKN3LkSPz222+wtT7j5s2boVAoMHjw4MosOtmRpEw9LiZkIT1/9WWjSWD/+QR8f+omMvL34wr1dcHQtnUR6qsBALgoHBHhr4G3hmO/iIhqOrsKfgBgw4YNmDNnjsXeXjt27ECXLl3ueW56ejp+/PFH9OvXD+7u7pVQWrInaVoDLiTcXZVZCIFT19MQc/w6bqflDZr3c1Vg8IPBeLCeB2QyGRzlMoT6ahDsqeK4HiKiWsKutrewF9zeonopvCozAFxOzMLX/3cNsXfy9nvTKBzxWMtAREX4wlHuAJkMqOOpQkMfDbeaICKqZeyu5YeopAqvygwAiZl6fHP8Bo7GJQPI246iZxN/9G0eIK3P4+nijEYBrlyckIioluKnP1U7OkPeqsy30vJWZQaALH0ufjx9C3vOxSPXJCAD0L6hN55oHSSN41E5yxHur4Gfq7LqCk9ERFWOwQ9VG4VXZTan7f03Hjv+ugVt/lT2JgGuGNKmLup5qwEAcrkMDbxdUM9LzT23iIiIwQ/ZP1urMgshcCwuBd+cuI7EzLwBznU8VIhuE4zmQW7S4OVADyVCfTVQOsmrrPxERGRfGPyQ3TKZBK6nZCMu6e6qzAAQeycDX//fdVxOzAIAuKuc8ETrIDwc6iO17LirnRDh7wp3lVOVlJ2IiOwXgx+yO+ZVmS8lZEFnMErpt9N0iDl+HSevpQIAFI4O6NMsAI809Yciv2VH4eSAcD9XBLhzXA8REdnG4IfsSny6DhcSMqHV3w160rMN+OGvm/gtNgEmAchkQJdwXwxoFSS17MgdZKjnrUZ9bxfIOa6HiIiKweCH7EJSph4X4jOlFZgBQJ9rxK6zd/DLmdvQGfK6vVoGuyP6wWAEeaikfP5uSoT7c1wPERGVDIMfqlJ5qzJnICXLIKWZTAKHLyXhu5M3kKLNSw/xVmNIm2A0Dri76KSr0hGNAlzhoXau9HITEVH1xeCHqkSGzoCLCVlILLAqMwCcuZmGr//vOq6nZAMAvF2cMeiBOniogRcc8mdwOTs6INRPgyB3JbekICKiUmPwQ5VKm5OLSwlZ0l5bZtdStIj58zrO3EoHAKic5OjfMhDdG/vBKX93dQcHoK6nGvV9XKQ0IiKi0mLwQ5XCvCrzzdRsFNxNLkWbg+9O3MChi0kQyBu43K2RL/q3CIJGeffl6eOqQIS/RtqigoiIqKz4TUIVKic3b1Xm6yl3V2UG8vbl+uXMbew6ewc5xrzBzG1DPDHowToW20+oFXJE+LvCJ3+LCiIiovvF4IcqRK7RlLcqc7IWRuPdoCfXZMKB2ER8/9dNaWZXmK8GQ9oGI9RXI+VzlMvQ0EeDul4qjushIqJyxeCHypV5VebLSVkwFFiVWQiBk9dSse34DdxOzxvv4++qwOA2wXigrocU4MhkQJCHCqG+Gjg7clwPERGVPwY/VG7StAacvpFmsSozAFxKzMTXf17H+fhMAIBG4YgBrYLQJcIHjg53AxxPF2dE+GvgquSWFEREVHEY/FC5yNAZcOJairTxKAAkZOjx7YkbOBqXDABwksvQq4k/+jQPsBi4rHKWI9xPAz83bklBREQVj8EP3bcsfS6OX02VAp9MfS5+PH0Le8/FI9ckIAPQIdQbT7SuAy+XuwsSyuUy1Pd2QYiXWtqQlIiIqKIx+KH7kp1jxPGrKTDkmmAwmrDnXDx+PH0L2py8rq8mga4Y0qYu6nmpLc4LcFcizI9bUhARUeVj8ENlpjPkBT56gwmp2hy8uytWWrywjocKQ9oEo1mQm8VsLXe1EyL8XaUNSYmIiCobgx8qE31uXuCTnWNEpi4X7+cHPu4qJwxsXQcdQ70turIUTg4I89Mg0F1VzFWJiIgqHoMfKjWD0YQTV1Oh1RuhMxjxwf9icTNNB0+1E2b2aWyxIKGDA1DPywUNfFwg57geIiKyAwx+qFRyjSacvJaKTF0ucnJN+GjPBcQlaaFROOLFnhEWgY+fmwLhfq5QOXNcDxER2Q8GP1RiRpPAqeupSNMakGsyYdX+i/j3TgaUTg6Y3jMcQR55XVoapSMa+bvCs8DMLiIiInvB4IdKxGQS+Ot6KlKyDDAJgbUH43Dqehqc5DJM6RaO+t4ukMtlCPfToI4Ht6QgIiL7xeCH7kkIgb9vpiEpMwdCCGw5ehVHLidDLpNhQlQoGgW4wsEBaBXsYbGODxERkT3i5kl0T2dupiM+XQ8A+O7kTez9NwEyAGM7NUDLYA/IZEDzOu4MfIiIqFpg8EPFOnc7XVq755e/b+PH07cAAE+3D0FkAy8AQONAN/i5cmsKIiKqHhj8UJHO38nA9eRsAMD+2ATEHL8OABj8YB1ERfgCAMLyx/gQERFVFwx+yKZLCZm4kqQFABy9nIyNf1wBAPRtHoC+zQMBACHeatT3camyMhIREZUFgx+ycjVJi0sJWQCAv66nYs3vlyEAREX4YtADdQAAQR4qhPu7VmEpiYiIyobBD1m4kZqN2DsZAIDYOxlY+dtFGIVAZH0vPNWuHmQyGXxdFWgSyMCHiIiqJwY/JLmdpsO5W+kAgCtJWfhozwUYjAIt67jj2U714SCTwdPFCS3quHMdHyIiqrYY/BAAID5DhzM30yAEcCstG0t3n0e2wYgIfw1eiAqFo4MDXJWOaBXsYbFhKRERUXXD4IeQlKnH3zfyAp+kTD3e3xWLTH0uQrzVmNItHM6ODlA7y/FAPU84yvmSISKi6o3fZLVcqjYHf11Pg8kEpGUb8N6uWKRoDQh0V2J6j3ConOVQODngwRBPODvy5UJERNUfv81qsbRsA05cS4XRJJClz8XS3bGIz9DDR+OMl3pFwFXpBEe5DA/U84TSiTuzExFRzcDgp5bK0Blw4moKjEYBvcGIZXvO43pKNtxVTnixZwQ81c6QO8jwQF1PaBTcAo6IiGoOBj+1kDYnFyeupiLXKGAwmrBi30VcTMiC2lmOF3uGw99NCQcHoGWwO9zVTlVdXCIionLF4KeW0RmMOH4lFTm5JhhNAp8duIyzt9KhcHTAtB7hCPZUQyYDmgW5w1ujqOriEhERlTsGP7VIXuCTAp3BCJMQWH84Dv93NQWODjJM7haGUF8NACDC3xX+btyolIiIaiYGP7VETq4JJ66mQptjhBACX/15DYcuJsFBBozv0hBNAt0AAA19XVDXS13FpSUiIqo4DH5qAYPRhBNXU5ClzwUA7PjrFnb/Ew8AGN2xPh6o5wkAqOulRsP81h8iIqKaisFPDWc0CZy6looMXV7gs/ufO9h+6iYAYPhDddEx1AcAEOCuRKMA7tdFREQ1H4OfGsxkEjh1PRWpWgMA4ODFRGw9dg0A8HjrIPRo4g8A8NY4o2l+txcREVFNx+CnBruSrEVyZg4A4P+upGDdoTgAQK+m/ujfIhAA4KF2Qkvu10VERLUIg58aymQSuJ6iBQCcvZmOTw9cghBApzAfDG0TDJlMBo3SEa3qekDOwIeIiGoRBj81VHyGHnqDCRcTMrFi3wXkmgTahHhiZPsQyGQyqJzlaF3XA07cqJSIiGqZMn3zHTlypLzLQeXsarIW11K0+PB/56HPNaFZkBue69QADg4yODs64IF6Htyvi4iIaqUyBT8dOnRAREQEFi5ciEuXLpV3meg+pWkNuJqUhaW7YqHNMSLMV4OJUaFwkjvkb1TqAbUz9+siIqLaqUzBz6ZNmxAeHo6FCxciPDwcDz/8MD755BMkJyeXd/moDK4ma7EvNgHpulwEeSgxtUcYFE5yyB1kaF3XA65K7tdFRES1V5mCnxEjRuDHH3/EzZs38eGHH0IIgYkTJyIoKAhPPPEEYmJikJOTU95lpRLQGYy4lZaNgxcSAQADWgZB7ewImQxoXscdHmrnKi4hERFR1bqv0a4+Pj6YPHkyDh06hPPnz+P111/HuXPn8OSTTyIgIADjxo3D77//Xl5lpRK4nqLF3zfSkKI1QKPIm80FAE2D3ODryo1KiYiIym2qj0qlglqthlKphBACMpkM27dvR1RUFB566CGcPXu2vJ6KimA0CVxPycaB83mtPh1CveEkd0CEvysC3VVVXDoiIiL7cF/BT0ZGBtauXYuePXsiJCQE//nPf1C/fn3ExMTg9u3buHnzJr788kvEx8djzJgx5VVmKsKttGwkZuhx6noqAKBzmA/q+7ignjc3KiUiIjIr05Sf7du3Y/PmzdixYwd0Oh0eeughfPDBBxg2bBi8vb0t8kZHRyMlJQWTJk0qlwJT0a4ma3HoYhJMAgjz1aBFsDvC/LhRKRERUUFlavkZOHAgjhw5ghdffBH//PMPjhw5gkmTJlkFPmatWrXCU089VaJr6/V6zJw5E0FBQVCpVGjXrh127dpV4rJ9+eWX6NChA1xcXODh4YGOHTtiz549JT6/ukrM1CNTl4sD+QOdO4f7oI4Hu7qIiIgKK1PLz549e9C1a9cS54+MjERkZGSJ8o4ePRoxMTGYPn06wsPDsW7dOjz66KPYu3cvOnXqVOy58+fPxxtvvIHo6GiMHj0aBoMBf//9N27cuFHislZXV5O1iL2TgYQMPVROcrRv6AUfDQc4ExERFSYTQoiqLoTZ0aNH0a5dOyxZsgQzZswAAOh0OjRv3hx+fn44dOhQkef+8ccf6NixI9577z28+OKL91WO9PR0uLu7Iy0tDW5u9r/beZY+F4cvJuHTA5dw5HIyoiJ8MbNPYzQNsv+yExERVbYydXvNnj0brVu3LvL4Aw88gAULFpT6ujExMZDL5Rg3bpyUplQqMXbsWBw+fBjXrl0r8twPPvgAAQEBmDZtGoQQyMzMLPXzV1dXk7XI1Ofi/66kAMjr8gpwV1ZxqYiIiOxTmYKfmJgY9O3bt8jjjz76KL788stSX/fEiROIiIiwam0xd5mdPHmyyHP/97//4aGHHsKyZcvg6+sLV1dXBAYGYvny5fd8Xr1ej/T0dIuf6sJgNOF2mg5/XEpCrkmgrqcKEf4aeKq5ijMREZEtZRrzc/XqVYSGhhZ5vEGDBrhy5Uqpr3vr1i0EBgZapZvTbt68afO8lJQUJCYm4uDBg9izZw/mzZuHevXqYe3atZgyZQqcnJwwfvz4Ip938eLFZWqpsgc3UrKRazRJa/t0CfdFoLsKMpmsiktGRERkn8rU8qPRaIoNbi5fvgylsvTdLtnZ2VAorAfpmq+VnZ1t8zxzF1dSUhI+++wzzJgxA0OHDsWPP/6Ipk2b4s033yz2eWfNmoW0tDTpp7juNXsiRN6ihpcTs3AjNRtOchnaNfRilxcREVExyhT8dO3aFatWrbI5i+ratWtYvXo1unXrVurrqlQq6PV6q3SdTicdL+o8AHByckJ0dLSU7uDggCeffBLXr1/H1atXi3xehUIBNzc3i5/qID5DD53BKLX6tA3xgq+rkhuXEhERFaNM3V4LFy5EZGQkmjVrhrFjx6JZs2YAgL///huff/45hBBYuHBhqa8bGBhoM6C6desWACAoKMjmeV5eXlAqlfDw8IBcLrc45ufnByCva6xevXqlLpM9u5qshc5gxNG4ZAAc6ExERFQSZQp+GjVqhAMHDmDKlClYunSpxbEuXbpg2bJlaNKkSamv27p1a+zduxfp6ekWrS9HjhyRjtvi4OCA1q1b49ixY8jJyYGz892dy83jhHx9fUtdHnuWlm1AmtaAo3HJ0Oea4O+mQLifBgFuDH6IiIiKU+a9vVq2bInffvsN8fHx+OOPP/DHH38gPj4e+/btQ8uWLct0zejoaBiNRqxevVpK0+v1WLt2Ldq1a4e6desCyBtwfe7cOYtzn3zySRiNRqxfv15K0+l02Lx5M5o2bVpkq1F1dS1ZCwD4Pb/Lq3OYLzxdnKFylhd3GhERUa1Xppafgnx8fODj41MeZUG7du0wZMgQzJo1C/Hx8QgLC8P69esRFxeHNWvWSPlGjhyJ3377DQXXZxw/fjw+++wzTJo0CbGxsahXrx42btyIK1eu4IcffiiX8tkLncGI+AwdrqdocSkxC3KZDB1DveHPVh8iIqJ7uq/g5/r16zhx4gTS0tJgMpmsjo8cObLU19ywYQPmzJmDjRs3IiUlBS1btsSOHTvQpUuXYs9TqVTYs2cPXn31VXz++efIyspC69at8eOPP6J3796lLoc9u56SDZMJ0kDn1nU94OHixOCHiIioBMq0vYVOp8OoUaOwbds2mEwmyGQyqRWm4PoyRqOx/Epaiex5ewujSeD3C4nQ6nPx8tenoM0xYnqPcHRt7IfWdT2qunhERER2r0xjfv7zn//gm2++waJFi7Bv3z4IIbB+/Xr8+uuv6Nu3L1q1aoVTp06Vd1kJwK20bBhyTTh+NQXaHCO8XJzRNNCNA52JiIhKqMzbW4wZMwYzZ86UprnXqVMHPXv2xI4dO+Dh4YEVK1aUa0Epz7XkvIUezV1encJ84OTkAF9X7uBORERUEmUKfuLj46X9tswLDGZlZUnHBw8ejG+++aYcikcFJWXqkaXPxZ10Hc7dzoAMwMOh3vDVKCB34HYWREREJVGm4Mff3x9JSUkAALVaDU9PT/z777/S8fT0dGlVZio/V/Ontx+8kNfq0yzIDd4aBRc2JCIiKoUyzfZq164dfv/9d8ycORMA8Nhjj2HJkiUIDAyEyWTC0qVL0b59+3ItaG2nzclFUmYOck0mHLyYF3h2DveFs6MDvF2c73E2ERERmZWp5Wfq1Klo2LChtA/XwoUL4eHhgWeeeQajRo2Cu7s7li1bVq4Fre3MrT6nr6chLdsAV6UjWgW7w99NyR3ciYiISqFMLT+dOnVCp06dpMd169bFP//8g9OnT0Mul6Nx48ZwdLzv9RMpn8Fowq3UvG7EA/ldXh1DveEod+AsLyIiolIqdcuPVqvFoEGDsHnzZssLOTigVatWaN68OQOfcnYzNRtGk0ByVg5O30gDkNflpXaWw13NHdyJiIhKo9TBj1qtxu7du6HVaiuiPFSIEEKa3n7oYiKEACL88zYw9edAZyIiolIr05ifTp064fDhw+VdFrIhIUMPncEIk8hb2RnI28QUAAIZ/BAREZVamYKf5cuX48CBA5g9ezauX79e3mWiAswDnf+5lY7EzByonORoE+IJN5UT1M7sXiQiIiqtMu3t5erqitzcXOTk5AAAHB0doVBYrjAsk8mQlpZWPqWsZPayt1datgHHLicDAD757SL+vJKCbo188VS7EET4u6Ket7rKykZERFRdlanpYPDgwZxeXQmu5bf6ZOgMOHEtFUDeQGeZDPB353YWREREZVGm4GfdunXlXAwqTJ9rRHxG3vT2w5eSYDQJhHirUc9LDU8XZygc5VVcQiIiouqpTGN+qOKlag0wmfJme5k3Me0SnjfQmWv7EBERlV2ZWn42bNhQonwjR44sy+UJQIYuFwBwMSELt9J0cHZ0QGR9L8gdZPDjDu5ERERlVqbgZ/To0UUeKzgWiMFP2WXp84Kf/ecTAABtQzyhcpbDR6OAo5wNdkRERGVVpuDn8uXLVmlGoxFxcXH4+OOPcfXqVaxfv/6+C1ebZepzoc3JxZ9XUgDc7fLiQGciIqL7U6bgJyQkxGZ6w4YN0b17d/Tr1w/Lly/HihUr7qtwtVWu0YTsHCOOxaUgJ9eEQHclQn1d4CiXwceFwQ8REdH9qJD+k/79++PLL7+siEvXCpmFurw6h/tAJpPB300JBwcuMUBERHQ/KiT4uXjxIvR6fUVculbI1OfiapIWV5K0kDvI0KGhNwDO8iIiIioPZer22r9/v8301NRU7N+/H8uWLcMTTzxxP+Wq1TL1uThwIa/V54G6HnBVOkHpJIeni3MVl4yIiKj6K1Pw07VrV5srPAshIJfLMWTIEHz00Uf3XbjaKilDjz8u5W1r0TncBwAQwIHORERE5aJMwc/evXut0mQyGTw9PRESElKl+2HVBMevpSLbYISX2hlNAvPupT+7vIiIiMpFmYKfqKio8i4H5cvOMUp7ejXwdYGDTAaN0hGuSqcqLhkREVHNUKYBz5cvX8YPP/xQ5PEffvgBcXFxZS1TrZahN+Bmat6eXkHuea09HOhMRERUfsrU8jNjxgykp6fjscces3l8xYoV8PDwwNatW++rcLVRlt6Im6nZAIA6HioAQIA7gx8iIqLyUqaWn8OHD6NXr15FHu/RowcOHDhQ5kLVZhnZBtxMywt+gjxU8HTJm+lFRERE5aNMwU9KSgpcXV2LPK7RaJCUlFTmQtVmcclZ0BlMkMvyNjDlQGciIqLyVabgp169ejh48GCRxw8cOIDg4OAyF6q2MpkELsVnAQD83RRwdnJg8ENERFTOyhT8DB8+HFu2bMGyZctgMpmkdKPRiA8//BBffvklRowYUW6FrC0yc3JxI/Vul5e3iwJO3MGdiIioXMmEEKK0J+n1evTr1w979uyBr68vGjVqBAD4999/kZCQgK5du+Lnn3+GQlE9F+ZLT0+Hu7s70tLSKnXNopup2Zjx9SkcupiEAa2C8Hq/Jmz5ISIiKmdlalZQKBT49ddfsWbNGkRGRiIxMRGJiYmIjIzE559/jt27d1fbwKcqZepzcSstb5p7sJcKvhreQyIiovJWpqnuAODg4IAxY8ZgzJgx5VmeWi092yBNc2/s78od3ImIiCpAmVp+kpOT8ddffxV5/PTp00hJSSlzoWqrK8la6HNNkDvIEOanqeriEBER1UhlCn5efPFFjBs3rsjj48ePx4wZM8pcqNpIZzDiSmLeTK8ANyXcVNzOgoiIqCKUKfjZs2cPBgwYUOTxxx57DLt37y5zoWqjLH3u3W0tPJRwcS5zjyQREREVo0zBT0JCAnx8fIo87u3tjfj4+DIXqjbK1OfeXdnZXQW1gqs6ExERVYQyBT+BgYE4ceJEkcf/7//+D76+vmUuVG2UocuVBjsHe6mgcGTwQ0REVBHKFPw88cQTWLNmDb7//nurY9u3b8fatWsxcODA+y5cbZKuM+Bm/jT3cL+itw4hIiKi+1OmgSXz58/H7t27MXDgQLRq1QrNmzcHAPz99984efIkmjZtigULFpRrQWsyIQSuJWuRk2uCo4MMDX1dqrpIRERENVaZWn7c3d3xxx9/YPbs2TAYDIiJiUFMTAwMBgPmzp2Lo0ePogwLR9daWTlGXE/J6/Lyd1PCTcmZXkRERBWlzBtHubi4YMGCBTh9+jS0Wi20Wi2OHTuGZs2aYcSIEQgMDCzPctZomQXG+9Tx4GBnIiKiinTf86mFEPjf//6HzZs349tvv0VGRgZ8fHy4sWkpZOoNFtPcNQpOcyciIqooZf6W/b//+z9s3rwZW7duxe3btyGTyTBs2DBMnjwZ7du3h0zGrRlKKkN3d5p7HU8VVE5s+SEiIqoopQp+Ll26hM2bN2Pz5s04f/486tSpg6eeegqRkZF48sknMXjwYHTo0KGiylpjFdzQNNRHw8CRiIioApU4+OnQoQOOHj0KHx8fREdH47PPPkOnTp0AABcvXqywAtYGN1OzpZleDTjTi4iIqEKVOPg5cuQIGjRogPfffx/9+vWDoyPHpZQHo0ngWnJel1eAuxKunOlFRERUoUo822v58uUIDAzEwIEDERAQgPHjx2Pv3r2c0n6fcnJN0kyvIHcVXDjTi4iIqEKVOPiZOHEifv/9d1y8eBHTp0/HgQMH0KNHD9SpUwdz586FTCbjWJUyyDGa7u7p5aGEmhuaEhERVahSr/PToEEDzJ49G2fPnsWxY8cwbNgw7Nu3D0IITJw4EePGjcOOHTug0+kqorw1Tl7LT969quOhgoszW36IiIgqUpkXOQSANm3a4P3338e1a9fw66+/onfv3vjyyy8xYMCAYnd9p7uyDUbcym/5qe/jAkf5ff1KiIiI6B7K5ZvWwcEBPXv2xLp163Dnzh1s2bIFPXr0KI9L13jXkrUwGAWc5DLU9+FMLyIioopW7s0MSqUSTz75JLZv317el66RLsRnAgACuKcXERFRpWAfSxW7mJAX/AR5qKDmeB8iIqIKx+CnisUlZgHIH+zMPb2IiIgqnN0FP3q9HjNnzkRQUBBUKhXatWuHXbt23fO8+fPnS9PtC/4olcpKKHXZXU3WAgAC3ZVs+SEiIqoEdtfUMHr0aMTExGD69OkIDw/HunXr8Oijj2Lv3r3SdhrFWblyJTQajfRYLrfvgCIxUw8ACPBQQskNTYmIiCqcXQU/R48exdatW7FkyRLMmDEDADBy5Eg0b94cr776Kg4dOnTPa0RHR1ebafYmk0CW3ggA8He17xYqIiKimsKuur1iYmIgl8sxbtw4KU2pVGLs2LE4fPgwrl27ds9rCCGQnp5eLbbdSNbmwFxKX1dFlZaFiIiotrCr4OfEiROIiIiAm5ubRXpkZCQA4OTJk/e8RsOGDeHu7g5XV1c8/fTTuHPnzj3P0ev1SE9Pt/ipDAkZeV1eCkcHeKidK+U5iYiIaju76va6desWAgMDrdLNaTdv3izyXE9PT0yePBkdOnSAQqHAgQMHsGLFChw9ehR//vmnVUBV0OLFi7FgwYL7r0Apmcf7uCgcuaEpERFRJbGr4Cc7OxsKhXX3j3nGVnZ2dpHnTps2zeLx4MGDERkZiaeeegoff/wxXnvttSLPnTVrFl566SXpcXp6OurWrVva4pdacmYOAMDFWQ4XbmhKRERUKeyq20ulUkGv11ulmzdJValUpbreiBEjEBAQgN27dxebT6FQwM3NzeKnMiRp84MfhSNUnOlFRERUKewq+AkMDMStW7es0s1pQUFBpb5m3bp1kZycfN9lqwjmlh93lRMcHGRVXBoiIqLawa6Cn9atWyM2NtZqwPGRI0ek46UhhEBcXBx8fX3Lq4jlKjU7L/jxUHNPLyIiospiV8FPdHQ0jEYjVq9eLaXp9XqsXbsW7dq1k8bhXL16FefOnbM4NyEhwep6K1euREJCAvr06VOxBS+jNK0BAODlwpleRERElcWuRtm2a9cOQ4YMwaxZsxAfH4+wsDCsX78ecXFxWLNmjZRv5MiR+O233yzW8gkJCcGTTz6JFi1aQKlU4vfff8fWrVvRunVrjB8/viqqc09purzgx9uFa/wQERFVFrsKfgBgw4YNmDNnDjZu3IiUlBS0bNkSO3bsQJcuXYo976mnnsKhQ4ewbds26HQ6hISE4NVXX8Xrr78OtVpdSaUvnbTsvOCHCxwSERFVHpmoDkshV7L09HS4u7sjLS2tQmd+9XhvHy4mZGHFiAfQr2XpB3MTERFR6dnVmJ/aRAiBTF0uAI75ISIiqkwMfqpIjtGETH1e8OOtYbcXERFRZWHwU0V0OUZoc/J2dOdUdyIiosrD4KeKpGgN0o7u7ioGP0RERJWFwU8VMW9qqnB0gMKRW1sQERFVFgY/VSQxf2sLV6XdrTZARERUozH4qSLJWebgh11eRERElYnBTxVJyd/R3Y0tP0RERJWKwU8VSTMHPxzsTEREVKkY/FSRtPwFDjnTi4iIqHIx+Kki6fn7enkw+CEiIqpUDH6qSEZ+y4+HmltbEBERVSYGP1UkQ5ff8sPVnYmIiCoVg58qYt7Xi5uaEhERVS4GP1XEHPx4MvghIiKqVAx+qoAQApn5Y368GfwQERFVKgY/VSAn1yTt6O6jUVRxaYiIiGoXBj9VIDX77o7uXi4c8ExERFSZGPxUAfO+XgpHByiduL0FERFRZWLwUwWS8oMfjYKBDxERUWVj8FMFUs3BDzc1JSIiqnQMfqpAijZvgUNXBj9ERESVjsFPFUgx7+iu5GBnIiKiysbgpwqk5W9q6sZNTYmIiCodg58qkJrf7eXO4IeIiKjSMfipAuk6Bj9ERERVhcFPFTB3ezH4ISIiqnwMfqpAdv7WFlznh4iIqPIx+KkCOgODHyIioqrC4KcK6HLzgh+1s7yKS0JERFT7MPipAnqDCQBbfoiIiKoCg58qoM/ND364wjMREVGlY/BTBfS5HPNDRERUVRj8VDIhhNTy48rgh4iIqNIx+KlkOUYThMj7v5rdXkRERJWOwU8l0+WYpP+rnDjbi4iIqLIx+KlkWTl5qzvLZTI4yXn7iYiIKhu/fStZlj5vsLPCibeeiIioKvAbuJJl6nMBAApH3noiIqKqwG/gSqbNyQt+lBzvQ0REVCUY/FQyqduLLT9ERERVgt/AlSxLz5YfIiKiqsTgp5Jl5eS1/HCaOxERUdVg8FPJsvODH7b8EBERVQ0GP5UsK3/As1rB4IeIiKgqMPipZDoDu72IiIiqEoOfSqblmB8iIqIqxeCnkpnH/KicGfwQERFVBQY/lYzdXkRERFWLwU8l0+YHP2q2/BAREVUJBj+VzNzyw9leREREVYPBTyXTGUwAALWTYxWXhIiIqHZi8FPJ9Gz5ISIiqlIMfiqZLje/5ceZLT9ERERVgcFPJTO3/Lgw+CEiIqoSDH4qmT6/5UflzFtPRERUFezuG1iv12PmzJkICgqCSqVCu3btsGvXrlJfp1evXpDJZJg8eXIFlLLspOCHA56JiIiqhN0FP6NHj8b777+Pp556Ch9++CHkcjkeffRR/P777yW+xjfffIPDhw9XYCnLLkdq+eGAZyIioqpgV8HP0aNHsXXrVixevBhLlizBuHHjsGfPHoSEhODVV18t0TV0Oh1efvllzJw5s4JLWzZS8MMVnomIiKqEXQU/MTExkMvlGDdunJSmVCoxduxYHD58GNeuXbvnNd555x2YTCbMmDGjIotaJgajCUYhADD4ISIiqip2NfDkxIkTiIiIgJubm0V6ZGQkAODkyZOoW7dukedfvXoVb7/9Nj7//HOoVKoSP69er4der5cep6enl7LkJZOdP9MLAJQc8ExERFQl7Cr4uXXrFgIDA63SzWk3b94s9vyXX34ZDzzwAIYNG1aq5128eDEWLFhQqnPKQpe/o7uDDHCWM/ipyYQQMBqNyM3NreqiEBFVe05OTpDLy6/HxK6Cn+zsbCgUCqt0pVIpHS/K3r17sW3bNhw5cqTUzztr1iy89NJL0uP09PRiW5jKSpsf/Dg7OkAmk5X79anqCSGQmpqKhIQEGI3Ge59AREQl4uHhgYCAgHL5/rSr4EelUll0P5npdDrpuC25ubmYOnUqnnnmGTz00EOlfl6FQmEz6Cpv5m4vpSPH+9RUt2/fRmpqKtzc3ODm5gZHR0cGukRE90EIAa1Wi/j4eACw2UNUWnYV/AQGBuLGjRtW6bdu3QIABAUF2Txvw4YN+Pfff7Fq1SrExcVZHMvIyEBcXBz8/PygVqvLvcylYQ5+FE7s8qqJjEYj0tLS4OvrCx8fn6ouDhFRjWFu/IiPj4efn999d4HZ1bdw69atERsbazXg2NyV1bp1a5vnXb16FQaDAQ8//DAaNGgg/QB5gVGDBg3w66+/VmjZS8I85octPzWTwWCAEAIuLi5VXRQiohrH3IBhMBju+1p21fITHR2Nd999F6tXr5amquv1eqxduxbt2rWTxuFcvXoVWq0WjRs3BgAMGzbMZmA0cOBAPProo3j++efRrl27SqtHUdjyUzuwm4uIqPyV52erXQU/7dq1w5AhQzBr1izEx8cjLCwM69evR1xcHNasWSPlGzlyJH777TeI/DVzGjduLAVChTVo0ABPPPFEZRT/nqQxP1zjh4iIqMrYVfAD5HVTzZkzBxs3bkRKSgpatmyJHTt2oEuXLlVdtPumZbcXERFRlbO7/helUoklS5bg1q1b0Ol0OHr0KHr37m2RZ9++fVKrT3GEEFi+fHlFFbXUdOaWHy5wSFSjxMXFQSaTYd26dSXO++6771Z8wahaOX/+PB555BG4u7tDJpPhu+++q+oi1Vj8Fq5E2fktP9zagqqjdevWQSaT4c8//7RIT0tLQ2RkJJRKJX755RcAwPz58yGTyeDv7w+tVmt1rfr166N///4WaTKZDDKZDO+9916Jn9uWb7/9Fr1790ZQUBAUCgWCg4MRHR2Nv//+uzTVvW8//fQT5s+fXyHXXrRoEQYMGAB/f3/IZLIin+ebb77Bk08+iYYNG0KtVqNRo0Z4+eWXkZqaapVXp9Nh8eLFaNq0KdRqNerUqYMhQ4bgzJkz9yzPvn37pN/fpk2bbOZ5+OGHIZPJ0Lx5c6tjBoMBy5Ytw0MPPQRXV1doNBo89NBDWLZsmc3BrTk5Ofjwww/xwAMPwM3NDR4eHmjWrBnGjRuHc+fO2Xz+f/75BzKZDEql0mb9AaBr165W5bP1WgWAjRs3Qi6Xo0+fPtJyLJmZmZg3bx6aN28OFxcXeHt7o3Xr1pg2bdo9F+kFgFGjRuH06dNYtGgRNm7ciLZt297znNLSarWYP38+9u3bV+7Xrk4Y/FQijvmhmiY9PR2PPPII/vrrL3z77bfo06ePxfH4+HisXLmyVNdcsmSJzYCppE6fPg1PT09MmzYNH3/8MSZMmIATJ04gMjISp06dKvN1ixMSEoLs7Gw888wzUtpPP/1UYSvHz549G8eOHcMDDzxQbL5x48bhn3/+wdNPP41ly5ahT58+WL58OTp06GC1aOxTTz2FuXPnomvXrli2bBnGjx+P/fv3o0OHDrhy5UqJyqVUKvHFF19YpcfFxeHQoUPSgrUFZWVloVevXpg2bRoCAgLw9ttvY8mSJQgKCsK0adPQq1cvZGVlWZwzePBgvPzyy2jevDnefvttLFiwAF26dMHPP/+MP/74w2bZNm3ahICAAAB5+0jej82bN2P06NHo2bMnvvvuOyiVShgMBnTp0gVLlixB586d8f777+M///kPHnzwQXzxxReIjY0t9prZ2dk4fPgwxo4di8mTJ+Ppp59GcHDwfZXTFq1WiwULFtT64AeCrKSlpQkAIi0trVyv+9ZPZ0XIzB1iZsypcr0u2Yfs7Gxx9uxZkZ2dXdVFqRBr164VAMSxY8eEEEKkp6eL9u3bC2dnZ7Fjxw6LvPPmzRMAROvWrYW/v7/QarUWx0NCQkS/fv0s0sz5AYj33nuv2Ocurdu3bwtHR0cxfvz4Mp1fFpMmTRK2PmIvX74sAIglS5aU+dqXL18WQgiRkJAgAIh58+bZzLd3716rtPXr1wsA4tNPP5XSrl+/LgCIGTNmWOTds2ePACDef//9Ysuzd+9eAUAMGjRIODo6ioSEBIvjixYtEv7+/qJTp06iWbNmFsfGjRsnAIiPPvrI6rrLly8XAMQLL7wgpR09elQAEIsWLbLKn5ubKxITE63STSaTqF+/vnjppZfEwIEDRdeuXW3WIyoqyqp8hV+rW7ZsEXK5XPTs2dPivf7VV18JAGLz5s1W183Ozr7n98mVK1fu+3VREvd6zZSVwWAQer2+XK9ZWHl+xrLlpxLp2O1FNURmZib69OmD48ePY9u2bejXr5/NfHPnzsWdO3dK3Prz8MMPo3v37njnnXeK3c6mtMyLnBbV3WH20ksvwdvb22JM4ZQpUyCTybBs2TIp7c6dO5DJZFK9Co/5GT16NFasWAHgbneerWm6q1evRmhoKBQKBR566CEcO3asRPWpX79+ifJ17drVKm3gwIEA8rqBzDIyMgAA/v7+FnnNK+mWdKPoxx9/HAqFAl9//bVF+hdffIGhQ4daLUx3/fp1rFmzBt27d8fkyZOtrjdp0iR069YNn332Ga5fvw4AuHjxIoC810phcrkc3t7eVukHDx5EXFwchg0bhmHDhmH//v3S9Urjq6++wtNPP42uXbvi+++/t2jJKq5cSqXSasPugubPn4+QkBAAwCuvvAKZTGbxO75x4waeffZZ+Pv7Q6FQoFmzZvj8888trpGTk4O5c+eiTZs2cHd3h4uLCzp37oy9e/dKeeLi4uDr6wsAWLBggfS6NHebdu3a1eZrZvTo0RblKThu7YMPPpBew2fPngUAnDt3DtHR0fDy8oJSqUTbtm3x/fffW1zTYDBgwYIFCA8Ph1KphLe3Nzp16oRdu3YVeZ/KE4OfSmTu9lI5M/ih6isrKwt9+/bFsWPH8PXXX9scD2HWuXPnUgcz8+fPL1XAVBTzHmunT5/Gc889h/T0dPTo0aPYczp37ozk5GSLcS4HDhyAg4MDDhw4YJEGoMhZqOPHj0evXr0A5I0NMf8U9MUXX2DJkiUYP3483nzzTcTFxWHQoEHlsoBbcW7fvg0AFquQh4aGIjg4GO+99x5++OEHXL9+HUePHsULL7yABg0alHizaLVajccffxxbtmyR0k6dOoUzZ85gxIgRVvl//vlnGI1GjBw5sshrjhw5Erm5udJ4MnOQsHnz5hJvHLx582aEhobioYcewmOPPQa1Wm1RxpLYtm0bnnrqKXTp0gU//PCDVUBoLteGDRtKNCGnoEGDBmHp0qUAgOHDh2Pjxo344IMPAOQF2u3bt8fu3bsxefJkfPjhhwgLC8PYsWOlPEBeF/Rnn32Grl274r///S/mz5+PhIQE9O7dGydPngQA+Pr6Su+rgQMHSq/LQYMGlaq8ZmvXrsVHH32EcePG4b333oOXlxfOnDmD9u3b459//sFrr72G9957Dy4uLnjiiSfw7bffSufOnz8fCxYsQLdu3bB8+XK8/vrrqFevHo4fP16mspTafbcd1UAV1e01afP/iZCZO8RH/4st1+uSfSiqSdZkMoksvcFufkwmU5nqZ+56CgkJEU5OTuK7774rMq+52yshIUH89ttvVl0nRXV7TZo0SQghRLdu3URAQIDUXVaWbq9GjRoJAAKA0Gg0Yvbs2cJoNBZ7Tnx8vAAgPv74YyGEEKmpqcLBwUEMGTJE+Pv7S/mmTp0qvLy8pHtp7spau3atlOde3V7e3t4iOTlZSt++fbsAIH744YcS17EsXRhjx44VcrlcxMZafg4dOXJEhIaGSvcMgGjTpo24devWPa9p7vb6+uuvxY4dO4RMJhNXr14VQgjxyiuviIYNGwohrLuVpk+fLgCIEydOFHnt48ePCwDipZdeEkLkvZ+ioqIEAOHv7y+GDx8uVqxYIa5cuWLz/JycHOHt7S1ef/11KW3EiBGiVatWVnmL6vYKCgoSjo6OomvXriIrK8vm82i1Wuk1FxISIkaPHi3WrFkj7ty5U2TdCiqqO3Ts2LEiMDDQqjtv2LBhwt3dXXqP5ObmWnU7paSkCH9/f/Hss89KacW9ZqKiokRUVJRV+qhRo0RISIhVWd3c3ER8fLxF3h49eogWLVoInU4npZlMJtGxY0cRHh4upbVq1crqM+BeyrPby+7W+anJdGz5qZWyDUY0nbuzqoshOftGb6idy/7Wv3PnDpRKpbTi+r106dIF3bp1wzvvvIMXXnihRF0o8+fPR1RUFD755BO8+OKLZSrn2rVrkZ6ejkuXLmHt2rXIzs6G0WiEg0PRDd6+vr5o3Lgx9u/fjwkTJuDgwYOQy+V45ZVX8PXXX+P8+fMIDw/HgQMH0KlTp/tacfbJJ5+Ep6en9Lhz584AgEuXLpX5mvfyxRdfYM2aNXj11VcRHh5ucczT0xOtW7fGkCFD0L59e1y4cAGLFy/GkCFDsGvXLpuDlW155JFH4OXlha1bt2LGjBnYunVrkS075u42V1fXIq9nPmbe9kgmk2Hnzp149913sWnTJmzZsgVbtmzBpEmTMHToUKxatQoeHh7S+T///DOSkpIwfPhwKW348OF47LHHcObMGTRr1uyedUpOTkZubi6Cg4OLfP2qVCocOXIEixYtwldffYV169Zh3bp1cHBwwMSJE/Huu++WegNtIQS2bduGoUOHQgiBxMRE6Vjv3r2xdetWHD9+HA8//DDkcrnUrWgymZCamgqTyYS2bdtWWGvK4MGDpW40IO8+7dmzB2+88QYyMjKk36+5vPPmzcONGzdQp04deHh44MyZM9J7qrKx26sSmbu91E6MOan6WrVqFZydndGnTx/8+++/JTpn/vz5uH37Nj755JMS5S8YMNnqLsvOzsbt27ctfgrr0KEDevfujQkTJmDnzp3YtGkTZs2adc/n7ty5s9StdeDAAbRt2xZt27aFl5cXDhw4gPT0dJw6dUoKVsqqXr16Fo/NgVBKSsp9XbcoBw4cwNixY9G7d28sWrTI4lhaWho6d+6MDh06YPHixXj88cfx8ssvY9u2bfj999+xdu3aEj+Pk5MThgwZgi+++AL79+/HtWvXbHZ5AXcDm4JfkoXZCpAUCgVef/11/PPPP7h58ya2bNmC9u3b46uvvrIaO7Rp0yY0aNAACoUCFy5cwIULFxAaGgq1Wo3NmzeXqE49evTAhAkTsGnTJkyfPr3IfO7u7njnnXcQFxcn7UzQqFEjLF++HAsXLizRcxWUkJCA1NRUrF69Gr6+vhY/Y8aMAQBpp3MAWL9+PVq2bCmNofH19cWPP/6ItLS0Uj93SZj30DS7cOEChBCYM2eOVXnnzZtnUd433ngDqampiIiIQIsWLfDKK6/gr7/+qpBy2sJv4UokrfPDlp9aReUkx9k3et87YyW53wH3TZs2xU8//YQePXqgV69eOHjw4D1bgbp06YKuXbtKrT8lMW/ePHTt2tXqL3kA+PLLL6UPfzNRzDgLT09PdO/eHZs3b77n4oKdOnXCp59+ikuXLuHAgQPo3LkzZDIZOnXqhAMHDiAoKAgmk+m+g5+idqUurh5lderUKQwYMADNmzdHTEwMHB0tP/q3bduGO3fuYMCAARbpUVFRcHNzw8GDBzFhwoQSP9+IESPwySefYP78+WjVqhWaNm1qM1+TJk0AAH/99VeRG1ebvxCLukZgYCCGDRuGwYMHo1mzZlKri6OjI9LT0/HDDz9Ap9PZbF344osvsGjRohK14C1fvhwpKSlYtmwZPD0977mGU0hICJ599lkMHDgQDRs2xObNm/Hmm2/e83kKMplMAICnn34ao0aNspmnZcuWAPKCvNGjR+OJJ57AK6+8Iu18vnjxYmkw9r3IZDKbrz+j0Wgzf+FWMHN5Z8yYYbU4sVlYWBiAvM+EixcvYvv27fj111/x2WefYenSpfjkk0/w3HPPlai894PBTyXKNuS9MFwUDH5qE5lMdl/dTPYoMjIS3333Hfr164devXrhwIEDFs3ftsyfP18KZkoiKipKGrw5d+5ci2O9e/cu9ayQ7OzsEv0FbA5qdu3ahWPHjuG1114DkPdhvXLlSgQFBcHFxQVt2rQp9jr2ssHtxYsX0adPH/j5+eGnn36CRqOxynPnzh0A1l9yQggYjcYSDyw269SpE+rVq4d9+/bhv//9b5H5+vbtC7lcjo0bNxbZNbZhwwY4OjparSFVmJOTE1q2bInz588jMTERAQEB+Oabb6DT6bBy5UqLAd4A8O+//2L27Nk4ePAgOnXqdM86OTg4YMOGDUhLS8OCBQvg5eWFqVOn3vM8T09PhIaGlmmRTV9fX7i6usJoNKJnz57F5o2JiUHDhg3xzTffWLz2zC0uZsW9Lj09PW12u5Z0naeGDRsCyPtd3Ku8AODl5YUxY8ZgzJgxyMzMRJcuXTB//vxKCX7Y7VWJzGN+atoXIdVOPXr0wJYtW3DhwgX06dNHGpNRlILBjHlF3Hsxd5etXr3aIj0wMBA9e/a0+DEr2A1gFhcXh//9738lWjG3QYMGqFOnDpYuXQqDwSBNXe7cuTMuXryImJgYtG/f3qr1pDAXFxcAuOf0+op0+/ZtPPLII3BwcMDOnTuLDFAjIiIAAFu3brVI//7775GVlXXPxRQLMy8NMG/ePIuFHwurW7cuxowZg927d9uc3ffJJ59gz549GDt2rLTg3/nz53H16lWrvKmpqTh8+DA8PT2lem7atAkNGzbECy+8gOjoaIufGTNmQKPRlLjrC8j7Uo+JicHDDz+M6dOnW8zgO3XqlMWYHLMrV67g7NmzaNSoUYmfx0wul2Pw4MHYtm2bzeApISHBIi9g2XJ45MgRHD582OIctVoNwPbrMjQ0FOfOnbO47qlTp3Dw4MESldfPz0/6A+fWrVvFljcpKcnimEajQVhYGPR6fYme637xW7gSaXPy/npyYbcX1RADBw7Ep59+imeffRYDBgzAL7/8UuzA2Hnz5qFbt24lvn5UVBSioqLw22+/lficFi1aoEePHmjdujU8PT1x/vx5rFmzBgaDAW+//XaJrtG5c2ds3boVLVq0kMbiPPjgg3BxcUFsbGyRY1gKMrcMTZ06Fb1794ZcLi/xlPF72bhxI65cuSKthL1//36pS+WZZ56Rpl336dMHly5dwquvvorff/8dv//+u3QNf39/aTr+Y489hmbNmuGNN97AlStXpAHPy5cvR2BgIMaOHVvqMj7++ON4/PHH75lv6dKlOHfuHCZOnIhffvlFauHZuXMntm/fjqioKIstT06dOoURI0agb9++6Ny5M7y8vHDjxg2sX78eN2/exAcffAC5XI6bN29i7969RbbOKBQK9O7dG19//TWWLVsGJyenEtVLrVbjxx9/RFRUFJ599lm4u7tjwIAB2LVrF+bNm4cBAwagffv20Gg0uHTpEj7//HPo9foyb3Xy9ttvY+/evWjXrh2ef/55NG3aFMnJyTh+/Dh2796N5ORkAED//v3xzTffYODAgejXrx8uX76MTz75BE2bNkVmZqZ0PZVKhaZNm+LLL79EREQEvLy80Lx5czRv3hzPPvss3n//ffTu3Rtjx45FfHw8PvnkEzRr1uyef9yYrVixAp06dUKLFi3w/PPPo2HDhrhz5w4OHz6M69evS6usN23aFF27dkWbNm3g5eWFP//8EzExMTbXe6oQ9z1frAaqqKnuLeb9IkJm7hCxt9PL9bpkH2rbCs8FvfvuuwKA6N+/vzAYDBZT3QszT1Mubqp7QeZp1EU9d2Hz5s0Tbdu2FZ6ensLR0VEEBQWJYcOGib/++qvEdV2xYoUAICZMmGCR3rNnTwFA/O9//7NItzXVPTc3V0yZMkX4+voKmUwmTXsvboVnlHDauvke2vopuKpzUXkAWE1pTk5OFi+++KKIiIgQCoVC+Pj4iGHDholLly7dszwFp7rfq9yFp5ILIYRerxdLly4Vbdq0ES4uLkKtVosHH3xQfPDBByInJ8ci7507d8Tbb78toqKiRGBgoHB0dBSenp6ie/fuIiYmRsr33nvv2fxdFbRu3ToBQGzfvr3I8tlalkGIvFXDw8LChFKpFHv37hWXLl0Sc+fOFe3btxd+fn7C0dFR+Pr6in79+ok9e/YUe1+EKP51cefOHTFp0iRRt25d4eTkJAICAkSPHj3E6tWrpTwmk0m89dZbIiQkRCgUCvHAAw+IHTt2WE1TF0KIQ4cOiTZt2ghnZ2er19ymTZtEw4YNhbOzs2jdurXYuXNnkVPdi1qN+uLFi2LkyJEiICBAODk5iTp16oj+/ftb/H7efPNNERkZKTw8PIRKpRKNGzcWixYtsvp9F1Sen7EyISpgdF01l56eDnd3d6SlpRW7KmdpRbz+M3KMJhyc2Q11PNXldl2yDzqdDpcvX0aDBg1KPC2YiIhKpjw/Y9ntVUmEEJjWMxznbqXDQ+1c1cUhIiKqtRj8VBKZTIZJ3cJw8EIiXBS87URERFWFs70qmYOdTH8lIiKqrRj8VDIHxj5ERERVisFPJZMz+iEiIqpSDH4qmQODHyIioirF4KeSccwPERFR1WLwU8nkDH6IiIiqFIOfSsbYh4iIqGox+KlkHPBMRERUtRj8VDIGP0RERFWLwU8l44BnIiKiqsXgp5Kx4YfornXr1kEmkyEuLq6qi1IkW2Xs2rUrunbtWmVlAu7v3u3btw8ymQz79u0r93LVVPbwO6fyw+CnkrHbi6qr+fPnQyaTITEx0ebx5s2b88uhkLfeegvfffddVReDiAph8FPJ2O1FdNczzzyD7OxshISEVHVRKkRFBj/3c++6dOmC7OxsdOnSpQJKRmT/uL14JeMKz0R3yeVyyOXyqi6GXcjKyoKLi0uJ89/PvXNwcIBSqSzTuUQ1AVt+KhkXOaTa5KOPPkKzZs2gVqvh6emJtm3b4osvvpCO2xq3Ur9+ffTv3x+///47IiMjoVQq0bBhQ2zYsMHq+n/99ReioqKgUqkQHByMN998E2vXri3RWJi//voLo0ePRsOGDaFUKhEQEIBnn30WSUlJ5VJ3mUyGrKwsrF+/HjKZDDKZDKNHjwZwtwvx7NmzGDFiBDw9PdGpU6dSlet+7p2tMT9du3ZF8+bNcfbsWXTr1g1qtRp16tTBO++8Y1W3K1euYMCAAXBxcYGfnx9efPFF7Ny5s0TjiDIyMjB9+nTUr18fCoUCfn5+6NWrF44fPy7lOXDgAIYMGYJ69epBoVCgbt26ePHFF5GdnW1xrdGjR0Oj0eDq1avo378/NBoN6tSpgxUrVgAATp8+je7du8PFxQUhISEWr72C93D//v0YP348vL294ebmhpEjRyIlJaXYegCAXq/HvHnzEBYWJpXz1VdfhV6vt8i3a9cudOrUCR4eHtBoNGjUqBH+85//3PP6VHHY8lPJ2PBTi2VlFX1MLgcK/iVeXF4HB0ClKlveSvTpp59i6tSpiI6OxrRp06DT6fDXX3/hyJEjGDFiRLHnXrhwAdHR0Rg7dixGjRqFzz//HKNHj0abNm3QrFkzAMCNGzfQrVs3yGQyzJo1Cy4uLvjss8+gUChKVL5du3bh0qVLGDNmDAICAnDmzBmsXr0aZ86cwR9//AHZff6hsnHjRjz33HOIjIzEuHHjAAChoaEWeYYMGYLw8HC89dZbEEKUS7lKcu+KkpKSgj59+mDQoEEYOnQoYmJiMHPmTLRo0QJ9+/YFkNdC1b17d9y6dQvTpk1DQEAAvvjiC+zdu7dE9+WFF15ATEwMJk+ejKZNmyIpKQm///47/vnnHzz44IMAgK+//hparRYTJkyAt7c3jh49io8++gjXr1/H119/bXE9o9GIvn37okuXLnjnnXewefNmTJ48GS4uLnj99dfx1FNPYdCgQfjkk08wcuRIdOjQAQ0aNLC4xuTJk+Hh4YH58+fj33//xcqVK3HlyhUpSLTFZDJhwIAB+P333zFu3Dg0adIEp0+fxtKlSxEbGyt1d545cwb9+/dHy5Yt8cYbb0ChUODChQs4ePBgie4XVRBBVtLS0gQAkZaWVu7XTsjQlfs1yT5kZ2eLs2fPiuzsbNsZgKJ/Hn3UMq9aXXTeqCjLvD4+Redt27bc6jdv3jwBQCQkJNg83qxZMxFVoGyPP/64aNasWbHXXLt2rQAgLl++LKWFhIQIAGL//v1SWnx8vFAoFOLll1+W0qZMmSJkMpk4ceKElJaUlCS8vLysrmmLVqu1StuyZYvVc9sqY1RUlEVdi+Li4iJGjRpllW6+l8OHDy/XcpX03u3du1cAEHv37rWoEwCxYcMGKU2v14uAgAAxePBgKe29994TAMR3330npWVnZ4vGjRtbXdMWd3d3MWnSpGLz2LoHixcvFjKZTFy5ckVKGzVqlAAg3nrrLSktJSVFqFQqIZPJxNatW6X0c+fOCQBi3rx5Upr5HrZp00bk5ORI6e+8844AILZv3y6lFf6db9y4UTg4OIgDBw5YlPOTTz4RAMTBgweFEEIsXbq02PcNldw9P2NLgd1elYzdXlRbeHh44Pr16zh27Fipz23atCk6d+4sPfb19UWjRo1w6dIlKe2XX35Bhw4d0Lp1aynNy8sLTz31VImeQ1WgRUyn0yExMRHt27cHAIsumIr0wgsvlHu5SnLviqLRaPD0009Lj52dnREZGWl13+vUqYMBAwZIaUqlEs8///w9rw/kvS6OHDmCmzdvFpmn4D3IyspCYmIiOnbsCCEETpw4YZX/ueees7h+o0aN4OLigqFDh0rpjRo1goeHh837MG7cODg5OUmPJ0yYAEdHR/z0009FlvHrr79GkyZN0LhxYyQmJko/3bt3BwCpJczDwwMAsH37dphMpiKvR5WLwU8l42yvWiwzs+ifbdss88bHF533558t88bFFZ13//5Kqx4Aiy6CmTNnQqPRIDIyEuHh4Zg0aVKJm/rr1atnlebp6WkxDuPKlSsICwuzymcrzZbk5GRMmzYN/v7+UKlU8PX1lbpD0tLSSnSN+1W4+6U8ylWSe1eU4OBgq24eW/c9NDTUKl9J7/s777yDv//+G3Xr1kVkZCTmz59vFZBcvXoVo0ePhpeXFzQaDXx9fREVFQXA+h4olUr4+vpapLm7u9usi7u7u837EB4ebvFYo9EgMDCw2HFj58+fx5kzZ+Dr62vxExERAQCIj48HADz55JN4+OGH8dxzz8Hf3x/Dhg3DV199xUCoinHMTyVzYLhZe5ViJk+F5b0P5tlBhQedmmm1WosZRE2aNMG///6LHTt24JdffsG2bdvw8ccfY+7cuViwYEGxz1XULCaRPy6mPAwdOhSHDh3CK6+8gtatW0Oj0cBkMqFPnz6V9sWksjEe637LdT/3rrLue+fOnfHtt9/i119/xZIlS/Df//4X33zzDfr27Quj0YhevXohOTkZM2fOROPGjeHi4oIbN25g9OjRVvegqDJXdF1MJhNatGiB999/3+bxunXrAsj7He/fvx979+7Fjz/+iF9++QVffvklunfvjl9//ZWzHasIg59KxkUOqboyryfz77//Sh/sZlqtFteuXcMjjzxike7i4oInn3wSTz75JHJycjBo0CAsWrQIs2bNuu+p1iEhIbhw4YJVuq20wlJSUvC///0PCxYswNy5c6X08+fP31eZCivtoOnKKtf9CAkJwdmzZyGEsKhfSe67WWBgICZOnIiJEyciPj4eDz74IBYtWoS+ffvi9OnTiI2Nxfr16zFy5EjpnF27dpVrPQo6f/48unXrJj3OzMzErVu38OijjxZ5TmhoKE6dOoUePXrc8/fs4OCAHj16oEePHnj//ffx1ltv4fXXX8fevXvRs2fPcqsHlRzbISoZu72ouurRowecnZ2xcuVKq7++V69ejdzcXGlGEACrqdnOzs5o2rQphBAwGAz3XZ7evXvj8OHDOHnypJSWnJyMzZs33/Nc81/bhVsBPvjgg/suV0EuLi5ITU0tcf7KKtf96N27N27cuIHvv/9eStPpdPj000/vea7RaLTqtvLz80NQUJA0PdzWPRBC4MMPPyyP4tu0evVqi9fkypUrrV7PhQ0dOhQ3btywWe/s7Gxk5c/CTE5OtjpuHqdWeEo8VR62/FQyBj9UXfn5+WHu3LmYPXs2unTpggEDBkCtVuPQoUPYsmULHnnkETz22GNS/kceeQQBAQF4+OGH4e/vj3/++QfLly9Hv3794Orqet/lefXVV7Fp0yb06tULU6ZMkaa616tXD8nJycX+Ne7m5iZNjTYYDKhTpw5+/fVXXL58+b7LVVCbNm2we/duvP/++wgKCkKDBg3Qrl27Ki/X/Rg/fjyWL1+O4cOHY9q0aQgMDMTmzZullrzi7ntGRgaCg4MRHR2NVq1aQaPRYPfu3Th27Bjee+89AEDjxo0RGhqKGTNm4MaNG3Bzc8O2bdtKNGaprHJyctCjRw8MHToU//77Lz7++GN06tTJYlB3Yc888wy++uorvPDCC9i7dy8efvhhGI1GnDt3Dl999RV27tyJtm3b4o033sD+/fvRr18/hISEID4+Hh9//DGCg4OltZ2o8jH4qWTs9aLq7PXXX0f9+vWxfPlyvPHGG8jNzUWDBg2wYMECzJw5Ew4FBrWNHz8emzdvxvvvv4/MzEwEBwdj6tSpmD17drmUpW7duti7dy+mTp2Kt956C76+vpg0aRJcXFwwderUe3arffHFF5gyZQpWrFgBIQQeeeQR/PzzzwgKCiqX8gHA+++/j3HjxmH27NnIzs7GqFGjig1+Kqtc90Oj0WDPnj2YMmUKPvzwQ2g0GowcORIdO3bE4MGDi73varUaEydOxK+//opvvvkGJpMJYWFh+PjjjzFhwgQAgJOTE3744QdMnToVixcvhlKpxMCBAzF58mS0atWqQuq0fPlybN68GXPnzoXBYMDw4cOxbNmyYgM5BwcHfPfdd1i6dCk2bNiAb7/9Fmq1Gg0bNsS0adOkgc8DBgxAXFwcPv/8cyQmJsLHxwdRUVFYsGAB3N3dK6Q+dG8yUZ4j2WqI9PR0uLu7Iy0tDW5ubuV67cL95FRz6HQ6XL58GQ0aNODWAVVo+vTpWLVqFTIzMzmYtBJ98MEHePHFF3H9+nXUqVOnqotTIuvWrcOYMWNw7NgxtG3btqqLQ/dQnp+xHPNTyRj4EJWfwjPPkpKSsHHjRnTq1ImBTwUqfN91Oh1WrVqF8PDwahP4UO3Gbi8iqrY6dOiArl27okmTJrhz5w7WrFmD9PR0zJkzp6qLVqMNGjQI9erVQ+vWrZGWloZNmzbh3LlzJRpsTmQPGPwQUbX16KOPIiYmBqtXr4ZMJsODDz6INWvWoEuXLlVdtBqtd+/e+Oyzz7B582YYjUY0bdoUW7duxZNPPlnVRSMqEY75saEix/xQzcUxP0REFYdjfoiIiIjKiMEPUTljYyoRUfkrz89WBj9E5cTJyQkymUxa2ZWIiMqPVqsFkPdZe7844JmonMjlcri7uyMhIQF6vR5ubm5wdHTk8gZERPdBCAGtVov4+Hh4eHiUyzIWDH6IylFAQABUKhXi4+ORnp5e1cUhIqoxPDw8EBAQUC7XYvBDVI5kMhk8PDzg7u4Oo9GI3Nzcqi4SEVG15+TkVK4LlzL4IaoAMpkMjo6OcHTkW4yIyN5wwDMRERHVKgx+iIiIqFZh8ENERES1CoMfIiIiqlUY/BAREVGtwqkoNpiX0OY6LURERNWPq6trsQvMMvixISMjAwBQt27dKi4JERERlVZaWhrc3NyKPC4T3IXRislkws2bN+8ZOZZWeno66tati2vXrhX7S6muWL/qr6bXsabXD6j5dazp9QNqfh0ro35s+SkDBwcHBAcHV9j13dzcauQL2oz1q/5qeh1rev2Aml/Hml4/oObXsSrrxwHPREREVKsw+CEiIqJahcFPJVIoFJg3bx4UCkVVF6VCsH7VX02vY02vH1Dz61jT6wfU/DraQ/044JmIiIhqFbb8EBERUa3C4IeIiIhqFQY/REREVKsw+CEiIqJahcFPBdPr9Zg5cyaCgoKgUqnQrl077Nq1q6qLdU+ZmZmYN28e+vTpAy8vL8hkMqxbt85m3n/++Qd9+vSBRqOBl5cXnnnmGSQkJFjlM5lMeOedd9CgQQMolUq0bNkSW7ZsqeCa2Hbs2DFMnjwZzZo1g4uLC+rVq4ehQ4ciNjbWKm91rN+ZM2cwZMgQNGzYEGq1Gj4+PujSpQt++OEHq7zVsX62LFq0CDKZDM2bN7c6dujQIXTq1AlqtRoBAQGYOnUqMjMzrfLZ0/t13759kMlkNn/++OMPi7zVsX5mx48fx4ABA+Dl5QW1Wo3mzZtj2bJlFnmqa/1Gjx5d5O9QJpPhxo0bUt7qWsfz589j2LBhCA4OhlqtRuPGjfHGG29Aq9Va5LO7+gmqUMOGDROOjo5ixowZYtWqVaJDhw7C0dFRHDhwoKqLVqzLly8LAKJevXqia9euAoBYu3atVb5r164JHx8fERoaKj788EOxaNEi4enpKVq1aiX0er1F3tdee00AEM8//7xYvXq16NevnwAgtmzZUkm1umvw4MEiICBATJkyRXz66adi4cKFwt/fX7i4uIjTp09L+apr/X788UfRu3dvMX/+fLF69WrxwQcfiM6dOwsAYtWqVVK+6lq/wq5duybUarVwcXERzZo1szh24sQJoVQqxQMPPCBWrlwpXn/9daFQKESfPn2srmNP79e9e/cKAGLq1Kli48aNFj8JCQlSvupaPyGE2Llzp3B2dhbt2rUT77//vli9erWYOXOmeOWVV6Q81bl+hw4dsvrdbdiwQajVatG0aVMpX3Wt49WrV4WHh4cICQkRixcvFqtWrRKjR48WAMSAAQOkfPZYPwY/FejIkSMCgFiyZImUlp2dLUJDQ0WHDh2qsGT3ptPpxK1bt4QQQhw7dqzI4GfChAlCpVKJK1euSGm7du2y+pK9fv26cHJyEpMmTZLSTCaT6Ny5swgODha5ubkVVxkbDh48aPXlHhsbKxQKhXjqqaektOpaP1tyc3NFq1atRKNGjaS0mlK/J598UnTv3l1ERUVZBT99+/YVgYGBIi0tTUr79NNPBQCxc+dOKc3e3q/m4Ofrr78uNl91rV9aWprw9/cXAwcOFEajsch81bV+RTlw4IAAIBYtWiSlVdc6Llq0SAAQf//9t0X6yJEjBQCRnJwshLDP+jH4qUCvvPKKkMvlFr9wIYR46623BABx9erVKipZ6RQX/Pj5+YkhQ4ZYpUdERIgePXpIj1esWCEAiDNnzljk++KLLwQAu2kJe/DBB8WDDz4oPa5p9evfv7/w9/eXHteE+v32229CLpeLv/76yyr4SUtLE46OjhYtCUIIodfrhUajEWPHjpXS7O39WjD4SU9PFwaDwSpPda7fypUrBQBx9uxZIYQQmZmZVkFQda5fUSZMmCBkMpm4fPmyEKJ613HmzJkCgEVLpDndwcFBZGZm2m39OOanAp04cQIRERFWG7dFRkYCAE6ePFkFpSo/N27cQHx8PNq2bWt1LDIyEidOnJAenzhxAi4uLmjSpIlVPvPxqiaEwJ07d+Dj4wOgZtQvKysLiYmJuHjxIpYuXYqff/4ZPXr0AFAz6mc0GjFlyhQ899xzaNGihdXx06dPIzc316qOzs7OaN26tVUd7fH9OmbMGLi5uUGpVKJbt274888/pWPVuX67d++Gm5sbbty4gUaNGkGj0cDNzQ0TJkyATqcDUL3rZ4vBYMBXX32Fjh07on79+gCqdx27du0KABg7dixOnjyJa9eu4csvv8TKlSsxdepUuLi42G39GPxUoFu3biEwMNAq3Zx28+bNyi5Subp16xYAFFnH5ORk6PV6Ka+/vz9kMplVPsA+7sXmzZtx48YNPPnkkwBqRv1efvll+Pr6IiwsDDNmzMDAgQOxfPlyADWjfp988gmuXLmChQsX2jx+rzoWLLe9vV+dnZ0xePBgfPjhh9i+fTvefPNNnD59Gp07d5a+MKpz/c6fP4/c3Fw8/vjj6N27N7Zt24Znn30Wn3zyCcaMGSOVuWAZC7L3+tmyc+dOJCUl4amnnpLSqnMd+/Tpg4ULF2LXrl144IEHUK9ePQwbNgxTpkzB0qVLpTIXLGNBVVk/x3K7ElnJzs62uXeJUqmUjldn5vLfq44KhcLu78W5c+cwadIkdOjQAaNGjbIoU3Wu3/Tp0xEdHY2bN2/iq6++gtFoRE5OjkWZqmv9kpKSMHfuXMyZMwe+vr4289yrjgXLbW917NixIzp27Cg9HjBgAKKjo9GyZUvMmjULv/zyS7WuX2ZmJrRaLV544QVpdtegQYOQk5ODVatW4Y033qjW9bPliy++gJOTE4YOHSqlVfc61q9fH126dMHgwYPh7e2NH3/8EW+99RYCAgIwefJku60fg58KpFKppL+cCzI36apUqsouUrkyl78kdbTne3H79m3069cP7u7uiImJgVwutyhTda5f48aN0bhxYwDAyJEj8cgjj+Cxxx7DkSNHqn39Zs+eDS8vL0yZMqXIPPeqY8Fy22MdCwsLC8Pjjz+Ob775BkajsVrXz/x8w4cPt0gfMWIEVq1ahcOHD0OtVgOonvUrLDMzE9u3b0fv3r3h7e0tpVfn3+HWrVsxbtw4xMbGIjg4GEBeAGsymTBz5kwMHz7cbuvHbq8KFBgYKDX5FWROCwoKquwilStzU2RRdfTy8pKi+MDAQNy+fRui0D66VX0v0tLS0LdvX6SmpuKXX36xKEdNqF9h0dHROHbsGGJjY6t1/c6fP4/Vq1dj6tSpuHnzJuLi4hAXFwedTgeDwYC4uDgkJyffs46Ff9/V4f1at25d5OTkICsrq1rXz/x8/v7+Ful+fn4AgJSUlGpdv8K+++47aLVaiy4v4N6fM/Zcx48//hgPPPCAFPiYDRgwAFqtFidOnLDb+jH4qUCtW7dGbGws0tPTLdKPHDkiHa/O6tSpA19fX4sBmGZHjx61qF/r1q2h1Wrxzz//WOSrynuh0+nw2GOPITY2Fjt27EDTpk0tjlf3+tlibjZOS0ur1vW7ceMGTCYTpk6digYNGkg/R44cQWxsLBo0aIA33ngDzZs3h6Ojo1Udc3JycPLkSas6Vof366VLl6BUKqHRaKp1/dq0aQMAFgv9AXfHdfj6+lbr+hW2efNmaDQaDBgwwCK9Otfxzp07MBqNVukGgwEAkJuba7/1K7d5Y2Tljz/+sFqzQKfTibCwMNGuXbsqLFnpFDfV/YUXXhAqlcpiCuLu3bsFALFy5Uop7dq1a0WuE1OnTp1KXycmNzdXDBgwQDg6Oooff/yxyHzVtX537tyxSsvJyREPPvigUKlUIiMjQwhRfeuXkJAgvv32W6ufZs2aiXr16olvv/1W/PXXX0IIIfr06SMCAwNFenq6dP5nn30mAIiff/5ZSrO392t8fLxV2smTJ4WTk5PFAnLVtX7Hjx8XAMSIESMs0ocPHy4cHR3FjRs3hBDVt34FxcfHC0dHR/HMM8/YPF5d69i/f3/h7Ows/v33X4v0J554Qjg4ONj175DBTwUbMmSItMbBqlWrRMeOHYWjo6P47bffqrpo9/TRRx+JhQsXigkTJggAYtCgQWLhwoVi4cKFIjU1VQiRt8Knt7e3CA0NFcuWLRNvvfWW8PT0FC1atBA6nc7ieq+88ooAIMaNGyc+/fRTaYXgzZs3V3rdpk2bJgCIxx57zGoF1o0bN0r5qmv9nnjiCdG9e3cxf/58aQXrxo0bCwDivffek/JV1/oVxdYih//3f/8nFAqFxeqySqVSPPLII1bn29P7tVu3buLRRx8Vb775pli9erWYPn26UKvVwt3dXVobR4jqWz8hhHj22WcFADF06FCxYsUKMWTIEAFAzJo1S8pTnetn9tFHHwkA4pdffrF5vLrW0bzGlp+fn3jjjTfEihUrRN++fQUA8dxzz0n57LF+DH4qWHZ2tpgxY4YICAgQCoVCPPTQQ0W+AexNSEiIAGDzx7xAlxBC/P333+KRRx4RarVaeHh4iKeeekrcvn3b6npGo1G89dZbIiQkRDg7O4tmzZqJTZs2VWKN7oqKiiqyboUbRKtj/bZs2SJ69uwp/P39haOjo/D09BQ9e/YU27dvt8pbHetXFFvBjxB5q+p27NhRKJVK4evrKyZNmmTxV6iZPb1fP/zwQxEZGSm8vLyEo6OjCAwMFE8//bQ4f/68Vd7qWD8h8loj58+fL0JCQoSTk5MICwsTS5cutcpXXetn1r59e+Hn51dsC2l1reORI0dE3759RUBAgHBychIRERFi0aJFVoty2lv9ZEIUGsFIREREVINxwDMRERHVKgx+iIiIqFZh8ENERES1CoMfIiIiqlUY/BAREVGtwuCHiIiIahUGP0RERFSrMPghIiKiWoXBDxEREdUqDH6ISmDfvn2QyWSIiYmp6qKUyJ07dxAdHQ1vb2/IZDJ88MEHVVKO+fPnQyaTlencdevWQSaTIS4urnwLVYPVr18fo0ePrupi2CWZTIb58+dXdTHITjD4Ibth/rJTKpW4ceOG1fGuXbuiefPmVVCy6ufFF1/Ezp07MWvWLGzcuBF9+vSxmU+r1WL+/PnYt29f5RaQiKgKMfghu6PX6/H2229XdTGqtT179uDxxx/HjBkz8PTTT6Nx48Y282m1WixYsKDCgp/Zs2cjOzu7TOc+88wzyM7ORkhISDmXiohqOwY/ZHdat26NTz/9FDdv3qzqolS6rKyscrlOfHw8PDw8yuVaBZW2fI6OjlAqlWV6LrlcDqVSWeZuM6o5yut9QWTG4Ifszn/+8x8YjcZ7tv7ExcVBJpNh3bp1VscK9++bx57Exsbi6aefhru7O3x9fTFnzhwIIXDt2jU8/vjjcHNzQ0BAAN577z2bz2k0GvGf//wHAQEBcHFxwYABA3Dt2jWrfEeOHEGfPn3g7u4OtVqNqKgoHDx40CKPuUxnz57FiBEj4OnpiU6dOhVb50uXLmHIkCHw8vKCWq1G+/bt8eOPP0rHzV2HQgisWLECMpmsyOAhLi4Ovr6+AIAFCxZIec33bfTo0dBoNLh48SIeffRRuLq64qmnngIAHDhwAEOGDEG9evWgUChQt25dvPjii1atPLbG/MhkMkyePBnfffcdmjdvDoVCgWbNmuGXX36xyGdrzE/9+vXRv39//P7774iMjIRSqUTDhg2xYcMGq/r99ddfiIqKgkqlQnBwMN58802sXbu2ROOIbt++jTFjxiA4OBgKhQKBgYF4/PHHLc7bvn07+vXrh6CgICgUCoSGhmLhwoUwGo0W1zJ315rLo1arERYWJo0f++2339CuXTuoVCo0atQIu3fvtnkPz507h6FDh8LNzQ3e3t6YNm0adDpdsfUAgNTUVEyfPh1169aFQqFAWFgY/vvf/8JkMlnk27p1K9q0aQNXV1e4ubmhRYsW+PDDD4u9tvk9+O6772Lp0qUICQmBSqVCVFQU/v77b6v8586dQ3R0NLy8vKBUKtG2bVt8//33FnnMv/fffvsNEydOhJ+fH4KDg4sth06nw/z58xEREQGlUonAwEAMGjQIFy9eLPKcK1euYOLEiWjUqBFUKhW8vb0xZMgQq9eGwWDAggULEB4eDqVSCW9vb3Tq1Am7du2S8pTk9UL2xbGqC0BUWIMGDTBy5Eh8+umneO211xAUFFRu137yySfRpEkTvP322/jxxx/x5ptvwsvLC6tWrUL37t3x3//+F5s3b8aMGTPw0EMPoUuXLhbnL1q0CDKZDDNnzkR8fDw++OAD9OzZEydPnoRKpQKQ1+XUt29ftGnTBvPmzYODgwPWrl2L7t2748CBA4iMjLS45pAhQxAeHo633noLQogiy37nzh107NgRWq0WU6dOhbe3N9avX48BAwYgJiYGAwcORJcuXbBx40Y888wz6NWrF0aOHFnk9Xx9fbFy5UpMmDABAwcOxKBBgwAALVu2lPLk5uaid+/e6NSpE959912o1WoAwNdffw2tVosJEybA29sbR48exUcffYTr16/j66+/vufv4ffff8c333yDiRMnwtXVFcuWLcPgwYNx9epVeHt7F3vuhQsXEB0djbFjx2LUqFH4/PPPMXr0aLRp0wbNmjUDANy4cQPdunWDTCbDrFmz4OLigs8++wwKheKeZQOAwYMH48yZM5gyZQrq16+P+Ph47Nq1C1evXkX9+vUB5H1JazQavPTSS9BoNNizZw/mzp2L9PR0LFmyxOJ6KSkp6N+/P4YNG4YhQ4Zg5cqVGDZsGDZv3ozp06fjhRdewIgRI7BkyRJER0fj2rVrcHV1tbjG0KFDUb9+fSxevBh//PEHli1bhpSUFJuBn5lWq0VUVBRu3LiB8ePHo169ejh06BBmzZqFW7duSQPhd+3aheHDh6NHjx7473//CwD4559/cPDgQUybNu2e92vDhg3IyMjApEmToNPp8OGHH6J79+44ffo0/P39AQBnzpzBww8/jDp16uC1116Di4sLvvrqKzzxxBPYtm0bBg4caHHNiRMnwtfXF3Pnzi225cdoNKJ///743//+h2HDhmHatGnIyMjArl278PfffyM0NNTmeceOHcOhQ4cwbNgwBAcHIy4uDitXrkTXrl1x9uxZ6bU+f/58LF68GM899xwiIyORnp6OP//8E8ePH0evXr0AlOz1QnZGENmJtWvXCgDi2LFj4uLFi8LR0VFMnTpVOh4VFSWaNWsmPb58+bIAINauXWt1LQBi3rx50uN58+YJAGLcuHFSWm5urggODhYymUy8/fbbUnpKSopQqVRi1KhRUtrevXsFAFGnTh2Rnp4upX/11VcCgPjwww+FEEKYTCYRHh4uevfuLUwmk5RPq9WKBg0aiF69elmVafjw4SW6P9OnTxcAxIEDB6S0jIwM0aBBA1G/fn1hNBot6j9p0qR7XjMhIcHqXpmNGjVKABCvvfaa1TGtVmuVtnjxYiGTycSVK1ekNHMdCwIgnJ2dxYULF6S0U6dOCQDio48+ktLMr4fLly9LaSEhIQKA2L9/v5QW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rWnHUVFRIioqyiLtxIkTonPnzkKhUIjg4GCxePFisWzZMgFA3L59u8j7kZiYKCZNmiQaN24sXFxchLu7u2jXrp346quvLPIdPHhQtG/fXqhUKhEUFCReffVVaar63r17LcpW+HVbXF0K3x/zPTx79qyIjo4Wrq6uwtPTU0yePFlkZ2dbXbPgPRQibzmEWbNmibCwMOHs7Cx8fHxEx44dxbvvvitycnKEEELExMSIRx55RPj5+QlnZ2dRr149MX78eHHr1q0i75MQd6e6L1myRLz33nuibt26QqFQiM6dO1tMwTe7ePGiGDlypAgICBBOTk6iTp06on///iImJkbKU9znQFG0Wq14/fXXRYMGDYSTk5MICAgQ0dHR4uLFixb3teBnQkpKihgzZozw8fERGo1G9O7dW5w7d87qHr755psiMjJSeHh4CJVKJRo3biwWLVok3buSvl7IvsiEqMA/VYiI7Mj06dOxatUqZGZmlmgatT2YP38+FixYgISEBKtZiVUtLi4ODRo0wJIlSzBjxoyqLg5RiXHMDxHVSIW32khKSsLGjRvRqVOnahP4EFHF4JgfIqqROnTogK5du6JJkya4c+cO1qxZg/T0dMyZM6eqi0ZEVYzBDxHVSI8++ihiYmKwevVqyGQyPPjgg1izZo3Vfm1EVPtwzA8RERHVKhzzQ0RERLUKgx8iIiKqVRj8EBERUa3C4IeIiIhqFQY/REREVKsw+CEiIqJahcEPERER1SoMfoiIiKhW+X9R2qt9U8pdSgAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure()\n",
"ax = plt.gca()\n",
"plt.plot(num_shots_list, mean_scores_per_shot, label=\"KNN-3 with 128 MOSAIKS features\")\n",
"plt.fill_between(num_shots_list, mean_scores_per_shot - std_scores_per_shot, mean_scores_per_shot + std_scores_per_shot, alpha=0.3)\n",
"\n",
"plt.hlines(score_with_all_training, num_shots_list[0], num_shots_list[-1], linestyles=\"--\", color=\"r\", label=\"Using all training samples\")\n",
"\n",
"plt.xticks(fontsize=12)\n",
"plt.yticks(fontsize=12)\n",
"\n",
"plt.legend(loc=\"lower right\", fontsize=12)\n",
"plt.ylabel(\"Accuracy\", fontsize=12)\n",
"plt.xlabel(\"Number of training samples per class\", fontsize=12)\n",
"\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"\n",
"plt.show()\n",
"plt.close()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "geo",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment