From 1d271cc118d2916ae7d5c94fd6e927775abd14a3 Mon Sep 17 00:00:00 2001
From: Joseph Omar <j.omar@soton.ac.uk>
Date: Mon, 2 Dec 2024 15:54:54 +0000
Subject: [PATCH] Add pre-trained models and enhance training with learning
 rate scheduler

- Added pre-trained models for DINO and DINOv2 to backbone_store
- Updated .gitignore to exclude egg-info files
- Enhanced LinearHead to ensure new weights are initialized correctly
- Integrated Cosine Annealing LR Scheduler into pretraining and continual learning sessions
- Improved OOD accuracy computation with additional entropy and energy metrics
---
 .gitignore                                    |   3 +
 entcl/cl.py                                   |  23 +-
 .../dino_vitbase16_pretrain.pth               |   3 +
 .../backbone_store/dinov2_vitb14_pretrain.pth |   3 +
 entcl/models/linear_head.py                   |   3 +
 entcl/models/model.py                         |  64 +-
 entcl/pretrain.py                             |  15 +
 entcl/run.py                                  |  18 +-
 entcl/utils/ncd.py                            |  73 +-
 entcl/utils/ood.py                            |  19 +-
 experiments/experiments3.ipynb                | 854 ++++++++++++++++++
 11 files changed, 1012 insertions(+), 66 deletions(-)
 create mode 100644 entcl/models/backbone_store/dino_vitbase16_pretrain.pth
 create mode 100644 entcl/models/backbone_store/dinov2_vitb14_pretrain.pth
 create mode 100644 experiments/experiments3.ipynb

diff --git a/.gitignore b/.gitignore
index 1c47d2b..edcbd82 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,9 @@
 *.pyc
 __pycache__/
 
+# ignore egg stuff
+*.egg-info/
+
 runs/
 
 experiments/debug
diff --git a/entcl/cl.py b/entcl/cl.py
index 04d816c..f42242f 100644
--- a/entcl/cl.py
+++ b/entcl/cl.py
@@ -17,20 +17,16 @@ def cl_session(args, session_dataset: TransformedTensorDataset, model: torch.nn.
     logger.debug(f"Begin Continual Learning Session {args.current_session}")
     # make sure the dataset has the correct shape
     assert len(session_dataset.tensor_dataset.tensors) == 5, "Session Dataset should have 5 tensors, (data, true labels, true types, pred types, pseudo labels). Got: " + str(len(session_dataset.tensor_dataset.tensors))
-    
+    for i, t in enumerate(session_dataset.tensor_dataset.tensors):
+        if t.device != torch.device("cpu"):
+            logger.warning(f"Tensor {i} is not on CPU")
     # create the required training stuff and things and junk
     
     # we are only training with nove data at the moment, so we need to whittle down the dataset to only the predicted novel samples
     novel_samples_mask = session_dataset.tensor_dataset.tensors[3] == 1 # novel samples are labelled with 1. predtypes are the 4th tensor in the dataset
-    
+    novel_samples_mask = novel_samples_mask.cpu()
     novel_tensors = [tensor[novel_samples_mask] for tensor in session_dataset.tensor_dataset.tensors]
     
-    # adjust the psuedo labels (which start from 0 atm) to start from args.dataset.known + ((args.current_session - 1) * args.dataset.novel_inc)
-    adjust_value = args.dataset.known + ((args.current_session - 1) * args.dataset.novel_inc)
-    logger.debug(f"Adjusting Pseudo Labels by {adjust_value}")
-    novel_tensors[4] += adjust_value
-    logger.debug(f"Adjusted Pseudo Labels: {torch.unique(novel_tensors[4], sorted=True)}")
-    
     session_dataset = TransformedTensorDataset(
         tensor_dataset=torch.utils.data.TensorDataset(*novel_tensors),
         transform=session_dataset.transform,
@@ -79,6 +75,14 @@ def cl_session(args, session_dataset: TransformedTensorDataset, model: torch.nn.
         weight_decay=args.weight_decay,
     )
     
+    if not args.no_sched:
+        scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
+            optimizer=optimiser,
+            T_max=args.cl_epochs,
+            eta_min=args.lr * 1e-3,
+            verbose=args.verbose,
+        )
+    
     criterion = torch.nn.CrossEntropyLoss()
     
     results = None
@@ -126,6 +130,9 @@ def cl_session(args, session_dataset: TransformedTensorDataset, model: torch.nn.
         results.to_csv(f"{args.exp_dir}/results_s{args.current_session}.csv", index=False)
         logger.debug(f"Session {args.current_session} Results saved to {args.exp_dir}/results_s{args.current_session}.csv")
         
+        if not args.no_sched:
+            scheduler.step()
+        
     return model
 
 def _train(args, model: torch.nn.Module, train_loader: torch.utils.data.DataLoader, optimiser: torch.optim.Optimizer, criterion: torch.nn.Module) -> Tuple[torch.nn.Module, float]:
diff --git a/entcl/models/backbone_store/dino_vitbase16_pretrain.pth b/entcl/models/backbone_store/dino_vitbase16_pretrain.pth
new file mode 100644
index 0000000..a18201c
--- /dev/null
+++ b/entcl/models/backbone_store/dino_vitbase16_pretrain.pth
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf34ad0f424b9029b593e8dc3ed553bf26e88bcba0d32bf3e62a6209cb64c85e
+size 343242485
diff --git a/entcl/models/backbone_store/dinov2_vitb14_pretrain.pth b/entcl/models/backbone_store/dinov2_vitb14_pretrain.pth
new file mode 100644
index 0000000..d34296d
--- /dev/null
+++ b/entcl/models/backbone_store/dinov2_vitb14_pretrain.pth
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0b8b82f85de91b424aded121c7e1dcc2b7bc6d0adeea651bf73a13307fad8c73
+size 346378731
diff --git a/entcl/models/linear_head.py b/entcl/models/linear_head.py
index fec068e..5642c4b 100644
--- a/entcl/models/linear_head.py
+++ b/entcl/models/linear_head.py
@@ -16,12 +16,15 @@ class LinearHead(torch.nn.Module):
         """
         logger.info(f"Expanding Head: {self.fc.out_features} -> {self.fc.out_features + num}")
         old_fc = self.fc
+        
         self.fc = torch.nn.Linear(old_fc.in_features, old_fc.out_features + num)
         self.fc.weight.data[:old_fc.out_features] = old_fc.weight.data
         self.fc.bias.data[:old_fc.out_features] = old_fc.bias.data
         self.fc.weight.data[old_fc.out_features:] = 0
         self.fc.bias.data[old_fc.out_features:] = 0
         
+        self.fc = self.fc.to(old_fc.weight.device)
+        
         if init_new:
             torch.nn.init.kaiming_normal_(self.fc.weight.data[old_fc.out_features:])
             torch.nn.init.zeros_(self.fc.bias.data[old_fc.out_features:])
diff --git a/entcl/models/model.py b/entcl/models/model.py
index 9c9f4ba..bb4d0ac 100644
--- a/entcl/models/model.py
+++ b/entcl/models/model.py
@@ -2,31 +2,75 @@ import os
 from loguru import logger
 import torch
 
+
 class ENTCLModel(torch.nn.Module):
-    def __init__(self, head: torch.nn.Module, backbone_url: str, backbone: str, backbone_source: str):
+    def __init__(
+        self,
+        head: torch.nn.Module,
+        backbone_version: int = 1,
+    ):
         super().__init__()
         
-        # load the backbone
-        self.backbone = torch.hub.load(backbone_url, backbone, source=backbone_source)
-        logger.debug(f"Loaded backbone: {backbone} from {backbone_url} (src: {backbone_source})")
-        
+        self.backbone = self._load_backbone(backbone_version=backbone_version)
+
         # freeze the backbone
         for param in self.backbone.parameters():
             param.requires_grad = False
-        
+
         # set the head
         self.head = head
-        
+
     def forward(self, x):
         feats = self.backbone(x)
         logits = self.head(feats)
         return logits, feats
-    
+
     def train(self, mode=True):
         super().train(mode)
         self.backbone.train(False)
 
-    
+    def _load_backbone(self, backbone_version: int = 1):
+        if backbone_version == 1:
+            from dino import vision_transformer as vits
+
+            model = vits.__dict__["vit_base"](patch_size=16, num_classes=0)
+            state_dict = torch.load(
+                f=os.path.join(
+                    os.path.abspath(os.path.dirname(__file__)),
+                    "backbone_store",
+                    "dino_vitbase16_pretrain.pth",
+                ),
+                map_location="cpu",
+                weights_only=False,
+            )
+            model.load_state_dict(state_dict, strict=True)
+        elif backbone_version == 2:
+            from dinov2 import vision_transformer as vits
+
+            model = vits.__dict__["vit_base"](
+                img_size=518,
+                patch_size=14,
+                init_values=1.0,
+                ffn_layer="mlp",
+                block_chunks=0,
+                num_register_tokens=0,
+                interpolate_antialias=False,
+                interpolate_offset=0.1,
+            )
+            state_dict = torch.load(
+                f=os.path.join(
+                    os.path.abspath(os.path.dirname(__file__)),
+                    "backbone_store",
+                    "dinov2_vitb14_pretrain.pth",
+                ),
+                map_location="cpu",
+                weights_only=False,
+            )
+            model.load_state_dict(state_dict, strict=True)
+        else:
+            raise ValueError(f"Unsupported backbone version: {backbone_version}")
+        return model
+
 if __name__ == "__main__":
     model = ENTCLModel(head=None)
-    print(model)
\ No newline at end of file
+    print(model)
diff --git a/entcl/pretrain.py b/entcl/pretrain.py
index 11c2b07..28a8701 100644
--- a/entcl/pretrain.py
+++ b/entcl/pretrain.py
@@ -33,6 +33,17 @@ def pretrain(args, model):
         weight_decay=args.weight_decay,
     )
     
+    if not args.no_sched:
+        logger.debug("Using Cosine Annealing LR Scheduler")
+        scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
+            optimizer=optimiser,
+            T_max=args.pretrain_epochs,
+            eta_min=args.lr * 1e-3,
+            verbose=args.verbose,
+        )
+    else:
+        logger.debug("Not Using Scheduler")
+    
     criterion = torch.nn.CrossEntropyLoss()
     
     results = None
@@ -75,6 +86,10 @@ def pretrain(args, model):
             # save the results dataframe
             results.to_csv(f"{args.exp_dir}/results_s0.csv", index=False)
             logger.debug(f"Epoch {epoch} Finished. Pretrain Results Saved to {args.exp_dir}/results_s0.csv")
+            
+            if not args.no_sched:
+                scheduler.step()
+            
         return model
     else:
         raise ValueError(f"No Model to load and mode is not pretrain or both. Mode: {args.mode}, Pretrain Load: {args.pretrain_load}")
diff --git a/entcl/run.py b/entcl/run.py
index 4133e1e..269f8f8 100644
--- a/entcl/run.py
+++ b/entcl/run.py
@@ -16,7 +16,7 @@ from entcl.pretrain import pretrain
 
 @logger.catch
 def main(args: argparse.Namespace):
-    model = ENTCLModel(head=args.head, backbone_url=args.backbone_url, backbone=args.backbone, backbone_source=args.backbone_source)
+    model = ENTCLModel(head=args.head, backbone_version=args.backbone)
     logger.debug(f"Model: {model}")
     
     logger.info("Pretraining Model (Session 0)")
@@ -77,10 +77,11 @@ if __name__ == "__main__":
     parser.add_argument('--dataset', type=str, default='cifar100', help='Dataset to use', choices=['cifar100'])
     
     # optimiser args
-    parser.add_argument('--lr', type=float, default=0.001, help='Learning Rate for all optimisers')
+    parser.add_argument('--lr', type=float, default=0.1, help='Learning Rate for all optimisers')
     parser.add_argument('--gamma', type=float, default=0.1, help='Gamma for all optimisers')
-    parser.add_argument('--momentum', type=float, default=0, help='Momentum for all optimisers')
-    parser.add_argument('--weight_decay', type=float, default=0, help='Weight Decay for all optimisers')
+    parser.add_argument('--momentum', type=float, default=0.9, help='Momentum for all optimisers')
+    parser.add_argument('--weight_decay', type=float, default=5e-5, help='Weight Decay for all optimisers')
+    parser.add_argument('--no_sched', action='store_true', help='Do not use a scheduler')
     
     # cl args
     parser.add_argument('--known', type=int, default=50, help='Number of known classes. The rest are novel classes')
@@ -102,9 +103,7 @@ if __name__ == "__main__":
     
     # model args
     parser.add_argument('--head', type=str, default='linear', help='Classification head to use', choices=['linear','mlp', 'dino_head'])
-    parser.add_argument('--backbone_url', type=str, default="/cl/entcl/entcl/models/dinov2", help="URL to the repo containing the backbone model")
-    parser.add_argument("--backbone", type=str, default="dinov2_vitb14", help="Name of the backbone model to use")
-    parser.add_argument("--backbone_source", type=str, default="local", help="Source of the backbone model")
+    parser.add_argument("--backbone", type=int, default=1, help="Version of DINO to use", choices=[1, 2])
     
     # ood args
     parser.add_argument('--ood_score', type=str, default='entropy', help='Changes the metric(s) to base OOD detection on', choices=['entropy', 'energy', 'both'])
@@ -114,6 +113,7 @@ if __name__ == "__main__":
     parser.add_argument('--ncd_findk_method', type=str, default='cheat', help='Method to use for finding the number of novel classes', choices=['elbow', 'silhouette', 'gap', 'cheat'])
     args = parser.parse_args()
     
+    
     seed(args.seed) # seed everything
     
     # setup device
@@ -171,5 +171,7 @@ if __name__ == "__main__":
     argstr = "Arguments: \n"
     for arg in vars(args):
         argstr += f"{arg}: {getattr(args, arg)}\n"
-        
+    
+    logger.info(argstr)
+    
     main(args)
\ No newline at end of file
diff --git a/entcl/utils/ncd.py b/entcl/utils/ncd.py
index 8c5fb51..49ba177 100644
--- a/entcl/utils/ncd.py
+++ b/entcl/utils/ncd.py
@@ -87,31 +87,34 @@ def generate_mapping(
     :return: Dict[int, int] a mapping between the true labels and the pseudo labels.
     """
     logger.debug("Calculating Clustering Accuracy")
+    
+    true_labels = true_labels.cpu().numpy()
+    pseudo_labels = pseudo_labels.cpu().numpy()
+    
     assert (
         true_labels.shape == pseudo_labels.shape
     ), f"True and Pseudo labels must have the same shape. true_labels.shape: {true_labels.shape}, pseudo_labels.shape: {pseudo_labels.shape}"
-
-    # true labels will be > 50 and psuedo labels will start at 0. we need to adjust the pseudo labels to match the true labels.
-    # we will assume the true labels are sequential, and the lowest true label is 0.
-
-    novel_true_min_idx = true_labels.min()
-    pseudo_labels += novel_true_min_idx
-
-    true_labels = true_labels.cpu().numpy()
-    pseudo_labels = pseudo_labels.cpu().numpy()
-
+    
+    # this is used for testing, so we will cheat and remove all known classes from the data before finding the mapping
+    no_known_data_mask = true_labels >= args.dataset.known + (args.current_session - 1) * args.dataset.novel_inc
+    true_labels = true_labels[no_known_data_mask]
+    pseudo_labels = pseudo_labels[no_known_data_mask]
+    
+    # true and psuedo_label should start at 0, so we subtract the minimum value from both to move them into the 0-starting space
+    labels_start = true_labels.min()
+    true_labels -= labels_start
+    pseudo_labels -= labels_start
+    
+    # Hungarian Algorithm to find the best matching between the true and pseudo labels.
     conf_mat = confusion_matrix(true_labels, pseudo_labels)
     row_idxs, col_idxs = linear_sum_assignment(
         -conf_mat
-    )  # Hungarian Algorithm to find the best matching between the true and pseudo labels.
+    ) 
 
     # align the pseudo labels with the true labels based on the hungarian algorithm results
     pseudo_labels_aligned = np.zeros_like(pseudo_labels)
     for pseudo_label, true_label in zip(col_idxs, row_idxs):
         pseudo_labels_aligned[pseudo_labels == pseudo_label] = true_label
-        
-    # create a mapping between the true labels and the pseudo labels, used in validation and testing
-    mapping = {true_label: pseudo_label for pseudo_label, true_label in zip(col_idxs, row_idxs)}
     
     # compute the overall accuracy
     overall_accuracy = np.mean(true_labels == pseudo_labels_aligned)
@@ -126,31 +129,32 @@ def generate_mapping(
 
     string = f"NCD Clustering Accuracies for Session {args.current_session}:"
     for true_class, acc in per_class_accuracy.items():
-        string += f"\nTrue Class {true_class}: {acc*100:4f}%"
+        string += f"\nTrue Class {true_class+labels_start}: {acc*100:4f}%"
     string += f"\n"
     string += f"\nOverall Accuracy: {overall_accuracy*100:4f}%"
 
     logger.info(string)
+
+    # plot the confusion matrix
+    plot_confmat(
+        conf_mat,
+        os.path.join(args.exp_dir, f"confmat_session_{args.current_session}.png"),
+    )
+    
+    # Here is where we create the mapping ------------------------------------------------
+    # we now add the minimum value to the col and row idxs to move them back into the original label space
+    row_idxs += labels_start
+    col_idxs += labels_start
+    
+    # create a mapping between the true labels and the pseudo labels
+    mapping = {true_label: pseudo_label for pseudo_label, true_label in zip(col_idxs, row_idxs)}
     
     string = f"Mapping for Session {args.current_session}:"
     for true_label, pseudo_label in mapping.items():
         string += f"\nTrue Label {true_label} -> Pseudo Label {pseudo_label}"
-    
     logger.info(string)
-
-    # plot the confusion matrix
-    try:
-        plot_confmat(
-            conf_mat,
-            os.path.join(args.exp_dir, f"confmat_session_{args.currect_session}.png"),
-        )
-        logger.debug(
-            f"Confusion Matrix saved to {os.path.join(args.exp_dir, f'confmat_session_{args.currect_session}.png')}"
-        )
-    except Exception as e:
-        logger.error(
-            f"Could not plot the confusion matrix. Error: {e}\n Confusion Matrix not saved. Continuing..."
-        )
+        
+    
     return mapping
 
 def _cluster_features(args, features: torch.Tensor) -> torch.Tensor:
@@ -166,7 +170,7 @@ def _cluster_features(args, features: torch.Tensor) -> torch.Tensor:
 
     kmeans = KMeans(n_clusters=args.novel_classes_per_session, random_state=args.seed)
 
-    pseudo_labels = torch.tensor(kmeans.fit_predict(features.cpu().numpy()))
+    pseudo_labels = torch.tensor(kmeans.fit_predict(features.cpu().numpy()), dtype=torch.long)
     return pseudo_labels
 
 
@@ -207,7 +211,11 @@ def find_novel_classes_for_session(
 
     # cluster the features
     pseudo_labels = _cluster_features(args, novel_features)
-
+    
+    # pseudo_labels needs to start at the novel class start index, so we add that to the 0-starting pseudo labels
+    novel_class_start = args.dataset.known + (args.current_session - 1) * args.dataset.novel_inc
+    pseudo_labels += novel_class_start
+    
     # calculate the clustering accuracy (not used in the dataset, only for logging and testing)
     mapping = generate_mapping(
         novel_dataset.tensor_dataset.tensors[1], pseudo_labels, args
@@ -228,6 +236,7 @@ def find_novel_classes_for_session(
     clustering_df = pd.DataFrame(columns=["true_labels", "type", "pseudo_labels"])
     clustering_df["true_labels"] = session_dataset.tensor_dataset.tensors[1].cpu().numpy()
     clustering_df["type"] = session_dataset.tensor_dataset.tensors[2].cpu().numpy()
+    clustering_df["predtype"] = session_dataset.tensor_dataset.tensors[3].cpu().numpy()
     clustering_df["pseudo_labels"] = pseudo_labels_aligned.cpu().numpy()
 
     # save the dataset to a csv file
diff --git a/entcl/utils/ood.py b/entcl/utils/ood.py
index c0b8daa..aae758c 100644
--- a/entcl/utils/ood.py
+++ b/entcl/utils/ood.py
@@ -206,19 +206,19 @@ def label_ood_for_session(
             session_dataset.tensor_dataset.tensors[0],  # the data
             session_dataset.tensor_dataset.tensors[1],  # the labels
             session_dataset.tensor_dataset.tensors[2],  # the real types
-            final_predtypes,  # the predicted types (duh)
+            final_predtypes.cpu(),  # the predicted types (duh)
         ),
         transform=session_dataset.transform,
     )
 
     # compute the OOD Accuracy
-    _compute_ood_accuracy(session_dataset, args)
+    _compute_ood_accuracy(session_dataset, entropies, energies, args)
     
     return session_dataset
 
 
 def _compute_ood_accuracy(
-    session_dataset: TransformedTensorDataset, args
+    session_dataset: TransformedTensorDataset, entropies, energies, args
 ) -> None:
     """
     Computes the Accuracy of the OOD Labelling for a session dataset.
@@ -227,8 +227,6 @@ def _compute_ood_accuracy(
     :return: None
     """
     
-    
-
     # Create the DataFrame
     df = pd.DataFrame(
         {
@@ -238,6 +236,11 @@ def _compute_ood_accuracy(
         }
     )
     
+    if entropies is not None:
+        df["entropy"] = entropies.cpu().numpy()
+    if energies is not None:
+        df["energy"] = energies.cpu().numpy()
+    
     df["is_correct"] = df["predtype"] == df["type"]
     
     
@@ -246,14 +249,14 @@ def _compute_ood_accuracy(
     
     string = f"OOD Accuracies for Session {args.current_session}:"
     string += f"\nKnown Samples Correct/Total (Accuracy%): {known['is_correct'].sum()}/{known.shape[0]} ({known['is_correct'].mean()*100:.4f}%)"
-    string += f"\nKnown Samples Incorrect/Total (Error%) : {len(known) - known['is_correct'].sum()}/{known.shape[0]} ({1 - known['is_correct'].mean()*100:.4f}%)"
+    string += f"\nKnown Samples Incorrect/Total (Error%) : {len(known) - known['is_correct'].sum()}/{known.shape[0]} ({((len(known) - known['is_correct'].sum())/len(known))*100:.4f}%)"
     string += f"\n"
     string += f"\nNovel Samples Correct/Total (Accuracy%): {novel['is_correct'].sum()}/{novel.shape[0]} ({novel['is_correct'].mean()*100:.4f}%)"
-    string += f"\nNovel Samples Incorrect/Total (Error%) : {len(novel) - novel['is_correct'].sum()}/{novel.shape[0]} ({1 - novel['is_correct'].mean()*100:.4f}%)"
+    string += f"\nNovel Samples Incorrect/Total (Error%) : {len(novel) - novel['is_correct'].sum()}/{novel.shape[0]} ({((len(novel) - novel['is_correct'].sum())/len(novel))*100:.4f}%)"
     string += f"\n"
     string += f"\nOverall Accuracy: {df['is_correct'].mean()*100:.4f}%"
     logger.info(string)
     
-    file_path = generate_unique_path(os.path.join(args.exp_dir, f'ood_accuracy_{args.currect_session}.csv'))
+    file_path = generate_unique_path(os.path.join(args.exp_dir, f'ood_accuracy_{args.current_session}.csv'))
     df.to_csv(file_path, index=False)
     logger.info(f"OOD Accuracy CSV saved to {file_path}")
\ No newline at end of file
diff --git a/experiments/experiments3.ipynb b/experiments/experiments3.ipynb
new file mode 100644
index 0000000..ac9d55c
--- /dev/null
+++ b/experiments/experiments3.ipynb
@@ -0,0 +1,854 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Experiments 3: *The Samples Strike Back*\n",
+    "We use the much better ENTCL method here"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## GMM<sup>2\n",
+    "Here we try GMMing the GMMed data to get better OOD detection"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Load Stuff & Things"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/root/miniconda3/envs/entcl/lib/python3.10/site-packages/torchvision/transforms/v2/_deprecated.py:41: UserWarning: The transform `ToTensor()` is deprecated and will be removed in a future release. Instead, please use `transforms.Compose([transforms.ToImageTensor(), transforms.ConvertImageDtype()])`.\n",
+      "  warnings.warn(\n",
+      "\u001b[32m2024-12-02 15:25:35.075\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m53\u001b[0m - \u001b[34m\u001b[1mVerifying incremental learning settings\n",
+      "Known classes: 50\n",
+      "Pretraining samples per known class: 400\n",
+      "Samples per known class per CL session: 20\n",
+      "Samples per novel class per CL session: 400\n",
+      "Samples per previously novel class per CL session: 20\n",
+      "CL sessions: 5\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:35.076\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m66\u001b[0m - \u001b[34m\u001b[1mDownload: False\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:35.077\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m69\u001b[0m - \u001b[34m\u001b[1mLoading and Sorting CIFAR100 Train split\u001b[0m\n",
+      "/root/miniconda3/envs/entcl/lib/python3.10/site-packages/torchvision/transforms/v2/_deprecated.py:41: UserWarning: The transform `ToTensor()` is deprecated and will be removed in a future release. Instead, please use `transforms.Compose([transforms.ToImageTensor(), transforms.ConvertImageDtype()])`.\n",
+      "  warnings.warn(\n",
+      "\u001b[32m2024-12-02 15:25:42.365\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m74\u001b[0m - \u001b[34m\u001b[1mSplitting Train Data for Sessions\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.366\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m152\u001b[0m - \u001b[34m\u001b[1mSplitting data for 5 sessions\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.367\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m155\u001b[0m - \u001b[34m\u001b[1mSplitting data for session 0 (pretraining)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.411\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m163\u001b[0m - \u001b[34m\u001b[1mCreating dataset for session 0 (pretraining). There are 20000 samples, and 20000 labels. There are 50 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.412\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m164\u001b[0m - \u001b[34m\u001b[1mClasses in Pretraining Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.413\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m168\u001b[0m - \u001b[34m\u001b[1mSplitting data for CL sessions\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.414\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m170\u001b[0m - \u001b[34m\u001b[1mSplitting data for session 1\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.414\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m174\u001b[0m - \u001b[34m\u001b[1mThere are 50 known classes. Starting at 0 (inc), ending at 50 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.421\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m180\u001b[0m - \u001b[34m\u001b[1mThere are 10 novel classes. Starting at 50 (inc), ending at 60 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.436\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m203\u001b[0m - \u001b[34m\u001b[1mCreating dataset for session 1. There are 5000 samples, and 5000 labels. There are 60 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.438\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m204\u001b[0m - \u001b[34m\u001b[1mClasses in this Session 1's Train Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.439\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m170\u001b[0m - \u001b[34m\u001b[1mSplitting data for session 2\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.440\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m174\u001b[0m - \u001b[34m\u001b[1mThere are 50 known classes. Starting at 0 (inc), ending at 50 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.446\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m180\u001b[0m - \u001b[34m\u001b[1mThere are 10 novel classes. Starting at 60 (inc), ending at 70 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.451\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m189\u001b[0m - \u001b[34m\u001b[1mThere are 10 previously novel classes. Starting at 50 (inc), ending at 60 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.463\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m203\u001b[0m - \u001b[34m\u001b[1mCreating dataset for session 2. There are 5200 samples, and 5200 labels. There are 70 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.465\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m204\u001b[0m - \u001b[34m\u001b[1mClasses in this Session 2's Train Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.465\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m170\u001b[0m - \u001b[34m\u001b[1mSplitting data for session 3\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.466\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m174\u001b[0m - \u001b[34m\u001b[1mThere are 50 known classes. Starting at 0 (inc), ending at 50 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.471\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m180\u001b[0m - \u001b[34m\u001b[1mThere are 10 novel classes. Starting at 70 (inc), ending at 80 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.476\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m189\u001b[0m - \u001b[34m\u001b[1mThere are 10 previously novel classes. Starting at 50 (inc), ending at 70 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.490\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m203\u001b[0m - \u001b[34m\u001b[1mCreating dataset for session 3. There are 5400 samples, and 5400 labels. There are 80 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.492\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m204\u001b[0m - \u001b[34m\u001b[1mClasses in this Session 3's Train Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,\n",
+      "        72, 73, 74, 75, 76, 77, 78, 79])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.493\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m170\u001b[0m - \u001b[34m\u001b[1mSplitting data for session 4\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.494\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m174\u001b[0m - \u001b[34m\u001b[1mThere are 50 known classes. Starting at 0 (inc), ending at 50 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.498\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m180\u001b[0m - \u001b[34m\u001b[1mThere are 10 novel classes. Starting at 80 (inc), ending at 90 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.503\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m189\u001b[0m - \u001b[34m\u001b[1mThere are 10 previously novel classes. Starting at 50 (inc), ending at 80 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.518\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m203\u001b[0m - \u001b[34m\u001b[1mCreating dataset for session 4. There are 5600 samples, and 5600 labels. There are 90 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.520\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m204\u001b[0m - \u001b[34m\u001b[1mClasses in this Session 4's Train Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,\n",
+      "        72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.521\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m170\u001b[0m - \u001b[34m\u001b[1mSplitting data for session 5\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.521\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m174\u001b[0m - \u001b[34m\u001b[1mThere are 50 known classes. Starting at 0 (inc), ending at 50 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.525\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m180\u001b[0m - \u001b[34m\u001b[1mThere are 10 novel classes. Starting at 90 (inc), ending at 100 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.530\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m189\u001b[0m - \u001b[34m\u001b[1mThere are 10 previously novel classes. Starting at 50 (inc), ending at 90 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.548\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m203\u001b[0m - \u001b[34m\u001b[1mCreating dataset for session 5. There are 5800 samples, and 5800 labels. There are 100 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.549\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_train_data_for_sessions\u001b[0m:\u001b[36m204\u001b[0m - \u001b[34m\u001b[1mClasses in this Session 5's Train Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,\n",
+      "        72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,\n",
+      "        90, 91, 92, 93, 94, 95, 96, 97, 98, 99])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:42.557\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m79\u001b[0m - \u001b[34m\u001b[1mLoading and Sorting CIFAR100 Test split\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.017\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m83\u001b[0m - \u001b[34m\u001b[1mSplitting Test Data for Sessions\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.018\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m219\u001b[0m - \u001b[34m\u001b[1mSplitting test data for session 0\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.024\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m230\u001b[0m - \u001b[34m\u001b[1mCreating dataset for session 0 (pretraining). There are 5000 samples, and 5000 labels. There are 50 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.025\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m231\u001b[0m - \u001b[34m\u001b[1mClasses in Session 0's Test Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.026\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m236\u001b[0m - \u001b[34m\u001b[1mSplitting test data for 5 sessions\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.027\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m239\u001b[0m - \u001b[34m\u001b[1mSplitting test data for session 1\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.027\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m244\u001b[0m - \u001b[34m\u001b[1mOld classes end at 50 (exc), New classes start at 50 (inc) and end at 60 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.031\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m257\u001b[0m - \u001b[34m\u001b[1mCreating OLD dataset for session 1. There are 5000 samples, and 5000 labels. There are 50 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.033\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m258\u001b[0m - \u001b[34m\u001b[1mClasses in Session 1's OLD Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.035\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m273\u001b[0m - \u001b[34m\u001b[1mCreating NEW dataset for session 1. There are 1000 samples, and 1000 labels. There are 10 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.036\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m274\u001b[0m - \u001b[34m\u001b[1mClasses in Session 1's NEW Dataset: tensor([50, 51, 52, 53, 54, 55, 56, 57, 58, 59])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.042\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m284\u001b[0m - \u001b[34m\u001b[1mCreating ALL dataset for session 1. There are 6000 samples, and 6000 labels. There are 60 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.044\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m285\u001b[0m - \u001b[34m\u001b[1mClasses in Session 1's ALL Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.044\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m239\u001b[0m - \u001b[34m\u001b[1mSplitting test data for session 2\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.045\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m244\u001b[0m - \u001b[34m\u001b[1mOld classes end at 60 (exc), New classes start at 60 (inc) and end at 70 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.054\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m257\u001b[0m - \u001b[34m\u001b[1mCreating OLD dataset for session 2. There are 6000 samples, and 6000 labels. There are 60 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.055\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m258\u001b[0m - \u001b[34m\u001b[1mClasses in Session 2's OLD Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.057\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m273\u001b[0m - \u001b[34m\u001b[1mCreating NEW dataset for session 2. There are 1000 samples, and 1000 labels. There are 10 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.058\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m274\u001b[0m - \u001b[34m\u001b[1mClasses in Session 2's NEW Dataset: tensor([60, 61, 62, 63, 64, 65, 66, 67, 68, 69])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.063\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m284\u001b[0m - \u001b[34m\u001b[1mCreating ALL dataset for session 2. There are 7000 samples, and 7000 labels. There are 70 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.065\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m285\u001b[0m - \u001b[34m\u001b[1mClasses in Session 2's ALL Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.065\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m239\u001b[0m - \u001b[34m\u001b[1mSplitting test data for session 3\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.066\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m244\u001b[0m - \u001b[34m\u001b[1mOld classes end at 70 (exc), New classes start at 70 (inc) and end at 80 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.076\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m257\u001b[0m - \u001b[34m\u001b[1mCreating OLD dataset for session 3. There are 7000 samples, and 7000 labels. There are 70 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.078\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m258\u001b[0m - \u001b[34m\u001b[1mClasses in Session 3's OLD Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.079\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m273\u001b[0m - \u001b[34m\u001b[1mCreating NEW dataset for session 3. There are 1000 samples, and 1000 labels. There are 10 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.080\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m274\u001b[0m - \u001b[34m\u001b[1mClasses in Session 3's NEW Dataset: tensor([70, 71, 72, 73, 74, 75, 76, 77, 78, 79])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.088\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m284\u001b[0m - \u001b[34m\u001b[1mCreating ALL dataset for session 3. There are 8000 samples, and 8000 labels. There are 80 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.089\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m285\u001b[0m - \u001b[34m\u001b[1mClasses in Session 3's ALL Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,\n",
+      "        72, 73, 74, 75, 76, 77, 78, 79])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.090\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m239\u001b[0m - \u001b[34m\u001b[1mSplitting test data for session 4\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.090\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m244\u001b[0m - \u001b[34m\u001b[1mOld classes end at 80 (exc), New classes start at 80 (inc) and end at 90 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.102\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m257\u001b[0m - \u001b[34m\u001b[1mCreating OLD dataset for session 4. There are 8000 samples, and 8000 labels. There are 80 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.104\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m258\u001b[0m - \u001b[34m\u001b[1mClasses in Session 4's OLD Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,\n",
+      "        72, 73, 74, 75, 76, 77, 78, 79])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.106\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m273\u001b[0m - \u001b[34m\u001b[1mCreating NEW dataset for session 4. There are 1000 samples, and 1000 labels. There are 10 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.107\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m274\u001b[0m - \u001b[34m\u001b[1mClasses in Session 4's NEW Dataset: tensor([80, 81, 82, 83, 84, 85, 86, 87, 88, 89])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.114\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m284\u001b[0m - \u001b[34m\u001b[1mCreating ALL dataset for session 4. There are 9000 samples, and 9000 labels. There are 90 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.116\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m285\u001b[0m - \u001b[34m\u001b[1mClasses in Session 4's ALL Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,\n",
+      "        72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.117\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m239\u001b[0m - \u001b[34m\u001b[1mSplitting test data for session 5\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.117\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m244\u001b[0m - \u001b[34m\u001b[1mOld classes end at 90 (exc), New classes start at 90 (inc) and end at 100 (exc)\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.132\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m257\u001b[0m - \u001b[34m\u001b[1mCreating OLD dataset for session 5. There are 9000 samples, and 9000 labels. There are 90 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.134\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m258\u001b[0m - \u001b[34m\u001b[1mClasses in Session 5's OLD Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,\n",
+      "        72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.136\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m273\u001b[0m - \u001b[34m\u001b[1mCreating NEW dataset for session 5. There are 1000 samples, and 1000 labels. There are 10 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.137\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m274\u001b[0m - \u001b[34m\u001b[1mClasses in Session 5's NEW Dataset: tensor([90, 91, 92, 93, 94, 95, 96, 97, 98, 99])\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.150\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m284\u001b[0m - \u001b[34m\u001b[1mCreating ALL dataset for session 5. There are 10000 samples, and 10000 labels. There are 100 different classes\u001b[0m\n",
+      "\u001b[32m2024-12-02 15:25:44.151\u001b[0m | \u001b[34m\u001b[1mDEBUG   \u001b[0m | \u001b[36mentcl.data.cifar100\u001b[0m:\u001b[36m_split_test_data_for_sessions\u001b[0m:\u001b[36m285\u001b[0m - \u001b[34m\u001b[1mClasses in Session 5's ALL Dataset: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
+      "        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
+      "        36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
+      "        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,\n",
+      "        72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,\n",
+      "        90, 91, 92, 93, 94, 95, 96, 97, 98, 99])\u001b[0m\n"
+     ]
+    }
+   ],
+   "source": [
+    "from entcl.utils.util import seed\n",
+    "seed(8008135)\n",
+    "from entcl.models.model import ENTCLModel\n",
+    "from entcl.models.linear_head import LinearHead\n",
+    "from entcl.data.cifar100 import CIFAR100Dataset\n",
+    "import torch\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "from tqdm.notebook import tqdm\n",
+    "\n",
+    "device = torch.device('cpu')\n",
+    "eps = 1e-8\n",
+    "\n",
+    "pretrained_model = ENTCLModel(LinearHead(768, 50), backbone_version=1)\n",
+    "pretrained_model.head.load_state_dict(torch.load('/cl/entcl_LFS/experiments/dino_nosched_bb/session_0/head_s0_ep99.pt'))\n",
+    "pretrained_model = pretrained_model.to(device)\n",
+    "\n",
+    "dataset_master = CIFAR100Dataset()\n",
+    "dataset = dataset_master.get_dataset(1)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Calculate Entropy"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "119c4a9fd83d4d23a73c1af59a9d43d4",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "Calculating Entropies:   0%|          | 0/10 [00:00<?, ?batch/s]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "dataloader = torch.utils.data.DataLoader(dataset,\n",
+    "                                         batch_size=512,\n",
+    "                                         shuffle=False,\n",
+    "                                         num_workers=4,\n",
+    "                                         pin_memory=True)\n",
+    "\n",
+    "# DataFrame columns\n",
+    "feat_cols = [f'feat_{i}' for i in range(768)]\n",
+    "logit_cols = [f'logit_{i}' for i in range(50)]\n",
+    "\n",
+    "# List to store batch results\n",
+    "results = []\n",
+    "\n",
+    "# Ensure the model is in evaluation mode\n",
+    "pretrained_model.eval()\n",
+    "\n",
+    "# Iterate over the dataloader\n",
+    "for x, label, truetype in tqdm(dataloader, desc='Calculating Entropies', unit='batch'):\n",
+    "    with torch.no_grad():\n",
+    "        # Move inputs to the appropriate device\n",
+    "        x = x.to(device)\n",
+    "        \n",
+    "        # Get model outputs\n",
+    "        logits, feats = pretrained_model(x)\n",
+    "        \n",
+    "        # Compute softmax and entropy\n",
+    "        softmax = torch.nn.functional.softmax(logits, dim=1)\n",
+    "        entropy = -torch.sum(softmax * torch.log(softmax + 1e-12), dim=1)\n",
+    "        \n",
+    "        # Compute energy\n",
+    "        energy = -torch.logsumexp(logits, dim=1)  # Efficient log-sum-exp trick\n",
+    "        \n",
+    "        # Move data to CPU and convert to NumPy\n",
+    "        feats = feats.cpu().numpy()\n",
+    "        logits = logits.cpu().numpy()\n",
+    "        entropy = entropy.cpu().numpy()\n",
+    "        energy = energy.cpu().numpy()\n",
+    "        label = label.cpu().numpy()\n",
+    "        truetype = truetype.cpu().numpy()\n",
+    "        \n",
+    "        # Append batch results to the list\n",
+    "        for i in range(x.size(0)):\n",
+    "            results.append([entropy[i], energy[i], label[i], truetype[i], *feats[i], *logits[i]])\n",
+    "\n",
+    "# Create the DataFrame in one step\n",
+    "columns = ['entropy', 'energy', 'label', 'true_type'] + feat_cols + logit_cols\n",
+    "df = pd.DataFrame(results, columns=columns)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Plot Entropy Distributions"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIhCAYAAAB5deq6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACUwElEQVR4nOzdeXhU5d3/8feZyWxJyAYEwh4UEVEQxQVFQFEUrHurVqvSqo9rrUUefmLrgrZSW7RqXcCqoHWpPkWt1pUqi1asouACihubEAgkIdtkmcmc3x8nMxCyzT5ZPq/rmmuSmTNn7kyGkE++9/29DdM0TURERERERKRVtlQPQEREREREpKNTcBIREREREWmHgpOIiIiIiEg7FJxERERERETaoeAkIiIiIiLSDgUnERERERGRdig4iYiIiIiItEPBSUREREREpB0KTiIiIiIiIu1QcBKRpFi0aBGGYbBq1aomt+/atYuxY8eSmZnJkiVLALjtttswDCN0SU9PZ8CAAZx88sn85S9/obKystn5p0+f3uQx+17aM2TIkCbHZ2ZmctRRR/Hkk082OW7SpElMmjQpqtfgzjvv5KWXXorqsW0pLS3l/PPPJz8/H8MwOPPMM1s9dtKkSa2+RkOGDInq+R966CEWLVoU1WM7Cp/Px4IFCzjiiCPIy8sjPT2dwYMHc8YZZ/Diiy+menhxt2zZMgzD4B//+EfCnqOtf497X5YtW5awMbQl+DOpvUu0/y5EpOtJS/UARKT7+uGHHzjppJPYsWMH//73vzn66KOb3P/GG2+QnZ1NfX0927Zt4+2332bWrFn86U9/4pVXXmH06NFNjvd4PLzzzjtRj+fYY49l3rx5obHNmzePSy65hOrqaq666qqozxt055138uMf/7jNYBONO+64gxdffJHHH3+c/fbbj7y8vDaPHzp0KE8//XSz210uV1TP/9BDD9GrVy+mT58e1eM7gosuuogXXniB66+/njlz5uByufj+++954403ePPNNznrrLNSPcROZ+XKlU0+v+OOO1i6dGmzf6MHHXRQMocVcuqppzYb47hx4/jxj3/MDTfcELot2n8XItL1KDiJSEp88803nHjiifh8PpYvX84hhxzS7JjDDz+cXr16hT4///zzufbaa5k4cSKnn346X3/9dZNfamw2W7PwFYmcnJwmjz/xxBMZPHgw99xz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eznrrLOanO8///mPCZi/+93vTNM0zerqajMvL8887bTTmhzX0NBgjh492jzyyCPDHquIJJ8qTiKSVKeffjrl5eVcf/31NDQ0RHUOc5/pWEEej4ePPvqo2aWtys7eXnvtNRwOBw6Hg8LCQp5//nl++ctf8rvf/a7Vx7zzzjtkZGTw4x//uMntwalE0f4FOVHnBdhvv/1afJ1uvvnmZscGq3tBo0aNAmh3+uLezjnnnCafr1y5kpqammbTrQYOHMgJJ5zQ4te27/qtCy64AIClS5cC1nS6a6+9ln/9619s3rwZgO+++4433niDq6++ut3OitOmTWPz5s28+OKLzJw5k5EjR/LSSy9x+umnc+2114aOe/311znggAM48cQTWz1XpN+7E044gdzc3NDntbW1vP3225x11lmkp6c3qQpOmzaN2tpaPvjgAwCOPPJIPv30U66++mrefPNNKioq2vw693XBBRc0eW0GDx7MMcccE3pdgdD6vr/+9a+h2x544AEOOeQQJkyYENHztSQ3N5cTTjgh6sf/61//4vjjj6dfv35NXqupU6cCsHz58qjPPXToUH70ox/x0EMPhX7uPPPMM5SUlDR5XwTt+z495phjGDx4cOj1fP/99yktLeWSSy5pVu095ZRT+Oijj6iuro56vCKSWB1nda6IdAs333wzhx56KLfffjuBQICnnnoKu90e0TmCv7TvO0XIZrMxduzYqMc2fvx4/vznP4daoO+33344nc42H1NSUkLfvn2b/WKen59PWlpaaP1MpBJ1XgC32x3269SzZ88mnwebcdTU1IT9fPuuHWprTVG/fv1CbemD0tLSmo2jb9++Tc4F8Itf/IJbbrmF+fPnc+edd/Lggw/i8XiaTadqjcfj4cwzzwx1Pdy8eTNTp07lwQcf5KqrrmLkyJHs3LmTQYMGtXmeSL93Lb0+fr+fv/zlL/zlL39p8Tl27doFWNMgMzIyeOqpp5g/fz52u50JEyZw1113hfU9Dr6O+9726aefhj7v06cP5513HgsWLODGG29k7dq1vPvuuyxYsKDd84ejtbVl4dqxYwevvPIKDoejxfuDr1W0fvWrXzF58mSWLFnClClTePDBBxk3blyLU2Jbez2D3/MdO3YANAvVeystLSUjIyOmMYtIYig4iUjSzZkzB8MwmDNnDoFAgKeffjqiLmsvv/wyQNT7KbUmOzs74uDVs2dP/vvf/2KaZpNflIuLi/H7/U26AnaE86bCvgEiGIKCa4L2tm3btmZfm9/vp6SkpEl42r59e5NzgfX9u+SSS3j00UeZOXMmCxcu5IILLiAnJyeqcQ8aNIj/+Z//4frrr2ft2rWMHDmS3r1788MPP7T5uEi/d/u+Prm5udjtdi666KJW12YVFhYCVqicMWMGM2bMYPfu3fz73//mpptu4uSTT2bLli3tdqcLvo773rZvUP3Vr37F3/72N/75z3/yxhtvkJOTE3YXx/a0Vg10uVzNmmkAzYJnr169GDVqFL///e9bPE+sa7BOOOEEDj74YB544AEyMzP55JNPeOqpp1o8trXXc//99w+NFeAvf/lLq537+vTpE9N4RSRxNFVPRFLitttuY86cOTz//PNccMEFYXe/+vTTT7nzzjsZMmQI5557boJH2b7JkydTVVXVbGPb4Ma5kydPDt3mcrnCrtREct5Ui+TrAmuvHI/H0+yXzx9++IF33nmnxa9t332nnnnmGaB5eL7uuuvYtWsXP/7xj9m9e3eL06n2VVlZSVVVVYv3Bbv8BX/5njp1Kl9//XWb+4XF+r1LT0/n+OOPZ/Xq1YwaNYqxY8c2u+wbbMDqAvnjH/+Ya665htLS0jabXAQ9++yzTaa+btq0iffff7/Z63r44YdzzDHHcNddd/H0008zffr0hFdFhgwZwmeffdbktnfeeafZ9+pHP/pRqCV/S69VrMEJrPfVq6++yuzZs+nTpw8/+clPWjxu3/fp+++/z6ZNm0Kv57HHHktOTg7r1q1rcaxjx45tt8otIqmjipOIpMwtt9yCzWbj5ptvxjRNnn322SaVp48//pjs7Gx8Pl9oA9y//e1v5Ofn88orrzT7BSMQCITWfuxrzJgxCdnI8uKLL+bBBx/kkksuYePGjRxyyCG899573HnnnUybNq3JWphDDjmEZcuW8corr1BQUECPHj0YPnx4zOeNVE1NTauvUzT71xxyyCH8/e9/57nnnmPo0KG43e42W8zn5ORw8803c9NNN3HxxRfz05/+lJKSEubMmYPb7ebWW29tcrzT6eTuu++mqqqKI444gvfff5/f/e53TJ06lfHjxzc59oADDuCUU07h9ddfZ/z48c02SW7J+vXrOfnkkzn//POZOHEiBQUFlJWV8eqrr/LII48wadIkjjnm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wKxZs5g3bx5Dhw4lJycnrPP99re/5YUXXuDhhx9m2LBhrFixgp/97Gf07t2biRMntvq4gQMHsnjxYs455xzWr19PVlYWHo8Hp9PJddddx8svv8xPfvITAHbt2sW//vUv3njjjdDjv/32W55//nleeeUVKioquPTSS7nmmmt4+umnAfjrX//KrbfeygMPPMCYMWNYvXo1l19+ORkZGVxyySURvWaBQIABAwbw/PPP06tXL95//33+53/+h4KCAs4999zQcW+//TZut5ulS5eyceNGfv7zn9OrVy9+//vfx/RaxZuCk4iIiIhIO7Kzs3E6naSnp9O3b18AvvrqKwBuv/12TjrppLDPVV1dzT333MM777zDuHHjABg6dCjvvfceCxYsaDMM2O128vLyAMjPz28S1C644AIWLlwYCk5PP/00AwYMaFLpqq2t5YknnmDAgAEA/OUvf+HUU0/l7rvvpm/fvtxxxx3cfffdnH322QAUFhaybt06FixYEHFwcjgczJkzJ/R5YWEh77//Ps8//3yT4OR0Onn88cdJT09n5MiR3H777fzv//4vd9xxBzU1NVG/VvGm4CQiIiIiEoOxY8dGdPy6deuora1tFrbq6+sZM2ZM1OO4/PLLOeKII9i6dSv9+/dn4cKFTJ8+vckGsIMGDQqFJoBx48YRCARYv349drudLVu2cOmll3L55ZeHjvH7/WRnZ0c1pvnz5/Poo4+yadMmampqqK+v59BDD21yzOjRo0lPT28ypqqqKrZs2UJxcXFCXqtoKDiJiIiIiMQgIyOjyec2mw3TNJvc5vP5Qh8HAgEAXn31Vfr379/kOJfLFfU4xowZw+jRo3nyySc5+eST+fzzz3nllVfafEwwVBmGERrXX//6V4466qgmx9nt9ojH8/zzz/PrX/+au+++m3HjxtGjRw/+9Kc/8d///jesx+89pni/VtFQcJLk8pbClg9h+CmpHomIiIhIRJxOJw0NDe0e17t3b7744osmt61ZswaHwwHAQQcdhMvlYvPmzVFNNXM6nQAtjuWyyy7jz3/+M1u3buXEE09k4MCBTe7fvHkz27Zto1+/fgCsXLkSm83GAQccQJ8+fejfvz/ff/89F154YcTj2te7777LMcccw9VXXx267bvvvmt23KeffkpNTQ0ejweADz74gMzMTAYMGEBubm5Mr1U8KThJ8pgm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UPkPYHNY+zhFI6O31jiJiIiISIeT8g1wP//8c8aNG0dtbS2ZmZm8+OKLHHTQQS0eW1BQwCOPPMLhhx9OXV0df/vb35g8eTLLli1jwoQJLT5m7ty5zJkzJ5FfguytfIu1VsmIMpOn91LFSURERDq33VvAW5Kc50rvCTkDk/NccbZx40YKCwtZvXo1hx56aKqH066UB6fhw4ezZs0adu/ezeLFi7nkkktYvnx5i+Fp+PDhDB8+PPT5uHHj2LJlC/PmzWs1OM2ePZsZM2aEPq+oqGDgwM755uoUyn+A9BjWnGX2hh1r4zceERERkWTavQUePAJ8Ncl5PocHrvkoovA0ffp0nnjiCebOncuNN94Yuv2ll17irLPOwjTNRIy000t5cHI6naHmEGPHjuWjjz7ivvvuY8GCBWE9/uijj+app55q9X6Xy4XL5YrLWCUM5VsgI4rNb4My8qH8TautuWHEb1wiIiIiyeAtsULTcTdYW60kUvkWePdu6zkjrDq53W7uuusurrjiCnJzcxM0wK6lw6xxCjJNk7q6urCPX716NQUFBQkckUSkPMrNb4MyeoO/Fryl8RuTiIiISLJlD4Se+yf2EkMwO/HEE+nbty9z585t9ZjFixczcuRIXC4XQ4YM4e677w7dN3v2bI4++uhmjxk1ahS33npr6POFCxcyYsQI3G43Bx54IA899FDUY061lFacbrrpJqZOncrAgQOprKzk73//O8uWLeONN94ArG/I1q1befLJJwG49957GTJkCCNHjqS+vp6nnnqKxYsXs3jx4lR+GRLU4IPKHbEHJ2gMYD3jMy4RERERacJut3PnnXdywQUXcN111zFgwIAm93/88cece+653HbbbZx33nm8//77XH311fTs2ZPp06dz4YUX8oc//IHvvvuO/fbbD4C1a9fy+eef849//AOAv/71r9x666088MADjBkzhtWrV3P55ZeTkZHBJZdckvSvOVYpDU47duzgoosuoqioiOzsbEaNGsUbb7zBSSedBEBRURGbN+/psFZfX8/MmTPZunUrHo+HkSNH8uqrrzJt2rRUfQmyt8oiwIxTcPoB+h0aj1GJiIiISAvOOussDj30UG699VYee+yxJvfdc889TJ48mZtvvhmAAw44gHXr1vGnP/2J6dOnc/DBBzNq1CieeeaZ0DFPP/00RxxxBAcccAAAd9xx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dcTBSRUnEREREUkxBSeJXvUua32T0fLbyOsz2V1n0tOzZ6oeQEnEwSlPa5xEREREJKUUnCR67e7hZLUi77VPcIqq4uTzWl38RERERERSQMFJoldVvGefpRZsbdz8NhicMhxgM6CkJsLglJ675/lERERERFJAwUmiV1Xc7ua3NiC3saueYRhkOY3oKk6gTXBFREREJGUUnCR6YUzVy/MYpNmM0G1ZLiLfyykYnLQJroiIiIikSEqD08MPP8yoUaPIysoiKyuLcePG8frrr7f5mOXLl3P44YfjdrsZOnQo8+fPT9JopZnqnW1P1avc0xgiqIfToLQ2ENnzODLA7tRUPRERERFJmZQGpwEDBvCHP/yBVatWsWrVKk444QTOOOMM1q5d2+LxGzZsYNq0aRx33HGsXr2am266ieuuu47FixcneeRCvRfqq62ueq3Y7g2EpukFZTqMyNc4GUZjZz1VnEREREQkNdJS+eSnnXZak89///vf8/DDD/PBBx8wcuTIZsfPnz+fQYMGce+99wIwYsQIVq1axbx58zjnnHOSMWQJCm5+28ZUvYo6kz7pTbN5lsvgh8oIK05gNYhQxUlEREREUqTDrHFqaGjg73//O9XV1YwbN67FY1auXMmUKVOa3HbyySezatUqfD5fi4+pq6ujoqKiyUXioGqndd1Gc4jKehOPo+ltPZxQGmnFKfg8WuMkIiIiIimS8uD0+eefk5mZicvl4sorr+TFF1/koIMOavHY7du306dPnya39enTB7/fz65du1p8zNy5c8nOzg5dBg4cGPevoVsKo+JU5QNPWtOpesGueqYZzSa4Ck4iIiIikhopD07Dhw9nzZo1fPDBB1x11VVccsklrFu3rtXjDaPpL+LBX8D3vT1o9uzZlJeXhy5btmyJ3+C7s6piMGzgymr9kHqT9H0mg/ZwGtQHoLrlAmHrPDlQqXbkIiIiIpIaKV3jBOB0Otl///0BGDt2LB999BH33XcfCxYsaHZs37592b69adWhuLiYtLQ0evbs2eL5XS4XLpcr/gPv7oId9Wz2Fu+ubzCpawCPo3nFCaCs1iTT2XLYbZEnF7wl0OAHe8rftiIiIiLSzaS84rQv0zSpq6tr8b5x48axZMmSJre99dZbjB07FofD0eJjJEGqd7XZiryq3qoEtlRxAiiJeC+nPMAEb8tTMkVEREREEiml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8MNZsqRpYX/JkiUcc8wxLT5m3LhxzY5/6623GDt2bIvrm0REREREROIhpatNZ8yYwaOPPsrjjz/Ol19+ya9//Ws2b94c2pdp9uzZXHzxxaHjr7zySjZt2sSMGTP48ssvefzxx3nssceYOXNmqr4EERERERHpBlK6xum8886jpKSE22+/naKiIg4++GBee+01Bg8eDEBRURGbN28OHV9YWMhrr73Gr3/9ax588EH69evH/fffH5dW5C6Xi1tvvbXZtD6JnV7bxNDrmjh6bRNDr2vi6LVNDL2uiaPXNjH0uiaWYYbTe09ERERERKQb6xgbQ4iIiIiIiHRgCk4iIiIiIiLtUHASERERERFph4KTiIiIiIhIO7pNcCorK+Oiiy4iOzub7OxsLrroInbv3t3q8T6fj//3//4fhxxyCBkZGfTr14+LL76Ybdu2NTlu0qRJGIbR5HL++ecn+KtJrYceeojCwkLcbjeHH3447777bpvHL1++nMMPPxy3283QoUOZP39+s2MWL17MQQcdhMvl4qCDDuLFF19M1PA7tEhe2xdeeIGTTjqJ3r17k5WVxbhx43jzzTebHLNo0aJm70/DMKitrU30l9KhRPK6Llu2rMXX7KuvvmpynN6zlkhe2+nTp7f42o4cOTJ0jN6zsGLFCk477TT69euHYRi89NJL7T5GP2fbF+nrqp+x4Yv0tdXP2fBE+rrqZ2zidZvgdMEFF7BmzRreeOMN3njjDdasWcNFF13U6vFer5dPPvmEm2++mU8++YQXXniBr7/+mtNPP73ZsZdffjlFRUWhy4IFCxL5paTUc889x/XXX89vfvMbVq9ezXHHHcfUqVObtI3f24YNG5g2bRrHHXccq1ev5qabbuK6665j8eLFoWNWrlzJeeedx0UXXcSnn37KRRddxLnnnst///vfZH1ZHUKkr+2KFSs46aSTeO211/j44485/vjjOe2001i9enWT47Kyspq8P4uKinC73cn4kjqESF/XoPXr1zd5zYYNGxa6T+9ZS6Sv7X333dfkNd2yZQt5eXn85Cc/aXJcd3/PVldXM3r0aB544IGwjtfP2fBE+rrqZ2z4In1tg/Rztm2Rvq76GZsEZjewbt06EzA/+OCD0G0rV640AfOrr74K+zwffvihCZibNm0K3TZx4kTzV7/6VTyH26EdeeSR5pVXXtnktgMPPNC8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",
+      "text/plain": [
+       "<Figure size 1000x600 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import seaborn as sns\n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "# Map true_type to labels\n",
+    "df['true_type_label'] = df['true_type'].map({0: 'Known', 1: 'Novel'})\n",
+    "master_df = df.copy()\n",
+    "\n",
+    "plt.figure(figsize=(10, 6))\n",
+    "sns.kdeplot(data=df, x='entropy', hue='true_type_label', fill=True)\n",
+    "plt.title('KDE Plot of Entropy Scores by True Type')\n",
+    "plt.xlabel('Entropy')\n",
+    "plt.ylabel('Density')\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Plot Energy Distributions"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2AAAAIhCAYAAAAo4dnZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACbq0lEQVR4nOzdd3hU1drG4d/MpFdSSKMm9N5FUJoiCDYEFRUFPMoROyDHXhBUjoLlKCB+KiB2bIiKIiogSqRJB5ESCISEEEpCSZ/9/bFhNCSU1J1Jnvu65grZs2b2M5MY82at/S6bYRgGIiIiIiIiUu7sVgcQERERERGpLlSAiYiIiIiIVBAVYCIiIiIiIhVEBZiIiIiIiEgFUQEmIiIiIiJSQVSAiYiIiIiIVBAVYCIiIiIiIhVEBZiIiIiIiEgFUQEmIiIiIiJSQVSAiYjbmjVrFjabjVWrVhU4npaWRseOHQkICGDhwoUAjBs3DpvN5rr5+flRu3Zt+vbty+uvv87Ro0cLPf/w4cMLPOb027nUr1+/wPiAgAA6d+7M7NmzC4zr2bMnPXv2LNF78PzzzzN37twSPfZsDh06xI033khERAQ2m40BAwaccWzPnj3P+B7Vr1+/zLNVNlu2bOHWW28lLi4OHx8fwsPDad++Pffeey8ZGRlWxytzPXv2pGXLluX2/Kf/t3qmW0n/mykLp/+3fabbrFmzLMsoIpWXh9UBRETK0t69e7nsssvYv38/P/74IxdeeGGB+7///nuCg4PJyclh3759/PTTTzz00ENMmjSJr7/+mjZt2hQY7+vry88//1ziPBdddBGTJ092ZZs8eTLDhg3j+PHj3HXXXSV+3lOef/55rrvuurMWSCUxYcIEvvzyS2bMmEGDBg0IDQ096/i4uDg++OCDQse9vb3LNFdls2bNGi666CKaNWvGU089Rf369UlLS2PdunV8/PHHjB07lqCgIKtjupU77riDyy+/3PV5cnIyAwcO5L777uPmm292Hbfyff3yyy/Jzs52ff7222/zzjvvuH6+nNKgQQMr4olIJacCTESqjG3bttG7d29yc3NZsmQJrVq1KjSmQ4cOhIeHuz6/8cYbuffee+nRowdXX301f/31V4GiwW63FyriiqNGjRoFHt+7d2/q1avHyy+/XCYFWHnZuHEjDRo0YMiQIec13tfXt1TvU1k6ceIEfn5+FXKuV199FbvdzuLFiwkMDHQdv+6665gwYQKGYVRIDqjY112eateuTe3atV2f79q1C4C6deue9XssNzcXm82Gh0f5/2rTrl27Ap9///33QOGfLyIiRdESRBGpEtauXcvFF1+Mh4cHv/76a5HF15m0adOGxx9/nMTERD755JNyTGkWZE2aNGH37t1nHXfo0CHuvvtuatWqhZeXF3FxcTz++OMF/upus9k4fvw477777nkvyzrX8+7atQubzcaPP/7Ili1bXM+7ePHi0r5015LRRYsWcddddxEeHk5YWBgDBw5k3759hcZ/8skndOnSBX9/fwICAujbty9r1qwpMGb48OEEBASwYcMG+vTpQ2BgIJdeeikAR44c4fbbbyc0NJSAgACuuOIKdu7cic1mY9y4cQAsXboUm83GRx99VOj8s2fPxmazsXLlyjO+poMHDxIUFERAQECR95++VPX777/n0ksvJTg4GD8/P5o1a8bEiRMLjJk3bx5dunTBz8+PwMBALrvsMuLj4wuMObVM748//uC6664jJCTENdtiGAbTpk2jbdu2+Pr6EhISwnXXXcfOnTsLPMeaNWu48soriYiIwNvbm5iYGK644gr27t17xtf7T0uXLuXCCy/E19eXWrVq8eSTT5Kfn+/K0KhRI/r27VvocceOHSM4OJh77rnnvM5TlMWLF2Oz2Xjvvfd48MEHqVWrFt7e3mzfvt313pzu1PffqYLulPP5PiuuCRMm4OHhwZ49ewrd969//YuwsDCysrIAcznjlVdeyZdffknr1q3x8fEhLi6O1157rdBjMzIyGDt2LLGxsXh5eVGrVi1GjRrF8ePHS5VXRCqWCjARcXu//vorPXv2JCIigl9//ZW4uLhiP8fVV18NwC+//FLovry8vEI3p9NZoqy5ubns3r2bmjVrnnFMVlYWvXr1Yvbs2YwZM4Zvv/2WW265hRdffJGBAwe6xsXHx+Pr60v//v2Jj48nPj6eadOmlep5o6OjiY+Pp127dsTFxbmet3379ud8bef7Pt1xxx14enry4Ycf8uKLL7J48WJuueWWAmOef/55brrpJpo3b86cOXN47733OHr0KN26dWPz5s0Fxubk5HD11VdzySWX8NVXX/HMM8/gdDq56qqr+PDDD3n44Yf58ssv6dy5c4GlbQDdunWjXbt2TJ06tVDOKVOm0KlT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M6dAAebl5cWMGTPw8/OjRYsWjB8/nv/85z9MmDCBzMzMEr9XZc2yAgxgzJgx3HrrrXTs2JEuXbrwf//3fyQmJjJy5EjAXPaXlJTE7NmzAbPj4ZQpUxgzZgwjRowgPj6ed955h48++sj1nBMnTqRjx440aNCAnJwc5s+fz+zZswt0PDzXeUVEREREKlrHjh2LNX7z5s1kZWUVKtpycnJo165diXOMGDGCTp06kZSURK1atZg5cybDhw8vcLlO3bp1XcUXmBMlTqeTrVu34nA42LNnD7fffjsjRoxwjcnLyyM4OLhEmaZPn87bb7/N7t27yczMJCcnp1CHxDZt2uDn51cg07Fjx9izZw+pqanl8l6VhKUF2ODBgzl48CDjx48nOTmZli1bMn/+fOrVqwdAcnJygb25YmNjmT9/PqNHj2bq1KnExMTw2muvMWjQINeY48ePc/fdd7N37158fX1p2rQp77//PoMHDz7v84qIiIiIVDR/f/8Cn9vtdk7fMeqfnb+dTicA3377LbVq1SowrjSXzrRr1442bdowe/Zs+vbty4YNGwqtQjvdqeLMZrO5cr311lt07ty5wDiHw1HsPHPmzGH06NG89NJLdOnShcDAQCZNmsTy5cvP6/H/zFTW71VJWFqAAdx9993cfffdRd43a9asQsd69OjBH3/8ccbne/bZZ3n22WdLdV4RERERt2MYcHAH7F0JmYfBvyYE1ITQOKhR1+p08g9eXl7k5+efc1zNmjXZuHFjgWNr1651XXrTvHlzvL29SUxMLNESOi8vL4Ais9xxxx288sorJCUl0bt370IdwBMTE9m3bx8xMTGAuV2U3W6ncePGREZGUqtWLXbu3MmQIUOKnet0S5cupWvXrgV+d9+xY0ehcevWrSMzMxNfX18Afv/9dwICAqhduzYhISGleq/KkuUFmIiIiIiUwr618NursONnyEo3j3l4Q94/utg1vAy63guxPeAsXZ+lYtSvX5/ly5eza9cuAgICXLMzp7vkkkuYNGkSs2fPpkuXLrz//vts3LjRtWQuMDCQsWPHMnr0aJxOJxdffDEZGRksW7aMgICAc15rVa9ePWw2G9988w39+/fH19eXgIAAAIYMGcLYsWN56623XJcD/ZOPjw/Dhg1j8uTJZGRkcP/993PDDTe4rmsbN24c999/P0FBQfTr14/s7GxWrVrF4cOHGTNmTLHer4YNGzJ79mwWLFhAbGws7733HitXriQ2NrbAuJycHG6//XaeeOIJdu/ezdNPP829996L3W4v9XtVllSAiYiIiLijPSthyQuwfSEE1YImV0DNplCzMXgFQG4mZB6B1M2w+SuYfQ1EtYKBb0NEU6vTV2tjx45l2LBhNG/enMzMTGbOnFnkuL59+/Lkk0/y0EMPkZWVxb/+9S+GDh3Khg0bXGMmTJhAREQEEydOZOfOndSoUYP27dvz2GOPnTNHrVq1eOaZZ3jkkUe47bbbGDp0qGsFWlBQEIMGDeLbb78t1AofzKJo4MCB9O/fn0OHDtG/f/8CbebvuOMO/Pz8mDRpEg899BD+/v60atWqRBtQjxw5krVr1zJ48GBsNhs33XQTd999N999912BcZdeeimNGjWie/fuZGdnc+ONNzJu3Lgyea/Kks04fWGpnJeMjAyCg4NJT08nKCjI6jgiIiJSXeRlw0/jIX4K1KgHra6H+t3AfpZrawwDUtbByrfhxCEY/B7E9aywyNVNVlYWCQkJxMbG4uPjY3WcErvsssto1qwZr732WoHj48aNY+7cuaxdu9aaYBY529e1OLWB5Rsxi4iIiMh5StsGb18Ky6dDxzvg6tfNQupsxReYyw6j28LlL0JYI3h/EPzxXkUkFjd06NAhPv74Y37++Wfuueceq+NUOSrARERERNzB1u/hzW7mssL+L0GLAWAr5q9yXn5w6VPQsDfMuxdWvlMeSaWSGDlyJAEBAUXezrb9Uvv27bnzzjt54YUXaNKkSZnnev7558+Yq1+/fmV+vspGSxBLSEsQRUREpMKsnwNfjoQ6F8DFD4JnKZe1GYY5i7Z9Idz+A8RU7D5IVV1lWYKYmppKRkZGkfcFBQURERFRwYlMhw4d4tChQ0Xe5+vrW6hNfGVRVksQ1YRDREREpDJb8RbM/w80vBS63Hfu5Ybnw2aDTnfAwb9gzlC4cyn41ij980qlEhERYVmRdTahoaGEhoZaHcMyWoIoIiIiUlktfxPmj4VmV0HX+8um+DrF4QndHzabcnx1jzkrJiLlTgWYiIiISGW0+Sv47mFoPgA6jSj+9V7nIzAKLhoFf35jzrSJSLlTASYiIiJS2SQuhy9GmO3lO/6rfDdPrnshNL4cfn7WnA0TkXKlAkxERESkMknbDh8NNtvFXzyqfGa+Ttd2COTnwNKXyv9cItWcCjARERGRyiL7mFl8eQVAryfA4VUx5/UNgZYDYcX/weFdFXNOkWpKXRBFREREKgPDgG9GQUYSXPEKeAdU7PmbXwtbvzOXIg56u2LPLYUkHcnk8PGcCjtfiL8XtWr4Vtj5qjMVYCIiIiKVwepZsOFT6PYfCK5d8ef39IG2N0P8FOhyj/YGs1DSkUwufWkxWbnOCjunj6ednx7sWawibPjw4Rw5coS5c+e6jn322WfccsstjB8/noceeqgckro/FWAiIiIiVkteD989ZDbDiOthXY6Gl8GWr+HHcTD0K+tyVHOHj+eQlevknl4NK2RWKulIJlMXbefw8ZxSne/tt9/mnnvuYerUqdxxxx1lmLBq0TVgIiIiIlbKOQGfDoPgOnDBv63NYndAqxtg52LYv9naLEKtGr7EhvuX+60sirwXX3yRe++9lw8//NBVfA0fPpwBAwYwefJkoqOjCQsL45577iE3N9f1uMOHDzN06FBCQkLw8/OjX79+bNu2DQDDMKhZsyaff/65a3zbtm0LbC4dHx+Pp6cnx44dA8Bms/H2229z7bXX4ufnR6NGjZg3b16pX19ZUgEmIiIiYqWfn4X0vdB9bMU13Tibel3BLwxWvGl1EnETjzzyCBMmTOCbb75h0KBBBe5btGgRO3bsYNGiRbz77rvMmjWLWbNmue4fPnw4q1atYt68ecTHx2MYBv379yc3NxebzUb37t1ZvHgxYBZrmzdvJjc3l82bzT8QLF68mA4dOhAQ8Pc1k8888ww33HAD69evp3///gwZMoRDhyrPFgsqwERERESssjsefp8GbW8xZ8AqA4enuRRy/SeQedjqNFLJfffdd7zwwgt89dVX9O7du9D9ISEhTJkyhaZNm3LllVdyxRVX8NNPPwGwbds25s2bx9tvv023bt1o06YNH3zwAUlJSa7rynr27OkqwH755RfatGnDJZdc4jq2ePFievbsWeCcw4cP56abbqJhw4Y8//zzHD9+nBUrVpTXW1BsKsBERERErJBzAubeBTWbQvNrrE5TUOPLIT8X1rxvdRKp5Fq3bk39+vV56qmnOHr0aKH7W7RogcPhcH0eHR1NamoqAFu2bMHDw4POnTu77g8LC6NJkyZs2bIFMAuwTZs2kZaWxpIlS+jZsyc9e/ZkyZIl5OXlsWzZMnr0KHjdZOvWrV3/9vf3JzAw0HXOykAFmIiIiIgVfn7WbDl/0QPmtVeViW8I1L/Y3BfMmW91GqnEatWqxZIlS0hOTubyyy8vVIR5enoW+Nxms+F0mt0dDcMo8jkNw8BmswHQsmVLwsLCWLJkiasA69GjB0uWLGHlypVkZmZy8cUXn/c5KwMVYCIiIiIVLWm1ufSw3S3WtJw/H02vgiOJsO0Hq5NIJVe3bl2WLFlCamoqffr0ISMj47we17x5c/Ly8li+fLnr2MGDB/nrr79o1qwZgOs6sK+++oqNGzfSrVs3WrVqRW5uLtOnT6d9+/YEBgaWy+sqL2pDLyIiIlKRnPnwzWgIjYNmlWzp4T/VbALhTWD5dGjSz+o01VLSkUy3OU/t2rVZvHgxvXr1ok+fPixYsOCcj2nUqBHXXHMNI0aM4M033yQwMJBHHnmEWrVqcc01f/+30bNnT0aPHk27du0ICgoCoHv37nzwwQeMGTOm1NkrmgowERERkYq0eiYkr4N+kyrf0sPTNe0Pv74Ch3dDSD2r01QbIf5e+Hjambpoe4Wd08fTToh/6bpwnlqO2KtXLy677DJiYmLO+ZiZM2fywAMPcOWVV5KTk0P37t2ZP39+gWWEvXr1Ij8/v0CzjR49ejB37txC13+5A5txpsWXclYZGRkEBweTnp7uqsRFREREzup4GrzeHupcAF0fsDrNueVmwpxboMcj0M39ZhqskpWVRUJCArGxsfj4+JToOZKOZHL4eE4ZJzuzEH+vCtn02Z2d7etanNpAM2AiIiIiFWXhU2A4of1wq5OcH09fqN0ZNnyqAqyC1arhq4KoilITDhEREZGKsGcFrP0A2g0Fn2Cr05y/2B6Quhn2b7Y6iUiVoAJMREREpLwZBnz/KIQ2gEZ9rE5TPLXag1cAbPzM6iQiVYIKMBEREZHytukLSFoFHf9V+RtvnM7hCfW6mssQ1TpApNRUgImIiIiUp9wsWPg01L4AottYnaZkYnuae4LtXWV1EhG3pwJMREREpDyteBMy9kHH26xOUnKRLcAvzJwFE5FSUQEmIiIiUl6OH4RfJkPjyyG4jtVpSs7ugPoXw8bPIT/P6jQibk0FmIiIiEh5+WUSGPnQ9mark5RebA84kQa7f7M6iYhbUwEmIiIiUh6OJMKqd6DFQPdqO38mYY3MZYh/fW91EhG3po2YRURERMrD4v+Clz80u9rqJGXDZoPanWDrfOj7vPm5lJ8je+DEwYo7n18Y1HDPZbK7du0iNjaWNWvW0LZtW6vjnJMKMBEREZGydmArrPsIOt0Bnr5Wpyk7tS8wZ8DStkHNxlanqbqO7IGpnSA3s+LO6ekL96wsVhE2fPhw3n33XSZOnMgjjzziOj537lyuvfZaDG1bUCQVYCIiIiJl7ednwb8mNO5ndZKyFd0GPLzhr+9UgJWnEwfN4qvbgxXTvCV9Dyx9yTxvMWfBfHx8eOGFF7jzzjsJCQkpp4BVi64BExERESlLSX/AlnnQ5iZzE+OqxMMbotrAVl0HViGC60BYw/K/laLI6927N1FRUUycOPGMYz7//HNatGiBt7c39evX56WXXnLd9+ijj3LhhRcWekzr1q15+umnXZ/PnDmTZs2a4ePjQ9OmTZk2bVqJM1tNBZiIiIhIWfr5WahRF+J6WZ2kfNS5APYshxOHrE4ilYDD4eD555/n9ddfZ+/evYXuX716NTfccAM33ngjGzZsYNy4cTz55JPMmjULgCFDhrB8+XJ27NjhesymTZvYsGEDQ4YMAeCtt97i8ccf57nnnmPLli08//zzPPnkk7z77rsV8hrLmgowERERkbKSuBx2/ARtbjb3zqqKanU0W+tv/9HqJFJJXHvttbRt27bAjNUpL7/8MpdeeilPPvkkjRs3Zvjw4dx7771MmjQJgJYtW9K6dWs+/PBD12M++OADOnXqROPG5jLXCRMm8NJLLzFw4EBiY2MZOHAgo0eP5s0336yYF1jGVICJiIiIlJVFz0FILNTranWS8uMfbi5bUzt6+YcXXniBd999l82bNxc4vmXLFi666KICxy666CK2bdtGfn4+YM6CffDBBwAYhsFHH33kmv06cOAAe/bs4fbbbycgIMB1e/bZZwvMmrkTNeEQERERKQu74yFhCfR8FGxV/G/ctTvBn99Cfm7Vu85NSqR79+707duXxx57jOHDh7uOG4aB7bQtC07vjnjzzTfzyCOP8Mcff5CZmcmePXu48cYbAXA6nYC5DLFz584FHudwuOcsswowERERkbKw6Hlz9qtuF6uTlL86nc02+4nxENvd6jRSSfz3v/+lbdu2rqWDAM2bN+fXX38tMG7ZsmU0btzYVUDVrl2b7t2788EHH5CZmUnv3r2JjIwEIDIyklq1arFz507XrJi7UwEmIiIiUlq7foNdv0DPx6r+7BdAaBz4hprXgakAKz/pe9zqPK1atWLIkCG8/vrrrmMPPvggnTp1YsKECQwePJj4+HimTJlSqIvhkCFDGDduHDk5ObzyyisF7hs3bhz3338/QUFB9OvXj+zsbFatWsXhw4cZM2ZMmWSvSCrAREREREpr0fMQ2qB6zH6BWWRGt4Gdi61OUjX5hZkbIy996dxjy4qnr3neUpowYQJz5sxxfd6+fXvmzJnDU089xYQJE4iOjmb8+PEFlikCXH/99dx33304HA4GDBhQ4L477rgDPz8/Jk2axEMPPYS/vz+tWrVi1KhRpc5rBZuhLapLJCMjg+DgYNLT0wkKCrI6joiIiFhl9zKY2Q96PV59CjAwZ79++x88tBP8Qq1OU6lkZWWRkJBAbGwsPj4+JXuSI3vMjZEril9YsTdhrm7O9nUtTm2gGTARERGR0ljygnntV53O5x5blUS3AQxI+AVaDLA6TdVTo44KoiqqGixSFhERESkne1eZy/Ba31A9rv36J/+aEFxHyxBFiqma/aQQERERKUNLXjCLkLpVeN+vs4lqDTsXWZ1CxK2oABMREREpiX1rYdsP0OoGsLvnfkSlFtMWDu+Cw7utTiLiNlSAiYiIiJTEL5MgMKZ6t2GPamUuvUxYYnWSSkm97qqWsvp6qgATERERKa79m+HPb6DVddV39gvAKwDCG+s6sNN4enoCcOLECYuTSFk69fU89fUtKXVBFBERESmuX1+BgAhocInVSawX1Rp2/AROJ9j1t30Ah8NBjRo1SE1NBcDPzw+bzWZxKikpwzA4ceIEqamp1KhRA4ejdH90UQEmIiIiUhyHEmDj59DpDrDrVymi28KGOZC6yVySKABERUUBuIowcX81atRwfV1LQz81RERERIpj2WvgHQiNLrM6SeUQ0RQ8vGHnEhVg/2Cz2YiOjiYiIoLc3Fyr40gpeXp6lnrm6xQVYCIiIiLn62gKrHkf2twIHj5Wp6kcHF4Q0dy8DqzrvVanqXQcDkeZ/eIuVYMW6oqIiIicr/gpYPeEJldYnaRyiWwJe5aDM9/qJCKVngowERERkfNx4hCsfAeaXgFe/lanqVwiWkB2BuzfZHUSkUpPBZiIiIjI+VjxFjjzoNnVViepfGo2NmcGdy+zOolIpacCTERERORcco7D8jeg4WXgW8PqNJWPwwtqNoFEFWAi56ICTERERORc1rwPWRnQ4lqrk1ReES1g129gGFYnEanUVICJiIiInE1+rtl6PrYbBJZ+D6AqK7IFnEiDg9utTiJSqakAExERETmbjV9A+l5oMcjqJJVbRFOwOWD3b1YnEanUVICJiIiInIlhwK+vQK2OEBprdZrKzdMPwhqoEYfIOVhegE2bNo3Y2Fh8fHzo0KEDS5cuPev4JUuW0KFDB3x8fIiLi2P69OkF7n/rrbfo1q0bISEhhISE0Lt3b1asWFFgzLhx47DZbAVuUVFaUiAiIiKn2fYDHNgCLa+zOol7iGgOu361OoVIpWZpAfbJJ58watQoHn/8cdasWUO3bt3o168fiYmJRY5PSEigf//+dOvWjTVr1vDYY49x//338/nnn7vGLF68mJtuuolFixYRHx9P3bp16dOnD0lJSQWeq0WLFiQnJ7tuGzZsKNfXKiIiIm7o11ehZlPz+iY5t8iWkJEER4r+XU5EwGYY1rWq6dy5M+3bt+eNN95wHWvWrBkDBgxg4sSJhcY//PDDzJs3jy1btriOjRw5knXr1hEfH1/kOfLz8wkJCWHKlCkMHToUMGfA5s6dy9q1a0ucPSMjg+DgYNLT0wkKCirx84iIiEgltXc1vH0J9HwM6nW1Oo17yMqAT26Ga/8P2gy2Oo1IhSlObWDZDFhOTg6rV6+mT58+BY736dOHZcuKXjscHx9faHzfvn1ZtWoVubm5RT7mxIkT5ObmEhoaWuD4tm3biImJITY2lhtvvJGdO3eeNW92djYZGRkFbiIiIlKFLfsfBNWCOp2tTuI+fIIgpL4acYichWUFWFpaGvn5+URGRhY4HhkZSUpKSpGPSUlJKXJ8Xl4eaWlpRT7mkUceoVatWvTu3dt1rHPnzsyePZsFCxbw1ltvkZKSQteuXTl48OAZ806cOJHg4GDXrU6dOuf7UkVERMTdHNoJW76G5teA3WF1GvcS0VwFmMhZWN6Ew2azFfjcMIxCx841vqjjAC+++CIfffQRX3zxBT4+Pq7j/fr1Y9CgQbRq1YrevXvz7bffAvDuu++e8byPPvoo6enprtuePXvO/eJERETEPcVPBe8gaHCp1UncT0Qzcy+wE4esTiJSKXlYdeLw8HAcDkeh2a7U1NRCs1ynREVFFTnew8ODsLCwAscnT57M888/z48//kjr1q3PmsXf359WrVqxbdu2M47x9vbG29v7rM8jIiIiVcDxg7DmfWg5CDz0//5iq9nM/Lh3JTTua20WkUrIshkwLy8vOnTowMKFCwscX7hwIV27Fn2ha5cuXQqN/+GHH+jYsSOenp6uY5MmTWLChAl8//33dOzY8ZxZsrOz2bJlC9HR0SV4JSIiIlKlrHwLMKBJf6uTuKeASPANgT3LrU4iUilZugRxzJgxvP3228yYMYMtW7YwevRoEhMTGTlyJGAu+zvVuRDMjoe7d+9mzJgxbNmyhRkzZvDOO+8wduxY15gXX3yRJ554ghkzZlC/fn1SUlJISUnh2LFjrjFjx45lyZIlJCQksHz5cq677joyMjIYNmxYxb14ERERqXxyM2HF/0GD3uATbHUa92Szma3796w491iRasiyJYgAgwcP5uDBg4wfP57k5GRatmzJ/PnzqVevHgDJyckF9gSLjY1l/vz5jB49mqlTpxITE8Nrr73GoEGDXGOmTZtGTk4O111XcMPEp59+mnHjxgGwd+9ebrrpJtLS0qhZsyYXXnghv//+u+u8IiIiUk2tn2Neu9T8GquTuLeazWD9R5CfBw5Lf90UqXQs3QfMnWkfMBERkSrGMGDqBeAXBr0etzqNe0vdDN89BP9eAjFtrU4jUu7cYh8wERERkUpl+0+Q9pdmv8pCWEOwe2gZokgRVICJiIiIAMS/DuGNIaKF1Uncn8MLwhrBXhVgIqdTASYiIiKyfxPsXAzNrjGbSEjp1WwCib9bnUKk0lEBJiIiIhI/BfwjoP5FViepOmo2hfQ9cDTl3GNFqhEVYCIiIlK9HUuFDZ9B0yvM65akbESc3JBZ14GJFKACTERERKq3VTPAZodGfa1OUrX4hZmbMmtDZpECVICJiIhI9ZWXDSveggaXgneA1WmqnvAmKsBETqMCTERERKqvjV/AiTRodpXVSaqmiGaQvM4sdEUEUAEmIiIi1ZVhwO9ToVZHCK5tdZqqqWYTyM+BlA1WJxGpNFSAiYiISPWUGG8WBpr9Kj8hsWD3hL2rrE4iUmmoABMREZHq6fc3ILgOxLS3OknV5fCEsAaQpAJM5BQVYCIiIlL9HEmEP78xZ7+08XL5Cm8Ee1danUKk0lABJiIiItXPqhng6Qdxl1idpOoLbwKHd8GJQ1YnEakUVICJiIhI9ZKbCatnQcNLwdPH6jRVX3gT82PSamtziFQSKsBERESketn4BWQehiZXWJ2kegiMAp9gNeIQOUkFmIiIiFQfhgHLp5ut54NirE5TPdhsEN5Y14GJnKQCTERERKqPvasgZT001exXhQprZC5BNAyrk4hYTgWYiIiIVB8r3oTAGKjVweok1UvNJpB1BA7ttDqJiOVUgImIiEj1cHQ/bJoLTfqDTb8CVajwxuZHNeIQUQEmIiIi1cQfs8Fuh4a9rU5S/XgHQlAtNeIQQQWYiIiIVAf5ebB6JsT2AO8Aq9NUT2rEIQKoABMREZHqYNsCyEgylx+KNcIbw/6NkJdtdRIRS6kAExERkapv5TvmhsBhDa1OUn2FN4b8HEjZYHUSEUupABMREZGq7eAO2PGTZr+sFhoHdg9I+sPqJCKWUgEmIiIiVdvqmWYTiPoXW52kenN4mkXYPhVgUr2pABMREZGqKzcT/ngPGlwKHt5Wp5GwhpoBk2pPBZiIiIhUXZvmmhsAN+lndRIBswBL+wuyj1qdRMQyKsBERESk6lr1DsS0M/egEuuFNwYMSF5ndRIRy6gAExERkapp/yZz36nGl1udRE4JrgMePlqGKNWaCjARERGpmlbNBN9QqNPZ6iRyit0BYQ1g3xqrk4hYRgWYiIiIVD05x2H9x9Cwt9n6XCqPsIaQtNrqFCKWUQEmIiIiVc/GzyH7GDTua3USOV1YIziyG04csjqJiCVUgImIiEjVs2oG1OoAAZFWJ5HThTcyP2o/MKmmVICJiIhI1bJvrXmNkZpvVE6BMeAVAEm6DkyqJxVgIiIiUrWsngl+4VC7k9VJpCg2m3kdmGbApJpSASYiIiJVR/ZR2PApNLrM7LgnlVN4I7Wil2pLBZiIiIhUHRs/h9xMaHiZ1UnkbMIawbEUyEi2OolIhVMBJiIiIlXHqpknm29EWJ1EzkaNOKQaUwEmIiIiVcO+tZC8Fhqp+Ual5xcOviHakFmqJRVgIiIiUjX88S74hUHtjlYnkXNxNeJQASbVjwowERERcX/Zx2D9HPPaLzXfcA+nCjDDsDqJSIVSASYiIiLub+PnkHMcGvWxOomcr9CGcOIgZCRZnUSkQqkAExEREfe3Ws033E5YA/OjliFKNaMCTERERNxb8jrzl/jGfa1OIsXhFwa+oWbzFJFqRAWYiIiIuLfVs04237jA6iRSHDabOQumGTCpZlSAiYiIiPtS8w33pkYcUg2pABMRERH3tfEzNd9wZ2ENIfMQpO+1OolIhVEBJiIiIu5r1Uxz3y8133BPYQ3Nj1qGKNWICjARERFxT/vWQvJaaHS51UmkpPzCzFvyWquTiFQYFWAiIiLinlbPBL9wcwZM3FdoA3VClGpFBZiIiIi4n+yjsOFTaKTmG24vrAHs+0ONOKTaUAEmIiIi7mf9HMjNVPONqiCsEWQehvQ9VicRqRAqwERERMS9GAasfMfc98u/ptVppLTUiEOqGRVgIiIi4l72LIfUTdCkn9VJpCz4hZrX8uk6MKkmVICJiIiIe1n5DgTGQEw7q5NIWQmL0wyYVBsqwERERMR9HE+DzXOh8eVg068xVUZoA0hep0YcUi3oJ5eIiIi4jzXvmR8b9rY2h5StsIaQeQjS91qdRKTcqQATERER9+DMh1UzoH438AmyOo2UpdAG5sfkddbmEKkAKsBERETEPWz/CY4kQpP+VieRsuYXBr4hKsCkWlABJiIiIu5h+XRzqVp4Y6uTSFmz2U5eB7bW6iQi5U4FmIiIiFR+B/6CHT9Bs6vMX9al6gltoFb0Ui2oABMREZHKb8X/mUvU6ne3OomUl7AGcDwVjqZYnUSkXKkAExERkcot8wis/cBsPe/wtDqNlJewhuZHzYJJFacCTERERCq3tR9Afg407md1EilP/jXBO0iNOKTKs7wAmzZtGrGxsfj4+NChQweWLl161vFLliyhQ4cO+Pj4EBcXx/Tp0wvc/9Zbb9GtWzdCQkIICQmhd+/erFixotTnFREREQs4883mG/UvBr9Qq9NIebLZIDROjTikyrO0APvkk08YNWoUjz/+OGvWrKFbt27069ePxMTEIscnJCTQv39/unXrxpo1a3jssce4//77+fzzz11jFi9ezE033cSiRYuIj4+nbt269OnTh6SkpBKfV0RERCzy1wKz9XzTq6xOIhUhrKEKMKnybIZhGFadvHPnzrRv35433njDdaxZs2YMGDCAiRMnFhr/8MMPM2/ePLZs2eI6NnLkSNatW0d8fHyR58jPzyckJIQpU6YwdOjQEp23KBkZGQQHB5Oenk5QkDaDFBERKRcz+kHmIeg/2eokUhF2LYUlL8B/doB/uNVpRM5bcWoDy2bAcnJyWL16NX369ClwvE+fPixbtqzIx8THxxca37dvX1atWkVubm6Rjzlx4gS5ubmEhoaW+LwA2dnZZGRkFLiJiIhIOdqzEhKXQYuBVieRihLawPyoWTCpwiwrwNLS0sjPzycyMrLA8cjISFJSim4/mpKSUuT4vLw80tLSinzMI488Qq1atejdu3eJzwswceJEgoODXbc6deqc8zWKiIhIKfz2KgTXhjqdrU4iFSUwGrwC1IhDqjTLm3DYTttM0TCMQsfONb6o4wAvvvgiH330EV988QU+Pj6lOu+jjz5Kenq667Znz54zjhUREZFSStsGf34Lza8Fu8PqNFJRTjXiUCt6qcI8rDpxeHg4Doej0KxTampqodmpU6Kioooc7+HhQVhYWIHjkydP5vnnn+fHH3+kdevWpTovgLe3N97e3uf12kRERKSUfvufufFyg0usTiIVLTQOklZbnUKk3Fg2A+bl5UWHDh1YuHBhgeMLFy6ka9euRT6mS5cuhcb/8MMPdOzYEU/PvzdmnDRpEhMmTOD777+nY8eOpT6viIiIVKCMZFj/CTS7WhsvV0dhDSB9D2QetjqJSLmwdAnimDFjePvtt5kxYwZbtmxh9OjRJCYmMnLkSMBc9neqcyGYHQ93797NmDFj2LJlCzNmzOCdd95h7NixrjEvvvgiTzzxBDNmzKB+/fqkpKSQkpLCsWPHzvu8IiIiYqHlb5iFVxNtvFwthTY0P6ZssDaHSDmxbAkiwODBgzl48CDjx48nOTmZli1bMn/+fOrVqwdAcnJygb25YmNjmT9/PqNHj2bq1KnExMTw2muvMWjQINeYadOmkZOTw3XXXVfgXE8//TTjxo07r/OKiIiIRY4fhJVvQ+N+4OVvdRqxQlAMePiYjThiu1udRqTMWboPmDvTPmAiIiLlYOHTsOJNGPg2+ARbnUasMv8/ENUKBr1ldRKR8+IW+4CJiIiIFHAs1Sy+ml6l4qu6C43TXmBSZakAExERkcrht/+BzQ4trrU6iVgtrAEc3A45x61OIlLmVICJiIiI9TKSYeVbZudD70Cr04jVQuPAcML+TVYnESlzKsBERETEer++AnZPaH6N1UmkMqhRD+weZiMOkSpGBZiIiIhY6/AuWD0Tmg8ArwCr00hl4PCEkPoqwKRKUgEmIiIi1lr4tLnssPkAq5NIZRISq0YcUiWpABMRERHr7F4Gm+dC+6Hg6WN1GqlMwhpA6p+Ql2N1EpEypQJMRERErOF0wvePQHhjiOtldRqpbEIbgDMXDmyxOolImVIBJiIiItZY/7F5jU+nO8z28yL/FBIL2CB5vdVJRMqUftqJiIhIxcs+Bj+Og/rdIKK51WmkMvL0geA6asQhVY4KMBEREal4i56DrCPQYbjVSaQyC41VASZVjgowERERqVh7V8Hvb0CbIRAQaXUaqcxCG8D+DeDMtzqJSJlRASYiIiIVJy8HvroXwhpq02U5t7AGkJsJB7dbnUSkzKgAExERkYrz6ytw8C/oeh/YHVankcouNM78qEYcUoWoABMREZGKkfon/DIJWgz6+xdrkbPxDjSXqaboOjCpOlSAiYiISPnLzYLPb4fAKGhzo9VpxJ2ExmkGTKoUFWAiIiJS/n4cBwe2Qvf/gMPL6jTiTkLjzE6IhmF1EpEyoQJMREREytfW72H5G9DxX1p6KMUXGmduWZC+1+okImVCBZiIiIiUn4xkmHsX1L4Aml5pdRpxR6ENzI8pWoYoVYMKMBERESkf+bnw2b/AZoOLHjA/ihSXXxj4BOs6MKkyVICJiIhI+VjwOOxdDt0fMn+BFikJm81chqhOiFJFqAATERGRsrfmfVjxJlxwJ0S2sDqNuLtTjThEqgAVYCIiIlK29q6Gb0ZDo77QuJ/VaaQqCI2DjH1w4pDVSURKTQWYiIiIlJ30JPj4ZvMX5s4jdd2XlI1TjTg0CyZVgAowERERKRvZR+HDGwAn9HwMHJ5WJ5KqIigGPHzVCVGqBA+rA4iIiEgVkJ8Hn94GhxPg8hfAL9TqRFKV2OwQGqtOiFIlaAZMRERESscwYMGjsONn6P4whNS3OpFURSGxWoIoVYIKMBERESmd+Kmw4v/Ma75qtbc6jVRVYQ3g4HbIOW51EpFSUQEmIiIiJbfpS/jhcWh5HTRRx0MpR6FxgAH7N1mdRKRUVICJiIhIyST+Dl/8G2J7QPuhVqeRqq5GPbB7aBmiuD0VYCIiIlJ8advhw8FQswlcNMpskiBSnhyeUKMupGywOolIqeinpYiIiBTPiUPwwXXgHQA9H1e7eak4IXGaARO3pwJMREREzl9etrnRcuYhuHScWYSJVJTQWEjdDPm5VicRKTEVYCIiInJ+DAPm3QdJq6HXExAYZXUiqW5CG0B+DqT9ZXUSkRJTASYiIiLnZ+lLsP4T6PoARDSzOo1UR6Fx5kdtyCxuTAWYiIiInNvW7+HnZ6HNTRDXw+o0Ul15+UFQjBpxiFtTASYiIiJnl7YNvrgD6nQ2CzARK4XEqhGHuLUSFWAJCQllnUNEREQqo6x0+OhG8A2Bi8eo3bxYLzQOUtab1ySKuKES/RRt2LAhvXr14v333ycrK6usM4mIiEhlYBjw5Ug4mgK9HjeXf4lYLTQOsjPgyG6rk4iUSIkKsHXr1tGuXTsefPBBoqKiuPPOO1mxYkVZZxMRERErxU+FrfPNma+gWlanETGFNjA/6jowcVMlKsBatmzJyy+/TFJSEjNnziQlJYWLL76YFi1a8PLLL3PgwIGyzikiIiIVac9K+PFpaDEQ6lxgdRqRv/mGmDd1QhQ3VaqF3B4eHlx77bXMmTOHF154gR07djB27Fhq167N0KFDSU5OLqucIiIiUlFOHIJPh0FYI2g/1Oo0IgXZbBASBylqxCHuqVQF2KpVq7j77ruJjo7m5ZdfZuzYsezYsYOff/6ZpKQkrrnmmrLKKSIiIhXBMGDuXZB9FLr/B+weVicSKSxUnRDFfZXop+rLL7/MzJkz2bp1K/3792f27Nn0798fu92s52JjY3nzzTdp2rRpmYYVERGRcrZ6Jvz1PfR6EgIirE4jUrTQONj4GRxPA/9wq9OIFEuJCrA33niDf/3rX9x2221ERUUVOaZu3bq88847pQonIiIiFShtOyx4DBpfDnU7W51G5MxcjTjWQ4NLrM0iUkwlKsAWLlxI3bp1XTNepxiGwZ49e6hbty5eXl4MGzasTEKKiIhIOcvPhS9GmM0NOt5udRqRswuKBk9fsxGHCjBxMyW6BqxBgwakpaUVOn7o0CFiY2NLHUpEREQq2C+TzWtqLn7Q/MVWpDKz2SEk1pwBE3EzJSrAjDPsPH7s2DF8fHxKFUhEREQqWNIf8MskaH0D1GxidRqR8xMSq1b04paKtQRxzJgxANhsNp566in8/Pxc9+Xn57N8+XLatm1bpgFFRESkHOXlwNy7za5yrQdbnUbk/IU1MDcKzzkOXv5WpxE5b8UqwNasWQOYM2AbNmzAy8vLdZ+Xlxdt2rRh7NixZZtQREREys/Sl+DgX3DFK2o5L+4lNA4wYP8mbRYubqVYP2kXLVoEwG233cb//vc/goKCyiWUiIiIVICUjbB0MrS8/uQvsyJupEY9sDvM68BUgIkbKdGfumbOnFnWOURERKQi5eeZGy4H1dLSQ3FPDk+zCNN1YOJmzrsAGzhwILNmzSIoKIiBAweedewXX3xR6mAiIiJSjuKnwP6N0H+y+YusiDsKiTW7d4q4kfMuwIKDg7HZbK5/i4iIiJs6lACLJ0KzqyC8sdVpREouNA52LTVndB26hlHcw3l/p/5z2aGWIIqIiLgpw4BvxoBPELS9xeo0IqUTGgf5OZD2F0Q2tzqNyHkp0T5gmZmZnDhxwvX57t27efXVV/nhhx/KLJiIiIiUgw2fwc6f4YKR2nBZ3N+p5jHakFncSIkKsGuuuYbZs2cDcOTIES644AJeeuklrrnmGt54440yDSgiIiJl5MQh+P5hqH+xusZJ1eDlD4HRasQhbqVEBdgff/xBt27dAPjss8+Iiopi9+7dzJ49m9dee61MA4qIiEgZWfg05GZBp39bnUSk7ITGagZM3EqJCrATJ04QGBgIwA8//MDAgQOx2+1ceOGF7N69u0wDioiISBlI/B3WzIb2w8Av1Oo0ImUnJM6cATMMq5OInJcSFWANGzZk7ty57NmzhwULFtCnTx8AUlNTtTmziIhIZZOfC9+MhvAm0Liv1WlEylZYA8hOhyOJVicROS8lKsCeeuopxo4dS/369encuTNdunQBzNmwdu3alWlAERERKaXf34ADf8KFd4PdYXUakbLlasSxwdocIuepRBsmXHfddVx88cUkJyfTpk0b1/FLL72Ua6+9tszCiYiISCkd2QOLn4emV5kzBSJVjW8o+NQwrwNrdqXVaUTOqcQ71kVFRREVFVXg2AUXqKOSiIhIpfLdQ+DpD+2GWJ1EpHzYbOYsWPI6q5OInJcSLUE8fvw4Tz75JF27dqVhw4bExcUVuBXHtGnTiI2NxcfHhw4dOrB06dKzjl+yZAkdOnTAx8eHuLg4pk+fXuD+TZs2MWjQIOrXr4/NZuPVV18t9Bzjxo3DZrMVuJ1eTIqIiLi9P7+FrfOh0x3g6Wd1GpHyowJM3EiJZsDuuOMOlixZwq233kp0dDQ2m61EJ//kk08YNWoU06ZN46KLLuLNN9+kX79+bN68mbp16xYan5CQQP/+/RkxYgTvv/8+v/32G3fffTc1a9Zk0KBBgNmhMS4ujuuvv57Ro0ef8dwtWrTgxx9/dH3ucGhNvIiIVCHZx2D+f6B2J6h3kdVpRMpXaBxs/AyOHwT/MKvTiJxViQqw7777jm+//ZaLLirdD/SXX36Z22+/nTvuuAOAV199lQULFvDGG28wceLEQuOnT59O3bp1XbNazZo1Y9WqVUyePNlVgHXq1IlOnToB8Mgjj5zx3B4eHpr1EhGRqmvxRDiRBr2fMZdoiVRloSevb0xZDw16WZtF5BxKtAQxJCSE0NDS7SGSk5PD6tWrXS3sT+nTpw/Lli0r8jHx8fGFxvft25dVq1aRm5tbrPNv27aNmJgYYmNjufHGG9m5c+dZx2dnZ5ORkVHgJiIiUimlbDA7H7a+EQL1x0apBoKiwdNXGzKLWyhRATZhwgSeeuopTpw4UeITp6WlkZ+fT2RkZIHjkZGRpKSkFPmYlJSUIsfn5eWRlpZ23ufu3Lkzs2fPZsGCBbz11lukpKTQtWtXDh48eMbHTJw4keDgYNetTp06530+ERGRCuPMh68fgODa0EKdiaWasNkhJNbckFmkkivREsSXXnqJHTt2EBkZSf369fH09Cxw/x9//HHez3X69WOGYZz1mrKixhd1/Gz69evn+nerVq3o0qULDRo04N1332XMmDFFPubRRx8tcF9GRoaKMBERqXxWvgNJq+HyF8Be4mbHIu4nJFaNOMQtlOgn84ABA0p94vDwcBwOR6HZrtTU1EKzXKdERUUVOd7Dw4OwsJJfcOnv70+rVq3Ytm3bGcd4e3vj7e1d4nOIiIiUu/S98NM4aNwPIltYnUakYoU1MLt+5hwHL3+r04icUYkKsKeffrrUJ/by8qJDhw4sXLiwwObNCxcu5JprrinyMV26dOHrr78ucOyHH36gY8eOhWbhiiM7O5stW7bQrVu3Ej+HiIiIpQwDvn0QPHygw3Cr04hUvNA4wID9m6CO9qaVyqtE14ABHDlyhLfffptHH32UQ4cOAebSw6SkpPN+jjFjxvD2228zY8YMtmzZwujRo0lMTGTkyJGAuexv6NChrvEjR45k9+7djBkzhi1btjBjxgzeeecdxo4d6xqTk5PD2rVrWbt2LTk5OSQlJbF27Vq2b9/uGjN27FiWLFlCQkICy5cv57rrriMjI4Nhw4aV9O0QERGx1ua58Nf3cMGd+uu/VE816oHdoWWIUumVaAZs/fr19O7dm+DgYHbt2sWIESMIDQ3lyy+/ZPfu3cyePfu8nmfw4MEcPHiQ8ePHk5ycTMuWLZk/fz716tUDIDk5mcTERNf42NhY5s+fz+jRo5k6dSoxMTG89tprrhb0APv27aNdu3auzydPnszkyZPp0aMHixcvBmDv3r3cdNNNpKWlUbNmTS688EJ+//1313lFRETcyolD5p5fdbtAva5WpxGxhsPTLMLUCVEqOZtxqotFMfTu3Zv27dvz4osvEhgYyLp164iLi2PZsmXcfPPN7Nq1qxyiVi4ZGRkEBweTnp5OUFCQ1XFERKQ6+2IE/DkfrpkKftqEVqqxX1+FEwfgzl+sTiLVTHFqgxItQVy5ciV33nlnoeO1atU6Ywt5ERERKQd/fgvr58AFI1R8iYTFQeoWyC/e/rAiFalEBZiPj0+RGxFv3bqVmjVrljqUiIiInIcTh8w9v+p0hrhLrE4jYr3QOMjPgQNbrU4ickYlKsCuueYaxo8fT26u+dcFm81GYmIijzzySIHrsURERKQczf8P5GXBhfdAMfbDFKmyQuLMj7oOTCqxEhVgkydP5sCBA0RERJCZmUmPHj1o2LAhgYGBPPfcc2WdUURERE636UvY+JnZ9dAv1Oo0IpWDlx8E1YJkFWBSeZWoC2JQUBC//vorixYtYvXq1TidTtq3b0/v3r3LOp+IiIic7sgemPcA1LsIYntYnUakcgmJ1QyYVGrFLsCcTiezZs3iiy++YNeuXdhsNmJjY4mKisIwDGxaAiEiIlJ+nPlm10NPb+hyn5YeipwuLM6cIXY6wV7iLW9Fyk2xvisNw+Dqq6/mjjvuICkpiVatWtGiRQt2797N8OHDufbaa8srp4iIiAD8Mhn2LIeLx4B3gNVpRCqf0AaQfRSO7LI6iUiRijUDNmvWLH755Rd++uknevXqVeC+n3/+mQEDBjB79myGDh1apiFFREQESPwdlvwXWg+GyJZWpxGpnEJPNuJIXv/3v0UqkWLNgH300Uc89thjhYovgEsuuYRHHnmEDz74oMzCiYiIyEnHUmHOMKjZFFrfaHUakcrLNwT8wiF5ndVJRIpUrAJs/fr1XH755We8v1+/fqxbp292ERGRMpWfaxZf+TnQ42GwO6xOJFK5hcapAJNKq1gF2KFDh4iMjDzj/ZGRkRw+fLjUoUREROQfFj4Ne5ebxZdfmNVpRCq/UwWYYVidRKSQYhVg+fn5eHic+bIxh8NBXl5eqUOJiIjISRs+g9+nQsc7ILKF1WlE3ENYAziRBkdTrE4iUkixmnAYhsHw4cPx9vYu8v7s7OwyCSUiIiLAnhXw1d0Q1wuaXml1GhH3EdrA/Ji8DoKirc0icppiFWDDhg075xh1QBQRESkDh3bCh4MhrCF01X5fIsXiXxO8g8wCrMmZ+xeIWKFYBdjMmTPLK4eIiIiccuIQvH8dePlBz8fB4WV1IhH3YrOZ14GlqBGHVD7aHlxERKQyyTkBH91kXr9yydPgE2R1IhH3FBoH+9ZanUKkEBVgIiIilUVeNnxyCySvhUue1LUrIqUR1gAykswZZZFKRAWYiIhIZZCfB5/fDruWwiVPmBsui0jJ/bMRh0glogJMRETEak6n2e1w63xzr6/otlYnEnF/QTHg6Qsp661OIlKACjARERErOfPN4mvDp3DxGKjT2epEIlWDzQ4hsZoBk0qnWF0QRUREpAzl58HckbDxC7P4iu1hdSKRqiW0gQowqXQ0AyYiImKF/Fzzmq9NX0D3/0BcT6sTiVQ9oXFwcAdkH7U6iYiLCjAREZGKlpsJHw+BP7+BHo9A/YutTiRSNYU1AAxI2Wh1EhEXFWAiIiIVKfsofHA9JCw2W83X7WJ1IpGqq0ZdcyNzLUOUSkTXgImIiFSUE4fg/YFw4C/oPR4iW1idSKRqs3tASH1zbz2RSkIFmIiISEU4mgKzB8DRfdD3OQhraHUikeohtAHsW2N1ChEXLUEUEREpb4d3wTt94PgBuPy/Kr5EKlJYA0j7C3JOWJ1EBFABJiIiUr4ObIUZl5tdD/u9AMF1rE4kUr2ENQTDCfs3WZ1EBFABJiIiUn72b4KZ/cDD25z5Coi0OpFI9VOjnnktmK4Dk0pCBZiIiEh5SF4Ps64A3xDo8zz4hVqdSKR6cniajTj2rbU6iQigAkxERKTs7VsD714J/uFw2bPgE2R1IpHqLTQOktWIQyoHFWAiIiJlKXk9zL4GAqPhsgngHWB1IhEJa2hej5mbZXUSERVgIiIiZSZtG7w3APwjoPcz4KXiS6RSCGsIzjxIVSMOsZ4KMBERkbJwJBHevdosunqPAy9/qxOJyCkh9cHu0HVgUimoABMRESmtY6lm8YUBl40Hn2CrE4nIPzm8zG6IyeusTiKCh9UBRERE3FrOCfhwMGSlQ78XwS/M6kQiUpTQOLNBjojFNAMmIiJSUk4nfHknpG6GS5+CwCirE4nImYQ1hNQtkJdjdRKp5lSAiYiIlNSPT8OWr6HbWPOXOxGpvEIbgDPX/IOJiIVUgImIiJTEH+/Bsteg0x1Q90Kr04jIuYTGgs0OyWutTiLVnAowERGR4kr6A74dA436QrOrrU4jIufDw8dsxKFOiGIxFWAiIiLFcfwgfHKL2da680iw2axOJCLnK6wB7PvD6hRSzakAExEROV/OfPj8dsg5Bj0eAYen1YlEpDjCGsH+zZCXbXUSqcZUgImIiJyvxf+FhCXQ/T8QEGF1GhEprrCGZiOO/ZusTiLVmAowERGR87HrV/hlErS5CaLbWp1GREoiNBbsDu0HJpZSASYiInIumYfh8xEQ2QJa3WB1GhEpKYcXhMSqABNLqQATERE5G8OArx+A7Ay4eIz513MRcV+hcWrEIZZSASYiInI2a96HzV9Bl3t13ZdIVRDWCFL/hNxMq5NINaUCTERE5EwO74bvH4aGl0H9i61OIyJlIbwRGPmQstHqJFJNqQATEREpimHAvPvAyx86jbA6jYiUlRr1wO4JyWutTiLVlAowERGRoqyeabac73IfePlZnUZEyorD0+yGqEYcYhEVYCIiIqc7vBt+eAIa9YWYdlanEZGyFtoAklZbnUKqKRVgIiIi//TPpYcdb7c6jYiUh/BGkPYX5By3OolUQyrARERE/mntB+bSwwvv1dJDkaoqrCEYTkjZYHUSqYZUgImIiJxy7AAseBwaXAK12ludRkTKS4265qbMSdoPTCqeCjAREZFTFjxm/lVcSw9Fqja7h3kdmBpxiAVUgImIiABs/wk2zDGLL59gq9OISHkLbwhJq6xOIdWQCjAREZGcE/DNKIhuYy4/FJGqL6wxHNoJmYetTiLVjAowERGRpZPhaApceDfYbFanEZGKEN7Y/KhliFLBVICJiEj1lrYNfnsNWg6CoFpWpxGRihIUDV4B2g9MKpwKMBERqb4MA759EPxrQsvrrE4jIhXJZjf3A1MBJhVMBZiIiFRfm74w9/y64N/g4W11GhGpaGGNYO9q848xIhVEBZiIiFRPWRnw/aNQryvU7mh1GhGxQnhjOJ4KGfusTiLViAowERGpnhb/F7LSoeMdVicREaucasShZYhSgVSAiYhI9ZO6BZZPh9aDISDC6jQiYhW/UPMaUBVgUoEsL8CmTZtGbGwsPj4+dOjQgaVLl551/JIlS+jQoQM+Pj7ExcUxffr0Avdv2rSJQYMGUb9+fWw2G6+++mqZnFdERKoIw4D5/4HAKGg+wOo0ImK1sIaQ9IfVKaQasbQA++STTxg1ahSPP/44a9asoVu3bvTr14/ExMQixyckJNC/f3+6devGmjVreOyxx7j//vv5/PPPXWNOnDhBXFwc//3vf4mKiiqT84qISBWy6UvYtdRsvOHwtDqNiFgtvDHs+wOcTquTSDVhMwzr2r507tyZ9u3b88Ybb7iONWvWjAEDBjBx4sRC4x9++GHmzZvHli1bXMdGjhzJunXriI+PLzS+fv36jBo1ilGjRpXqvEXJyMggODiY9PR0goKCzusxIiJisexjMKUjhNSHXo9bnUZEKoPkdfDD43DPCqjZxOo04qaKUxtYNgOWk5PD6tWr6dOnT4Hjffr0YdmyZUU+Jj4+vtD4vn37smrVKnJzc8vtvADZ2dlkZGQUuImIiJtZOhlOHISOt1udREQqi7CGgE3XgUmFsawAS0tLIz8/n8jIyALHIyMjSUlJKfIxKSkpRY7Py8sjLS2t3M4LMHHiRIKDg123OnXqnNf5RESkkji4A5ZNgZaDzOu/REQAvPwhuI6uA5MKY3kTDpvNVuBzwzAKHTvX+KKOl/V5H330UdLT0123PXv2FOt8IiJise8eBr8waHmd1UlEpLIJbwh7V1qdQqoJD6tOHB4ejsPhKDTrlJqaWmh26pSoqKgix3t4eBAWFlZu5wXw9vbG29v7vM4hIiKVzNbvYftC6PkYeOhnuYicJrwprPw/yM0ET1+r00gVZ9kMmJeXFx06dGDhwoUFji9cuJCuXbsW+ZguXboUGv/DDz/QsWNHPD3Pr5NVSc4rIiJuLDcLvn8YYtpB3S5WpxGRyqhmE3DmQfJ6q5NINWDZDBjAmDFjuPXWW+nYsSNdunTh//7v/0hMTGTkyJGAuewvKSmJ2bNnA2bHwylTpjBmzBhGjBhBfHw877zzDh999JHrOXNycti8ebPr30lJSaxdu5aAgAAaNmx4XucVEZEqJH4KpO+B7g9DMZeri0g1EVLfnB3fuxLqdrY6jVRxlhZggwcP5uDBg4wfP57k5GRatmzJ/PnzqVevHgDJyckF9uaKjY1l/vz5jB49mqlTpxITE8Nrr73GoEGDXGP27dtHu3btXJ9PnjyZyZMn06NHDxYvXnxe5xURkSoifa/Z+bDpVVBDzZNE5AzsDghrrOvApEJYug+YO9M+YCIibuDT22DnIhjwJnj5WZ1GRCqz1TMhMR7GbDn3WJHTuMU+YCIiIuUqYSls+gLaD1fxJSLnFt4EMvaZN5FypAJMRESqnvw8+O4hqNkUGvSyOo2IuIOaTcyPe1dZm0OqPBVgIiJS9ax6B1K3QOeRYNP/6kTkPPiFgX+ErgOTcqf/K4mISNVyPA1+fg4a9YGwhlanERF3UlONOKT8qQATEZGq5adnwMiH9kOtTiIi7ia8CexbA/m5VieRKkwFmIiIVB17V8Mf70G7W8En2Oo0IuJuajaFvCzYv8nqJFKFqQATEZGqwemE+Q9CaBw0vtzqNCLijkLjwO6hZYhSrlSAiYhI1bD2fXPpUOc7zU1VRUSKy8PbLMLUCVHKkQowERFxf5mHYeHT0OASiGhudRoRcWfhTWDPcqtTSBWmAkxERNzfz8+Z1220H251EhFxdzWbwuEEs6OqSDlQASYiIu4teZ2571ebm8Ev1Oo0IuLuIpqZHzULJuVEBZiIiLgvpxO+fRCC60CzK61OIyJVgX9N8A9XASblRgWYiIi4r3Ufmd3KOo80O5eJiJSWzWYuQ0z83eokUkWpABMREfeUeQQWPgmxPSCqldVpRKQqqdnM7Kqal211EqmCVICJiIh7WvQ85J6Ajv+yOomIVDURzSE/x7zGVKSMqQATERH3k7wOVr4FbW4CvzCr04hIVRMaCx4+WoYo5UIFmIiIuBenE74Zc7LxxtVWpxGRqsjuAeGN1YhDyoUKMBERcS9rP4CkVWq8ISLlq2YzcwbMMKxOIlWMCjAREXEfJw7Bwqcgrpcab4hI+YpoCifS4NBOq5NIFaMCTERE3MdP482uZGq8ISLlreapDZlXWJtDqhwVYCIi4h72robVs6DdLeAbYnUaEanqvAOgRn3Yo0YcUrZUgImISOXnzIdvHoCwBtCkv9VpRKS6qNlEnRClzKkAExGRym/lO5CyETrfBXaH1WlEpLqIaA4H/oTMw1YnkSpEBZiIiFRuR1Pg5/HQuK/512gRkYoS0dz8qOvApAypABMRkcrthyfA5oD2w61OIiLVTWAU+IXD7mVWJ5EqRAWYiIhUXjt+hg2fQofbzAviRUQqks1mzoLt/s3qJFKFqAATEZHKKTcLvhkDUa2hwSVWpxGR6iqyBexbAzknrE4iVYQKMBERqZyWvgTpe+DCu8y/QouIWCGyBTjzYO9Kq5NIFaECTEREKp8Df8Gvr0DL6yC4jtVpRKQ6q1EXvIMgMd7qJFJFqAATEZHKxTDgm9EQEAGtb7A6jYhUdzY7RDSDXboOTMqGCjAREalc1n4Au3+FziPB4WV1GhERcxni3hWQl2N1EqkCVICJiEjlcewALHjMbLoR087qNCIipsiWkJcFyWutTiJVgAowERGpPL5/xFyC2PF2q5OIiPwttAF4+KodvZQJFWAiIlI5bFsIGz+DTneAT7DVaURE/mZ3mNeBaUNmKQMqwERExHrZx+CbUeayw7heVqcRESksojkk/g7OfKuTiJtTASYiItb7+Vk4fgA63609v0SkcopsCdkZsH+T1UnEzakAExERayX+DsunQ9tbISja6jQiIkWr2djszKrrwKSUVICJiIh1cjNh7t1Qswk0u8rqNCIiZ+bwgppNIeEXq5OIm1MBJiIi1lk8EY4kQtcHzIvcRUQqs6hWsOtXXQcmpaICTERErJG0Gpa9Dm1vghp1rE4jInJuUa3N68BS1ludRNyYCjAREal4uZnw5Uhzb50Wg6xOIyJyfsIbg4cPJCy1Oom4MRVgIiJS8X6aAId3wcWjtfRQRNyHw9PcDyxhidVJxI2pABMRkYqV8Av8PhXaDYUada1OIyJSPFGtIDEe8nOtTiJuSgWYiIhUnKx0c+lhVCtofrXVaUREii+qDeQch31rrU4ibkoFmIiIVJzvHobMw3DRaLDpf0Ei4obCGoKnn5YhSonp/34iIlIx1n8K6z6CC+6EgAir04iIlIzdAZEt1IhDSkwFmIiIlL+DO+CbURDXExpcYnUaEZHSiWoFe+IhL9vqJOKGVICJiEj5ysuBz/4F3kFw4d1gs1mdSESkdKJam8XX3lVWJxE3pAJMRETK10/PwP6N0P0/5nUTIiLuLiQWvALMrq4ixaQCTEREys+WryF+CrQfCuGNrE4jIlI27A6Ibg07F1mdRNyQCjARESkfB/4yW87XuwiaX2t1GhGRshXd1lyCmJVhdRJxMyrARESk7GUfhY9vBr9QuOgBXfclIlVPTHsw8mGXuiFK8agAExGRsmUYMPduyEiCno/pui8RqZoCoyAwGnb8bHUScTMqwEREpGwtnghb5sFFoyC4ttVpRETKT3RbFWBSbCrARESk7Kz9CJa8YDbdqNfV6jQiIuUrph0c2gmHd1mdRNyICjARESkbCUth3n3Q6DJoeb3VaUREyl90a7DZYYe6Icr5UwEmIiKld2ArfDIEIlvAhfeo6YaIVA9eARDeRO3opVhUgImISOkc3gWzrwGfGtDzEbB7WJ1IRKTixLSFHYvBmW91EnETKsBERKTkMpLh3asBG1w2wfxrsIhIdRLTDrLTYd8aq5OIm1ABJiIiJXP8oDnzlXsC+jxr7vklIlLdhDcGL39dBybnTQWYiIgU37FUePdKOJ4Klz0LARFWJxIRsYbdA6Jaw/YfrU4ibkIFmIiIFE96Esy4HI7thz7PQXAtqxOJiFgrpj3sXQmZh61OIm5ABZiIiJy/QzthRl/IOQZ9/ws16lqdSETEerU7gpGvTZnlvFhegE2bNo3Y2Fh8fHzo0KEDS5cuPev4JUuW0KFDB3x8fIiLi2P69OmFxnz++ec0b94cb29vmjdvzpdfflng/nHjxmGz2QrcoqKiyvR1iYhUOfvWwDt9wXBC34kQFG11IhGRysG/JoTEwl8/WJ1E3IClBdgnn3zCqFGjePzxx1mzZg3dunWjX79+JCYmFjk+ISGB/v37061bN9asWcNjjz3G/fffz+eff+4aEx8fz+DBg7n11ltZt24dt956KzfccAPLly8v8FwtWrQgOTnZdduwYUO5vlYREbe29TuY2Q98Q+Dy/+qaLxGR09XqANt+AKfT6iRSydkMwzCsOnnnzp1p3749b7zxhutYs2bNGDBgABMnTiw0/uGHH2bevHls2bLFdWzkyJGsW7eO+Ph4AAYPHkxGRgbfffeda8zll19OSEgIH330EWDOgM2dO5e1a9eWOHtGRgbBwcGkp6cTFBRU4ucREanUDANW/B98/wjU6QzdHgQPH6tTiYhUPvs3wfcPwx0/mUsSpVopTm1g2QxYTk4Oq1evpk+fPgWO9+nTh2XLlhX5mPj4+ELj+/bty6pVq8jNzT3rmNOfc9u2bcTExBAbG8uNN97Izp07z5o3OzubjIyMAjcRkSotNwu+uhe+ewiaXQ09HlHxJSJyJjWbgnegOQsmchaWFWBpaWnk5+cTGRlZ4HhkZCQpKSlFPiYlJaXI8Xl5eaSlpZ11zD+fs3PnzsyePZsFCxbw1ltvkZKSQteuXTl48OAZ806cOJHg4GDXrU6dOsV6vSIibiV9L8y8HDbMgYtGQ6c7wO6wOpWISOVld5ibMv/1vdVJpJKzvAmHzWYr8LlhGIWOnWv86cfP9Zz9+vVj0KBBtGrVit69e/Ptt98C8O67757xvI8++ijp6emu2549e87xykRE3NSORfBmd8hIgn4vQsNLrU4kIuIeanWC5HVwdL/VSaQS87DqxOHh4TgcjkKzXampqYVmsE6JiooqcryHhwdhYWFnHXOm5wTw9/enVatWbNu27YxjvL298fb2PutrEhFxa/l5sHgiLH0JYtpCt7HgE2x1KhER91GrPWCD7Quh3S1Wp5FKyrIZMC8vLzp06MDChQsLHF+4cCFdu3Yt8jFdunQpNP6HH36gY8eOeHp6nnXMmZ4TzOu7tmzZQnS0WiqLSDWVngTvXgm/vgztboXez6j4EhEpLp9gqNkE/lpgdRKpxCybAQMYM2YMt956Kx07dqRLly783//9H4mJiYwcORIwl/0lJSUxe/ZswOx4OGXKFMaMGcOIESOIj4/nnXfecXU3BHjggQfo3r07L7zwAtdccw1fffUVP/74I7/++qtrzNixY7nqqquoW7cuqampPPvss2RkZDBs2LCKfQNERCqDLV+bzTbsHtD3eYhsaXUiERH3VasjbJ4LeTng4WV1GqmELC3ABg8ezMGDBxk/fjzJycm0bNmS+fPnU69ePQCSk5ML7AkWGxvL/PnzGT16NFOnTiUmJobXXnuNQYMGucZ07dqVjz/+mCeeeIInn3ySBg0a8Mknn9C5c2fXmL1793LTTTeRlpZGzZo1ufDCC/n9999d5xURqRZyTsCCx2D1TKjbBbrcBz7aVkNEpFTqdIa178OuX6Bhb6vTSCVk6T5g7kz7gImIW0teD5/fDkd2Q6cR0KgvnKUBkoiInCfDgC//DU36wZWvWJ1GKohb7AMmIiIWcDohfhq8fSk48+CKV6Hx5Sq+RETKis1mzoL9+a35M1fkNCrARESqi+Np8OH1sOBR8y+z/V+CGtrTUESkzNW9EI7th6TVVieRSsjSa8BERKSC7PoVPrsd8rLg0nFQu6PVieSkfKdBZh5k5Rtk5UFWnkGOE3LyISffICcfcp0GuU7IzYc8p/l5vgG5Tsg/+Xme69+Qb5jj81w34+Tj/v53jhPy8k8+78lxOSfvy8v/+xx5Tv7x0cBpmCusnAacuobh1Pypww4eNhsOO3jawcfDho8H+DggwMtGkJeNwJMfw3z/vkX624nxtxPsXXgvTxG3VLMZ+NSAP7+GOp2sTiOVjAowEZGqzOmEXybBkv+a3Q27PQh+YVanqnKy8gwOnDBIy3RyOMvgYJbB4SyD9Oy/b0dzDI7mwNEcg2O5BidyITPPIDu/5Oe128DDZhY+dht42MFhs+Gwgd3+930O28njrn//Y6zd/Le3A4LtNhx2m+t++8mxp47ZT95smKusbPxdhGGAE7NQcxpmoZeTz8li0iwyEzOcZObB8VyDjByD47kFX4+vB8QE2IkNthMXbCe2hp1GIXaahjoI8FJhJm7E7oA6F5hdZns/o2XeUoAKMBGRqirzMHw+Arb/CG1uhNY3mr8USLFkZBskHXOy75iTpKMGycedpBw3SD7mJOWEk7QTBsdyCz/O1wMCvWz4e4K/pw1fDxsBXhDuZ8fXYc4OeXuAt8OGtwO8HOBlt+HpMGePPO02PE4WR5528LCfLJb+UVS5+2xRbr5ZiB3OMkjLNDiYaXAg02D/MScb0vI5cNzg1BU0dQJttAhz0DbSQbsIB61qOvDzdO/XL1Vc3S6w7Qc4sBUimlqdRioRFWAiIlVRygb4eIhZhPUeB7U6WJ2o0nIaBsnHDHZnONmV7mR3hpPEU7ejTo7m/D3WwwahvjZCfWyE+NhoHuYgpJaNYO+/b4FeEORlw8Ou4uBcPB2nliFCw5DC9+fmGySd/NokZjjZne5k8Z48svLNArR5mJ2utTy4MMZBpygPzZJJ5RLdBjx9zWWIKsDkH9SGvoTUhl5EKq1NX8KXIyGoFvR8FAKjrE5UKRzJMthxJJ+d6U52HnGSkO5kxxHzF/tTywDtQE0/GxF+tpMf7dT0sxHuayPcz0YNbxt2N591cndOw2DPUYNth/L585CTLQedHMoy8LBBhygHl9T1oFddDxqF2N1+hlCqgCX/heyjcOcvVieRclac2kAFWAmpABORSscwYOlk+PlZiO0BXe8HD2+rU1WofKfB3qNmobXjiFlgbT/sZGe6+Uv6KTV9bUT724gMsBPtbyPK306Uv1l0aebKvRiGQfJxg41p+axLzWdTmllQ1w600S/Wk8tjPWgX6VDhLNbYuQSWToJRG9V1toorTm2gJYgiIlVBXjbMuw/WfwJth5jXe1XhXzgzsg0S0p3sPFlo7Ux3su2wuUQt5+RFQ94OiAmwER1g55J6HsT4m/+O8rfh41F135vqxmazERNgIybATp/6nuTkG2w+6GRVSj5ztubw1vocIvxsXNXAkwGNPGkZrpkxqUC1O4HDCzZ/BV3vtTqNVBKaASshzYCJSKWRlQEf3QR7V8BFD5izX1VAVp5BYoa5VDAh3bw+a+cRJzvSnRzM/Pt/XaE+NlehFeNvIybQ/Bjqq+WC1Z3TMNh6yMnv+/JZnpxHejbEBtsZ1NiTQY09iQ7QdqhSARY9Z24B8u/FVieRcqQliBVABZiIVArHUuH9gXAoAS55EiJbWJ2oWI7mmA0W9mQ42ZXhJPFUsZXhZP9xw9Xi3NcDYvztRPjbiA6wEeNvd81mqROenI98p8HGNCe/JeWxIjmfnHzoVtvBDU29uKy+B94OfR9JOdm1FJa8APevgdA4q9NIOdESRBGR6uBQArw3wLzA+/L/Qkh9qxMVkuc0OwwmZjjZc/TvzoJml0GDI9l//w3Qz4OT12HZuTDaQeTJ67KitEGvlAGH3UabCAdtIhzc1srg9335LEnM494fMwn1sXFDU0+GNPOiTpBmxaSM1eoEHr6w8QvoPtbqNFIJaAashDQDJiKWStsGs6409/W6bDwERFoW5UiWQeJR8/qrxKPmbFbiUXM2K/m4Qf7J/8vYgTBfs8NguJ+NSD9zRivyZLfBQC8VWVLx9h518tPuPJbuzeNELnSv42B4Sy961PHQElYpO79MguMH4O54q5NIOdESxAqgAkxELHNgq1l8efpCn2fBt4gNlMrYkSyDnen5rmuxdp1cKpiY4STjH/tk+XtClJ+d8JNt3CP9bET4282iy1cdBqXyys4zWLYvnx935bIz3aB+kI1hLb24rokXgdpfTEorcTksmgB3/w4RzaxOI+VABVgFUAEmIpbYvxnevQq8A+CyZ8G3Rpk9tdMwN73ddiif7f9o4b7jiLPAUsFQHxtR/jYi/c2Zq0j/k7NZfjZthCtuzzAMth128n2Cea2Yrwfc1MyLYS29qB2o5YlSQvm5MOdWuPBuuORxq9NIOVABVgFUgIlIhTuwFWb2A59guGyC+bGEDmeZG9j+eSifP09+3HbYSWaeeb+PA2oF2Ik62d47JuDvvbLUwl2qi0OZThbsyuOn3Xlk5UG/WA/+3dab1jUdVkcTd/Tbq3BoJ9z3R5XeJqS6UhMOEZGq5tBOePdq8A40Z758zv8PP/uPO1l/IJ8NB/LZfNDJxrR8Uo6bf3vztEOdQBu1A+0MbOxJ7QA7tQNthPnadD2WVHuhvnZuaubFtY08+WVPHt8l5PHNF8fpHO1gZFsvetbx0H8ncv7qd4ftP0LyOohpa3UasZAKMBGRyi59r1l8OTxOznydufhKzzZYl5rPugP5rN2fx/oDTg6c3DMryAvqB9vpFOWgfrCdekHmjJZD12WJnJWPh40+sZ70ru/ByuR8vt6Rx23fZdIkxM7Itl5c2cATT7Wxl3OJbgM+NWD9JyrAqjktQSwhLUEUkQpx7ADM6As5x8xW8/41XXflO81rVVbvz2fN/nxW7zebZIDZDKNBDTtxwXbiatiJDbZrVkukjBiGwZaDTr7ekcvaVCcxATb+3cabwU088dW+dHI2K9+ChKXw4Fbw8LI6jZQhLUEUEakKsjLMTZYzD8PlL3DcK5y1e/NYtT+fVSl5rNmfz7FcsNugfpCNhiEO+sV60DDEbIyhFtoi5cNms9E83EHzcAe7081CbPyyLF5bnc3trby4pYUXwd7670+K0PAy2PwVbFsAza6yOo1YRDNgJaQZMBEpV3nZHJh1K6v2nmBlneGsPOzP5oNO8g1zdqtxiJ3GoQ4ah5gzXGqMIWKt/cedfLMjjyV78vB2wK0tvPhXKy9q+qlzopzm2zEQGgc3f2J1EilD6oJYAVSAiUhZMgyDXQdPsHLXIVYmHGTFxj/ZnR0IQISfjSahdpqEOmgcaqdWgGa3RCqrw1kG83fm8tPuPJyG2cJ+RGsvaqmFvZzy57ew4v9gzBYIjLQ6jZQRFWAVQAWYiJRGXr6TLclHzYLr5C3tWA42oJ7PCRrnbKZpbF2axNYl1Fe/uIm4m2M5Bgt25bEgIZcTuTCwsScj23rRoIZa2Fd72cfg06FwyZNw0f1Wp5EyogKsAqgAE5HiSM/MZU3iYVbvPszKXYdZu+cwWblOPB02GkYE0CgikKZRgTQ+tAj/te9A8wFQt7PVsUWklLLyDH7cncf8nXkcyTLoF+fB3e28aRmuQqxaW/IiHEuBe1ZoT7AqQk04REQslO802HHgGGsSD/PH7iOs3n2Y7QeOARDk40HjyEAGtqtNk6hAYsP98XScnOFKWAJr34G4niq+RKoIHw8bVzbwpE99D5buzefr7blc+flxetRxcF97bzpG6Vexaqlhb/jxKUhaDbU7Wp1GKpj+qxcRKQXDMEjJyGLdnnTW7T3C2sQjrN97hOM5+dhtUCfUj4Y1A+jdPJLGEQFEBfsU3Qo+ZQP8+grUag+N+lT8CxGRcuXlsHFpPQ961nHw+758vtqey3VfnaBTlIN72nnTo45D20RUJ9FtzG1F/pitAqwa0hLEEtISRJHq51SxtTEpgw1J6Wzce4T1SemkHcsBINTPk7iaATSMMG9x4QH4ep3HMqP0RPh2LARGQ/th5obLIlKlOQ2DP/bn89W2PLYfcdI8zM7d7bzpF+uhzdGri3UfwaYvzGYcviFWp5FS0hJEEZFSys13svPAcbYkZ7AlOYNN+zLYtC+dwydyAXMpYWy4Pxc3DCcuPIAGEQGE+pdgU83MQ7DwafAOhLZDVHyJVBN2m42OUR50iHSw+aCTedtzuffHTOoF2bizjTcDG3tqe4mqrvHlsP4TWPMBdL3X6jRSgTQDVkKaAROpGgzDIOlIJtv2H2Pr/qNsTTnKluQMdhw4Rm6++eMxItCbuqF+1Avzp36YH/XD/Qnz9yr9cqG8TPjuYTh+ADrfBb41Sv+CRMRt7TxiFmIrkvMJ87Vxe2svhjTzIkibOlddSyfDoQS4fw3Y1ZjFnakLYgVQASbiXpxOs9DannqMbalHXQXX9tRjnMjJB8DX00GdUF9qh/hRJ8SPemF+1A31w9+7HGalnPnw8wRIWQ8X3AlB0WV/DhFxS8nHnHyzI5ele/PxcsAtzc1NnSP9tSVFlXPgT5g/Fm76BJpcbnUaKQUVYBVABZhI5ZSVm09C2nF2HDjGjtTjbD9wjG37j5KQdpzsPCcAPp52atXwJaaGWWzVDvGlTogv4QHeFXQRvAHx0+Cv781rvmo2roBzioi7OZTlZEFCHj/uyiPXCdc28mREGy8ahWimpMowDJj/IATXgVu/sDqNlIKuARORKu/gsWx2HDhVaB1jx4FjbEs9RtLhTE79VSnY15OYGj7UquFLp/qhJwsuX0L9vbBb2W1sw6ewdT60HKTiS0TOKNTHzk3NvLimoSc/7s5jQUIec7bm0quugzvbeNM5Wp0T3Z7NBk2vMLvgpm2D8EZWJ5IKoBmwEtIMmEj5MwyDfelZbDu5VNBcPmgWXEcyzWYYdhtEBvkQHexDTA1fooN9T85u+RDo42nxKyjCzsXwyyRoeKm5D4yIyHnKcxr8lpTP/B25JB41aBluZ0Qbb/rHeuDpUCHmtvJz4bPboPVg6P+i1WmkhLQEsQKoABMpO4ZhkHo0m60pR/lrv3n7M6Xg9VneHnZiavgSc7LQOrWEMCrY5++NjCu7fWvgx3EQ3RpaXmf+5VNEpJgMw2DdASfzd+SyIc1JjL+N21p5MbipGna4rTXvwZavYfQm8Au1Oo2UgAqwCqACTKRkcvKcbEs9yuZ9GWxOzmBL8lH+TM5wzWh5e9ipHVLw+qzaNXwJD/S2dtlgaR3cBt8/AjXqQbtb1e1KRMrE7nQn83fmsiwpH28PuKGJF7e18qJukJv8YUpMWenw+e3Q9X645HGr00gJqACrACrARM4tKzefLckZbExKZ8PJ27b9x8hzmj92ooN9qBNqdhqsG2p2HowI9MZe1TYhzUiC+f8B7yDodAd4lGC/MBGRsziU5WThrjx+2p3H8Vy4rJ4H/2rlxQW6Tsx9rHwbdvwMozeCT7DVaaSYVIBVABVgIgU5nQY7047xR+IR1u05wto9R9iacpQ8p4HDbqNuqJ9rD636Yf7UCfHD16sazAJlHoJvxwJOs928l7/ViUSkCsvOM1i612zYsfeYQfMwO/9q5cVVDT3x1nVilduJg/DFCOjxMHQfa3UaKSYVYBVABZhUd5k5+azdc4RVuw6xavdh1iQeJiMrDxtQO8SXuJoBNKjpT1zNAOqG+rnPdVplKSvdXHaYlQ6d7wTfEKsTiUg1YRgGGw44+S4hl7WpTsJ8bAxp7smQ5tpPrFL7/Q1IXGZeC6Y/2LkVFWAVQAWYVDfHsvNYuesQy3ceIn5nGpuSMshzGvh7OWgUGUDDiEAaRQTQMCIAPy/tcEHOMVjwGBzdDxeMgIAIqxOJSDW175i5n9gve/LIc0L/OA+GtfSifaSWJ1Y6x1LhyxHQezx0vdfqNFIMKsAqgAowqeqycvNZvfswy3ak8ev2NDbuzSDfMAjx86RpVBBNowNpEhlInRC/qnfNVmnlZcIPT8HhBOg0AoKirU4kIsKJXIPFe/JYuCuPlONmG/vhLb24soEnPh76OV5p/PY/SF4HD6wDLz+r08h5UgFWAVSASVVjGAZ/7T/GL38d4JdtB1iRcIjsPCfBvp40jw6iRUwQzaODiAr20V9MzyY3E356Bg78BZ3+BTXqWp1IRKQAp2GwLtXJDwm5rD3gJMTHxo1NzeWJtQO1PNFyR1Ng7l3Q4yHzJm5BBVgFUAEmVcHRrFx+257G4q0HWLQ1lf0Z2Xg57DSLDqRlrWBa1QqmTqife7d/r0i5J8x9vg5uhw63QUg9qxOJiJxV8jGze+Ive/PIzINL6nowtIUXF9d26Ge/lVbNgL++g/vWaBWFm1ABVgFUgIm72n3wOD9uSeWnLftZkXCIPKdBrRq+tKlTgza1g2kaFYSXh/4CWmw5x2Hh03AkAdoPV/ElIm4lK8/gt6R8Fu7KZXeGQb0gG7e28OL6Jl4Ea3PnipdzDL74NzS7GgZMtTqNnAcVYBVABZi4C6fTYH1SOj9sSuGHzfvZnnoMD4eNljFBtKsTQts6NYgI8rE6pnvLPGwWX0f3mTNfNepYnUhEpEQMw+Cvw+as2PJ9+TjscFUDT25t4UWbiGqwdUhl8uc3sPxNuPMXiG5tdRo5BxVgFUAFmFRmeflOViQc4vtNKXy/MYXUo9kE+njQvm4IHeqG0Kp2MD6e+h9pmchIgh+eNBtvtB+upSIiUmUcyTZYnJjHz7vzOJBp0CLMzi0tvLi6oSf+npoVK3fOPJh3H4TEwrB5oCWhlZoKsAqgAkwqm9x8J8t2HGT++mQWbE7hyIlcagZ406F+CJ3qh9IkMhCHuhWWrYPbzJkvDy9z5kv7fIlIFeQ0DNamOvlpdy5r9jvx84SBjTy5ubkXzcL0x7xytXel2djp+lnQ4lqr08hZFKc20GY9Im4sN9/Jb9vT+HZ9Mgs2pZCRlUd0sA/dG9XkgthQ4sL/v707j466uv8//pwtkz1kIStb2ASliixicEGsAoL+UNx/1p+4cORnOaViq1Cx4kI5Ludbj1osfvVQ1P6srdiDS0RA0QpN2cO+GZZAFrKSPZnMzP39MWFkCPCNQGYCeT3OuU7mfu58PnfC28znPfd+7idKKxa2l/3fwarXICYVhvwf3TBTRC5YVouFISk2hqTYKK33sjLfzed5bt7f0cxlyVbuG+hbyj5So2LnXsYw6DkSvngCel0DUUmh7pGcAxoBO0MaAZNQ8XgNa/aV89mWQr7c5hvpSosLZ0RmAiN6J9IzIVJJV3syHti4CLYuhvTLfd9I2hyh7pWISFC5vYZNRzx8fdDNllIvUQ6Y2M/BvQPCGNRVo2LnVEMlLPkl9L0B7lwY6t7IKWgETOQCY4xhY/5RPttcyOdbCimrdZEc4+Tafl25sncivRKVdAVFQyWs+i8ozIWLxkOvqzUnX0Q6JbvVwvA0O8PT7JTUe/k2382X+9z8dUczFydauXeg71oxraB4DkTEwxWPwvevwCW3wsUTQ90jOUsaATtDGgGTYNhdXMOS3AKW5BZScLSB+EgHV/ZOZGSfRPp0jVbSFUyH18GqP4Lxws/uhKR+oe6RiEiH4vEacks8fJvvYWOJB4cVxmXaueuiMLIydF+xs2IMfPsHKNsLv1wLUYmh7pGcQItwBIESMGkvhyrq+WxLIUs2FbL7SA3RTjtXZCYwsk8iA1NjsWohjeBqboANf/EtB9x1AAyaBM6YUPdKRKRDq2w0fH/YzXf5bgrrDOnRFu7o7+COi8LoEat7TZ6RY1MRu18B//vvYNVUz45ECVgQKAGTc6mstonsrUUsyS1kw8FKnHYrQ3rEc1XfJC7rFofdpg+r4DNw8N+w5m1oqvJNOew+QlMORUR+gmP3FfvukJv/FHpocMPwVBu393cwvreDWE1R/GkKNsLXc+CqX8MNz4a6N3IcJWBBoARMzlZtk5tl24tZklvIqr1lYIFLM+IY2TeJYT3jdZ+uUKo6DGv/GwrW+0a9Bt4CkQmh7pWIyHmt0W1YV+xh1SE3W8u8hNngxp52bu3n4NrudsJsSsbaZNti2LBQS9N3MErAgkAJmJyJxmYP3+4uZUluAd/sKqHJ7WVgWgxZvZMY0TuB2HCtphdStUcg90PI+xrC42DABEi+WKNeIiLnWEWDl9UFHlYVuMmvNsQ5YUJvB/+rr4PhqTbdt/J0jPEtyHF4HTy8AlIHhbpHghKwoFACJm3lcvvu1fXZ5kKW7ThCbZObzKQosnonktUnkaRoZ6i7KFX5sGMJ7F0BjgjofR10G67l5UVEguBQtZdVBW5yCjyUNhi6Rli4uY+Dm/vYuTxFi3ecVHMjLH0SXPXwYDYk9gl1jzo9JWBBoARMTqfZ4+XfeeV8saWQr7YfoaqhmYwuEVzZknRldIkIdRfF64HCDbDzM9+cemcs9MyCHllgV1IsIhJsXmP4odJLTqGHNUUeKhsNKZEWburt4KZMO8M0MhaooRK++h143TD5CyVhIaYELAiUgMmJmtweVv9QxtJtxf6k69gNkq/snUgP3SC5AzBQsR/yvoF93/o+vOIyoMdVkPozsOnWiCIiHYHXGHZXeFlb5GFdkYfyRkNCuIUbetoZ08vO1d3shNv1mUp9BSx72vel4oNfQELvUPeo01ICFgRKwASgprGZb3eXsnxHMV/vLKHO5SG9SwRX9IpX0tVReN1QshPy/wP5Ob7rvMKiIe0ySL8cYtN1jZeISAfmNYa8o17WF3vYUOyhoNYQboORGTau7+lgdHc7GTGdeLXg+gpY9jvwuOGe/wfdhoa6R52SErAgUALWeR2qqOebXSWs2HmEnLxy3F5DZlIkw3omcEVmAhldIpR0hZLxQGU+FG+Fwo1wZKtvrnx4LHQd6FtUI7GP7p8iInKeKqz1sqHYQ26Jh10VXrwG+sVbGdXdzjXd7IxIs3W+0bGGSlj5B6jIg5v/CJf/ItQ96nSUgAWBErDOo7HZw4aDlXy3p5Svdx4hr7QOm9XCxWmxDOkRz9Ce8XSN0TVDIeOqgdI9ULYXSnZA6S5w1YHVDvE9IbGvr8Smg6UTf0MqInIBqnUZtpZ62FzqYWupl4pGQ5gVhqTYuKqbnax0G5d2tXWOJe49zbDmz7D3Kxj+CNz4AoRFhrpXnYYSsCBQAnbh8noNO4uryckr5/u9ZazZV06j20t8pIPLunVhcI8u/CwjjsgwXS8UdE3VULEPyvOg/AdfqS70bXNEQFx3iO/lS7ziumsVQxGRTsQYw+Faw9YSDzvKvews91DvhnAbDE62cUWajSvS7AxOthEddgEnZLu/hHX/DTFpcPN/Qd8bQt2jTkEJWBAoAbtwuD1edhbVsO5ABWv3l5Ozr4KqhmbCbFYuSo3h0m5x/CwjTtdzBZPXDdUFUHkAKg7A0f1Qvg/qy33bbWG+Ea3YdIjt5ku2ohI0wiUiIn4er2F/lZddFV52lXvZU+mhxgUWfFMWh6bYGJxiY1CSjf7xVhwX0ihZVQGsmQ9Fm2HQHfDz3/u+nJR2owQsCJSAnb9Ka5rIPXSU3EOVbMo/yqb8ozQ0e3DYLPRNjmZgWiyXpMfRt2s0YXad0Lcrj8uXaFUdhqOHfffjqtwP1UW+JAwgIg6iUyA6DWLTfN/oRSaBVf82IiLSdl5jKKw17K308kOlhx8qvRyuMXiBMCsMSLRySZKNgQk2BiZauSjBRqzzPE7KjIF9K2HDQmishkvvhKufgK79Q92zC5ISsCBQAtbxeb2Gw5UN7CquZkdRNdsKqthWWE1xVSMAXSId9OkaTf/kaC5KjaV31ygcNp3Un3Mel2/lwZoiqC6G2iJfwlVVAHWlYLy+dmHREN21JdlKbnlM1fx1ERFpN41uw8FqL/uOetlf5eVQtS8pc7ecHadEWugXb6VfvI0+8VZ6x1nJjLOSEmU5f24Q7W6EPV/B9n/6ZpL0uR4uuwcGTICwqFD37oJxXiVg8+fP55VXXqGoqIhLLrmE1157jWuuueaU7b/77jtmzJjB9u3bSU9P58knn2Tq1KkBbRYvXswzzzxDXl4effr0Ye7cudx2221nddwTKQHrOBpcHvIr6tlfVkteaR37SuvYW1LD3iO1NDR7AIgJt5OZFEWvRF/pmxxNUnSYphSeLY8LGip8S+A2VEJdmS+pqi+D2hJfaaj8sb3NAREJEJkIUUktj8m+hEuJloiIdABur2+k7FC1l8O1XgpqDAW1Xo7UGTwtZ83hNugWY6VHrIUesTa6xVjIiLaSHm0lLdpCUkQHTNA8zb4Rsbyv4ch2X/LVb6wvIeszGuK6hbqH57WfkhuEdBWBjz76iF//+tfMnz+fq666igULFnDTTTexY8cOevTo0ar9/v37GT9+PFOmTOGDDz5g9erVPPbYY3Tt2pXbb78dgJycHO6++25eeOEFbrvtNv75z39y1113sWrVKkaMGHFGx5XQcXu8lNe5KKlu4kh1I0VVDRRWNVJ4tIHDlQ0cLK+jrNblbx/ltJEeF0FqXDiThmTQLT6S7vERJESdh8mW8fqm4XndvqXVvV7fdAJaRoyO/+7E/94sLYXW97YyBmgpXk/LPj2+/Xtcvj/MHpdvyXZPk++xuR6a68BVD001LaUKGqp8C2I0NwQew+aA8DhwxvmmDmYMgYj4lpLgWwpe12mJiEgHZrdaWhKrwM8rt9dQWm8oqjMU13opaTCU1nvZc7CZ0npDk+e4fVggKdJCapSFlEgrXSMtJEX4HhPDLcSHW0iM8D3GOS3YrUE4R7E5oN8YX6kp9iVjh9f7RsYwvps4Zwzz3SMz7TLoepHvi9Lz7fzpPBDSEbARI0YwZMgQ3nrrLX/dwIEDufXWW5k3b16r9k899RSffvopO3fu9NdNnTqVzZs3k5OTA8Ddd99NdXU1X375pb/NuHHjiI+P58MPPzyj456MRsDaxhhDk9tLg8tDnctNvctDXZObmsZjpZnqxmaO1jdztKGZqvpmymqbKK91UVHXRGV9M8cHqM1qITEqjMToMBKjnKTEOkmOCSc51klaXASx4fbgJlrGC+4mcDf4khF3gy9xcTf6kpZjda6G1m2aG3zt3I2+xMfdCG7XjwnRsal5oWQPB0d4y2ME2CN8j2FRvimDYVHgjGkpsb5t+kMtIiKdjDGG2mYoazCUN/iWw69sMFQ0GqqaDNUuw9FGqGoynOzTPdoBcU4LsU4LsWG+pCw6zEKMA6LDLEQ5LEQ7LEQ4IMphIcIOkXYLES0/h9ssOO3gtFkIt/uuaWvz+VBjNRRvgSPbfKsMV+T5zkPA96VqYl/o0gNiM3wlOrllFkvLTJbwWHBEdvrP//NiBMzlcrFhwwZmzpwZUD9mzBj+/e9/n/Q1OTk5jBkzJqBu7NixvPvuuzQ3N+NwOMjJyeHxxx9v1ea111474+MCNDU10dTU5H9eVVUF+H7ZHcGqH8p4+pOtVDe1LFxgfP8xBn8CY4zxjX+cJ1f9OWxW4sPtdIlyEBcRRlyEndhwB9Zj3xIZN54DGykq3U0RsPnHd3rcw3FvtsO9cTsQ3VLw/eGy2HwjRFYrYG35Y2b58Y/aseec7I/csREuAt62n+W4HwL223I8i7Xl+Dbf8+NvVOxuKSdV11KK2/KmRUREOo2ElgKAE4wT6j12qt0Oaj02aj126rx26hrsHKoN5cS0vi3lBFXAkRMrDVDaUtrGgrfl7MW0lOP39ePjj/N5TKszHQvGd65idwYkew+OzOT/Xtcn5DOdjuUEbRnbCtm/dFlZGR6Ph5SUlID6lJQUiotPfiJXXFx80vZut5uysjLS0tJO2ebYPs/kuADz5s3jueeea1XfvXv3U79JERERERFpN7NaSkdRU1NDXFzcaduE/E6yJ2arxpjTZrAna39ifVv2+VOPO2vWLGbMmOF/7vV6qaioIDExMaQZd3V1Nd27d+fQoUOaCintQjEm7U0xJu1NMSbtTTEmxhhqampIT0//H9uGLAFLSkrCZrO1GnUqKSlpNTp1TGpq6knb2+12EhMTT9vm2D7P5LgATqcTp9MZUNelS5dTv8Egi42N1f/w0q4UY9LeFGPS3hRj0t4UY53b/zTydUzIliMLCwtj6NChLF++PKB++fLljBw58qSvycrKatV+2bJlDBs2DIfDcdo2x/Z5JscVERERERE5F0I6BXHGjBncf//9DBs2jKysLN5++23y8/P99/WaNWsWBQUFvPfee4BvxcM333yTGTNmMGXKFHJycnj33Xf9qxsCTJ8+nWuvvZaXXnqJiRMnsmTJElasWMGqVavafFwREREREZH2ENIE7O6776a8vJznn3+eoqIiBg0aRHZ2Nj179gSgqKiI/Px8f/vMzEyys7N5/PHH+dOf/kR6ejqvv/66/x5gACNHjuRvf/sbs2fP5plnnqFPnz589NFH/nuAteW45xOn08mzzz7banqkyLmiGJP2phiT9qYYk/amGJOfIqT3ARMREREREelMQnYNmIiIiIiISGejBExERERERCRIlICJiIiIiIgEiRIwERERERGRIFECdp6YO3cuI0eOJDIy8pQ3gM7Pz+eWW24hKiqKpKQkfvWrX+FyuQLabN26lVGjRhEREUFGRgbPP/88WodFTmXPnj1MnDiRpKQkYmNjueqqq1i5cmVAm7bEncjpfPHFF4wYMYKIiAiSkpKYNGlSwHbFmJwLTU1NDB48GIvFQm5ubsA2xZicqQMHDvDwww+TmZlJREQEffr04dlnn20VP4oxOV5Il6GXtnO5XNx5551kZWXx7rvvttru8XiYMGECXbt2ZdWqVZSXl/PAAw9gjOGNN94AoLq6mhtvvJHRo0ezbt069uzZw+TJk4mKiuKJJ54I9luS88CECRPo378/33zzDREREbz22mvcfPPN5OXlkZqa2qa4EzmdxYsXM2XKFP7whz9w/fXXY4xh69at/u2KMTlXnnzySdLT09m8eXNAvWJMzsauXbvwer0sWLCAvn37sm3bNqZMmUJdXR2vvvoqoBiTkzByXlm4cKGJi4trVZ+dnW2sVqspKCjw13344YfG6XSaqqoqY4wx8+fPN3FxcaaxsdHfZt68eSY9Pd14vd5277ucX0pLSw1g/vWvf/nrqqurDWBWrFhhjGlb3ImcSnNzs8nIyDDvvPPOKdsoxuRcyM7ONgMGDDDbt283gNm0aVPANsWYnEsvv/yyyczM9D9XjMmJNAXxApGTk8OgQYNIT0/3140dO5ampiY2bNjgbzNq1KiAmwSOHTuWwsJCDhw4EOwuSweXmJjIwIEDee+996irq8PtdrNgwQJSUlIYOnQo0La4EzmVjRs3UlBQgNVq5fLLLyctLY2bbrqJ7du3+9soxuRsHTlyhClTpvD+++8TGRnZartiTM61qqoqEhIS/M8VY3IiJWAXiOLiYlJSUgLq4uPjCQsLo7i4+JRtjj0/1kbkGIvFwvLly9m0aRMxMTGEh4fzxz/+kaVLl/qvQ2xL3Imcyr59+wCYM2cOs2fP5vPPPyc+Pp5Ro0ZRUVEBKMbk7BhjmDx5MlOnTmXYsGEnbaMYk3MpLy+PN954g6lTp/rrFGNyIiVgITRnzhwsFstpy/r169u8P4vF0qrOGBNQf2Ib07IAx8leKxemtsadMYbHHnuM5ORkvv/+e9auXcvEiRO5+eabKSoq8u+vLXEnnUtbY8zr9QLw9NNPc/vttzN06FAWLlyIxWLhH//4h39/ijE5UVtj7I033qC6uppZs2addn+KMTnRmZyjFRYWMm7cOO68804eeeSRgG2KMTmeFuEIoWnTpnHPPfectk2vXr3atK/U1FTWrFkTUFdZWUlzc7P/W5fU1NRW37SUlJQAtPpmRi5cbY27b775hs8//5zKykpiY2MBmD9/PsuXL2fRokXMnDmzTXEnnU9bY6ympgaAiy++2F/vdDrp3bs3+fn5QNv+tknn09YYe/HFF/nPf/4TMPUeYNiwYdx3330sWrRIMSYn9VPP0QoLCxk9ejRZWVm8/fbbAe0UY3IiJWAhlJSURFJS0jnZV1ZWFnPnzqWoqIi0tDQAli1bhtPp9F+vk5WVxe9+9ztcLhdhYWH+Nunp6W1O9OT819a4q6+vB8BqDRwot1qt/pGLtsSddD5tjbGhQ4fidDrZvXs3V199NQDNzc0cOHCAnj17AooxObm2xtjrr7/Oiy++6H9eWFjI2LFj+eijjxgxYgSgGJOT+ynnaAUFBYwePdo/in/i56ZiTFoJ3fof8lMcPHjQbNq0yTz33HMmOjrabNq0yWzatMnU1NQYY4xxu91m0KBB5uc//7nZuHGjWbFihenWrZuZNm2afx9Hjx41KSkp5t577zVbt241n3zyiYmNjTWvvvpqqN6WdGClpaUmMTHRTJo0yeTm5prdu3eb3/zmN8bhcJjc3FxjTNviTuR0pk+fbjIyMsxXX31ldu3aZR5++GGTnJxsKioqjDGKMTm39u/f32oVRMWYnI2CggLTt29fc/3115vDhw+boqIifzlGMSYnUgJ2nnjggQcM0KqsXLnS3+bgwYNmwoQJJiIiwiQkJJhp06YFLDlvjDFbtmwx11xzjXE6nSY1NdXMmTNHS9DLKa1bt86MGTPGJCQkmJiYGHPllVea7OzsgDZtiTuRU3G5XOaJJ54wycnJJiYmxtxwww1m27ZtAW0UY3KunCwBM0YxJmdu4cKFJz0/O3GMQzEmx7MY07IKg4iIiIiIiLQrrYIoIiIiIiISJErAREREREREgkQJmIiIiIiISJAoARMREREREQkSJWAiIiIiIiJBogRMREREREQkSJSAiYiIiIiIBIkSMBERERERkSBRAiYiIiIiIhIkSsBERKRTmDx5MhaLpVUZN25cqLsmIiKdiD3UHRAREQmWcePGsXDhwoA6p9PZbsdzuVyEhYW12/5FROT8oxEwERHpNJxOJ6mpqQElPj4eAIvFwjvvvMNtt91GZGQk/fr149NPPw14/Y4dOxg/fjzR0dGkpKRw//33U1ZW5t9+3XXXMW3aNGbMmEFSUhI33ngjAJ9++in9+vUjIiKC0aNHs2jRIiwWC0ePHqWuro7Y2Fg+/vjjgGN99tlnREVFUVNT086/FRERCSYlYCIiIi2ee+457rrrLrZs2cL48eO57777qKioAKCoqIhRo0YxePBg1q9fz9KlSzly5Ah33XVXwD4WLVqE3W5n9erVLFiwgAMHDnDHHXdw6623kpuby6OPPsrTTz/tbx8VFcU999zTamRu4cKF3HHHHcTExLT/GxcRkaCxGGNMqDshIiLS3iZPnswHH3xAeHh4QP1TTz3FM888g8ViYfbs2bzwwgsA1NXVERMTQ3Z2NuPGjeP3v/89a9as4auvvvK/9vDhw3Tv3p3du3fTv39/rrvuOqqqqti0aZO/zcyZM/niiy/YunWrv2727NnMnTuXyspKunTpwtq1axk5ciT5+fmkp6dTVlZGeno6y5cvZ9SoUe38mxERkWDSNWAiItJpjB49mrfeeiugLiEhwf/zpZde6v85KiqKmJgYSkpKANiwYQMrV64kOjq61X7z8vLo378/AMOGDQvYtnv3boYPHx5Qd8UVV7R6fskll/Dee+8xc+ZM3n//fXr06MG11157Bu9SREQ6MiVgIiLSaURFRdG3b99Tbnc4HAHPLRYLXq8XAK/Xyy233MJLL73U6nVpaWkBxzieMQaLxdKq7kSPPPIIb775JjNnzmThwoU8+OCDrV4nIiLnPyVgIiIibTBkyBAWL15Mr169sNvb/vE5YMAAsrOzA+rWr1/fqt0vfvELnnzySV5//XW2b9/OAw88cNZ9FhGRjkeLcIiISKfR1NREcXFxQDl+FcPT+eUvf0lFRQX33nsva9euZd++fSxbtoyHHnoIj8dzytc9+uij7Nq1i6eeeoo9e/bw97//nb/85S8AASNc8fHxTJo0id/+9reMGTOGbt26ndV7FRGRjkkJmIiIdBpLly4lLS0toFx99dVtem16ejqrV6/G4/EwduxYBg0axPTp04mLi8NqPfXHaWZmJh9//DGffPIJl156KW+99ZZ/FcQT70H28MMP43K5eOihh878TYqISIemVRBFRESCbO7cufz5z3/m0KFDAfV//etfmT59OoWFhbqBs4jIBUrXgImIiLSz+fPnM3z4cBITE1m9ejWvvPIK06ZN82+vr69n//79zJs3j0cffVTJl4jIBUxTEEVERNrZ3r17mThxIhdffDEvvPACTzzxBHPmzPFvf/nllxk8eDApKSnMmjUrdB0VEZF2pymIIiIiIiIiQaIRMBERERERkSBRAiYiIiIiIhIkSsBERERERESCRAmYiIiIiIhIkCgBExERERERCRIlYCIiIiIiIkGiBExERERERCRIlICJiIiIiIgEyf8HSgI0Ov021JEAAAAASUVORK5CYII=",
+      "text/plain": [
+       "<Figure size 1000x600 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import seaborn as sns\n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "# Map true_type to labels\n",
+    "df['true_type_label'] = df['true_type'].map({0: 'Known', 1: 'Novel'})\n",
+    "master_df = df.copy()\n",
+    "\n",
+    "plt.figure(figsize=(10, 6))\n",
+    "sns.kdeplot(data=df, x='energy', hue='true_type_label', fill=True)\n",
+    "plt.title('KDE Plot of Energy Scores by True Type')\n",
+    "plt.xlabel('Energy')\n",
+    "plt.ylabel('Density')\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "926a9415c404460c9a45984d3350c36e",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "Calculating Accuracy:   0%|          | 0/10 [00:00<?, ?batch/s]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Accuracy of the model on the testset: 85.20%\n"
+     ]
+    }
+   ],
+   "source": [
+    "testset = dataset_master.get_dataset(session=1, train=False)[\"old\"]\n",
+    "# get the accuracy of the model on the testset:\n",
+    "\n",
+    "testloader = torch.utils.data.DataLoader(testset,\n",
+    "                                            batch_size=512,\n",
+    "                                            shuffle=False,\n",
+    "                                            num_workers=4,\n",
+    "                                            pin_memory=True)\n",
+    "\n",
+    "correct = 0\n",
+    "total = 0\n",
+    "pretrained_model.eval()\n",
+    "for x, y, _ in tqdm(testloader, desc='Calculating Accuracy', unit='batch'):\n",
+    "    with torch.no_grad():\n",
+    "        x = x.to(device)\n",
+    "        y = y.to(device)\n",
+    "        logits, _ = pretrained_model(x)\n",
+    "        _, predicted = torch.max(logits, 1)\n",
+    "        total += y.size(0)\n",
+    "        correct += (predicted == y).sum().item()\n",
+    "\n",
+    "print(f'Accuracy of the model on the testset: {100 * correct / total:.2f}%')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Voting GMM"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "ename": "ValueError",
+     "evalue": "Input X contains infinity or a value too large for dtype('float32').",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
+      "Cell \u001b[0;32mIn[7], line 21\u001b[0m\n\u001b[1;32m     19\u001b[0m \u001b[38;5;66;03m# GMM 2: energy\u001b[39;00m\n\u001b[1;32m     20\u001b[0m energy_gmm \u001b[38;5;241m=\u001b[39m GaussianMixture(n_components\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m, random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m8008135\u001b[39m, max_iter\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1000\u001b[39m, init_params\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk-means++\u001b[39m\u001b[38;5;124m'\u001b[39m, tol\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1e-4\u001b[39m)\n\u001b[0;32m---> 21\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124menergy_cluster\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[43menergy_gmm\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit_predict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43menergy\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalues\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreshape\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     22\u001b[0m soft_clusters \u001b[38;5;241m=\u001b[39m energy_gmm\u001b[38;5;241m.\u001b[39mpredict_proba(df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124menergy\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mvalues\u001b[38;5;241m.\u001b[39mreshape(\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m1\u001b[39m))\n\u001b[1;32m     24\u001b[0m mean_0 \u001b[38;5;241m=\u001b[39m df[df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124menergy_cluster\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124menergy\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mmean()\n",
+      "File \u001b[0;32m~/miniconda3/envs/entcl/lib/python3.10/site-packages/sklearn/base.py:1473\u001b[0m, in \u001b[0;36m_fit_context.<locals>.decorator.<locals>.wrapper\u001b[0;34m(estimator, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1466\u001b[0m     estimator\u001b[38;5;241m.\u001b[39m_validate_params()\n\u001b[1;32m   1468\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[1;32m   1469\u001b[0m     skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[1;32m   1470\u001b[0m         prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[1;32m   1471\u001b[0m     )\n\u001b[1;32m   1472\u001b[0m ):\n\u001b[0;32m-> 1473\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfit_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
+      "File \u001b[0;32m~/miniconda3/envs/entcl/lib/python3.10/site-packages/sklearn/mixture/_base.py:212\u001b[0m, in \u001b[0;36mBaseMixture.fit_predict\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m    184\u001b[0m \u001b[38;5;129m@_fit_context\u001b[39m(prefer_skip_nested_validation\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m    185\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfit_predict\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, y\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m    186\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"Estimate model parameters using X and predict the labels for X.\u001b[39;00m\n\u001b[1;32m    187\u001b[0m \n\u001b[1;32m    188\u001b[0m \u001b[38;5;124;03m    The method fits the model n_init times and sets the parameters with\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    210\u001b[0m \u001b[38;5;124;03m        Component labels.\u001b[39;00m\n\u001b[1;32m    211\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[0;32m--> 212\u001b[0m     X \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfloat64\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfloat32\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mensure_min_samples\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m    213\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m X\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m<\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_components:\n\u001b[1;32m    214\u001b[0m         \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m    215\u001b[0m             \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mExpected n_samples >= n_components \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    216\u001b[0m             \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbut got n_components = \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_components\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    217\u001b[0m             \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mn_samples = \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mX\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    218\u001b[0m         )\n",
+      "File \u001b[0;32m~/miniconda3/envs/entcl/lib/python3.10/site-packages/sklearn/base.py:633\u001b[0m, in \u001b[0;36mBaseEstimator._validate_data\u001b[0;34m(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)\u001b[0m\n\u001b[1;32m    631\u001b[0m         out \u001b[38;5;241m=\u001b[39m X, y\n\u001b[1;32m    632\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m no_val_y:\n\u001b[0;32m--> 633\u001b[0m     out \u001b[38;5;241m=\u001b[39m \u001b[43mcheck_array\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mX\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcheck_params\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    634\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_y:\n\u001b[1;32m    635\u001b[0m     out \u001b[38;5;241m=\u001b[39m _check_y(y, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mcheck_params)\n",
+      "File \u001b[0;32m~/miniconda3/envs/entcl/lib/python3.10/site-packages/sklearn/utils/validation.py:1064\u001b[0m, in \u001b[0;36mcheck_array\u001b[0;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[0m\n\u001b[1;32m   1058\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m   1059\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFound array with dim \u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m expected <= 2.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m   1060\u001b[0m         \u001b[38;5;241m%\u001b[39m (array\u001b[38;5;241m.\u001b[39mndim, estimator_name)\n\u001b[1;32m   1061\u001b[0m     )\n\u001b[1;32m   1063\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m force_all_finite:\n\u001b[0;32m-> 1064\u001b[0m     \u001b[43m_assert_all_finite\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m   1065\u001b[0m \u001b[43m        \u001b[49m\u001b[43marray\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1066\u001b[0m \u001b[43m        \u001b[49m\u001b[43minput_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minput_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1067\u001b[0m \u001b[43m        \u001b[49m\u001b[43mestimator_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mestimator_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1068\u001b[0m \u001b[43m        \u001b[49m\u001b[43mallow_nan\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mforce_all_finite\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mallow-nan\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1069\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1071\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m copy:\n\u001b[1;32m   1072\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m _is_numpy_namespace(xp):\n\u001b[1;32m   1073\u001b[0m         \u001b[38;5;66;03m# only make a copy if `array` and `array_orig` may share memory`\u001b[39;00m\n",
+      "File \u001b[0;32m~/miniconda3/envs/entcl/lib/python3.10/site-packages/sklearn/utils/validation.py:123\u001b[0m, in \u001b[0;36m_assert_all_finite\u001b[0;34m(X, allow_nan, msg_dtype, estimator_name, input_name)\u001b[0m\n\u001b[1;32m    120\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first_pass_isfinite:\n\u001b[1;32m    121\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m--> 123\u001b[0m \u001b[43m_assert_all_finite_element_wise\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    124\u001b[0m \u001b[43m    \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    125\u001b[0m \u001b[43m    \u001b[49m\u001b[43mxp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mxp\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    126\u001b[0m \u001b[43m    \u001b[49m\u001b[43mallow_nan\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mallow_nan\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    127\u001b[0m \u001b[43m    \u001b[49m\u001b[43mmsg_dtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmsg_dtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    128\u001b[0m \u001b[43m    \u001b[49m\u001b[43mestimator_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mestimator_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    129\u001b[0m \u001b[43m    \u001b[49m\u001b[43minput_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minput_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    130\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
+      "File \u001b[0;32m~/miniconda3/envs/entcl/lib/python3.10/site-packages/sklearn/utils/validation.py:172\u001b[0m, in \u001b[0;36m_assert_all_finite_element_wise\u001b[0;34m(X, xp, allow_nan, msg_dtype, estimator_name, input_name)\u001b[0m\n\u001b[1;32m    155\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m estimator_name \u001b[38;5;129;01mand\u001b[39;00m input_name \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mX\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m has_nan_error:\n\u001b[1;32m    156\u001b[0m     \u001b[38;5;66;03m# Improve the error message on how to handle missing values in\u001b[39;00m\n\u001b[1;32m    157\u001b[0m     \u001b[38;5;66;03m# scikit-learn.\u001b[39;00m\n\u001b[1;32m    158\u001b[0m     msg_err \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m    159\u001b[0m         \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mestimator_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m does not accept missing values\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    160\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m encoded as NaN natively. For supervised learning, you might want\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    170\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m#estimators-that-handle-nan-values\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    171\u001b[0m     )\n\u001b[0;32m--> 172\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg_err)\n",
+      "\u001b[0;31mValueError\u001b[0m: Input X contains infinity or a value too large for dtype('float32')."
+     ]
+    }
+   ],
+   "source": [
+    "from sklearn.mixture import GaussianMixture\n",
+    "# GMM 1: entropy\n",
+    "df = master_df.copy()\n",
+    "entropy_gmm = GaussianMixture(n_components=2, random_state=8008135, max_iter=1000, init_params='k-means++', tol=1e-4)\n",
+    "df[\"entropy_cluster\"] = entropy_gmm.fit_predict(df['entropy'].values.reshape(-1, 1))\n",
+    "soft_clusters = entropy_gmm.predict_proba(df['entropy'].values.reshape(-1, 1))\n",
+    "\n",
+    "mean_0 = df[df[\"entropy_cluster\"] == 0][\"entropy\"].mean()\n",
+    "mean_1 = df[df[\"entropy_cluster\"] == 1][\"entropy\"].mean()\n",
+    "\n",
+    "if mean_0 > mean_1:\n",
+    "    df[\"entropy_cluster\"] = 1 - df[\"entropy_cluster\"]\n",
+    "    soft_clusters = soft_clusters[:, [1, 0]]\n",
+    "    print(\"Swapped Ent Clusters\")\n",
+    "    \n",
+    "df[\"entropy_clusterprob_0\"] = soft_clusters[:, 0]\n",
+    "df[\"entropy_clusterprob_1\"] = soft_clusters[:, 1]\n",
+    "\n",
+    "# GMM 2: energy\n",
+    "energy_gmm = GaussianMixture(n_components=2, random_state=8008135, max_iter=1000, init_params='k-means++', tol=1e-4)\n",
+    "df[\"energy_cluster\"] = energy_gmm.fit_predict(df['energy'].values.reshape(-1, 1))\n",
+    "soft_clusters = energy_gmm.predict_proba(df['energy'].values.reshape(-1, 1))\n",
+    "\n",
+    "mean_0 = df[df[\"energy_cluster\"] == 0][\"energy\"].mean()\n",
+    "mean_1 = df[df[\"energy_cluster\"] == 1][\"energy\"].mean()\n",
+    "\n",
+    "if mean_0 > mean_1:\n",
+    "    df[\"energy_cluster\"] = 1 - df[\"energy_cluster\"]\n",
+    "    soft_clusters = soft_clusters[:, [1, 0]]\n",
+    "    print(\"Swapped Energy Clusters\")\n",
+    "\n",
+    "df[\"energy_clusterprob_0\"] = soft_clusters[:, 0]\n",
+    "df[\"energy_clusterprob_1\"] = soft_clusters[:, 1]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Individual GMM Scoring"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Entropy-based Known Correct/Total (Accuracy%) 574/1000 (57.4000%)\n",
+      "Entropy-based Novel Correct/Total (Accuracy%) 3704/4000 (92.6000%)\n",
+      "\n",
+      "Energy-based Known Correct/Total (Accuracy%) 891/1000 (89.1000%)\n",
+      "Energy-based Novel Correct/Total (Accuracy%) 2639/4000 (65.9750%)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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XeZ3LDs726hXr57RsGFD37GLLrrIuOiii3zXMzIyjE6dOhmRkZHGM888YyxdutR49NFHjZCQEGPIkCG+89auXWuEh4cbQ4YMMdauXWusXbvW+PnnnwutpyT3m5mZaaxdu9bo2rWr0aJFC9/9pqSkFHq/F110kdG+fftiX6e8n1eLFi2Mu+66y/jss8+MV155xahdu7bRr18/33kbN240WrRoYXTt2tX3+Bs3bjQMwzC+/PJLQ5LRqFEj45prrjE+/PBD4+OPPzaOHDliPPnkk4Yk489//rPxySefGPPmzTNatGhhxMTEGL/99pvv/keOHGk4nU6jadOmxj//+U9j6dKlxqRJk4yQkBDj8ssv9533wQcfGJKMZcuW+T3fTz75xJBkfPLJJ4W+JmlpaUZsbKxRv359Y9asWcaOHTsKPTc1NdVo3769ERkZaTz++OPGZ599Zrz33nvGPffcYyxfvrzEP7s8ea9Pp06djDfeeMNYvny58dNPPxk///yzERMTY3Ts2NGYN2+esXTpUuO+++4z7Ha7MWnSJN/tp0yZYjgcDuOxxx4zvvjiC2PJkiXGtGnT/M4pSN7PpkmTJsbQoUONjz76yHj99deNVq1aGbVq1TJ+//13wzAMIysry6hfv77xl7/8xe/2OTk5RsOGDY1rr722yMfJex998803+d5vbrc732vRrFkzo2fPnsbbb79tLF682Ojbt68REhLiq2fPnj3GXXfdZUgyFi5cmO89n5iYaDRo0MBo0aKFMXv2bOPLL780vvvuO+OXX34xoqOjjZYtWxrz5s0zPvnkE+PPf/6zIcn497//XaWvi9vtNiIiIoxzzz23yNfudGf+u5NX55dfful33o4dOwxJxpw5c3zH2rZta7Rq1cp47bXXjJUrVxrvvfeecd999/luW9Tf4fT0dKNLly5GfHy8MXXqVOPzzz83pk+fbsTExBgXX3yx4fV6fY9T2HsZQOkQnAD4PkBJMmJiYozk5ORCzy0uOGVkZBiSjMGDB/uOjRw50nf/Z1769+9fbH2JiYnGkCFDfB/qduzY4bvPBx54wHfemR9gXnrpJUOS8fbbb/vd37///W9DkrF06VLfscjISGPkyJHF1lLa+80LQyVx0UUXFfo6nR5E835eY8aM8bv9U089ZUgykpKSfMfat2/v95rkyftwd+GFF/odP3bsmC9Enm737t2Gy+UybrjhBt+xvJ/B9OnT/c795z//aUgyVq9ebRiGYXg8HqNFixbG0KFD/c4bPHiw0bJlS78PeAX55JNPjPj4eN9rUadOHePaa681PvzwQ7/zHn/88QID2ulK87PL+/tw9OhRv3MHDRpkNG7cOF8IHjt2rBEWFuY7//LLLze6dOlS5HMrSN7Pplu3bn6vzc6dO43Q0FDjlltu8R177LHHDKfTaRw8eNB3bMGCBYYkY+XKlUU+zul/78+8OBwOv3MlGQkJCUZqaqrv2IEDBwy73W5MmTLFd+zpp582JBUYcBMTEw2Hw2H8+uuvfsevv/56w+VyGbt37/Y7PnjwYCMiIsI4fvx4lb0uBw4cMCQZ119/faHnnKmswenw4cOGJGPatGlF3n9hf4enTJli2O12Y926dX7H3333XUOSsXjxYt+xwt7LAEqHqXoAfK688kqlpKRo3Lhx8ng8ZboP44zpWHnCw8O1bt26fJcZM2aU6H4XL16s0NBQhYaGqnnz5nr77bd111136Yknnij0NsuXL1dkZKSuueYav+N5i6y/+OKLkj2pKrpfSWrZsmWBr9Ojjz6a79wzpwt16tRJkoqdvni6q6++2u/62rVrlZGRkW8hepMmTXTxxRcX+NzOXL91ww03SJK+/PJLSeZ0urFjx+rjjz/W7t27JUm///67lixZojFjxhTbWXHIkCHavXu3Fi1apPvvv1/t27fX+++/ryuvvFJjx471nffpp5+qTZs2GjBgQKH3Vdqf3cUXX6zatWv7rmdmZuqLL77QVVddpYiICLndbt9lyJAhyszM1DfffCNJ6tmzp3744QeNGTNGn332mVJTU4t8nme64YYb/F6bxMRE9e7d2/e6SvKt7/vvf//rO/bCCy+oY8eOuvDCC0v0OPPmzcv3fvv222/zndevXz9FR0f7rickJKhevXqler916tRJbdq08Tu2fPly9e/fX02aNPE7PmrUKJ08eTLflLuqel0qW1xcnFq2bKmnn35aU6dO1ffff1+qNXsff/yxOnTooC5duvi9DwcNGlTgVMEz38sASo/gBMDn0Ucf1cSJE/XGG2/or3/9a5nCU96HqIYNG/odt9vt6tGjR77LmR+iCnP++edr3bp1Wr9+vbZs2aLjx4/rueeek9PpLPQ2R44cUf369fN9MK9Xr55CQkJ862dKq7LuV5LCwsIKfJ0SExPznVunTh2/63nrMTIyMkr8eGeuHSpqTVHDhg3zPbeQkJB8ddSvX9/vviRp9OjRCg8P10svvSRJevHFFxUeHq7Ro0eXqM7w8HANGzZMTz/9tFauXKnt27fr7LPP1osvvqiff/5ZknTo0CE1bty4yPsp7c+uoNfH7Xbr+eef9wX5vMuQIUMkmW38JWnChAl65pln9M0332jw4MGqU6eO+vfvn6/tf2HyXsczj51eY0JCgoYPH65Zs2bJ4/Fo8+bN+uqrr/wCZXHatWuX7/3WvXv3fOed+XOWzPdced5vkvmaFvZ+y/v+6SrzdYmPj1dERIR27NhRoudTHjabTV988YUGDRqkp556St26dVPdunV19913F7itw5kOHjyozZs353sfRkdHyzAM3/swT2HrBAGUXPVpnQSgWpg8ebJsNpsmT54sr9er+fPnl6rL2ocffihJFb6vSUxMTKk7f9WpU0fffvutDMPw+6CcnJwst9vt1xWwOtyvFc4MEHkfjpOSkvKdu3///nzPze1268iRI34fqg8cOOB3X5L58xs5cqReeeUV3X///ZozZ45uuOGGMresbtq0qf72t79p3Lhx+vnnn9W+fXvVrVtXe/fuLfJ2pf3Znfn61K5dWw6HQzfeeKPuvPPOAh+jefPmksxQOX78eI0fP17Hjx/X559/roceekiDBg3Snj17FBERUWStea/jmcfODDD33HOPXnvtNX3wwQdasmSJYmNjS9zFsaoVNLpYp06dQt9vkvL9TCrzdXE4HOrfv78+/fRT7d27t9ggXpCwsDBJytds5MwgI5mjZa+++qok6bffftPbb7+tSZMmKTs72/dLhsLEx8crPDxcs2fPLvT7pyvJnnkAisaIE4B8Jk2apMmTJ+vtt9/WDTfcILfbXaLb/fDDD3ryySfVrFkzXXfddZVcZfH69++vtLS0fBvb5m2c279/f9+x0vzmvDT3a7XSjgj06tVL4eHhev311/2O79271zel6kxn7jv1xhtvSMofnu+++24dPnxY11xzjY4fP16iUZETJ04oLS2twO/ldfnLG5kYPHiwfvvttyL3Cyvvzy4iIkL9+vXT999/r06dOhU4OljQyExsbKyuueYa3XnnnTp69Kh27txZ5ONI0ptvvuk39XXXrl1as2ZNvte1e/fu6t27t/79739r/vz5GjVqlCIjI4u9/8pQllHP/v37a/ny5fk63c2bN08RERH52vNX9usyYcIEGYahW2+9VdnZ2fm+n5OTo48++qjQ2+d1vdu8ebPf8bxfKhWmTZs2euSRR9SxY0dt3LjRd7ywv8OXX365fv/9d9WpU6fA92FZN80GUDhGnAAUaOLEibLb7Xr00UdlGIbefPNNv5GnDRs2KCYmRjk5Ob4NcF977TXVq1dPH330Ub4pdF6v17f240xdu3Yt8wavRRkxYoRefPFFjRw5Ujt37lTHjh21evVqPfnkkxoyZIjfWpiOHTtqxYoV+uijj9SgQQNFR0erbdu25b7f0srIyCj0dSrL/k4dO3bUW2+9pQULFqhFixYKCwsrssV8bGysHn30UT300EMaMWKE/vznP+vIkSOaPHmywsLC9Nhjj/md73Q69eyzzyotLU3nnHOO1qxZoyeeeEKDBw/W+eef73dumzZtdOmll+rTTz/V+eefn2+T5IL8+uuvGjRokK6//npddNFFatCggY4dO6ZPPvlEL7/8svr27avevXtLksaNG6cFCxZo6NChevDBB9WzZ09lZGRo5cqVuvzyy9WvX78K+dlNnz5d559/vi644ALdcccdatasmU6cOKHt27fro48+8gW3K664wrdHUt26dbVr1y5NmzZNiYmJat26dbGPk5ycrKuuukq33nqrUlJS9NhjjyksLEwTJkzId+4999yj4cOHy2azacyYMcXe9+l++umnAn850rJlS9WtW7dU95X33po+fbpGjhyp0NBQtW3b1m9t1Jkee+wxffzxx+rXr58mTpyouLg4zZ8/X5988omeeuopxcTE+J1f2a9Lr169NHPmTI0ZM0bdu3fXHXfcofbt2ysnJ0fff/+9Xn75ZXXo0EFXXHFFgbevX7++BgwYoClTpqh27dpKTEzUF198oYULF/qdt3nzZo0dO1bXXnutWrduLafTqeXLl2vz5s168MEH/V7Tgv4Ojxs3Tu+9954uvPBC3XvvverUqZO8Xq92796tpUuX6r777tO5555boucMoIQsa0sBoNrI6651ZncmwzjVIe1Pf/qTkZ2d7euql3dxuVxGgwYNjIEDBxrTp0/367qVp6iuepKMbdu2FVlfQe3IC3JmdyvDMIwjR44Yt99+u9GgQQMjJCTESExMNCZMmGBkZmb6nbdp0yajT58+RkREhCGpwC5WZbnfiuqq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Q1LBr023bt104MABhYSE5HvN4+PjS1RXRaoxa5xgvTte36htyWnaNPESxUY4rS4HAACgykRHR+v+++/XvffeK6/Xq/PPP1+pqalas2aNoqKiSjSK06xZM9/SlMaNGys6Otq3dudMDzzwgK677jp169ZN/fv310cffaSFCxf6mifkeeedd9SjRw+df/75mj9/vr777rt8ne/ymkREREToqquuKtHzbdasmUaOHKnRo0f7mkPs2rVLycnJvvVSp+vbt68OHTqkp556Stdcc42WLFmiTz/91NfReseOHXr55Zd15ZVXqmHDhvr111/122+/acSIEYW+NgMGDFCvXr00bNgw/fvf/1bbtm21f/9+LV68WMOGDcs3vbGy1Zh25LDetuQ0SdL23K8AAADB5B//+IcmTpyoKVOmqF27dho0aJA++uijEjcpu/rqq3XppZeqX79+qlu3rt58881Czx02bJimT5+up59+Wu3bt9esWbM0Z84c9e3b1++8yZMn66233lKnTp30v//9T/Pnz9fZZ5/td86f//xnhYSE6IYbblBYWFiJn+/MmTN1zTXXaMyYMTrrrLN06623Kj09vcBz27VrpxkzZujFF19U586d9d133+n+++/3fT8iIkK//PKLrr76arVp00Z/+9vfNHbsWN12222FvjY2m02LFy/WhRdeqNGjR6tNmza6/vrrtXPnTiUkJJT4eVQUm1FZjc6rqdTUVMXExCglJYU9nUrB4zXU8qHFkqSnr+mka3uUbEgaAACgJsjMzNSOHTvUvHnzUoULK9lsNi1atEjDhg0r8rw9e/aoWbNmWrdunbp161Y1xVUjRf1sS5MNmKqHEjl+Mtv35+QTWRZWAgAAgJLIyclRUlKSHnzwQZ133nlBGZoqElP1UCJH0k8Fp6On/RkAAADV09dff63ExERt2LBBL730kt/3vvrqK0VFRRV6QX6MOKFEjqSZYSk2IpTgBAAAUA0Ut+Imr4N1QXr06EF36lIiOKFE0rLckqSE6DAdTmOqHgAAQE0WHh6uVq1aWV1GjcJUPZRIWpa5gVndaJdSMnKKORsAAAAILAQnlEhaplshdptiwkN1ItNtdTkAAABAlSI4oUROZLkV4XQowulQaiYjTgAAAAguBCeUSFqmW+FOhyKcITqRwYgTAAAAggvBCSWSnuVWWKhDkS6Hsj1eZeZ4rC4JAAAAqDJ01UOJZOR45AqxKyzUIelUkAIAAEDl2Hc8Q8eqcBuY2pFONYoNr7LHq2kITiiRjByvnA67wn3ByaM67I0GAABQKfYdz1D/Z1coM8dbZY8ZFmrXF/f1LXV4mjFjhp5++mklJSWpffv2mjZtmi644IJKqtI6BCeUSEa2R87TR5yyWecEAABQWY6lZyszx6s7+7WqklGgfccz9OKX23UsPbtUj7dgwQKNGzdOM2bMUJ8+fTRr1iwNHjxYW7ZsUdOmTSux4qpHcEKJnMx25wYnc1lcehbBCQAAoLI1ig1X8/hIq8so1NSpU3XzzTfrlltukSRNmzZNn332mWbOnKkpU6ZYXF3FojkESsRc4+Q4NVUvm+YQAAAAwSw7O1sbNmzQwIED/Y4PHDhQa9assaiqykNwQonkm6rHiBMAAEBQO3z4sDwejxISEvyOJyQk6MCBAxZVVXkITiiRgrrqAQAAADabze+6YRj5jgUCghNKJDPHI6fDLofdphCHTRns4wQAABDU4uPj5XA48o0uJScn5xuFCgQEJ5RIVo5XoSHm2yUsxKH0LIITAABAMHM6nerevbuWLVvmd3zZsmXq3bu3RVVVHrrqoUSyPeY+TpLZ4z+DduQAAACVbt/xjGr9OOPHj9eNN96oHj16qFevXnr55Ze1e/du3X777RVcofUITiiRbLdXoQ5zrqorxKGTdNUDAACoNLUjnQoLtevFL7dX2WOGhdpVO9JZqtsMHz5cR44c0eOPP66kpCR16NBBixcvVmJiYiVVaR2CE4rl9njl9hoKzR1xcoXYdZI1TgAAAJWmUWy4vrivr46lZ1fZY9aOdJZps90xY8ZozJgxlVBR9UJwQrGyPV5JOhWcQu3KYMQJAACgUjWKDS9TkEHloDkEipWVYwanvDVOzhC7TrLGCQAAAEGE4IRi+UacQk6tcWLECQAAAMGE4IRi5Y04hdhzp+o57OzjBAAAgKBCcEKxstxmSHKGnJqql5EbpgAAAIBgQHBCsbLceSNOeVP17Mpkqh4AAACCCMEJxcoLTqGO00ecCE4AAAAIHgQnFCvHc2ZwchCcAAAAEFQITihWdt5UPcdpU/UITgAAAAgibICLYmWfscbJmRucDMOQzWazsjQAAIDAdXyPdPJI1T1eRB0ptknVPV4NQ3BCsfKm6oXkTdVz2OU1zP2dXCEOK0sDAAAITMf3SC+eI+VkVN1jhoZLd64rcXhatWqVnn76aW3YsEFJSUlatGiRhg0bVrk1WojghGLlbYB7elc9ScrMITgBAABUipNHzNB0wX1STBWMAqXskb561nzcEgan9PR0de7cWTfddJOuvvrqSi7QegQnFCv7jK56obnBKSvHI4WHWlYXAABAwItpItVpZXUVBRo8eLAGDx5sdRlVhuYQKFa2xyubpNwBJzlzAxSd9QAAABAsCE4oVo7bq1CH3dcI4vSpegAAAEAwIDihWNker68VuWR21ZNES3IAAAAEDYITipXjMXzrmySm6gEAACD4EJxQrCy319dRT2LECQAAAMGHrnooVg5T9QAAAKyRsqfaPk5aWpq2b9/uu75jxw5t2rRJcXFxatq0aUVWVy0QnFCsHLdXIfbTpurltSN30xwCAACgUkTUMTek/erZqnvM0HDzcUto/fr16tevn+/6+PHjJUkjR47U3LlzK7o6yxGcUCy31/Cbqpe33okRJwAAgEoS20S6c525IW1ViahT4s1vJalv374yDKMSC6peCE4oVrbHK8dpwclusynUYaMdOQAAQGWKbVKqIIPKRXMIFMt9xhonyeysx4gTAAAAggXBCcXK8Rh+I06Suc6JEScAAAAEC4ITipVzxlQ9KTc4uRlxAgAAQHAgOKFYOR7/rnoSU/UAAEBgCqZmB8Gion6mBCcUy81UPQAAEOBCQ0MlSSdPnrS4ElS07OxsSZLD4SjX/dBVD8XK9nj92pFLUojDrixGnAAAQIBwOByKjY1VcnKyJCkiIkI2m62YW6G683q9OnTokCIiIhQSUr7oY2lwWrVqlZ5++mlt2LBBSUlJWrRokYYNG1bo+QsXLtTMmTO1adMmZWVlqX379po0aZIGDRpUdUUHoQKbQzjsbIALAAACSv369SXJF54QGOx2u5o2bVruIGxpcEpPT1fnzp1100036eqrry72/FWrVumSSy7Rk08+qdjYWM2ZM0dXXHGFvv32W3Xt2rUKKg5OOR6vIp3+Q5uhrHECAAABxmazqUGDBqpXr55ycnKsLgcVxOl0ym4v/wolS4PT4MGDNXjw4BKfP23aNL/rTz75pD744AN99NFHBKdKlOPxKsQR6nfMGWKjqx4AAAhIDoej3OthEHhq9Bonr9erEydOKC4urtBzsrKylJWV5buemppaFaUFlILakYc6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770nSfr111+VlJSk6dOn+273v//9TyEhIfr66681a9Ys7du3T0OGDNE555yjH374QTNnztSrr76qJ554wu/x8m737bff6rnnntN//vMfvfLKK5Kk0aNHa8uWLVq3bp3v/M2bN+v777/3hTYAQM1mM/J+XQYAQDUxatQovf766woLC/M7/ve//12PPvqobDabHnnkEf3jH/+QJKWnpys6OlqLFy/WpZdeqhUrVqhfv346duyYYmNjfbfv27evUlJS9P333/uOPfzww3rvvfe0detW2Ww2SdKMGTP097//XSkpKbLb7erbt6+Sk5P1888/+8558MEH9eGHH2rLli2SpCFDhqhZs2aaMWOGJOnee+/Vpk2b9OWXX1ba6wQAqDqMOAEAqqV+/fpp06ZNfpc777zT9/1OnTr5/hwZGano6GglJycXe789evTwu75161b16tXLF4gkqU+fPkpLS9PevXt9x8477zy/c3r16qVt27bJ4/FIkm699Va9+eabyszMVE5OjubPn6/Ro0eX/okDAKolmkMAAKqlyMhItWrVqtDvh4aG+l232Wzyer0lut/TGYbhF4jyjuXdZ0ldccUVcrlcWrRokVwul7KysnT11VeX+PYAgOqN4AQACDh5nfLyRoOKcvbZZ+u9997zC1Br1qxRdHS0GjVq5Dvvm2++8bvdN998o9atW8vhcEiSQkJCNHLkSM2ZM0cul0vXX3+9IiIiKuopAQAsRnACAFRLWVlZOnDggN+xkJAQxcfHF3vbxMRE2Ww2ffzxxxoyZIjCw8MVFRVV4LljxozRtGnTdNddd2ns2LH69ddf9dhjj2n8+PGy20/NaN+zZ4/Gjx+v2267TRs3btTzzz+vZ5991u++brnlFrVr106S9PXXX5f2KQMAqjGCEwCgWlqyZIkaNGjgd6xt27b65Zdfir1to0aNNHnyZD344IO66aabNGLECM2dO7fQcxcvXqwHHnhAnTt3VlxcnG6++WY98sgjfueNGDFCGRkZ6tmzpxwOh+666y797W9/8zundevW6t27t44cOaJzzz23dE8YAFCt0VUPAIBi9O3bV126dNG0adOKPM8wDJ111lm67bbbNH78+KopDgBQJRhxAgCgAiQnJ+u1117Tvn37dNNNN1ldDgCgghGcAACoAAkJCYqPj9fLL7+s2rVrW10OAKCCMVUPAAAAAIrBBrgAAAAAUAyCEwAAAAAUg+AEAAAAAMUgOAEAAABAMQhOAAAAAFAMghMAAAAAFIPgBAAAAADFIDgBAAAAQDH+H0uFfdJw6vuuAAAAAElFTkSuQmCC",
+      "text/plain": [
+       "<Figure size 1000x600 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIhCAYAAAB5deq6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACFwklEQVR4nOzdd3hUZfrG8XsmmZZJ7wFC6EgTECyAiChFbFiwF7Ctiu6uor9VFisWVl3L7iqo6wpiW11dXQsWRFRUVECKgtIhISRAeu/n98eQSEggbWbOJHw/1zXXMWfOnHlmJuDcvO95XothGIYAAAAAAIdkNbsAAAAAAAh0BCcAAAAAaALBCQAAAACaQHACAAAAgCYQnAAAAACgCQQnAAAAAGgCwQkAAAAAmkBwAgAAAIAmEJwAAAAAoAkEJwCHtWDBAlksFq1cubLe/qysLA0fPlyhoaFavHixJOm+++6TxWKpu4WEhKhLly6aOHGi/vGPf6iwsLDB+adNm1bvMQffmtKtW7d6x4eGhur444/XwoUL6x138skn6+STT27Ve/Dwww/r3XffbdVjDycnJ0cXX3yx4uPjZbFYdM455xzy2JNPPvmQ71G3bt28Xlug+eWXX3TFFVeoR48ecjqdio2N1THHHKObb75ZBQUFZpfndSeffLIGDhzo8+c5+M/PgbfW/nlpb9atW6errrpK3bt3l9PpVGhoqI455hg9+uijysnJqTuuLX+HNMfcuXO1YMECn50fQNsFm10AgPZn165dGj9+vPbs2aPPPvtMJ5xwQr37P/74Y0VERKiiokK7d+/WkiVL9Kc//UmPPfaY3n//fQ0ePLje8S6XS59//nmr6xk1apT++te/1tX217/+VVOnTlVxcbFuvPHGVp+31sMPP6wpU6YcNti0xgMPPKB33nlHL774onr27Kno6OjDHt+jRw+9+uqrDfY7HA6v1hVoVq9erVGjRqlfv36655571K1bN2VlZWnt2rX697//rdtvv13h4eFml9luHfjn50BHwnv6z3/+U9OnT1ffvn31f//3f+rfv78qKyu1cuVKPfvss1q+fLneeecdv9Qyd+5cxcbGatq0aX55PgAtR3AC0CKbN2/WuHHjVFlZqS+//FKDBg1qcMywYcMUGxtb9/PFF1+sm2++WWPGjNHZZ5+tTZs21fuyb7VaG4SvloiMjKz3+HHjxiklJUVPPPGEV4KTr/z888/q2bOnLrvssmYd73K52vQ+eVNJSYlCQkL88lxPPfWUrFarvvjiC4WFhdXtnzJlih544AEZhuGXOiT/vm5/OfjPj5n8+f4uX75cN954o8aPH69333233t9J48eP12233aaPP/7YL7X4imEYKisrk8vlMrsUoENgqh6AZluzZo1OPPFEBQcH6+uvv240NB3K4MGDNWvWLKWmpuqNN97wYZWeL4J9+/bVzp07D3tcTk6Opk+frs6dO8tut6tHjx6aNWuWysvL646xWCwqLi7WSy+91OwpTE2dd8eOHbJYLPrss8/0yy+/1J33iy++aOtLr5tauXTpUt14442KjY1VTEyMzjvvPO3evbvB8W+88YZGjBght9ut0NBQTZw4UatXr653zLRp0xQaGqqffvpJEyZMUFhYmE499VRJUl5enq655hpFR0crNDRUZ5xxhrZt2yaLxaL77rtPkrRs2TJZLBa9/vrrDZ5/4cKFslgsWrFixSFfU3Z2tsLDwxUaGtro/QdP6fz444916qmnKiIiQiEhIerXr5/mzJlT75j33ntPI0aMUEhIiMLCwjR+/HgtX7683jG1U09//PFHTZkyRVFRUerZs6ckzxfSuXPnasiQIXK5XIqKitKUKVO0bdu2eudYvXq1zjzzTMXHx8vhcKhTp04644wztGvXrkO+3gMtW7ZMJ5xwglwulzp37qy7775b1dXVdTX07t1bEydObPC4oqIiRURE6KabbmrW8zSl9r1Yv369LrnkEkVERCghIUFXX3218vPz6x3b3PemdjriV199pZEjRyokJERXX321JM/I8ZQpUxQWFqbIyEhddtllWrFihSwWS910tpdfflkWi6XB5yZJs2fPls1ma/R3vtbDDz8si8Wi559/vtFRW7vdrrPPPvuQj//iiy8a/XNb++f7wGl327Zt08UXX6xOnTrJ4XAoISFBp556qtasWSPJM2Vy/fr1+vLLLxudgltQUKDbb79d3bt3l91uV+fOnXXLLbeouLi43nNbLBbdfPPNevbZZ9WvXz85HA699NJLh3wNAFqG4ASgWb7++mudfPLJio+P19dff60ePXq0+By1X0K++uqrBvdVVVU1uNXU1LSq1srKSu3cuVNxcXGHPKasrExjx47VwoULNWPGDH344Ye6/PLL9eijj+q8886rO2758uVyuVw6/fTTtXz5ci1fvlxz585t03mTkpK0fPlyDR06VD169Kg77zHHHNPka2vu+3TttdfKZrPptdde06OPPqovvvhCl19+eb1jHn74YV1yySXq37+/3nzzTb388ssqLCzU6NGjtWHDhnrHVlRU6Oyzz9Ypp5yi//3vf7r//vtVU1Ojs846S6+99pruuOMOvfPOOzr++ON12mmn1Xvs6NGjNXToUD3zzDMN6nz66ad17LHH6thjjz3kax4xYoQyMjJ02WWX6csvv1Rpaekhj/3Xv/6l008/XTU1NXr22Wf1/vvv6w9/+EO9oPLaa69p8uTJCg8P1+uvv65//etfys3N1cknn6yvv/66wTnPO+889erVS//5z3/07LPPSpKuv/563XLLLRo3bpzeffddzZ07V+vXr9fIkSO1Z88eSVJxcXHdlNZnnnlGixcv1lNPPaWuXbs2er3fwTIzM3XxxRfrsssu0//+9z9NmTJFDz74oP74xz9K8nxJ/v3vf6/Fixdr8+bN9R67cOFCFRQUNCs4GYbR6O9VYyN5559/vvr06aO3335bd955p1577TXdeuut9Y5pzntTKyMjQ5dffrkuvfRSLVq0SNOnT1dxcbHGjh2rpUuX6pFHHtGbb76phIQEXXTRRfUee9FFFykxMbHB71VVVZWee+45nXvuuerUqVOjr7m6ulqff/65hg0bpuTk5Cbfo7Y6/fTTtWrVKj366KNavHix5s2bp6FDhyovL0+S9M4776hHjx4aOnRo3d8HtVMES0pKNGbMGL300kv6wx/+oI8++kh33HGHFixYoLPPPrvB5/Tuu+9q3rx5uueee/TJJ59o9OjRPn99wBHDAIDDmD9/viHJkGREREQYe/fuPeSx9957ryHJ2LdvX6P3l5aWGpKMSZMm1e2bOnVq3fkPvp166qlN1peSkmKcfvrpRmVlpVFZWWls37697pz/93//V3fcmDFjjDFjxtT9/OyzzxqSjDfffLPe+R555BFDkvHpp5/W7XO73cbUqVObrKWl5x0zZowxYMCAZp13zJgxh3yfrrnmmrrjaj+v6dOn13v8o48+akgyMjIyDMMwjNTUVCM4ONj4/e9/X++4wsJCIzEx0bjwwgvr9tW+ny+++GK9Yz/88ENDkjFv3rx6++fMmWNIMu69994Gda1evbpu3w8//GBIMl566aXDvvaysjLjnHPOqXu9QUFBxtChQ41Zs2bV+30sLCw0wsPDjRNPPNGoqalp9FzV1dVGp06djEGDBhnV1dX1HhsfH2+MHDmybl/t7/M999xT7xzLly83JBmPP/54vf1paWmGy+Uy/vSnPxmGYRgrV640JBnvvvvuYV9fY2o/7//973/19l933XWG1Wo1du7caRiGYRQUFBhhYWHGH//4x3rH9e/f3xg7dmyTz5OSknLI36sHHnig7rja9+LRRx+t9/jp06cbTqez7v1u7ntz4GtcsmRJvWOfeeYZQ5Lx0Ucf1dt//fXXG5KM+fPn16vLbrcbe/bsqdv3xhtvGJKML7/88pCvOzMz05BkXHzxxU28Q785+O+QpUuXGpKMpUuX1jtu+/bt9erMysoyJBlPPfXUYc8/YMCAeuevNWfOHMNqtRorVqyot/+tt94yJBmLFi2q21f793ROTk6zXxeA5mPECUCznH322crPz9ctt9xSN1WopYxDXIvicrm0YsWKBrfDjewcaNGiRbLZbLLZbOrevbvefPNN/f73v9eDDz54yMd8/vnncrvdmjJlSr39tRdmL1mypHkvyk/nlaSePXs2+j7dfffdDY49eIrR0UcfLUl10xc/+eQTVVVV6corr6w3yuB0OjVmzJhGpw2ef/759X7+8ssvJUkXXnhhvf2XXHJJg8decsklio+Przc68I9//ENxcXENRhIO5nA49M4772jDhg168skndfHFF2vfvn166KGH1K9fP23cuFGS9O2336qgoEDTp08/ZEfGjRs3avfu3briiitktf72v8DQ0FCdf/75+u6771RSUnLY1/3BBx/IYrHo8ssvr/feJSYmavDgwXXvXa9evRQVFaU77rhDzz77bINRvKaEhYU1+BwvvfRS1dTU1I3ahoWF6aqrrtKCBQvqpm19/vnn2rBhg26++eZmPc+JJ57Y6O/VNddc0+DYxn6vysrKtHfv3ha9N7WioqJ0yimn1Nv35ZdfKiwsrMHIZWO/V7XXMP7zn/+s2/f0009r0KBBOumkk5r1+n0tOjpaPXv21GOPPaYnnnhCq1evbtFo+gcffKCBAwdqyJAh9d7TiRMnNjpV8JRTTlFUVJSXXwUAieYQAJrp7rvv1pAhQzR79mzV1NTolVdeUVBQUIvOUful/eDpM1arVcOHD291bSeeeKKefPLJuhboPXv2lN1uP+xjsrOzlZiY2OALdnx8vIKDg5Wdnd2qWnx1XklyOp3Nfp9iYmLq/Vx7DUftNLfaKVOHmiJ3YKiQpJCQkAZd1rKzsxUcHNygG2BCQkKD8zkcDl1//fV6/PHH9dhjj6myslJvvvmmZsyY0eyugP369VO/fv0keUL4U089pRkzZujuu+/Wm2++qX379kmSunTpcshz1L7/SUlJDe7r1KmTampqlJubW69BwcHH7tmzR4ZhNPo6JdVNY42IiNCXX36phx56SH/+85+Vm5urpKQkXXfddbrrrrtks9kO+3obO39iYmK91yFJv//97/X000/r1Vdf1e9+9zs9/fTT6tKliyZPnnzY89eKiIjw6u9Vc96bWo19DtnZ2Y0+/lD7LrroIj333HO68847tX79ei1btkzPPffcYV9HbGysQkJCtH379sMe5w0Wi0VLlizR7Nmz9eijj+q2225TdHS0LrvsMj300EP1Gp40Zs+ePdqyZcshf1+ysrLq/dzYewrAOwhOAJrt/vvvl8Viqbu+5dVXX1VwcPP/GnnvvfckyetrobTki1+tmJgYff/99zIMo17I2bt3r6qqqup1BQyE83pbbR1vvfWWUlJSmjy+sRGcmJgYVVVVKScnp154yszMbPQcN954o/7yl7/oxRdfVFlZmaqqqnTDDTe0qn6LxaJbb71Vs2fP1s8//yxJdde0Ha7xQu0X/4yMjAb37d69W1artcG/1h/82mNjY2WxWLRs2bJGQ9+B+wYNGqR///vfMgxD69at04IFCzR79my5XC7deeedh32NB18PJP323h4YYHr16qVJkybpmWee0aRJk/Tee+/p/vvvb/E/bHhDS94b6dC/Vz/88EOD/Yf6vfrjH/+ol19+Wf/73//08ccf1zWTOJygoCCdeuqp+uijj7Rr167Dhu1DcTqdklSvmYzUMMhIUkpKiv71r39JkjZt2qQ333xT9913nyoqKuqumzuU2NhYuVwuvfjii4e8/0DNWf8OQOswVQ9Ai9x33326//779eabb+rSSy9VVVVVsx63du1aPfzww+rWrVuDqV1mOPXUU1VUVNRgYdvahXNru8ZJni97h2tI0NrzmmnixIkKDg7W1q1bNXz48EZvTRkzZowkNeiS+O9//7vR45OSknTBBRdo7ty5evbZZ3XWWWepa9euTT5PYyFH8gSdgoKCuhHMkSNHKiIiQs8+++whp4X27dtXnTt31muvvVbvmOLiYr399tt1nfYO58wzz5RhGEpPT2/0fWus26TFYtHgwYP15JNPKjIyUj/++GOTr7uwsLDuHxtqvfbaa7JarQ2mof3xj3/UunXrNHXqVAUFBem6665r8vy+0Jr35mBjxoxRYWGhPvroo3r7D/V7NWzYMI0cOVKPPPKIXn31VU2bNk1ut7vJ55k5c6YMw9B1112nioqKBvdXVlbq/fffP+Tja7verVu3rt7+gz+zg/Xp00d33XWXBg0aVO/34FB/z5x55pnaunWrYmJiGn1Pj4QFsIFAwYgTgBa75557ZLVadffdd8swDL3++uv1Rp5WrVqliIgIVVZW1i2A+/LLLys+Pl7vv/9+g2l0NTU1+u677xp9rqFDh/pkgdcrr7xSzzzzjKZOnaodO3Zo0KBB+vrrr/Xwww/r9NNP17hx4+qOHTRokL744gu9//77SkpKUlhYmPr27dvm87ZUaWnpId+nlq7D061bN82ePVuzZs3Stm3bdNpppykqKkp79uzRDz/8ILfbrfvvv/+w5zjttNM0atQo3XbbbSooKNCwYcO0fPnyupB48HQ/yfMF//jjj5ckzZ8/v1m1/u53v1NeXp7OP/98DRw4UEFBQfr111/15JNPymq16o477pDkuU7p8ccf17XXXqtx48bpuuuuU0JCgrZs2aK1a9fq6aefltVq1aOPPqrLLrtMZ555pq6//nqVl5frscceU15env7yl780Wc+oUaP0u9/9TldddZVWrlypk046SW63WxkZGXVt+m+88UZ98MEHmjt3rs455xz16NFDhmHov//9r/Ly8jR+/PgmnycmJkY33nijUlNT1adPHy1atEj//Oc/deONNzYInOPHj1f//v21dOlSXX755YqPj2/Weyt5Wso39nvlcDg0dOjQZp9Hav57czhTp07Vk08+qcsvv1wPPvigevXqpY8++kiffPKJpEP/Xl100UWyWCyaPn16s2odMWKE5s2bp+nTp2vYsGG68cYbNWDAAFVWVmr16tV6/vnnNXDgQJ111lmNPj4xMVHjxo3TnDlzFBUVpZSUFC1ZskT//e9/6x23bt063XzzzbrgggvUu3dv2e12ff7551q3bl29Ucfa0ck33nhDPXr0kNPp1KBBg3TLLbfo7bff1kknnaRbb71VRx99tGpqapSamqpPP/1Ut912W92fKQA+ZkZHCgDtR203tIM7OhmGYTz00EOGJOO8884zKioq6jpv1d4cDoeRlJRkTJgwwfjb3/5mFBQUNDjH4brqSTI2b9582PpSUlKMM844o8nXcXBHLMMwjOzsbOOGG24wkpKSjODgYCMlJcWYOXOmUVZWVu+4NWvWGKNGjTJCQkIMSY12vmrNeb3VVU+SUVlZaRjGoT+vQ3UAe/fdd42xY8ca4eHhhsPhMFJSUowpU6YYn332Wd0xU6dONdxud6N15eTkGFdddZURGRlphISEGOPHjze+++47Q5Lxt7/9rdHHdOvWzejXr1+zXrdhGMYnn3xiXH311Ub//v2NiIgIIzg42EhKSjLOO+88Y/ny5Q2OX7RokTFmzBjD7XYbISEhRv/+/Y1HHnmkwes+/vjjDafTabjdbuPUU081vvnmm3rHNNUl8sUXXzSOP/54w+12Gy6Xy+jZs6dx5ZVXGitXrjQMwzB+/fVX45JLLjF69uxpuFwuIyIiwjjuuOOMBQsWNPmaa383vvjiC2P48OF1f5b+/Oc/133WB7vvvvsMScZ3333X5PlrHa6rXufOnZt8L2p/37Zv396i9+bA19iY1NRU47zzzjNCQ0ONsLAw4/zzzzcWLVrUaKdBwzCM8vJyw+FwGKeddlqzX3utNWvWGFOnTjW6du1q2O12w+12G0OHDjXuueeeel0bG/s7JCMjw5gyZYoRHR1tREREGJdffnldN8Xarnp79uwxpk2bZhx11FGG2+02QkNDjaOPPtp48sknjaqqqrpz7dixw5gwYYIRFhZmSDJSUlLq7isqKjLuuusuo2/fvobdbjciIiKMQYMGGbfeequRmZlZd5wk46abbmrxewCgeSyG4ccl1wEAHd5rr72myy67TN98841GjhxZ775169Zp8ODBeuaZZ5o9MoDmGT58eJOLCbdnDz/8sO666y6lpqY2uCbp/fff19lnn60PP/xQp59+ukkVAujomKoHAGi1119/Xenp6Ro0aJCsVqu+++47PfbYYzrppJPqhaatW7dq586d+vOf/6ykpKS69uxom4KCAv3888/64IMPtGrVqrpFU9u7p59+WpJ01FFHqbKyUp9//rn+/ve/6/LLL68XmjZs2KCdO3fqtttu05AhQzRp0iSzSgZwBCA4AQBaLSwsTP/+97/14IMPqri4uC4UHbyG1gMPPKCXX35Z/fr103/+858mGzCgeX788UeNHTtWMTExuvfee3XOOeeYXZJXhISE6Mknn9SOHTtUXl6url276o477tBdd91V77jp06frm2++0THHHKOXXnqJjnIAfIqpegAAAADQBNqRAwAAAEATCE4AAAAA0ASCEwAAAAA04YhrDlFTU6Pdu3crLCyMi0gBAACAI5hhGCosLFSnTp0aXWD7QEdccNq9e7eSk5PNLgMAAABAgEhLS2uwRtzBjrjgFBYWJsnz5oSHh5tcDQAAAACzFBQUKDk5uS4jHM4RF5xqp+eFh4cTnAAAAAA06xIemkMAAAAAQBMITgAAAADQBIITAAAAADThiLvGqTkMw1BVVZWqq6vNLgUtFBQUpODgYFrNAwAAwKsITgepqKhQRkaGSkpKzC4FrRQSEqKkpCTZ7XazSwEAAEAHQXA6QE1NjbZv366goCB16tRJdrudkYt2xDAMVVRUaN++fdq+fbt69+7d5EJmAAAAQHMQnA5QUVGhmpoaJScnKyQkxOxy0Aoul0s2m007d+5URUWFnE6n2SUBAACgA+Cf4xvBKEX7xucHAAAAb+MbJgAAAAA0geAEAAAAAE0gOKFZTj75ZN1yyy1mlwEAAACYguAEU1gsFr377rtmlwEAAAA0C8GpHaisrDS7hIDFewMAAAB/IDi1kGEYevTRR9WjRw+5XC4NHjxYb731liTpiy++kMVi0ZIlSzR8+HCFhIRo5MiR2rhxY71zvP/++xo2bJicTqd69Oih+++/X1VVVXX3WywWPfvss5o8ebLcbrcefPBBSdKDDz6o+Ph4hYWF6dprr9Wdd96pIUOGSJK++uor2Ww2ZWZm1nuu2267TSeddFKzXts333yjMWPGKCQkRFFRUZo4caJyc3MbPbaxEaPIyEgtWLBAkqe1+80336ykpCQ5nU5169ZNc+bMkSR169ZNknTuuefKYrHU/dyW9wYAAADwJYJTC911112aP3++5s2bp/Xr1+vWW2/V5Zdfri+//LLumFmzZunxxx/XypUrFRwcrKuvvrruvk8++USXX365/vCHP2jDhg167rnntGDBAj300EP1nufee+/V5MmT9dNPP+nqq6/Wq6++qoceekiPPPKIVq1apa5du2revHl1x5900knq0aOHXn755bp9VVVVeuWVV3TVVVc1+brWrFmjU089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/fbbuu222/xcKbzhjDPOUFVVlT7//HOtWrVKQ4YM0ZlnnqnMzEyzS0Mbvf3227riiit01VVXae3atfrmm2906aWXml0WvOxPf/qTOnXqZHYZvmGggfnz5xsREREN9ufk5Bgul8v47LPP/F8UvOJQn22tuXPnGmPGjDGWLFliSDJyc3P9VhvarqnP90DTp083xo4d69uC4FWH+nwXLVpkWK1WIz09vW7f66+/bjgcDiM/P9+PFaKt9u3bZ0gyvvrqq7p9BQUFhiT+39vOVVZWGp07dzZeeOEFs0uBDy1atMg46qijjPXr1xuSjNWrV5tdklcx4tQCixcvVk1NjdLT09WvXz916dJFF154odLS0swuDV6wYcMGzZ49WwsXLpTVyh+Nji4/P1/R0dFmlwEvWL58uQYOHFjvXzgnTpyo8vJyrVq1ysTK0FIxMTHq16+fFi5cqOLiYlVVVem5555TQkKChg0bZnZ5aIMff/xR6enpslqtGjp0qJKSkjRp0iStX7/e7NLgJXv27NF1112nl19+WSEhIWaX4xN8O2yBbdu2qaamRg8//LCeeuopvfXWW8rJydH48eOZS9/OlZeX65JLLtFjjz2mrl27ml0OfGz58uV68803df3115tdCrwgMzNTCQkJ9fZFRUXJbrczvaudsVgsWrx4sVavXq2wsDA5nU49+eST+vjjj5u8PhWBbdu2bZKk++67T3fddZc++OADRUVFacyYMcrJyTG5OrSVYRiaNm2abrjhBg0fPtzscnymwwen++67TxaL5bC3lStXNutcNTU1qqys1N///ndNnDhRJ5xwgl5//XVt3ryZC1dN4M3PdubMmerXr58uv/xyH1eN5vLm53ug9evXa/Lkybrnnns0fvx4H1SO5vD252uxWBrsMwyj0f3wv+Z+3oZhaPr06YqPj9eyZcv0ww8/aPLkyTrzzDOVkZFh9stAI5r72dbU1EiSZs2apfPPP1/Dhg3T/PnzZbFY9J///MfkV4FDae7n+49//EMFBQWaOXOm2SX7VLDZBfjazTffrIsvvviwx3Tr1q1Z50pKSpIk9e/fv25fXFycYmNjlZqa2uoa0Tre/Gw///xz/fTTT3rrrbckeb5wSVJsbKxmzZql+++/v021ouW8+fnW2rBhg0455RRdd911uuuuu9pQHdrKm59vYmKivv/++3r7cnNzVVlZ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",
+      "text/plain": [
+       "<Figure size 1000x600 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "novel = df[df[\"true_type\"] == 1]\n",
+    "known = df[df[\"true_type\"] == 0]\n",
+    "\n",
+    "print(f\"Entropy-based Known Correct/Total (Accuracy%) {known[known['entropy_cluster'] == 0].shape[0]}/{known.shape[0]} ({ 100 * (known[known['entropy_cluster'] == 0].shape[0]/known.shape[0]):.4f}%)\")\n",
+    "print(f\"Entropy-based Novel Correct/Total (Accuracy%) {novel[novel['entropy_cluster'] == 1].shape[0]}/{novel.shape[0]} ({ 100 * (novel[novel['entropy_cluster'] == 1].shape[0]/novel.shape[0]):.4f}%)\")\n",
+    "print(\"\")\n",
+    "print(f\"Energy-based Known Correct/Total (Accuracy%) {known[known['energy_cluster'] == 0].shape[0]}/{known.shape[0]} ({ 100 * (known[known['energy_cluster'] == 0].shape[0]/known.shape[0]):.4f}%)\")\n",
+    "print(f\"Energy-based Novel Correct/Total (Accuracy%) {novel[novel['energy_cluster'] == 1].shape[0]}/{novel.shape[0]} ({ 100 * (novel[novel['energy_cluster'] == 1].shape[0]/novel.shape[0]):.4f}%)\")\n",
+    "\n",
+    "plt.figure(figsize=(10, 6))\n",
+    "sns.kdeplot(data=df, x='entropy', hue='entropy_cluster', fill=True)\n",
+    "plt.title('KDE Plot of Entropy Scores by Entropy Cluster')\n",
+    "plt.xlabel('Entropy')\n",
+    "plt.ylabel('Density')\n",
+    "plt.show()\n",
+    "\n",
+    "plt.figure(figsize=(10, 6))\n",
+    "sns.kdeplot(data=df, x='energy', hue='energy_cluster', fill=True)\n",
+    "plt.title('KDE Plot of Energy Scores by Energy Cluster')\n",
+    "plt.xlabel('Energy')\n",
+    "plt.ylabel('Density')\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Voting Scoring"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Known Correct/Total (Accuracy%) 686/1000 (68.6000%)\n",
+      "Novel Correct/Total (Accuracy%) 3504/4000 (87.6000%)\n"
+     ]
+    }
+   ],
+   "source": [
+    "# if both cluster assignments are the same, then the pred_type is the same as the cluster assignment\n",
+    "# if they are not the same, the cluster with the best confidence is the pred_type\n",
+    "vote_df = df.copy()\n",
+    "def vote(row):\n",
+    "    if row[\"entropy_cluster\"] == row[\"energy_cluster\"]:\n",
+    "        return row[\"entropy_cluster\"]\n",
+    "    else:\n",
+    "        entropy_conf = row[\"entropy_clusterprob_0\"] if row[\"entropy_cluster\"] == 0 else row[\"entropy_clusterprob_1\"]\n",
+    "        energy_conf = row[\"energy_clusterprob_0\"] if row[\"energy_cluster\"] == 0 else row[\"energy_clusterprob_1\"]\n",
+    "        \n",
+    "        if entropy_conf >= energy_conf:\n",
+    "            return row[\"entropy_cluster\"]\n",
+    "        else:\n",
+    "            return row[\"energy_cluster\"]\n",
+    "        \n",
+    "vote_df[\"pred_type\"] = vote_df.apply(vote, axis=1)\n",
+    "\n",
+    "novel = vote_df[vote_df[\"true_type\"] == 1]\n",
+    "known = vote_df[vote_df[\"true_type\"] == 0]\n",
+    "\n",
+    "print(f\"Known Correct/Total (Accuracy%) {known[known['pred_type'] == 0].shape[0]}/{known.shape[0]} ({ 100 * (known[known['pred_type'] == 0].shape[0]/known.shape[0]):.4f}%)\")\n",
+    "print(f\"Novel Correct/Total (Accuracy%) {novel[novel['pred_type'] == 1].shape[0]}/{novel.shape[0]} ({ 100 * (novel[novel['pred_type'] == 1].shape[0]/novel.shape[0]):.4f}%)\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Weighted Voting Scoring"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Known Correct/Total (Accuracy%) 610/1000 (61.0000%)\n",
+      "Novel Correct/Total (Accuracy%) 3640/4000 (91.0000%)\n"
+     ]
+    }
+   ],
+   "source": [
+    "# same as voting, but cluster confidence is multiplied by the accuracy of that scores clustering\n",
+    "\n",
+    "weights = {\"entropy\": {0: 0.574, 1: 0.926}, \"energy\": {0: 0.891, 1: 0.65975}}\n",
+    "\n",
+    "wvote_df = df.copy()\n",
+    "def vote(row):\n",
+    "    if row[\"entropy_cluster\"] == row[\"energy_cluster\"]:\n",
+    "        return row[\"entropy_cluster\"]\n",
+    "    else:\n",
+    "        entropy_conf = row[\"entropy_clusterprob_0\"] if row[\"entropy_cluster\"] == 0 else row[\"entropy_clusterprob_1\"]\n",
+    "        energy_conf = row[\"energy_clusterprob_0\"] if row[\"energy_cluster\"] == 0 else row[\"energy_clusterprob_1\"]\n",
+    "        \n",
+    "        if row[\"entropy_cluster\"] == 0:\n",
+    "            entropy_conf *= weights[\"entropy\"][0]\n",
+    "        else:\n",
+    "            entropy_conf *= weights[\"entropy\"][1]\n",
+    "            \n",
+    "        if row[\"energy_cluster\"] == 0:\n",
+    "            energy_conf *= weights[\"energy\"][0]\n",
+    "        else:\n",
+    "            energy_conf *= weights[\"energy\"][1]\n",
+    "        \n",
+    "        if entropy_conf >= energy_conf:\n",
+    "            return row[\"entropy_cluster\"]\n",
+    "        else:\n",
+    "            return row[\"energy_cluster\"]\n",
+    "        \n",
+    "wvote_df[\"pred_type\"] = wvote_df.apply(vote, axis=1)\n",
+    "\n",
+    "novel = wvote_df[wvote_df[\"true_type\"] == 1]\n",
+    "known = wvote_df[wvote_df[\"true_type\"] == 0]\n",
+    "\n",
+    "print(f\"Known Correct/Total (Accuracy%) {known[known['pred_type'] == 0].shape[0]}/{known.shape[0]} ({ 100 * (known[known['pred_type'] == 0].shape[0]/known.shape[0]):.4f}%)\")\n",
+    "print(f\"Novel Correct/Total (Accuracy%) {novel[novel['pred_type'] == 1].shape[0]}/{novel.shape[0]} ({ 100 * (novel[novel['pred_type'] == 1].shape[0]/novel.shape[0]):.4f}%)\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 3-Component GMM & Feature Distance Resolution"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### GMM"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "df = master_df.copy()\n",
+    "\n",
+    "# entropy GMM\n",
+    "gmm = GaussianMixture(n_components=3, random_state=8008135, max_iter=1000, init_params='k-means++', tol=1e-4)\n",
+    "\n",
+    "df[\"cluster\"] = gmm.fit_predict(df['entropy'].values.reshape(-1, 1))\n",
+    "soft_clusters = gmm.predict_proba(df['entropy'].values.reshape(-1, 1))\n",
+    "\n",
+    "cluster_means = df.group_by('cluster')['entropy'].mean()\n",
+    "sorted_clusters = cluster_means.sort_values().index\n",
+    "\n",
+    "rename_mapping = {sorted_clusters[0]: 0, sorted_clusters[1]: -1, sorted_clusters[2]: 1}\n",
+    "\n",
+    "df[\"cluster\"] = df['cluster'].map(rename_mapping)\n",
+    "\n",
+    "print(f\"Means 0, -1, 1: {df[df['cluster'] == 0]['entropy'].mean()}, {df[df['cluster'] == -1]['entropy'].mean()}, {df[df['cluster'] == 1]['entropy'].mean()}\")\n",
+    "\n",
+    "known = df[df[\"true_type\"] == 0 and df[\"cluster\"] != -1]\n",
+    "novel = df[df[\"true_type\"] == 1 and df[\"cluster\"] != -1]\n",
+    "\n",
+    "print(f\"Non -1 Known Correct/Total (Accuracy%) {known[known['cluster'] == 0].shape[0]}/{known.shape[0]} ({ 100 * (known[known['cluster'] == 0].shape[0]/known.shape[0]):.4f}%)\")\n",
+    "print(f\"Non -1 Novel Correct/Total (Accuracy%) {novel[novel['cluster'] == 1].shape[0]}/{novel.shape[0]} ({ 100 * (novel[novel['cluster'] == 1].shape[0]/novel.shape[0]):.4f}%)\")\n",
+    "print(f\"Known in -1: {df[df['cluster'] == -1 and df['true_type'] == 0].shape[0]} | Novel in -1: {df[df['cluster'] == -1 and df['true_type'] == 1].shape[0]}\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Feature Distances"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Exemplar Set"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# for the feature distance sorting of cluster -1, we need an exemplar set. We will randomly sample 32 images per class from the session 0 training dataset\n",
+    "session_0_trainset = dataset_master.get_dataset(session=0)\n",
+    "\n",
+    "labels_np = session_0_trainset.tensor_dataset.tensors[1].cpu().numpy()\n",
+    "\n",
+    "samples_per_label = 32\n",
+    "\n",
+    "unique_labels = np.unique(labels_np)\n",
+    "\n",
+    "sample_indices = []\n",
+    "\n",
+    "for label in unique_labels:\n",
+    "    label_indices = np.where(labels_np == label)[0]\n",
+    "    sample_indices.extend(np.random.choice(label_indices, samples_per_label, replace=False))\n",
+    "\n",
+    "subset = torch.utils.data.Subset(session_0_trainset.tensor_dataset, sample_indices)\n",
+    "subset_loader = torch.utils.data.DataLoader(subset, batch_size=512, shuffle=False, num_workers=4, pin_memory=True)\n",
+    "\n",
+    "# get the features, logits, entropies and energies of the exemplar set\n",
+    "results = []\n",
+    "\n",
+    "pretrained_model.eval()\n",
+    "for x, label, _ in tqdm(subset_loader, desc='Calculating Entropies', unit='batch'):\n",
+    "    with torch.no_grad():\n",
+    "        x = x.to(device)\n",
+    "        logits, feats = pretrained_model(x)\n",
+    "        softmax = torch.nn.functional.softmax(logits, dim=1)\n",
+    "        entropy = -torch.sum(softmax * torch.log(softmax + 1e-12), dim=1)\n",
+    "        energy = -torch.logsumexp(logits, dim=1)\n",
+    "        feats = feats.cpu().numpy()\n",
+    "        logits = logits.cpu().numpy()\n",
+    "        entropy = entropy.cpu().numpy()\n",
+    "        energy = energy.cpu().numpy()\n",
+    "        label = label.cpu().numpy()\n",
+    "        results.append([entropy, energy, label, *feats, *logits])\n",
+    "\n",
+    "columns = ['entropy', 'energy', 'label'] + feat_cols + logit_cols\n",
+    "exemplar_df = pd.DataFrame(results, columns=columns)\n",
+    "\n",
+    "# create a df for exemplar means: mean of each column for each label\n",
+    "exemplar_means = exemplar_df.groupby('label').mean()\n",
+    "\n",
+    "print(exemplar_means[\"label\", \"entropy\", \"energy\"])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Compute Distances"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from sklearn.metrics.pairwise import cosine_distances as dist\n",
+    "# filter the df to only include cluster -1\n",
+    "unassigned_df = df[df[\"cluster\"] == -1].copy()\n",
+    "\n",
+    "# for each sample in unassigned_df, calculate the distance of that sample's features to the nearest exemplar mean's features\n",
+    "\n",
+    "def get_dist_to_nearest(row):\n",
+    "    features = row[feat_cols].values\n",
+    "    distances = dist(features.reshape(1, -1), exemplar_means[feat_cols].values)\n",
+    "    return np.min(distances), np.argmin(distances)\n",
+    "\n",
+    "unassigned_df[\"nearest_dist\"], unassigned_df[\"nearest_label\"] = zip(*unassigned_df.apply(get_dist_to_nearest, axis=1))\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Try using a GMM and the distances to separate unassigned?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "unassigned_gmm_df = unassigned_df.copy()\n",
+    "unassigned_gmm_df = unassigned_gmm_df.drop(\"cluster\") # remove the cluster, because we know they are unassigned\n",
+    "\n",
+    "gmm = GaussianMixture(n_components=2, random_state=8008135, max_iter=1000, init_params='k-means++', tol=1e-4)\n",
+    "\n",
+    "unassigned_gmm_df[\"cluster\"] = gmm.fit_predict(unassigned_gmm_df['nearest_dist'].values.reshape(-1, 1))\n",
+    "\n",
+    "# the cluster with the smaller dists are the knowns, so we will swap the clusters if the mean of the knowns is greater than the mean of the novelties\n",
+    "cluster_means = unassigned_gmm_df.groupby('cluster')['nearest_dist'].mean()\n",
+    "sorted_clusters = cluster_means.sort_values().index\n",
+    "rename_mapping = {sorted_clusters[0]: 0, sorted_clusters[1]: 1}\n",
+    "\n",
+    "unassigned_gmm_df['cluster'] = unassigned_gmm_df['cluster'].map(rename_mapping)\n",
+    "\n",
+    "known = unassigned_gmm_df[unassigned_gmm_df[\"truetype\"] == 0]\n",
+    "novel = unassigned_gmm_df[unassigned_gmm_df[\"truetype\"] == 1]\n",
+    "\n",
+    "print(f\"-1 Known Correct/Total (Accuracy%) {known[known['cluster'] == 0].shape[0]}/{known.shape[0]} ({ 100 * (known[known['cluster'] == 0].shape[0]/known.shape[0]):.4f}%)\")\n",
+    "print(f\"-1 Novel Correct/Total (Accuracy%) {novel[novel['cluster'] == 1].shape[0]}/{novel.shape[0]} ({ 100 * (novel[novel['cluster'] == 1].shape[0]/novel.shape[0]):.4f}%)\")"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "entcl",
+   "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.10.15"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
-- 
GitLab