{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "qUjxrGpH4_y4"
},
"source": [
"#### **PROJECT TITLE :** `AI-Powered Medical Image Analysis Tool for Chest (X-Ray and CT-Scan) Diseases Detection`\n",
"\n",
"
\n",
"
\n",
"\n",
"### Component : `Model Implementation`"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "wdWLj1az4_y8"
},
"source": [
"### **STEP - 1 : Project Evironment Setup**"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "_UQfO8ts4_y8"
},
"outputs": [],
"source": [
"# Let us first import all the necessary libraries required for this project\n",
"\n",
"import tensorflow as tf\n",
"import torch\n",
"import cv2\n",
"import sklearn\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import os\n",
"from torchvision import datasets, transforms, models\n",
"from torch.utils.data import DataLoader, Dataset\n",
"import torch.nn as nn\n",
"import torch.optim as optim\n",
"import torchvision\n",
"import torch.nn.functional as F\n",
"from PIL import Image\n",
"\n",
"from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix, roc_curve, auc\n",
"\n",
"\n",
"# Later on, as per requirement, more libraries will be imported"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "g5BxezgA4_y-",
"outputId": "720cf91b-5e02-49a7-d135-d6b73b9e3a73"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CUDA\n"
]
}
],
"source": [
"# Let us test whether we have GPU available or not\n",
"\n",
"print(\"CUDA\") if torch.cuda.is_available() else print(\"CPU\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SpMAyaLh4_y_"
},
"source": [
"
\n",
"
\n",
"\n",
"### **STEP - 2 : Data Acquisition**\n",
"\n",
"
\n",
"\n",
"#### **Creating Data Generators and Verifying the modified image dimensions**\n",
"\n",
"Penumonia : Chest-X-Ray 🔽"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "V9wE1uWw4_zA",
"outputId": "5fed680f-ff73-4491-fb76-d1924eba99be"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"pneumo_train_loader (class indices) : {'NORMAL': 0, 'PNEUMONIA': 1}\n",
"Number of images in training dataset: 5216\n",
"pneumo_val_loader (class indices) : {'NORMAL': 0, 'PNEUMONIA': 1}\n",
"Number of images in validation dataset: 16\n",
"pneumo_test_loader (class indices) : {'NORMAL': 0, 'PNEUMONIA': 1}\n",
"Number of images in testing dataset: 624\n"
]
}
],
"source": [
"# Defining the path to the dataset\n",
"base_dir_1 = r'Datasets/Pneumonia_Chest_X_Ray_Extracted'\n",
"\n",
"# Setting up parameters\n",
"img_height, img_width = 224, 224 # Desired dimensions for resizing\n",
"batch_size = 8\n",
"\n",
"# Defining transforms for the dataset\n",
"transform = transforms.Compose([\n",
" transforms.Resize((img_height, img_width)), # Resizing images\n",
" transforms.ToTensor(), # Converting images to PyTorch tensors\n",
" transforms.Normalize(mean=[0.5], std=[0.5]) # Normalizing pixel values to [-1, 1]\n",
"])\n",
"\n",
"# Loading training data\n",
"pneumo_train_dataset = datasets.ImageFolder(\n",
" os.path.join(base_dir_1, 'train'), # Path to training images\n",
" transform=transform\n",
")\n",
"\n",
"pneumo_train_loader = DataLoader(\n",
" pneumo_train_dataset,\n",
" batch_size=batch_size,\n",
" shuffle=True\n",
")\n",
"\n",
"# Loading validation data\n",
"pneumo_val_dataset = datasets.ImageFolder(\n",
" os.path.join(base_dir_1, 'val'), # Path to validation images\n",
" transform=transform\n",
")\n",
"\n",
"pneumo_val_loader = DataLoader(\n",
" pneumo_val_dataset,\n",
" batch_size=batch_size,\n",
" shuffle=False\n",
")\n",
"\n",
"# Loading testing data\n",
"pneumo_test_dataset = datasets.ImageFolder(\n",
" os.path.join(base_dir_1, 'test'), # Path to testing images\n",
" transform=transform\n",
")\n",
"\n",
"pneumo_test_loader = DataLoader(\n",
" pneumo_test_dataset,\n",
" batch_size=batch_size,\n",
" shuffle=False\n",
")\n",
"\n",
"# Displaying the class indices and number of images\n",
"print(\"pneumo_train_loader (class indices) : \", pneumo_train_dataset.class_to_idx)\n",
"print(\"Number of images in training dataset: \", len(pneumo_train_dataset))\n",
"print(\"pneumo_val_loader (class indices) : \", pneumo_val_dataset.class_to_idx)\n",
"print(\"Number of images in validation dataset: \", len(pneumo_val_dataset))\n",
"print(\"pneumo_test_loader (class indices) : \", pneumo_test_dataset.class_to_idx)\n",
"print(\"Number of images in testing dataset: \", len(pneumo_test_dataset))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GQBpn-fH4_zB",
"outputId": "eeb58909-8327-41e8-ca74-ad557cb294a5"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Training Loader 🔻\n",
"Shape of images in batch: torch.Size([8, 3, 224, 224])\n",
"Labels for the batch: tensor([1, 1, 1, 1, 0, 1, 1, 1])\n",
"\n",
"Test Loader 🔻\n",
"Shape of images in batch: torch.Size([8, 3, 224, 224])\n",
"Labels for the batch: tensor([0, 0, 0, 0, 0, 0, 0, 0])\n",
"\n",
"Validation Loader 🔻\n",
"Shape of images in batch: torch.Size([8, 3, 224, 224])\n",
"Labels for the batch: tensor([0, 0, 0, 0, 0, 0, 0, 0])\n"
]
}
],
"source": [
"# Verifying the Image Dimensions\n",
"\n",
"# Function to verify image dimensions and print labels\n",
"def verify_image_dimensions_1(data_loader, generator_name):\n",
" # Getting a batch of images and labels\n",
" for images, labels in data_loader:\n",
" print(f\"\\n{generator_name} 🔻\")\n",
" # Printing the shape of the images and labels\n",
" print(f\"Shape of images in batch: {images.shape}\")\n",
" print(f\"Labels for the batch: {labels}\")\n",
" break # Only need the first batch\n",
"\n",
"# Verifying the dimensions for each data loader\n",
"verify_image_dimensions_1(pneumo_train_loader, \"Training Loader\")\n",
"verify_image_dimensions_1(pneumo_test_loader, \"Test Loader\")\n",
"verify_image_dimensions_1(pneumo_val_loader, \"Validation Loader\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9it9xHyb4_zB"
},
"source": [
"
\n",
"
\n",
"\n",
"**Image Data Analysis on Training DataLoader - Pneumonia : Chest (X-Ray)**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 487
},
"id": "BuORooA34_zB",
"outputId": "6093fa6a-f814-4da4-85bb-a05b24c014aa"
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAHWCAYAAAB5SD/0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABDAUlEQVR4nO3dfVhUdf7/8deAMCIykJqMrHhvJt5rpZPmapKk2M2mfbVMzbxZWzQFU2Qz77bSpc17zW23sv2urpmVlaw3BKJZZKayoqmt5oYtAqbBqCkgzO+Pfsy3CTXGBgY5z8d1zXVxzud9znkf/sDXdfzM55gcDodDAAAAgEH4eLsBAAAAoCoRgAEAAGAoBGAAAAAYCgEYAAAAhkIABgAAgKEQgAEAAGAoBGAAAAAYCgEYAAAAhkIABgAAgKEQgAHg/2vWrJkef/xxb7fxi82ZM0cmk6lKrtWnTx/16dPHuZ2WliaTyaQNGzZUyfUff/xxNWvWrEquBaDmIAADqPGOHz+u3/72t2rRooVq164ti8Winj17asmSJbp48aK327um1atXy2QyOT+1a9dWWFiYoqKitHTpUp07d84j18nOztacOXOUkZHhkfN5UnXuDcCNqZa3GwCAypSUlKSHH35YZrNZI0eOVPv27VVUVKRdu3Zp2rRpOnTokF555RVvt/mz5s2bp+bNm6u4uFg5OTlKS0vTlClTtHDhQr3//vvq2LGjs3bmzJmaMWOGW+fPzs7W3Llz1axZM3Xu3LnCx23bts2t61yPa/X2l7/8RaWlpZXeA4CahQAMoMY6ceKEhg0bpqZNmyo1NVWNGjVyjsXExOjYsWNKSkryYocVN2DAAN12223O7YSEBKWmpmrQoEG6//77dfjwYQUEBEiSatWqpVq1KvfP+/fff686derI39+/Uq/zc/z8/Lx6fQA3JqZAAKixEhMTdf78eb366qsu4bdMq1atNHny5Ksef/bsWT399NPq0KGD6tatK4vFogEDBuhf//pXudply5apXbt2qlOnjm666SbddtttWrt2rXP83LlzmjJlipo1ayaz2ayGDRvqnnvu0b59+677/u6++249++yz+vrrr/X3v//duf9Kc4CTk5PVq1cvhYSEqG7dumrTpo1+//vfS/ph3u7tt98uSRo9erRzusXq1asl/TDPt3379tq7d6969+6tOnXqOI/96RzgMiUlJfr9738vq9WqwMBA3X///Tp58qRLzdXmXP/4nD/X25XmAF+4cEFTp05VeHi4zGaz2rRpoz/96U9yOBwudSaTSRMnTtTGjRvVvn17mc1mtWvXTlu2bLnyLxxAjcETYAA11gcffKAWLVrozjvvvK7jv/rqK23cuFEPP/ywmjdvrtzcXP35z3/Wr3/9a33xxRcKCwuT9MN/wz/11FMaMmSIJk+erEuXLunAgQPavXu3Hn30UUnShAkTtGHDBk2cOFERERE6c+aMdu3apcOHD6tr167XfY8jRozQ73//e23btk3jxo27Ys2hQ4c0aNAgdezYUfPmzZPZbNaxY8f08ccfS5Latm2refPmadasWRo/frzuuusuSXL5vZ05c0YDBgzQsGHD9Nhjjyk0NPSafT3//PMymUyKj49XXl6eFi9erMjISGVkZDifVFdERXr7MYfDofvvv1/bt2/XmDFj1LlzZ23dulXTpk3Tf//7Xy1atMilfteuXXrnnXf0u9/9TkFBQVq6dKkGDx6srKws1a9fv8J9ArjBOACgBiooKHBIcjzwwAMVPqZp06aOUaNGObcvXbrkKCkpcak5ceKEw2w2O+bNm+fc98ADDzjatWt3zXMHBwc7YmJiKtxLmddff90hybFnz55rnrtLly7O7dmzZzt+/Od90aJFDkmO06dPX/Uce/bscUhyvP766+XGfv3rXzskOVatWnXFsV//+tfO7e3btzskOX71q1857Ha7c//69esdkhxLlixx7vvp7/tq57xWb6NGjXI0bdrUub1x40aHJMdzzz3nUjdkyBCHyWRyHDt2zLlPksPf399l37/+9S+HJMeyZcvKXQtAzcEUCAA1kt1ulyQFBQVd9znMZrN8fH74M1lSUqIzZ844pw/8eOpCSEiIvvnmG+3Zs+eq5woJCdHu3buVnZ193f1cTd26da+5GkRISIgk6b333rvuL4yZzWaNHj26wvUjR450+d0PGTJEjRo10j//+c/run5F/fOf/5Svr6+eeuopl/1Tp06Vw+HQ5s2bXfZHRkaqZcuWzu2OHTvKYrHoq6++qtQ+AXgXARhAjWSxWCTpFy0TVlpaqkWLFql169Yym81q0KCBbr75Zh04cEAFBQXOuvj4eNWtW1d33HGHWrdurZiYGOf0gjKJiYk6ePCgwsPDdccdd2jOnDkeC1nnz5+/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tXv3bplMJmVnZ2vNmjV6+umn9eSTT1ZGjwAAAIDHuP0ijBkzZqi0tFT9+vXT999/r969e8tsNuvpp5/WpEmTKqNHAAAAwGPcfgJsMpn0zDPP6OzZszp48KA+/fRTnT59Wn/4wx/cvvj8+fN1++23KygoSA0bNtSDDz6oo0ePutT06dNHJpPJ5TNhwgSXmqysLEVHR6tOnTpq2LChpk2bpsuXL7vUpKWlqWvXrjKbzWrVqpVWr17tdr8AAAC48bn9BLiMv7+/IiIiftHFd+zYoZiYGN1+++26fPmyfv/736t///764osvFBgY6KwbN26c5s2b59yuU6eO8+eSkhJFR0fLarXqk08+0alTpzRy5Ej5+fk5l2U7ceKEoqOjNWHCBK1Zs0YpKSkaO3asGjVqpKioqF90DwAAALixuP0muN/85jcymUzlT2QyqXbt2mrVqpUeffRRtWnTxu1mTp8+rYYNG2rHjh3OlSb69Omjzp07a/HixVc8ZvPmzRo0aJCys7MVGhoqSVq1apXi4+N1+vRp+fv7Kz4+XklJSTp48KDzuGHDhik/P19btmz52b54ExwAeB5vggNqvhrzJrjg4GClpqZq3759zikJ+/fvV2pqqi5fvqw333xTnTp10scff+x24wUFBZKkevXquexfs2aNGjRooPbt2yshIUHff/+9cyw9PV0dOnRwhl9JioqKkt1u16FDh5w1kZGRLueMiopSenr6FfsoLCyU3W53+QAAAKBmcHsKhNVq1aOPPqrly5fLx+eH/FxaWqrJkycrKChI69at04QJExQfH+/Wq5FLS0s1ZcoU9ezZU+3bt3fuf/TRR9W0aVOFhYXpwIEDio+P19GjR/XOO+9IknJyclzCryTndk5OzjVr7Ha7Ll68qICAAJex+fPna+7cuRXuHQAAADcOtwPwq6++qo8//tgZfiXJx8dHkyZN0p133qkXXnhBEydO1F133eXWeWNiYnTw4MFyoXn8+PHOnzt06KBGjRqpX79+On78uFq2bOlu+xWSkJCguLg457bdbld4eHilXAsAAABVy+0pEJcvX9aRI0fK7T9y5IhKSkokSbVr177iPOGrmThxojZt2qTt27ercePG16zt3r27JDlfxmG1WpWbm+tSU7ZttVqvWWOxWMo9/ZUks9ksi8Xi8gEAAEDN4HYAHjFihMaMGaNFixZp165d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/Jrr/X711VcVPteFCxfUqVMnPfHEE1edVnHvvfe6PHU2m80u48OHD9epU6eUnJys4uJijR49WuPHj9fatWslSXa7Xf3791dkZKRWrVqlzMxMPfHEEwoJCdH48eMr3CsAAABqBrcD8JQpU1y2i4uLtX//fm3ZskXTpk1z61wDBgzQgAEDrlljNptltVqvOHb48GFt2bJFe/bs0W233SZJWrZsmQYOHKg//elPCgsL05o1a1RUVKTXXntN/v7+ateunTIyMrRw4UICMAAAgAG5HYAnT558xf0rVqzQ559//osb+qm0tDQ1bNhQN910k+6++24999xzql+/viQpPT1dISEhzvArSZGRkfLx8dHu3bv1m9/8Runp6erdu7f8/f2dNVFRUfrjH/+o7777TjfddFO5axYWFqqwsNC5bbfbPX5fAAAA8A6PzQEeMGCA3n77bU+dTtIP0x/+9re/KSUlRX/84x+1Y8cODRgwQCUlJZKknJwcNWzY0OWYWrVqqV69esrJyXHWhIaGutSUbZfV/NT8+fMVHBzs/ISHh3v0vgAAAOA9bj8BvpoNGzaoXr16njqdJGnYsGHOnzt06KCOHTuqZcuWSktLU79+/Tx6rR9LSEhQXFycc9tutxOCAQAAagi3A3CXLl1cvgTncDiUk5Oj06dPa+XKlR5t7qdatGihBg0a6NixY+rXr5+sVqvy8vJcai5fvqyzZ8865w1brVbl5ua61JRtX21usdlsLvdlOwAAANQMbgfgBx980GXbx8dHN998s/r06aNbb73VU31d0TfffKMzZ86oUaNGkiSbzab8/Hzt3btX3bp1kySlpqaqtLRU3bt3d9Y888wzKi4udr61Ljk5WW3atLni/F8AAADUbG4H4NmzZ3vs4ufPn9exY8ec2ydOnFBGRobq1aunevXqae7cuRo8eLCsVquOHz+u6dOnq1WrVoqKipIktW3bVvfee6/GjRunVatWqbi4WBMnTtSwYcMUFhYmSXr00Uc1d+5cjRkzRvHx8Tp48KCWLFmiRYsWeew+AAAAcOPw6oswPv/8c3Xp0kVdunSRJMXFxalLly6aNWuWfH19deDAAd1///265ZZbNGbMGHXr1k0fffSRy/SENWvW6NZbb1W/fv00cOBA9erVS6+88opzPDg4WNu2bdOJEyfUrVs3TZ06VbNmzWIJNAAAAIMyORwO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WsvtLygo0Kuvvqq1a9fq7rvvliS9/vrratu2rT799FP16NFD27Zt0xdffKEPP/xQoaGh6ty5s/7whz8oPj5ec+bMkb+//xWvWVhYqMLCQue23W6vnJsDAABAlavWUyAk6d///rfCwsLUokULDR8+XFlZWZKkvXv3qri4WJGRkc7aW2+9VU2aNFF6erokKT09XR06dFBoaKizJioqSna7XYcOHbrqNefPn6/g4GDnJzw8vJLuDgAAAFWtWgfg7t27a/Xq1dqyZYtefvllnThxQnfddZfOnTunnJwc+fv7KyQkxOWY0NBQ5eTkSJJycnJcwm/ZeNnY1SQkJKigoMD5OXnypGdvDAAAAF5TradADBgwwPlzx44d1b17dzVt2lTr169XQEBApV3XbDbLbDZX2vkBAADgPdX6CfBPhYSE6JZbbtGxY8dktVpVVFSk/Px8l5rc3FznnGGr1VpuVYiy7SvNKwYAAEDNd0MF4PPnz+v48eNq1KiRunXrJj8/P6WkpDjHjx49qqysLNlsNkmSzWZTZmam8vLynDXJycmyWCyKiIio8v4BAADgfdV6CsTTTz+t++67T02bNlV2drZmz54tX19fPfLIIwoODtaYMWMUFxenevXqyWKxaNKkSbLZbOrRo4ckqX///oqIiNCIESOUmJionJwczZw5UzExMUxxAAAAMKhqHYC/+eYbPfLIIzpz5oxuvvlm9erVS59++qluvvlmSdKiRYvk4+OjwYMHq7CwUFFRUVq5cqXzeF9fX23atElPPvmkbDabAgMDNWrUKM2bN89btwQAAAAvMzkcDoe3m6ju7Ha7goODVVBQIIvFUmXXLZ47tcquBcA7/Ga/5O0WvGbB/m+93QKASjajS4Mqu5Y7ee2GmgMMAAAA/FIEYAAAABgKARgAAACGQgAGAACAoRCAAQAAYCgEYAAAABgKARgAAACGQgAGAACAoRCAAQAAYCgEYAAAABgKARgAAACGQgAGAACAoRCAAQAAYCgEYAAAABgKARgAAACGQgAGAACAoRCAAQAAYCgEYAAAABgKARgAAACGQgAGAACAoRCAAQAAYCgEYAAAABgKARgAAACGQgAGAACAoRCAAQAAYCgEYAAAABgKARgAAACGQgAGAACAoRCAAQAAYCgEYAAAABgKARgAAACGQgAGAACAoRCAAQAAYCgEYAAAABgKARgAAACGQgAGAACAoRgqAK9YsULNmjVT7dq11b17d3322WfebgkAAABVzDAB+M0331RcXJxmz56tffv2qVOnToqKilJeXp63WwMAAEAVMkwAXrhwocaNG6fRo0crIiJCq1atUp06dfTaa695uzUAAABUoVrebqAqFBUVae/evUpISHDu8/HxUWRkpNLT08vVFxYWqrCw0LldUFAgSbLb7ZXf7I8UXyr8+SIANzS/Kv67Up1cOn/O2y0AqGR2u38VXuuHv6cOh+Nnaw0RgL/99luVlJQoNDTUZX9oaKiOHDlSrn7+/PmaO3duuf3h4eGV1iMAg1qwwtsdAEClKZ+mKt+5c+cUHBx8zRpDBGB3JSQkKC4uzrldWlqqs2fPqn79+jKZTF7sDDWZ3W5XeHi4Tp48KYvF4u12AMCj+BuHyuZwOHTu3DmFhYX9bK0hAnCDBg3k6+ur3Nxcl/25ubmyWq3l6s1ms8xms8u+kJCQymwRcLJYLPzjAKDG4m8cKtPPPfktY4gvwfn7+6tbt25KSUlx7istLVVKSopsNpsXOwMAAEBVM8QTYEmKi4vTqFGjdNttt+mOO+7Q4sWLdeHCBY0ePdrbrQEAAKAKGSYADx06VKdPn9asWbOUk5Ojzp07a8uWLeW+GAd4i9ls1uzZs8tNvwGAmoC/cahOTI6KrBUBAAAA1BCGmAMMAAAAlCEAAwAAwFAIwAAAADAUAjAAAAAMhQAMVAMrVqxQs2bNVLt2bXXv3l2fffaZt1sCAI/YuXOn7rvvPoWFhclkMmnjxo3ebgkgAAPe9uabbyouLk6zZ8/Wvn371KlTJ0VFRSkvL8/brQHAL3bhwgV16tRJK1as8HYrgBPLoAFe1r17d91+++1avny5pB/eUhgeHq5JkyZpxowZXu4OADzHZDLp3Xff1YMPPujtVmBwPAEGvKioqEh79+5VZGSkc5+Pj48iIyOVnp7uxc4AAKi5CMCAF3377bcqKSkp90bC0NBQ5eTkeKkrAABqNgIwAAAADIUADHhRgwYN5Ovrq9zcXJf9ubm5slqtXuoKAICajQAMeJG/v7+6deumlJQU577S0lKlpKTIZrN5sTMAAGquWt5uADC6uLg4jRo1SrfddpvuuOMOLV68WBcuXNDo0aO93RoA/GLnz5/XsWPHnNsnTpxQRkaG6tWrpyZNmnixMxgZy6AB1cDy5cv14osvKicnR507d9bSpUvVvXt3b7cFAL9YWlqa+vbtW27/qFGjtHr16qpvCBABGAAAAAbDHGAAAAAYCgEYAAAAhkIABgAAgKEQgAEAAGAoBGAAAAAYCgEYAAAAhkIABgAAgKEQgAEAAGAoBGAAqMFMJpM2btzo7TYAoFohAAPADSwnJ0eTJk1SixYtZDabFR4ervvuu08pKSnebg0Aqq1a3m4AAHB9/vOf/6hnz54KCQnRiy++qA4dOqi4uFhbt25VTEyMjhw54u0WAaBa4gkwANygfve738lkMumzzz7T4MGDdcstt6hdu3aKi4vTp59+esVj4uPjdcstt6hOnTpq0aKFnn32WRUXFzvH//Wvf6lv374KCgqSxWJRt27d9Pnnn0uSvv76a91333266aabFBgYqHbt2umf//xnldwrAHgST4AB4AZ09uxZbdmyRc8//7wCAwPLjYeEhFzxuKCgIK1evVphYWHKzMzUuHHjFBQUpOnTp0uShg8fri5duujll1+Wr6+vMjIy5OfnJ0mKiYlRUVGRdu7cqcDAQH3xxReqW7dupd0jAFQWAjAA3ICOHTsmh8OhW2+91a3jZs6c6fy5WbNmevrpp7Vu3TpnAM7KytK0adOc523durWzPisrS4MHD1aHDh0kSS1atPiltwEAXsEUCAC4ATkcjus67s0331TPnj1ltVpVt25dzZw5U1lZWc7xuLg4jR07VpGRkVqwYIGOHz/uHHvqqaf03HPPqWfPnpo9e7YOHDjwi+8DALyBAAwAN6DWrVvLZDK59UW39PR0DR8+XAMHDtSmTZu0f/9+PfPMMyoqKnLWzJkzR4cOHVJ0dLRSU1MVERGhd999V5I0duxYffXVVxoxYoQyMzN12223admyZR6/NwCobCbH9T5GAAB41YABA5SZmamjR4+Wmwecn5+vkJAQmUwmvfvuu3rwwQf10ksvaeXKlS5PdceOHasNGzYoPz//itd45JFHdOHCBb3//vvlxhISEpSUlMSTYAA3HJ4AA8ANasWKFSopKdEdd9yht99+W//+9791+PBhLV26VDabrVx969atlZWVpXXr1un48eNaunSp8+muJF28eFETJ05UWlqavv76a3388cfas2eP2rZtK0maMmWKtm7dqhMnTmjfvn3avn27cwwAbiR8CQ4AblAtWrTQvn379Pzzz2vq1Kk6deqUbr75ZnXr1k0vv/xyufr7779fsbGxmjhxogoLCxUdHa1nn31Wc+bMkST5+vrqzJkzGjlypHJzc9WgQQM99NBDmjt3riSppKREMTEx+uabb2SxWHTvvfdq0aJFVXnLAOARTIEAAACAoTAFAgAAAIZCAAYAAIChEIABAABgKARgAAAAGAoBGAAAAIZCAAYAAIChEIABAABgKARgAAAAGAoBGAAAAIZCAAYAAIChEIABAABgKP8PVUExZcVdK5YAAAAASUVORK5CYII=",
"text/plain": [
"