[c72571]: / NESTCOMPETIITION.ipynb

Download this file

3322 lines (3322 with data), 251.0 kB

{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU",
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "e41925970dc94c2aa90b4da8acac85cf": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_c1f0f99a4a4341d18e0039a71b305111",
              "IPY_MODEL_d54d01c91e694b3eb180170cddd1211c",
              "IPY_MODEL_3c707baf63cf4cbf9732e39ddeb84c7c"
            ],
            "layout": "IPY_MODEL_08955c157996426eaa089d878b8d820f"
          }
        },
        "c1f0f99a4a4341d18e0039a71b305111": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_da9c8ff09bed4c6989b0246c7bdc8fd7",
            "placeholder": "​",
            "style": "IPY_MODEL_b78266bbcc0e4ed0bcaab9009b30d98e",
            "value": "tokenizer_config.json: 100%"
          }
        },
        "d54d01c91e694b3eb180170cddd1211c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_2fd8c28ebf1b47f78e2e0093608407cf",
            "max": 28,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_8c728d06a0814cc8b83931b24f0115d9",
            "value": 28
          }
        },
        "3c707baf63cf4cbf9732e39ddeb84c7c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_da4b0713ce9f47208a39ec89515c30e4",
            "placeholder": "​",
            "style": "IPY_MODEL_b2fd795e6a534319a87213f05e824315",
            "value": " 28.0/28.0 [00:00<00:00, 1.45kB/s]"
          }
        },
        "08955c157996426eaa089d878b8d820f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "da9c8ff09bed4c6989b0246c7bdc8fd7": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "b78266bbcc0e4ed0bcaab9009b30d98e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "2fd8c28ebf1b47f78e2e0093608407cf": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "8c728d06a0814cc8b83931b24f0115d9": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "da4b0713ce9f47208a39ec89515c30e4": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "b2fd795e6a534319a87213f05e824315": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "0722a8ceb94345a79e5bdc3b84f71d7f": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_7c04cff87d1041b1878488f5014f9b7c",
              "IPY_MODEL_0ef4539514a1462caacf58e5c3fa516b",
              "IPY_MODEL_4c61a2b37c4c4ffbb3a10d270140724f"
            ],
            "layout": "IPY_MODEL_d1288d4268e74bd384064c4f2cfbfa7b"
          }
        },
        "7c04cff87d1041b1878488f5014f9b7c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_1c84ce5cb56a4c7286c0f5981b8fbd5a",
            "placeholder": "​",
            "style": "IPY_MODEL_61a01f78b9714e4aa0d869d8e6563e81",
            "value": "config.json: 100%"
          }
        },
        "0ef4539514a1462caacf58e5c3fa516b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_180753d93be944e98c47bba836397ba0",
            "max": 385,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_db137743dfc24b6b84c6c15bcd5b5766",
            "value": 385
          }
        },
        "4c61a2b37c4c4ffbb3a10d270140724f": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_16f88feb88fc43b5b381521d91b02150",
            "placeholder": "​",
            "style": "IPY_MODEL_9b2a4006744a4940aa64fd9e41d62d4e",
            "value": " 385/385 [00:00<00:00, 21.0kB/s]"
          }
        },
        "d1288d4268e74bd384064c4f2cfbfa7b": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "1c84ce5cb56a4c7286c0f5981b8fbd5a": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "61a01f78b9714e4aa0d869d8e6563e81": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "180753d93be944e98c47bba836397ba0": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "db137743dfc24b6b84c6c15bcd5b5766": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "16f88feb88fc43b5b381521d91b02150": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "9b2a4006744a4940aa64fd9e41d62d4e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "d55048b2772b47eab27637e9aa42d4dc": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_a70574b040b14832abb25d2eb040fb0a",
              "IPY_MODEL_e5c3bf5ade9a405094a1673bc2beb795",
              "IPY_MODEL_3d7c0e5ba179442eb417435ff72ae85a"
            ],
            "layout": "IPY_MODEL_b8aea249ccf04a619c1e926e7b6b6bbe"
          }
        },
        "a70574b040b14832abb25d2eb040fb0a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_73554830b9524f1b8b8714ff33c3b8e8",
            "placeholder": "​",
            "style": "IPY_MODEL_15bf509be6d946e187e14fd6854950a9",
            "value": "vocab.txt: 100%"
          }
        },
        "e5c3bf5ade9a405094a1673bc2beb795": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_65855073adcd4434b8e9af65ecc59915",
            "max": 226150,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_f3485f93a7374df49cc200d18e9ac49e",
            "value": 226150
          }
        },
        "3d7c0e5ba179442eb417435ff72ae85a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_53d6422031bf48dab34a3b47e237da93",
            "placeholder": "​",
            "style": "IPY_MODEL_1ebb572142e8490199aa8ffce39df341",
            "value": " 226k/226k [00:00<00:00, 3.21MB/s]"
          }
        },
        "b8aea249ccf04a619c1e926e7b6b6bbe": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "73554830b9524f1b8b8714ff33c3b8e8": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "15bf509be6d946e187e14fd6854950a9": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "65855073adcd4434b8e9af65ecc59915": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "f3485f93a7374df49cc200d18e9ac49e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "53d6422031bf48dab34a3b47e237da93": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "1ebb572142e8490199aa8ffce39df341": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "efe460065f0448acbf75200543187bb0": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_0e6e8bc125874564bb46431ac85524dc",
              "IPY_MODEL_30d5690beb7341dc8b37de5a1e0812ab",
              "IPY_MODEL_e8c76754ea784709bae0c59843c61279"
            ],
            "layout": "IPY_MODEL_67690c975154491b96ed9091db152a0f"
          }
        },
        "0e6e8bc125874564bb46431ac85524dc": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_74bbdf59962d41059f018e6eab297968",
            "placeholder": "​",
            "style": "IPY_MODEL_2c20eb99653d4026ace81ccbe858b479",
            "value": "pytorch_model.bin: 100%"
          }
        },
        "30d5690beb7341dc8b37de5a1e0812ab": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_183aee869ce34eaca26f1cf533559caa",
            "max": 440474434,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_d4622e6a3301483c91a66836d5724e0e",
            "value": 440474434
          }
        },
        "e8c76754ea784709bae0c59843c61279": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_d9c5d0256f534e4cbd82797e1e9f3ccd",
            "placeholder": "​",
            "style": "IPY_MODEL_0dc7017260764c9dbdcb9167e7a40b15",
            "value": " 440M/440M [00:04<00:00, 108MB/s]"
          }
        },
        "67690c975154491b96ed9091db152a0f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "74bbdf59962d41059f018e6eab297968": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "2c20eb99653d4026ace81ccbe858b479": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "183aee869ce34eaca26f1cf533559caa": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "d4622e6a3301483c91a66836d5724e0e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "d9c5d0256f534e4cbd82797e1e9f3ccd": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "0dc7017260764c9dbdcb9167e7a40b15": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        }
      }
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "yBhXMsR3OE85",
        "outputId": "f586f5e1-50a3-446a-8258-0dde1c57e636"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-1-8174d4ba0823>:8: DtypeWarning: Columns (0,18,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,765,767,768,769,771,772,773,775,776) have mixed types. Specify dtype option on import or set low_memory=False.\n",
            "  df = pd.read_csv(\"/content/usecase_2_.csv\", quoting=csv.QUOTE_MINIMAL, escapechar='\\\\', on_bad_lines='skip')\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Successfully read the CSV with skipped lines.\n",
            "Check the problematic rows (if any) by inspecting the original CSV file around row 785.\n"
          ]
        }
      ],
      "source": [
        "import pandas as pd\n",
        "import csv\n",
        "\n",
        "# Use csv.QUOTE_MINIMAL to only quote where necessary\n",
        "# Try to read the file with error_bad_lines=False to skip problematic lines\n",
        "# and see if you can identify the issue in the skipped rows\n",
        "try:\n",
        "    df = pd.read_csv(\"/content/usecase_2_.csv\", quoting=csv.QUOTE_MINIMAL, escapechar='\\\\', on_bad_lines='skip')\n",
        "    print(\"Successfully read the CSV with skipped lines.\")\n",
        "    print(\"Check the problematic rows (if any) by inspecting the original CSV file around row 785.\")\n",
        "except pd.errors.ParserError as e:\n",
        "    print(f\"Error: {e}\")\n",
        "    print(\"The on_bad_lines='skip' approach also failed. This likely indicates a more severe issue within the CSV file structure.\")\n",
        "    print(\"Possible solutions:\")\n",
        "    print(\"  1. Manually inspect row 785 and the surrounding rows in your CSV file for unescaped quotes or incorrect line endings.\")\n",
        "    print(\"  2. If you have control over the CSV generation process, ensure proper escaping of quotes and consistent line endings.\")\n",
        "    print(\"  3. Try using a different text editor to open the CSV file and check for any hidden characters or encoding issues.\")\n",
        "    print(\"  4. If the file is large, consider processing it in smaller chunks to identify the specific area causing the problem.\")\n",
        "# escapechar is used to escape special characters (like quotes) within the fields.\n",
        "# Using backslash here is a common choice."
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "df = df.loc[:, ~df.columns.str.contains('^Unnamed')]"
      ],
      "metadata": {
        "id": "ONTOsvE2P2hT"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(df.head())"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0ICHZF9HP4vp",
        "outputId": "4fdf71c5-22f2-44c7-b559-8f40b5d8b75b"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "    NCT Number                                        Study Title  \\\n",
            "0  NCT04841499  Effects of a Seven-day BASIS™ Supplementation ...   \n",
            "1  NCT03020641          Peritoneal Damage in Laparoscopic Surgery   \n",
            "2  NCT03727620  Doxycycline in the Treatment of Aggressive Per...   \n",
            "3  NCT03162926  A Safety and Tolerability Study of VC-02™ Comb...   \n",
            "4  NCT04434313  Treatment of Hemiparetic Gait Impairments Usin...   \n",
            "\n",
            "                                      Study URL Acronym Study Status  \\\n",
            "0  https://clinicaltrials.gov/study/NCT04841499     NaN    COMPLETED   \n",
            "1  https://clinicaltrials.gov/study/NCT03020641     NaN    COMPLETED   \n",
            "2  https://clinicaltrials.gov/study/NCT03727620     NaN    COMPLETED   \n",
            "3  https://clinicaltrials.gov/study/NCT03162926     NaN    COMPLETED   \n",
            "4  https://clinicaltrials.gov/study/NCT04434313     NaN    COMPLETED   \n",
            "\n",
            "                                       Brief Summary Study Results  \\\n",
            "0  The purpose of this study is to determine whet...            NO   \n",
            "1  The investigators hypothesized that applying a...           YES   \n",
            "2  The aim of the study was to compare the clinic...            NO   \n",
            "3  The purpose of this trial is to test if VC-02™...            NO   \n",
            "4  The objective of this research is to investiga...            NO   \n",
            "\n",
            "                                          Conditions  \\\n",
            "0                                          Menopause   \n",
            "1                                  Peritoneal Damage   \n",
            "2                           Aggressive Periodontitis   \n",
            "3                           Type 1 Diabetes Mellitus   \n",
            "4  Telemedicine|Gait, Hemiplegic|Gait Disorders, ...   \n",
            "\n",
            "                                       Interventions  \\\n",
            "0  DRUG: BASIS™ (Crystalline Nicotinamide Ribosid...   \n",
            "1  PROCEDURE: Low pressure pneumoperitoneum|PROCE...   \n",
            "2  DRUG: amoxicillin plus metronidazole|DRUG: Dox...   \n",
            "3  COMBINATION_PRODUCT: VC-02 Combination Product...   \n",
            "4  DEVICE: Delivery of iStride™ device gait treat...   \n",
            "\n",
            "                            Primary Outcome Measures  ...                 Age  \\\n",
            "0  Production of Estradiol, To determine whether ...  ...  ADULT, OLDER_ADULT   \n",
            "1  Inflammatory Peritoneal Markers, logaritmic le...  ...  ADULT, OLDER_ADULT   \n",
            "2  Decrease of periodontal pockets ≥ 4mm, • Probi...  ...        CHILD, ADULT   \n",
            "3  Incidence of all adverse events reported for s...  ...  ADULT, OLDER_ADULT   \n",
            "4  Feasibility of safely implementing the treatme...  ...  ADULT, OLDER_ADULT   \n",
            "\n",
            "          Phases Enrollment Funder Type      Study Type  \\\n",
            "0            NaN         40       OTHER  INTERVENTIONAL   \n",
            "1            NaN        100       OTHER  INTERVENTIONAL   \n",
            "2  PHASE1|PHASE2         24       OTHER  INTERVENTIONAL   \n",
            "3         PHASE1          3    INDUSTRY  INTERVENTIONAL   \n",
            "4            NaN          6    INDUSTRY  INTERVENTIONAL   \n",
            "\n",
            "                                        Study Design            Other IDs  \\\n",
            "0  Allocation: NA|Intervention Model: SINGLE_GROU...           USAH-EH301   \n",
            "1  Allocation: RANDOMIZED|Intervention Model: PAR...          A-CGyD-2017   \n",
            "2  Allocation: NON_RANDOMIZED|Intervention Model:...            DOXYAPG18   \n",
            "3  Allocation: NA|Intervention Model: SINGLE_GROU...             VC02-102   \n",
            "4  Allocation: NA|Intervention Model: SINGLE_GROU...  MOT-TELE-2020-04-00   \n",
            "\n",
            "                                           Locations  \\\n",
            "0  University of South Alabama, Mobile, Alabama, ...   \n",
            "1       Ramon y Cajal Hospital, Madrid, 28034, Spain   \n",
            "2                  BENRACHADI Latifa, Rabat, Morocco   \n",
            "3   University of Alberta, Edmonton, Alberta, Canada   \n",
            "4  Moterum Technologies, Inc. (study location: ho...   \n",
            "\n",
            "                                     Study Documents Time taken for Enrollment  \n",
            "0                                                NaN                         3  \n",
            "1  Study Protocol and Statistical Analysis Plan, ...                        27  \n",
            "2                                                NaN                         5  \n",
            "3                                                NaN                         7  \n",
            "4                                                NaN                         8  \n",
            "\n",
            "[5 rows x 25 columns]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "df = df.drop(df.columns[0], axis=1)"
      ],
      "metadata": {
        "id": "k-Mb2MQbP60s"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(df.dtypes)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "FKeOAM3tP9-M",
        "outputId": "eca2d10b-a590-4ecf-e8a6-17816e8eace6"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Study Title                   object\n",
            "Study URL                     object\n",
            "Acronym                       object\n",
            "Study Status                  object\n",
            "Brief Summary                 object\n",
            "Study Results                 object\n",
            "Conditions                    object\n",
            "Interventions                 object\n",
            "Primary Outcome Measures      object\n",
            "Secondary Outcome Measures    object\n",
            "Other Outcome Measures        object\n",
            "Sponsor                       object\n",
            "Collaborators                 object\n",
            "Sex                           object\n",
            "Age                           object\n",
            "Phases                        object\n",
            "Enrollment                    object\n",
            "Funder Type                   object\n",
            "Study Type                    object\n",
            "Study Design                  object\n",
            "Other IDs                     object\n",
            "Locations                     object\n",
            "Study Documents               object\n",
            "Time taken for Enrollment     object\n",
            "dtype: object\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import re\n",
        "from nltk.corpus import stopwords\n",
        "from nltk.tokenize import word_tokenize\n",
        "import nltk\n",
        "\n",
        "# Download necessary NLTK data\n",
        "nltk.download('stopwords')\n",
        "nltk.download('punkt')\n",
        "nltk.download('punkt_tab') # Download punkt_tab data\n",
        "\n",
        "# Define the columns to process\n",
        "text_columns = [\n",
        "    'Study Title', 'Study Status', 'Brief Summary', 'Study Results',\n",
        "    'Conditions', 'Interventions', 'Primary Outcome Measures',\n",
        "    'Funder Type', 'Study Type', 'Study Design', 'Locations'\n",
        "]\n",
        "\n",
        "# Define a function to preprocess text (remove prepositions and stopwords)\n",
        "def preprocess_text(text):\n",
        "    if pd.isnull(text):\n",
        "        return text  # Skip processing for NaN values\n",
        "    # Tokenize and remove punctuation\n",
        "    words = word_tokenize(re.sub(r'[^\\w\\s]', '', text.lower()))\n",
        "    # Remove stopwords (including prepositions)\n",
        "    filtered_words = [word for word in words if word not in stopwords.words('english')]\n",
        "    return ' '.join(filtered_words)\n",
        "\n",
        "# Apply preprocessing to specified columns\n",
        "for column in text_columns:\n",
        "    if column in df.columns:\n",
        "        df[column] = df[column].apply(preprocess_text)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "EK48M-dFQBJW",
        "outputId": "7f1601b1-da77-474b-efc1-9ea5b28607dc"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "[nltk_data] Downloading package stopwords to /root/nltk_data...\n",
            "[nltk_data]   Unzipping corpora/stopwords.zip.\n",
            "[nltk_data] Downloading package punkt to /root/nltk_data...\n",
            "[nltk_data]   Unzipping tokenizers/punkt.zip.\n",
            "[nltk_data] Downloading package punkt_tab to /root/nltk_data...\n",
            "[nltk_data]   Unzipping tokenizers/punkt_tab.zip.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(df.head)"
      ],
      "metadata": {
        "id": "oizcbyiPQE-Q",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "52cd4dd2-688f-42f9-d44a-41c064365da0"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "<bound method NDFrame.head of                                             Study Title  \\\n",
            "0     effects sevenday basis supplementation menopau...   \n",
            "1                peritoneal damage laparoscopic surgery   \n",
            "2        doxycycline treatment aggressive periodontitis   \n",
            "3     safety tolerability study vc02 combination pro...   \n",
            "4     treatment hemiparetic gait impairments using t...   \n",
            "...                                                 ...   \n",
            "3098  comparative effectiveness costeffectiveness ch...   \n",
            "3099  impact intestinal microbiota treatment ceftria...   \n",
            "3100                               mental balance study   \n",
            "3101       glymphatic kinetics healthy adult volunteers   \n",
            "3102  utilizing mychart assess effectiveness interve...   \n",
            "\n",
            "                                         Study URL    Acronym Study Status  \\\n",
            "0     https://clinicaltrials.gov/study/NCT04841499        NaN    completed   \n",
            "1     https://clinicaltrials.gov/study/NCT03020641        NaN    completed   \n",
            "2     https://clinicaltrials.gov/study/NCT03727620        NaN    completed   \n",
            "3     https://clinicaltrials.gov/study/NCT03162926        NaN    completed   \n",
            "4     https://clinicaltrials.gov/study/NCT04434313        NaN    completed   \n",
            "...                                            ...        ...          ...   \n",
            "3098  https://clinicaltrials.gov/study/NCT03294785        NaN    completed   \n",
            "3099  https://clinicaltrials.gov/study/NCT03179384  CEFIMPACT    completed   \n",
            "3100  https://clinicaltrials.gov/study/NCT05757050        NaN    completed   \n",
            "3101  https://clinicaltrials.gov/study/NCT03218111        NaN    completed   \n",
            "3102  https://clinicaltrials.gov/study/NCT05222464        NaN    completed   \n",
            "\n",
            "                                          Brief Summary Study Results  \\\n",
            "0     purpose study determine whether short suppleme...                 \n",
            "1     investigators hypothesized applying low intrap...           yes   \n",
            "2     aim study compare clinical effects systemic us...                 \n",
            "3     purpose trial test vc02 combination product im...                 \n",
            "4     objective research investigate feasibility del...                 \n",
            "...                                                 ...           ...   \n",
            "3098  multicenter randomized controlled trial assess...                 \n",
            "3099  acute pyelonephritis apn corresponds infection...                 \n",
            "3100  proposed design randomised doubleblind control...                 \n",
            "3101  study done order see gadoliniumbased mri contr...                 \n",
            "3102  vasomotor symptoms vms common consequence syst...                 \n",
            "\n",
            "                                             Conditions  \\\n",
            "0                                             menopause   \n",
            "1                                     peritoneal damage   \n",
            "2                              aggressive periodontitis   \n",
            "3                              type 1 diabetes mellitus   \n",
            "4     telemedicinegait hemiplegicgait disorders neur...   \n",
            "...                                                 ...   \n",
            "3098                                  chronic neck pain   \n",
            "3099                               pyelonephritis acute   \n",
            "3100        mental health wellness 1work related stress   \n",
            "3101                                            healthy   \n",
            "3102                                      breast cancer   \n",
            "\n",
            "                                          Interventions  \\\n",
            "0     drug basis crystalline nicotinamide riboside 2...   \n",
            "1     procedure low pressure pneumoperitoneumprocedu...   \n",
            "2     drug amoxicillin plus metronidazoledrug doxycy...   \n",
            "3     combination_product vc02 combination product a...   \n",
            "4     device delivery istride device gait treatment ...   \n",
            "...                                                 ...   \n",
            "3098  procedure chuna manual therapydrug conventiona...   \n",
            "3099                                   drug ceftriaxone   \n",
            "3100  dietary_supplement refocus verum tabletsdietar...   \n",
            "3101                         mr imagingother ctguidance   \n",
            "3102                           standard care treatments   \n",
            "\n",
            "                               Primary Outcome Measures  \\\n",
            "0     production estradiol determine whether short s...   \n",
            "1     inflammatory peritoneal markers logaritmic lev...   \n",
            "2     decrease periodontal pockets 4mm probing pocke...   \n",
            "3     incidence adverse events reported subjects thr...   \n",
            "4     feasibility safely implementing treatment prot...   \n",
            "...                                                 ...   \n",
            "3098  difference visual analogue scale vas neck pain...   \n",
            "3099  emergence ceftriaxoneresistant enterobacteriac...   \n",
            "3100  change cognitive function cognitive domain fac...   \n",
            "3101  drug distribution time drug distribution gadol...   \n",
            "3102  patient engagement mychart accessibility user ...   \n",
            "\n",
            "                             Secondary Outcome Measures  ...  \\\n",
            "0                                                   NaN  ...   \n",
            "1                                                   NaN  ...   \n",
            "2     Plaque index decrease, Plaque index was assess...  ...   \n",
            "3                                                   NaN  ...   \n",
            "4     Feasibility of screening criteria, To enroll p...  ...   \n",
            "...                                                 ...  ...   \n",
            "3098  Difference between visual analogue scale (VAS)...  ...   \n",
            "3099                                                NaN  ...   \n",
            "3100  Profile of Mood States (POMS), 35-item measure...  ...   \n",
            "3101                                                NaN  ...   \n",
            "3102  Hot Flash Severity (MyChart Feasibility), Hot ...  ...   \n",
            "\n",
            "                     Age         Phases Enrollment Funder Type  \\\n",
            "0     ADULT, OLDER_ADULT            NaN         40               \n",
            "1     ADULT, OLDER_ADULT            NaN        100               \n",
            "2           CHILD, ADULT  PHASE1|PHASE2         24               \n",
            "3     ADULT, OLDER_ADULT         PHASE1          3    industry   \n",
            "4     ADULT, OLDER_ADULT            NaN          6    industry   \n",
            "...                  ...            ...        ...         ...   \n",
            "3098               ADULT            NaN        108               \n",
            "3099  ADULT, OLDER_ADULT         PHASE4          9               \n",
            "3100  ADULT, OLDER_ADULT            NaN         36    industry   \n",
            "3101  ADULT, OLDER_ADULT            NaN         19               \n",
            "3102  ADULT, OLDER_ADULT         PHASE4         56               \n",
            "\n",
            "          Study Type                                       Study Design  \\\n",
            "0     interventional  allocation naintervention model single_groupma...   \n",
            "1     interventional  allocation randomizedintervention model parall...   \n",
            "2     interventional  allocation non_randomizedintervention model pa...   \n",
            "3     interventional  allocation naintervention model single_groupma...   \n",
            "4     interventional  allocation naintervention model single_groupma...   \n",
            "...              ...                                                ...   \n",
            "3098  interventional  allocation randomizedintervention model parall...   \n",
            "3099  interventional  allocation naintervention model single_groupma...   \n",
            "3100  interventional  allocation randomizedintervention model crosso...   \n",
            "3101  interventional  allocation naintervention model single_groupma...   \n",
            "3102  interventional  allocation naintervention model single_groupma...   \n",
            "\n",
            "                    Other IDs  \\\n",
            "0                  USAH-EH301   \n",
            "1                 A-CGyD-2017   \n",
            "2                   DOXYAPG18   \n",
            "3                    VC02-102   \n",
            "4         MOT-TELE-2020-04-00   \n",
            "...                       ...   \n",
            "3098            JS-CT-2016-14   \n",
            "3099                16-AOI-02   \n",
            "3100              5'000'750-1   \n",
            "3101               1609017536   \n",
            "3102  REaCT-Hot Flashes Pilot   \n",
            "\n",
            "                                              Locations  \\\n",
            "0     university south alabama mobile alabama 36604 ...   \n",
            "1               ramon cajal hospital madrid 28034 spain   \n",
            "2                       benrachadi latifa rabat morocco   \n",
            "3            university alberta edmonton alberta canada   \n",
            "4     moterum technologies inc study location homes ...   \n",
            "...                                                 ...   \n",
            "3098  bucheon jaseng hospital korean medicine bucheo...   \n",
            "3099                      chu de nice nice 06003 france   \n",
            "3100  northumbria university newcastle upon tyne tyn...   \n",
            "3101  weill cornell medical college new york new yor...   \n",
            "3102  ottawa hospital cancer centre ottawa ontario c...   \n",
            "\n",
            "                                        Study Documents  \\\n",
            "0                                                   NaN   \n",
            "1     Study Protocol and Statistical Analysis Plan, ...   \n",
            "2                                                   NaN   \n",
            "3                                                   NaN   \n",
            "4                                                   NaN   \n",
            "...                                                 ...   \n",
            "3098                                                NaN   \n",
            "3099                                                NaN   \n",
            "3100                                                NaN   \n",
            "3101                                                NaN   \n",
            "3102                                                NaN   \n",
            "\n",
            "     Time taken for Enrollment  \n",
            "0                            3  \n",
            "1                           27  \n",
            "2                            5  \n",
            "3                            7  \n",
            "4                            8  \n",
            "...                        ...  \n",
            "3098                        10  \n",
            "3099                        20  \n",
            "3100                         6  \n",
            "3101                        12  \n",
            "3102                         5  \n",
            "\n",
            "[3103 rows x 24 columns]>\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import nltk\n",
        "nltk.download('wordnet') # Download the wordnet dataset\n",
        "\n",
        "from nltk.corpus import wordnet\n",
        "\n",
        "# ... (Rest of your code)\n",
        "\n",
        "# Function to expand synonyms for a given word\n",
        "def get_synonyms(word):\n",
        "    synonyms = set()\n",
        "    for syn in wordnet.synsets(word):\n",
        "        for lemma in syn.lemmas():\n",
        "            synonyms.add(lemma.name().replace('_', ' '))\n",
        "    return list(synonyms)\n",
        "\n",
        "# Function to expand synonyms in a text\n",
        "def synonym_expansion(text):\n",
        "    if pd.isnull(text):\n",
        "        return text  # Skip processing for NaN values\n",
        "    words = text.split()  # Split the cleaned text into words\n",
        "    expanded_text = []\n",
        "    for word in words:\n",
        "        expanded_text.append(word)  # Add the original word\n",
        "        expanded_text.extend(get_synonyms(word))  # Add synonyms\n",
        "    return ' '.join(set(expanded_text))  # Deduplicate and join back to a string\n",
        "\n",
        "# Apply synonym expansion to the same text columns\n",
        "for column in text_columns:\n",
        "    if column in df.columns:\n",
        "        df[column] = df[column].apply(synonym_expansion)\n",
        "\n",
        "\n"
      ],
      "metadata": {
        "id": "VxCT0bvfQJF6",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "8997c388-c278-40cb-9d6a-557b1fcea3a6"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "[nltk_data] Downloading package wordnet to /root/nltk_data...\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.preprocessing import LabelEncoder\n",
        "\n",
        "# List of columns to label encode\n",
        "label_columns = ['Sex', 'Age', 'Phases', 'Enrollment']\n",
        "\n",
        "# Initialize a dictionary to store encoders for each column (optional: for inverse transformations later)\n",
        "label_encoders = {}\n",
        "\n",
        "# Apply label encoding to each specified column\n",
        "for column in label_columns:\n",
        "    if column in df.columns:\n",
        "        le = LabelEncoder()\n",
        "        df[column] = le.fit_transform(df[column].astype(str))  # Ensure all data is treated as string\n",
        "        label_encoders[column] = le"
      ],
      "metadata": {
        "id": "tBlxiVGRQMwy"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "columns_to_check = [\n",
        "    'Sex', 'Age', 'Phases', 'Enrollment', 'Study Title', 'Study Status', 'Brief Summary',\n",
        "    'Study Results', 'Conditions', 'Interventions', 'Primary Outcome Measures',\n",
        "    'Funder Type', 'Study Type', 'Study Design', 'Locations', 'Time taken for Enrollment'\n",
        "]\n",
        "\n",
        "# Filter rows where all specified columns have non-null values\n",
        "filtered_df = df.dropna(subset=columns_to_check)\n",
        "\n",
        "# Select the top 1000 rows\n",
        "top_1000_rows = filtered_df.head(1000)"
      ],
      "metadata": {
        "id": "LFnloowZQPqa"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from transformers import AutoTokenizer, AutoModel\n",
        "import torch\n",
        "\n",
        "# Load the PubMedBERT model and tokenizer\n",
        "model_name = \"microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext\"\n",
        "tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
        "model = AutoModel.from_pretrained(model_name)\n",
        "\n",
        "# Function to generate embeddings\n",
        "def generate_embedding(text, tokenizer, model):\n",
        "    if pd.isna(text) or text.strip() == \"\":  # Handle empty or NaN values\n",
        "        return torch.zeros(768).tolist()  # Return a zero vector if the text is empty\n",
        "    inputs = tokenizer(text, return_tensors=\"pt\", truncation=True, max_length=512, padding=True)\n",
        "    with torch.no_grad():\n",
        "        outputs = model(**inputs)\n",
        "    return outputs.last_hidden_state.mean(dim=1).squeeze().tolist()  # Mean pooling of embeddings\n",
        "\n",
        "# Columns to process\n",
        "text_columns = [\n",
        "    'Study Title', 'Study Status', 'Brief Summary', 'Study Results',\n",
        "    'Conditions', 'Interventions', 'Primary Outcome Measures',\n",
        "    'Funder Type', 'Study Type', 'Study Design', 'Locations'\n",
        "]\n",
        "\n",
        "# Generate embeddings for each column using PubMedBERT\n",
        "for col in text_columns:\n",
        "    print(f\"Generating embeddings for column: {col} using PubMedBERT\")\n",
        "    top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n",
        "        lambda x: generate_embedding(x, tokenizer, model)\n",
        "    )\n"
      ],
      "metadata": {
        "id": "WB6AGY7uQSIR",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000,
          "referenced_widgets": [
            "e41925970dc94c2aa90b4da8acac85cf",
            "c1f0f99a4a4341d18e0039a71b305111",
            "d54d01c91e694b3eb180170cddd1211c",
            "3c707baf63cf4cbf9732e39ddeb84c7c",
            "08955c157996426eaa089d878b8d820f",
            "da9c8ff09bed4c6989b0246c7bdc8fd7",
            "b78266bbcc0e4ed0bcaab9009b30d98e",
            "2fd8c28ebf1b47f78e2e0093608407cf",
            "8c728d06a0814cc8b83931b24f0115d9",
            "da4b0713ce9f47208a39ec89515c30e4",
            "b2fd795e6a534319a87213f05e824315",
            "0722a8ceb94345a79e5bdc3b84f71d7f",
            "7c04cff87d1041b1878488f5014f9b7c",
            "0ef4539514a1462caacf58e5c3fa516b",
            "4c61a2b37c4c4ffbb3a10d270140724f",
            "d1288d4268e74bd384064c4f2cfbfa7b",
            "1c84ce5cb56a4c7286c0f5981b8fbd5a",
            "61a01f78b9714e4aa0d869d8e6563e81",
            "180753d93be944e98c47bba836397ba0",
            "db137743dfc24b6b84c6c15bcd5b5766",
            "16f88feb88fc43b5b381521d91b02150",
            "9b2a4006744a4940aa64fd9e41d62d4e",
            "d55048b2772b47eab27637e9aa42d4dc",
            "a70574b040b14832abb25d2eb040fb0a",
            "e5c3bf5ade9a405094a1673bc2beb795",
            "3d7c0e5ba179442eb417435ff72ae85a",
            "b8aea249ccf04a619c1e926e7b6b6bbe",
            "73554830b9524f1b8b8714ff33c3b8e8",
            "15bf509be6d946e187e14fd6854950a9",
            "65855073adcd4434b8e9af65ecc59915",
            "f3485f93a7374df49cc200d18e9ac49e",
            "53d6422031bf48dab34a3b47e237da93",
            "1ebb572142e8490199aa8ffce39df341",
            "efe460065f0448acbf75200543187bb0",
            "0e6e8bc125874564bb46431ac85524dc",
            "30d5690beb7341dc8b37de5a1e0812ab",
            "e8c76754ea784709bae0c59843c61279",
            "67690c975154491b96ed9091db152a0f",
            "74bbdf59962d41059f018e6eab297968",
            "2c20eb99653d4026ace81ccbe858b479",
            "183aee869ce34eaca26f1cf533559caa",
            "d4622e6a3301483c91a66836d5724e0e",
            "d9c5d0256f534e4cbd82797e1e9f3ccd",
            "0dc7017260764c9dbdcb9167e7a40b15"
          ]
        },
        "outputId": "4ca695b1-5a35-4c3d-d856-5e6450e388a2"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: \n",
            "The secret `HF_TOKEN` does not exist in your Colab secrets.\n",
            "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n",
            "You will be able to reuse this secret in all of your notebooks.\n",
            "Please note that authentication is recommended but still optional to access public models or datasets.\n",
            "  warnings.warn(\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "tokenizer_config.json:   0%|          | 0.00/28.0 [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "e41925970dc94c2aa90b4da8acac85cf"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "config.json:   0%|          | 0.00/385 [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "0722a8ceb94345a79e5bdc3b84f71d7f"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "vocab.txt:   0%|          | 0.00/226k [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "d55048b2772b47eab27637e9aa42d4dc"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "pytorch_model.bin:   0%|          | 0.00/440M [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "efe460065f0448acbf75200543187bb0"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Study Title using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Study Status using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Brief Summary using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Study Results using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Conditions using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Interventions using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Primary Outcome Measures using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Funder Type using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Study Type using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Study Design using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Generating embeddings for column: Locations using PubMedBERT\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-11-7092d7125584>:28: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"{col}_embedding\"] = top_1000_rows[col].apply(\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install umap-learn"
      ],
      "metadata": {
        "id": "gfPr4CcMQWMx",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "094e9427-18ef-40b5-a216-afd5416b4b69"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting umap-learn\n",
            "  Downloading umap_learn-0.5.7-py3-none-any.whl.metadata (21 kB)\n",
            "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from umap-learn) (1.26.4)\n",
            "Requirement already satisfied: scipy>=1.3.1 in /usr/local/lib/python3.10/dist-packages (from umap-learn) (1.13.1)\n",
            "Requirement already satisfied: scikit-learn>=0.22 in /usr/local/lib/python3.10/dist-packages (from umap-learn) (1.6.0)\n",
            "Requirement already satisfied: numba>=0.51.2 in /usr/local/lib/python3.10/dist-packages (from umap-learn) (0.60.0)\n",
            "Collecting pynndescent>=0.5 (from umap-learn)\n",
            "  Downloading pynndescent-0.5.13-py3-none-any.whl.metadata (6.8 kB)\n",
            "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from umap-learn) (4.67.1)\n",
            "Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba>=0.51.2->umap-learn) (0.43.0)\n",
            "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.10/dist-packages (from pynndescent>=0.5->umap-learn) (1.4.2)\n",
            "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.22->umap-learn) (3.5.0)\n",
            "Downloading umap_learn-0.5.7-py3-none-any.whl (88 kB)\n",
            "\u001b[?25l   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/88.8 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m88.8/88.8 kB\u001b[0m \u001b[31m3.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading pynndescent-0.5.13-py3-none-any.whl (56 kB)\n",
            "\u001b[?25l   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/56.9 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.9/56.9 kB\u001b[0m \u001b[31m4.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hInstalling collected packages: pynndescent, umap-learn\n",
            "Successfully installed pynndescent-0.5.13 umap-learn-0.5.7\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.manifold import TSNE\n",
        "import umap\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn.metrics import pairwise_distances\n",
        "import numpy as np\n",
        "\n",
        "# Combine all embedding columns into a single DataFrame\n",
        "embedding_columns = [f\"{col}_embedding\" for col in [\n",
        "    'Study Title', 'Study Status', 'Brief Summary', 'Study Results',\n",
        "    'Conditions', 'Interventions', 'Primary Outcome Measures',\n",
        "    'Funder Type', 'Study Type', 'Study Design', 'Locations'\n",
        "]]\n",
        "\n",
        "# Flatten embeddings into a single numpy array\n",
        "embedding_data = np.vstack(\n",
        "    top_1000_rows[embedding_columns].apply(\n",
        "        lambda row: np.concatenate(row.values), axis=1\n",
        "    )\n",
        ")\n",
        "\n",
        "# Use pairwise distances for elbow method\n",
        "distances = pairwise_distances(embedding_data, metric='euclidean')\n",
        "\n",
        "# Find optimal dimensions for UMAP using the elbow method\n",
        "inertia = []\n",
        "dimensions = range(2, 50)  # Test dimensions from 2 to 50\n",
        "for dim in dimensions:\n",
        "    umap_reducer = umap.UMAP(n_components=dim, random_state=42)\n",
        "    transformed = umap_reducer.fit_transform(embedding_data)\n",
        "    inertia.append(np.sum(np.var(transformed, axis=0)))  # Variance in reduced dimensions\n",
        "\n",
        "# Plot the elbow curve\n",
        "plt.figure(figsize=(8, 5))\n",
        "plt.plot(dimensions, inertia, marker='o')\n",
        "plt.title(\"Elbow Method for UMAP Dimension Reduction\")\n",
        "plt.xlabel(\"Number of Components\")\n",
        "plt.ylabel(\"Sum of Variance\")\n",
        "plt.grid()\n",
        "plt.show()"
      ],
      "metadata": {
        "id": "g6Jg9xf1Vq8B",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "outputId": "1409e037-88f0-4038-d687-3ead90037e6a"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x500 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAArcAAAHWCAYAAABt3aEVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAADUn0lEQVR4nOydd5wU9f3/X7P9ej+uAEeVXgRFUBBQUECxRGNXjEZjj2KMGmOQaKIYS772hF+MRiyJsUQUURQUVAQVAelwHAccV7jbq9vL/P6Y/czu3m2ZnZ3dnb17Px8PEm/rbJt5z+vzer/eHM/zPAiCIAiCIAiiF6BJ9QYQBEEQBEEQhFJQcUsQBEEQBEH0Gqi4JQiCIAiCIHoNVNwSBEEQBEEQvQYqbgmCIAiCIIheAxW3BEEQBEEQRK+BiluCIAiCIAii10DFLUEQBEEQBNFroOKWIAiCIAiC6DVQcUsQIeA4Dg899JD490MPPQSO49Dc3Jy6jVIpgwYNwrnnnpvw5/niiy/AcRy++OKLqLf97rvvcOqppyIrKwscx2Hr1q0J3z6i5+8mXbn22msxaNCgVG9GQjl06BA4jsMrr7yS9Od+5ZVXwHEcDh06lPTnJvoGVNwSfQa2Qw3379tvv031Jspm0KBB4DgOc+bMCXn98uXLxdf5/fffx/z4u3btwkMPPZQWByOXy4Wf//znMJvNePrpp/Haa6+hqqoqYc/Hvlfh3tdzzz23R6HEPotf/vKXIe/zwAMPiLcJd0J1ySWXgOM43HvvvSGvZycD7J9er8eQIUNwzTXX4ODBg1FfF/tOcRwHjUaD/Px8jBs3DjfeeCM2bdoU9f5E7LCCM/B9LywsxPz587Fx48ZUb17M/PnPf8b777+f6s0g+iC6VG8AQSSbP/7xjxg8eHCPy4cNG5aCrVEOk8mEdevWoaGhAWVlZUHXvf766zCZTLDb7bIee9euXVi6dClmzZqlekWruroatbW1WL58edjiUQ2YTCa88847eOGFF2AwGIKue/PNNyN+Xh0dHVi5ciUGDRqEN998E4899hg4jgt52zvuuAMnn3wyXC4XtmzZgr///e/46KOP8NNPP6GioiLiNk6cOBF33303AKCzsxO7d+/G22+/jeXLl+Ouu+7CU089FXR7m80GnS79DyvLly+H1+tN2fNffvnlWLBgATweD/bt24cXXngBs2fPxnfffYdx48albLti5c9//jMuvvhiXHDBBUGXX3311bjssstgNBpTs2FEryf990IEESPz58/HSSedlOrNUJzTTjsN3333Hf7973/j17/+tXj50aNHsWHDBlx44YV45513UriFyaGpqQkAkJ+fr9hjWiwWZGVlKfZ4ADBv3jx88MEH+Pjjj3H++eeLl3/zzTeoqanBRRddFPbzeuedd+DxePDyyy/jjDPOwPr16zFz5syQt50xYwYuvvhiAMAvfvELnHDCCbjjjjvw6quv4v7774+4jZWVlbjqqquCLlu2bBmuuOIKPP300xg+fDhuvvlm8TqTySTptasdvV6f0uefNGlS0Ps+Y8YMzJ8/Hy+++CJeeOGFFG6ZMmi1Wmi12lRvBtGLIVsCQcRAc3MzLrnkEuTm5qKoqAi//vWve6hrbrcbDz/8MIYOHQqj0YhBgwbhd7/7HRwOh3ibxYsXo6ioCDzPi5fdfvvt4DgOzzzzjHhZY2MjOI7Diy++GHXbTCYTfvazn+GNN94IuvzNN99EQUEBzj777JD327NnDy6++GIUFhbCZDLhpJNOwgcffCBe/8orr+DnP/85AGD27Nnikml37+tXX32FKVOmwGQyYciQIfjXv/7V47kOHjyIn//85ygsLERmZiamTp2Kjz76qMftjh49igsuuABZWVkoLS3FXXfdFfT+hePaa68Vi7yf//zn4DgOs2bNEq9fu3YtZsyYgaysLOTn5+P888/H7t27gx6D+at37dqFK664AgUFBZg+fXrU546VyspKnH766T0+r9dffx3jxo3D2LFjw9739ddfx9y5czF79myMGjUKr7/+uuTnPeOMMwAANTU1srY7IyMDr732GgoLC/GnP/0p6Dsczqu+b98+XHXVVcjLy0NJSQkefPBB8DyPI0eO4Pzzz0dubi7Kysrw5JNP9ng+h8OBJUuWYNiwYTAajRgwYAB++9vf9vg+cByH2267De+//z7Gjh0Lo9GIMWPGYPXq1UG36+zsxJ133olBgwbBaDSitLQUc+fOxZYtW8TbhPLcWiwW3H333RgwYACMRiNGjBiBJ554Iuj1x7IdsTBjxgwAwqpEIG1tbbjzzjvFbRo2bBiWLVvWQ3Vua2vDtddei7y8POTn52PRokVoa2vr8TyzZs0K+r0wQr0fXq8X//d//4dx48bBZDKhpKQE8+bNE+05HMfBYrHg1VdfFfcZ1157LYDwntsXXngBY8aMgdFoREVFBW699dYe2zlr1iyMHTsWu3btwuzZs5GZmYnKyko8/vjjkd9Eok9BxS3R52hvb0dzc3PQv5aWFkn3veSSS2C32/Hoo49iwYIFeOaZZ3DjjTcG3eaXv/wl/vCHP2DSpEl4+umnMXPmTDz66KO47LLLxNvMmDEDZrMZO3fuFC/bsGEDNBoNNmzYEHQZAJx++umStu+KK67A5s2bgw6Cb7zxBi6++OKQatTOnTsxdepU7N69G/fddx+efPJJZGVl4YILLsB7770nPvcdd9wBAPjd736H1157Da+99hpGjRolPs6BAwdw8cUXY+7cuXjyySdRUFCAa6+9Nuj1NTY24tRTT8Unn3yCW265BX/6059gt9tx3nnnic8FCEvbZ555Jj755BPcdttteOCBB7Bhwwb89re/jfr6f/WrX+F3v/sdAGE5/rXXXsMDDzwAAPjss89w9tlno6mpCQ899BAWL16Mb775BqeddlpIL/HPf/5zWK1W/PnPf8YNN9wQ9bnlcMUVV2DlypXo6uoCIJwYvf3227jiiivC3ufYsWNYt24dLr/8cgDCEvZ///tfOJ1OSc/JvhtFRUWytzs7OxsXXngh6urqsGvXrqi3v/TSS+H1evHYY4/hlFNOwSOPPIK//vWvmDt3LiorK7Fs2TIMGzYMv/nNb7B+/Xrxfl6vF+eddx6eeOIJLFy4EM8++ywuuOACPP3007j00kt7PM9XX32FW265BZdddhkef/xx2O12XHTRRUG/75tuugkvvvgiLrroIrzwwgv4zW9+g4yMjB4nOYHwPI/zzjsPTz/9NObNm4ennnoKI0aMwD333IPFixfL2o5YYN/PgoIC8TKr1YqZM2dixYoVuOaaa/DMM8/gtNNOw/333x+0TTzP4/zzz8drr72Gq666Co888giOHj2KRYsWydoWxvXXXy8W1suWLcN9990Hk8kk9i689tprMBqNmDFjhrjP+NWvfhX28R566CHceuutqKiowJNPPomLLroIf/vb33DWWWfB5XIF3ba1tRXz5s3DhAkT8OSTT2LkyJG499578fHHH8f1moheBE8QfYR//vOfPICQ/4xGY9BtAfBLliwR/16yZAkPgD/vvPOCbnfLLbfwAPht27bxPM/zW7du5QHwv/zlL4Nu95vf/IYHwK9du5bneZ5vamriAfAvvPACz/M839bWxms0Gv7nP/85369fP/F+d9xxB19YWMh7vd6Ir62qqoo/55xzeLfbzZeVlfEPP/wwz/M8v2vXLh4A/+WXX4qv/7vvvhPvd+aZZ/Ljxo3j7Xa7eJnX6+VPPfVUfvjw4eJlb7/9Ng+AX7duXcjnBsCvX79evKypqYk3Go383XffLV5255138gD4DRs2iJd1dnbygwcP5gcNGsR7PB6e53n+r3/9Kw+A/89//iPezmKx8MOGDQu7DYGsW7eOB8C//fbbQZdPnDiRLy0t5VtaWsTLtm3bxms0Gv6aa64RL2Of9eWXXx7xeRih3tdAzjnnHL6qqiroMgD8rbfeypvNZt5gMPCvvfYaz/M8/9FHH/Ecx/GHDh0St+P48eNB933iiSf4jIwMvqOjg+d5nt+3bx8PgH/vvfdCvg8vv/wyf/z4cf7YsWP8Rx99xA8aNIjnOC7s9jLYdyocTz/9NA+A/9///hf0ukL9bm688UbxMrfbzffv35/nOI5/7LHHxMtbW1v5jIwMftGiReJlr732Gq/RaIK+MzzP8y+99BIPgP/666+DnttgMPAHDhwQL9u2bRsPgH/22WfFy/Ly8vhbb7014mtftGhR0Gf2/vvv8wD4Rx55JOh2F198Mc9xXNBzSt2OUNTU1PAA+KVLl/LHjx/nGxoa+A0bNvAnn3xyj+/0ww8/zGdlZfH79u0Leoz77ruP12q1/OHDh4O2/fHHHxdv43a7+RkzZvAA+H/+85/i5TNnzuRnzpwZ9f1Yu3YtD4C/4447etw2cF+VlZUV9Hky2G+mpqaG53lhf2EwGPizzjpL3A/wPM8/99xz4nc4cBsB8P/617/EyxwOB19WVsZfdNFFPZ6L6JuQckv0OZ5//nmsWbMm6J/UM/5bb7016O/bb78dALBq1aqg/++u5rCmHLYEX1JSgpEjR4oq1ddffw2tVot77rkHjY2N2L9/PwBBuZ0+fXrYZqHuaLVaXHLJJXjzzTcBCMvXAwYMEJc1AzGbzVi7di0uueQSdHZ2BqnYZ599Nvbv34+6ujpJzzt69Oig5ygpKcGIESOCuvJXrVqFKVOmBC3xZ2dn48Ybb8ShQ4dEBXDVqlUoLy8XfaIAkJmZ2UMhj4X6+nps3boV1157LQoLC8XLx48fj7lz54qfWyA33XST7OeTSkFBAebNmyd+Xm+88QZOPfXUiOkOr7/+Os455xzk5OQAAIYPH47JkyeHtSZcd911KCkpQUVFBc455xxxqThe33l2djYAYZk/GoGNfVqtFieddBJ4nsf1118vXp6fn9/jO/P2229j1KhRGDlyZNBKC7NWrFu3Luh55syZg6FDh4p/jx8/Hrm5uUGPmZ+fj02bNuHYsWOSX+uqVaug1WrFFQzG3XffDZ7ne+w/pGxHJJYsWYKSkhKUlZVhxowZ2L17N5588smg38Tbb7+NGTNmoKCgIOi9mTNnDjwej7hvWbVqFXQ6XZA3WqvVivsuObzzzjvgOA5LlizpcZ3UfVUgn332GZxOJ+68805oNP6y5IYbbkBubm4P61J2dnaQJ9lgMGDKlCmS31+i90MNZUSfY8qUKbIP7MOHDw/6e+jQodBoNOKyYW1tLTQaTY/khbKyMuTn56O2tla8bMaMGWJRtWHDBpx00kk46aSTUFhYiA0bNqBfv37Ytm1bxCXqUFxxxRV45plnsG3bNrzxxhu47LLLQh5wDhw4AJ7n8eCDD+LBBx8M+VhNTU2orKyM+pwDBw7scVlBQQFaW1vFv2tra3HKKaf0uB2zN9TW1mLs2LGora3FsGHDemzziBEjom5HONj7HuoxRo0ahU8++aRH01ioRA25RDrgX3HFFbj66qtx+PBhvP/++xG9g7t378aPP/6Ia665BgcOHBAvnzVrFp5//nl0dHQgNzc36D5/+MMfMGPGDGi1WhQXF2PUqFGKJBowKwUrsiPR/fuRl5cHk8mE4uLiHpcHLt3v378fu3fvRklJScjHZc2D4Z4H6Pk9fPzxx7Fo0SIMGDAAkydPxoIFC3DNNddgyJAhYbe/trYWFRUVPV5r4Hc31u2IxI033oif//znsNvtWLt2LZ555hl4PJ6g2+zfvx/bt2+P+t7U1taivLxcPBlhxPN7qq6uRkVFRdCJYjyE+30aDAYMGTKkx/vbv3//Hr+pgoICbN++XZHtIdIfKm4JIg7CFS1S1Ivp06dj+fLlOHjwIDZs2IAZM2aA4zhMnz4dGzZsQEVFBbxeb0jVNRKnnHIKhg4dijvvvBM1NTVhi2PWdPKb3/wmbLOZ1Hi0cJ3PfLdmm3QiIyND0u1YQoDNZgt5vdVqjZgicN5558FoNGLRokVwOBy45JJLwt52xYoVAIC77roLd911V4/r33nnHfziF78IumzcuHFh84/jYceOHQCkfUdCfT+kfGe8Xi/GjRvXI3KMMWDAgJgf85JLLsGMGTPw3nvv4dNPP8Vf/vIXLFu2DO+++y7mz58f9bVIId7fw/Dhw8XP7Nxzz4VWq8V9992H2bNniyfmXq8Xc+fODetFP+GEE2Lebo7jQm5j98I61fTG/Q2hLFTcEkQM7N+/P0jRO3DgALxer9hJXFVVBa/Xi/379wc1XDU2NqKtrS1ouZkVrWvWrMF3332H++67D4DQwPXiiy+ioqICWVlZmDx5cszbefnll+ORRx7BqFGjMHHixJC3YUqVXq+PWvzIWWrsTlVVFfbu3dvj8j179ojXs//fsWMHeJ4Pet5Q943lucM9xp49e1BcXCw76ivwsUOdiOzbty9i8kFGRgYuuOACrFixAvPnz++hZjJ4nscbb7yB2bNn45Zbbulx/cMPP4zXX3+9R3GbCLq6uvDee+9hwIABQd9zpRk6dCi2bduGM888U5HvIKO8vBy33HILbrnlFjQ1NWHSpEn405/+FLa4raqqwmeffYbOzs4g9bb7dzdRPPDAA1i+fDl+//vfi6kLQ4cORVdXV9TfblVVFT7//HN0dXUFqbehfgsFBQUhl/a7K6dDhw7FJ598ArPZHFG9lfqZBf6GAhV0p9OJmpqahJycEb0b8twSRAw8//zzQX8/++yzACAeFBcsWAAA+Otf/xp0O6Y8nXPOOeJlgwcPRmVlJZ5++mm4XC6cdtppAISit7q6Gv/9738xdepUWUvIv/zlL7FkyZKQ0UqM0tJSzJo1C3/7299QX1/f4/rjx4+L/80Kv1DxQVJZsGABNm/eHDRpyWKx4O9//zsGDRqE0aNHi7c7duwY/vvf/4q3s1qt+Pvf/y77ucvLyzFx4kS8+uqrQa9hx44d+PTTT8XPTQ6TJ09GaWkp/t//+3894qnef/991NXVRVUEf/Ob32DJkiVh7SGA4Ms+dOgQfvGLX+Diiy/u8e/SSy/FunXrYvKSysFms+Hqq6+G2WwWJ6kliksuuQR1dXVYvnx5yO2wWCwxPZ7H40F7e3vQZaWlpaioqIgYNccGKjz33HNBlz/99NPgOE4xxTcc+fn5+NWvfoVPPvlEHCV9ySWXYOPGjfjkk0963L6trQ1ut1vcdrfbHRQn6PF4xH1XIEOHDsWePXuCfvvbtm3D119/HXS7iy66CDzPY+nSpT0eI1A9zcrKkrTPmDNnDgwGA5555pmg+//jH/9Ae3t70H6TIKRAyi3R5/j4449FxSWQU089NaLvDhCyQc877zzMmzcPGzduxIoVK3DFFVdgwoQJAIAJEyZg0aJF+Pvf/462tjbMnDkTmzdvxquvvooLLrgAs2fPDnq8GTNm4K233sK4cePEmJ9JkyYhKysL+/bti9lvy6iqqgrKGw3H888/j+nTp2PcuHG44YYbMGTIEDQ2NmLjxo04evQotm3bBkCYVKXVarFs2TK0t7fDaDTijDPOQGlpqeRtuu+++/Dmm29i/vz5uOOOO1BYWIhXX30VNTU1eOedd8RGkhtuuAHPPfccrrnmGvzwww8oLy/Ha6+9hszMTFnvBeMvf/kL5s+fj2nTpuH666+HzWbDs88+i7y8PEnvVTgMBgOeeOIJLFq0CCeffDIuvfRSFBUV4ccff8TLL7+M8ePHR22GmzBhgvgdCsfrr78OrVYb9kB/3nnn4YEHHsBbb70VMp5KDnV1daIVoqurC7t27cLbb7+NhoYG3H333RGjnZTg6quvxn/+8x/cdNNNWLduHU477TR4PB7s2bMH//nPf/DJJ5/E5J/v7OxE//79cfHFF2PChAnIzs7GZ599hu+++y7iieDChQsxe/ZsPPDAAzh06BAmTJiATz/9FP/73/9w5513BjWPJYpf//rX+Otf/4rHHnsMb731Fu655x588MEHOPfcc3Httddi8uTJsFgs+Omnn/Df//4Xhw4dQnFxMRYuXIjTTjsN9913Hw4dOoTRo0fj3Xff7VHkA0Lz4VNPPYWzzz4b119/PZqamvDSSy9hzJgx6OjoEG83e/ZsXH311XjmmWewf/9+zJs3D16vFxs2bMDs2bNx2223ARBO/D777DM89dRTqKiowODBg0P67ktKSnD//fdj6dKlmDdvHs477zzs3bsXL7zwAk4++eQeg0QIIiqpiGggiFQQKQoM3SJxECbSaNeuXfzFF1/M5+Tk8AUFBfxtt93G22y2oOdxuVz80qVL+cGDB/N6vZ4fMGAAf//99wfFbTGef/55HgB/8803B10+Z84cHgD/+eefS3pt0WKbAl9/9wio6upq/pprruHLysp4vV7PV1ZW8ueeey7/3//+N+h2y5cv54cMGcJrtdqgSK5wzx0qVqi6upq/+OKL+fz8fN5kMvFTpkzhP/zwwx73ra2t5c877zw+MzOTLy4u5n/961/zq1evjisKjOd5/rPPPuNPO+00PiMjg8/NzeUXLlzI79q1K+g24SK4ovHxxx/zs2fP5nNzc3m9Xs8PHjyYX7x4Md/a2trjtvBFgUUicDucTidfVFTEz5gxI+J9Bg8ezJ944ok8z0d+H6TAIt4A8BzH8bm5ufyYMWP4G264gd+0aVPI+4T73XR/LxctWsRnZWX1uP/MmTP5MWPGBF3mdDr5ZcuW8WPGjOGNRiNfUFDAT548mV+6dCnf3t4e9Nyh3tOqqioxjsrhcPD33HMPP2HCBD4nJ4fPysriJ0yYIEbyBW5f9/i2zs5O/q677uIrKip4vV7PDx8+nP/LX/7SI6ZPynaEg0WB/eUvfwl5/bXXXstrtVoxZqyzs5O///77+WHDhvEGg4EvLi7mTz31VP6JJ57gnU6neL+Wlhb+6quv5nNzc/m8vDz+6quv5n/88cce+z2e5/kVK1bwQ4YM4Q0GAz9x4kT+k08+Cfl+uN1u/i9/+Qs/cuRI3mAw8CUlJfz8+fP5H374QbzNnj17+NNPP53PyMjgAYivv3sUGOO5557jR44cyev1er5fv378zTff3OP3E+o7wvOhPzOi78LxPDmwCYIgCIIgiN4BeW4JgiAIgiCIXgMVtwRBEARBEESvgYpbgiAIgiAIotdAxS1BEARBEATRa6DiliAIgiAIgug1UHFLEARBEARB9BpoiAOEGd3Hjh1DTk5OQqftEARBEARBEPLgeR6dnZ2oqKgQB/+EgopbAMeOHcOAAQNSvRkEQRAEQRBEFI4cOYL+/fuHvZ6KWwA5OTkAhDcrNzcXLpcLn376Kc466yzo9foUbx2hNPT59m7o8+3d0Ofbu6HPt3cT7+fb0dGBAQMGiHVbOKi4BUQrQm5urljcZmZmIjc3l35cvRD6fHs39Pn2bujz7d3Q59u7UerzjWYhpYYygiAIgiAIotdAxS1BEARBEATRa6DiliAIgiAIgug1UHFLEARBEARB9BqouCUIgiAIgiB6DVTcEgRBEARBEL0GKm4JgiAIgiCIXgMVtwRBEARBEESvgYpbgiAIgiAIotdAE8qImPB4eWyuMaOp047SHBOmDC6EVhN5UghBEARBEESyoOKWkMzqHfVYunIX6tvt4mXleSYsWTga88aWp3DLCIIgCIIgBMiWQEhi9Y563LxiS1BhCwAN7XbcvGILVu+oT9GWEQRBEARB+KHiloiKx8tj6cpd4ENcxy5bunIXPN5QtyAIgiAIgkgeVNwSUdlcY+6h2AbCA6hvt2NzjTl5G0UQBEEQBBECKm6JqDR1hi9s5dyOIAiCIAgiUVBxS0SlNMek6O0IgiAIgiASBRW3RFSmDC5EeZ4J4QK/OAipCVMGFyZzswiCIAiCIHpAxS0RFa2Gw5KFo0NexwreJQtHU94tQRAEQRAph4pbQhLzxpbjxasmoSBTH3R5WZ4JL141iXJuCYIgCIJQBTTEgZDMvLHlsDk9uOs/2wAAf7pgLC6bMpAUW4IgCIIgVAMpt0RMONxe8b+HlGRTYUsQBEEQhKqg4paICavTI/63zeVO4ZYQBEEQBEH0hIpbIiZsLn9xa3F4ItySIAiCIAgi+VBxS8SExeFXa21OKm4JgiAIglAXVNwSMRFoS7A6yZZAEARBEIS6oOKWiIlAtdZCyi1BEARBECqDilsiJqwBnluyJRAEQRAEoTaouCViwhZgRbCQLYEgCIIgCJWR0uJ2/fr1WLhwISoqKsBxHN5///2g67u6unDbbbehf//+yMjIwOjRo/HSSy8F3cZut+PWW29FUVERsrOzcdFFF6GxsTGJr6JvERQFRsotQRAEQRAqI6XFrcViwYQJE/D888+HvH7x4sVYvXo1VqxYgd27d+POO+/Ebbfdhg8++EC8zV133YWVK1fi7bffxpdffoljx47hZz/7WbJeQp8juKGMiluCIAiCINRFSsfvzp8/H/Pnzw97/TfffINFixZh1qxZAIAbb7wRf/vb37B582acd955aG9vxz/+8Q+88cYbOOOMMwAA//znPzFq1Ch8++23mDp1ajJeRp/CRmkJBEEQBEGomJQWt9E49dRT8cEHH+C6665DRUUFvvjiC+zbtw9PP/00AOCHH36Ay+XCnDlzxPuMHDkSAwcOxMaNG8MWtw6HAw6HQ/y7o6MDAOByucR/7G8iGIvDFfDf7rR8j+jz7d3Q59u7oc+3d0Ofb+8m3s9X6v1UXdw+++yzuPHGG9G/f3/odDpoNBosX74cp59+OgCgoaEBBoMB+fn5Qffr168fGhoawj7uo48+iqVLl/a4/NNPP0VmZqb495o1a5R5Ib2Iti4tAA4AcKypBatWrUrtBsUBfb69G/p8ezf0+fZu6PPt3cj9fK1Wq6Tbqb64/fbbb/HBBx+gqqoK69evx6233oqKioogtTZW7r//fixevFj8u6OjAwMGDMBZZ52F3NxcuFwurFmzBnPnzoVer1fipfQa7vv+MwBeAIAhMxsLFpyW2g2SAX2+vRv6fHs39Pn2bujz7d3E+/mylfZoqLa4tdls+N3vfof33nsP55xzDgBg/Pjx2Lp1K5544gnMmTMHZWVlcDqdaGtrC1JvGxsbUVZWFvaxjUYjjEZjj8v1en3Qm939776O18vD5vKKf9tc3rR+f+jz7d3Q59u7oc+3d0Ofb+9G7ucr9T6qzbll3leNJngTtVotvF6hwJo8eTL0ej0+//xz8fq9e/fi8OHDmDZtWlK3ty9gdwenI1BaAkEQBEEQaiOlym1XVxcOHDgg/l1TU4OtW7eisLAQAwcOxMyZM3HPPfcgIyMDVVVV+PLLL/Gvf/0LTz31FAAgLy8P119/PRYvXozCwkLk5ubi9ttvx7Rp0ygpIQF0L2YpLYEgCIIgCLWR0uL2+++/x+zZs8W/mQ920aJFeOWVV/DWW2/h/vvvx5VXXgmz2Yyqqir86U9/wk033STe5+mnn4ZGo8FFF10Eh8OBs88+Gy+88ELSX0tfoPvQBrvLC4+Xh1bDpWiLCIIgCIIggklpcTtr1izwPB/2+rKyMvzzn/+M+BgmkwnPP/982EEQhHIw5TbToBX/2+byINuYuq+Rx8tjc40ZTZ12lOaYMGVwIRXbBEEQBNGHUW1DGaE+mA2hINMAm8sGnhcuS1Vxu3pHPZau3IX6drt4WXmeCUsWjsa8seUp2SaCIAiCIFKLahvKCPXB1NosoxaZeq1wmSM1TWWrd9Tj5hVbggpbAGhot+PmFVuwekd9SraLIAiCIIjUQsUtIRlW3GYYdMj0qbWpSEzweHksXbkLoQwt7LKlK3fB4w1veSEIgiAIondCxS0hGWZLyNRrkWnQBl2WTDbXmHsotoHwAOrb7dhcY07eRhEEQRAEoQqouCUkYwtoKMs0pE65beoMX9jKuR1BEARBEL0HKm4JyfhtCYHKbfKL29Ick6K3IwiCIAii90DFLSEZmytQuU2dLWHK4EKU55kQLvCLg5CaMGVwYTI3iyAIgiAIFUDFLSEZ0XNr0KVUudVqOCxZODpkQxkreJcsHE15twRBEATRB6HilpBMsC2BeW5TM4J33thyXHbygB6Xl+WZ8OJVkyjnliAIgiD6KDTEgZAMy7TNSrHnlnHMl5hg0mtgd3lx9uh+eOGqyaTYEgRBEEQfhpRbQjJWV0DOra+4taWouO1yuPFtdQsA4LKTBwIAPDxPhS1BEARB9HGouCUkYxM9t1pk+GwJlhTZEr7afxxOjxdVRZmYeUIJAOBoqy0l20IQBEEQhHqg4paQjDUg5zYrxbaEz3Y3AQDOHNkPlQUZAIC6NipuCYIgCKKvQ8UtIRmxoSxwQpkjNeN31+0Rits5o0pRmS8Ut512NzrsrqRvD0EQBEEQ6oGKW0Iy/gllOn9agiv5xe3WI61osTiRY9Lh5MGFyDLqkJ+pBwDUkTWBIAiCIPo0VNwSkrG6BH9t4IQyWwo8t8ySMGtEKfRa4SvM1FsqbgmCIAiib0PFLSEZW4DnNsNX3FpSYEv4fHcjAMGSwBCLW/LdEgRBEESfhopbQjJBDWVGwZZgS7It4YjZin2NXdBqOMw6IaC4paYygiAIgiBAxS0hEa+XDyhudcjQM+U2ubaEz3yq7UlVBcjz+WwBsiUQBEEQBCFAxS0hCbvbr9AGKbdJjgL7fDdLSegXdHl/n3J7lJRbgiAIgujTUHFLSCIwzzYoCszlAc/zSdmGTrsLm2qEqWRnBvhtAaAyPxMAKbcEQRAE0deh4paQBFNoTXoNNBpObCjzeHk43N6kbMP6fc1weXgMKc7CkJLsoOuY57a5ywF7CuLJCIIgCIJQB1TcEpII9NsCQKbPcwskz5rAUhK6q7YAUJCpF33Ax8iaQBAEQRB9FipuCUlYfXm2rIDUaTUw6ISvjyUJWbdujxdr9/pG7nbz2wIAx3GUmEAQBEEQBBW3hDQCM24ZWeIgh8Qrt1sOt6HN6kJehh4nVRWEvA0lJhAEQRAEQcUtIQlriOJWHMGbhOKWWRJmjyiBThv6a0vKLUEQBEEQVNwSkmDWA1bQAvBPKUuCLeEz0W/b05LAIOWWIAiCIAgqbglJpNKWcKjZgurjFug0HGaOKAl7O8q6JQiCIAiCiltCEsx6kBFQ3PqV28QWt0y1nTK4ELkmfdjbkXJLEARBEAQVt4QkbK5Qyi2bUpZYWwKbShbJkgD4PbcNHXa4PcnJ3iUIgiAIQl1QcUtIwhrBc5vIhrJ2mwvfHTIDAOaEyLcNpDTHBJ2Gg8fLo7HTkbBtIgiCIAhCvVBxS0gilC0hMwnF7Zf7jsPt5TGsNBtVRVkRb6vVcKggawJBEARB9GmouCUkITaU6UNFgSXOlvDZrvBTyUIh+m7brAnbJoIgCIIg1AsVt4QkIim3FkdilFuXx4svfFPJ5kTx2zLErFtSbgmCIAiiT0LFLSEJ/xAHv+c2y8gayhJT3H5/qBUddjcKMvWYNDD0VLLu+JVbKm4JgiAIoi9CxS0hCWY9yDIGRIH5LApWV2KKW3Eq2chSaDWcpPsw5fYoKbcEQRAE0Seh4paQhGhL0IdoKHMkxnP7+Z7YLAkA0J+UW4IgCILo01BxS0jCFsKWkGlkDWXKK7fVx7tQ02yBXsthxvBiyfdjyu2xNht4nld8uwiCIAiCUDdU3BKSsLoEdTaooYzZEhKQlsAsCVOHFCEnwlSy7pTnZYDjALvLixaLU/HtIgiCIAhC3VBxS0jCr9wGFLdG5XNuPV4eG6tb8O/vjgAAZo8oien+Bp0GpTlGAJSYQBAEQRB9EV30mxBEYFpCqJxbZYrb1TvqsXTlLtS328XLXvzyICryMzBvbLnkx6nMz0BjhwN1bTZMGJCvyLYRBEEQBJEekHJLRIXnedhckSaUxW9LWL2jHjev2BJU2AJAc6cDN6/YgtU76iU/VmVBJgDgaCsNciAIgiCIvgYVt0RU7C4vWG9WUEOZQuN3PV4eS1fuQqj2L3bZ0pW74PFKaxCrpBG8BEEQBNFnoeKWiEqgMpsRYvyuw+2VXHiGYnONuYdiGwgPoL7djs01ZkmPJ04pozgwgiAIguhzUHFLRIUpsya9JmiYQqD/Nh5rQlNn+MJWzu1Y1i0NciAIgiCIvgc1lBFRCTV6FwCMOg00HODlhTSFWCK7AinNMSl6O1Juk4fHy2NzjRlNnXaU5pgwZXCh5GlyBEEQBJEIqLglosJU2UBLAgBwHIdMgw5dDjcscfhupwwuRHmeCQ3t9pC+Ww5AWZ5QOEmBeW477W502F3IlVl0E5EJlW5RnmfCkoWjY0q3IAiCIAglIVsCEZVQGbcMJRITtBoOSxaODnkd0wCXLBwtWRHMMuqQnykUtNRUlhjCpVs0tNtjTrcgCIIgCCWh4paISqiMW4ZSiQnzxpbjxasmIS8jWGUtyzPhxasmxawEUmJC4lA63YIgCIIglIRsCURUrCEybhlKDnKYN7YctS1WPPrxHpxUlY+7zxop28NZmZ+Bncc6yHebAGJJt5g2tCh5G0YQBEEQoOKWkIDNZzno3lAmXKYNuk28WBzC44wqz4urMKKmssShdLoFQRAEQSgJ2RKIqDBVNpRyyy6zOJQZwdthF4rb3Iz4zrvIlpA4lE63IAiCIAgloeKWiAorbrNCFLdZzJbgUqq4dQGA7FgxRn+fcnuUlFvFYekW4cwiHITUBKnpFgRBEAShJFTcElGxSrAlWB3K2BI6fcptjile5TYTACm3iUDpdIvejMfLY2N1C/63tQ4bq1uoyY4gCCIJkOeWiEokW0KmUZm0BEanT7mNN5uWeW6buxywuzww6XtuOyEflm7xm7e3oSvAklJGObcilANMEASRGki5JaIi5tyGKBCZmmtTypZgU0a5LcjUi0MnjpE1ISHMG1uOhRMqxL8XTavCV/eeQYUbKAeYIIj0ozetNJFyS0QlYkOZnjWUKWRLcCjjueU4DpUFGTjQ1IW6NhuGlGQrsXlEN1gDIACYDFqyIiB6DjAHIQd47ugyer8IglAFvW2liZRbIir+IQ49z4WyjCwKTClbglAs5cWZlgBQYkIyaLM6xf9u6nCkcEvUQyw5wARBEKmmN640UXFLRMXmYg1loaLAhCLUokDOLc/zAQ1l8Sm3AGXdJoM2q0v878YOyrUFKAeYIIj0obdOnKTilohKxIYyvXINZVanR/wBxeu5BfxxYKTcJg4qbntCOcAEQaQLvXWliYpbIio2Mec2sbYEptrqNJzo5Y0HZkugrNvEQbaEnlAOMEEQ6UJvXWmi4paICrMchJ5QxmwJShS3rJlMB46Lv9GGlNvE4nR7gz73TodbscbCdIZygAmCSBd660oTFbdEVMQosJATyphyG39Ro9R0MgYb5NDQYYfb41XkMQk/bTZBtdVw/u9GUyept4A/B7h7/VqWZ8KLV01Ky+5jgiB6H711pYmKWyIq1gjFLVNzlVBuWaxUrgJJCQBQmmOEXsvB4+XRSEWX4jC/bV6GHmW5wlk9+W79nDasGIE9GNedNohygAmCUBW9daWJilsiIjzPiwMaQjaUsSEOCnpuc4zKKLcaDYfyPLImJApW3OZnGlCaawRAxW0gB49bgv7OoBxggiBUyLyx5bjn7BE9Lk/nlSYa4kBExO7ygvepTyFzbg0sLcENnufj8sp22PyeW6WozM/AYbMVdW1WAOm1rKJ2Wn3NZPmZevTzKbfUVObnYHNX0N+ROpIJgiBSSUmOMejvq6YOxNLzxqbtCTkpt0RErAFe2lAJBkzN9fKAwx2fr7VTtCUoo9wCAVm3pNwqTjtTbjP8xS0pt36YcptjFE7WGqi4JQhCpVR3W2niwKVtYQtQcUtEgfltjTpNyC96oJobb9ZtYFqCUohTyigOTHH8yq0Bpb6zfvI2+6k+Lii3pwwpAkDKLUEQ6oXtr0aX5wIAas3WVG5O3FBxS0SE+W1DNZMBghndqBO+RvHGQCmdlgD4ldujpNwqTpuNeW5JuQ0FU26nD2PFrQ08n15TfjxeHhurW/C/rXXYWN2SdlOKCIKQRnWTUNyeMbIUAHC4xRLp5qonpcXt+vXrsXDhQlRUVIDjOLz//vs9brN7926cd955yMvLQ1ZWFk4++WQcPnxYvN5ut+PWW29FUVERsrOzcdFFF6GxsTGJr6J3wwrWUH5bBit8WSEsF9GWoKBy25+U24QhNpRlGAI8t1TcAoDXy6OmWTg4nDqsGIDgX2+3uSLdTVWs3lGP6cvW4vLl3+LXb23F5cu/xfRla9NyzjxBEOFxur2iUjvbV9webbWl9clsSotbi8WCCRMm4Pnnnw95fXV1NaZPn46RI0fiiy++wPbt2/Hggw/CZPKHCd91111YuXIl3n77bXz55Zc4duwYfvaznyXrJfR6ImXcMljhG78tgRW3yiu3x9rSTzVTO2w6WUGWHv18aQkNHXZ6nyGcTDncXhi0GgwtyUZhlgFA+lgTVu+ox80rtvTY3oZ2O25esYUKXJVCSjshh9oWCzxeHlkGLSYOyIdBq4Hby+NYGotCKU1LmD9/PubPnx/2+gceeAALFizA448/Ll42dOhQ8b/b29vxj3/8A2+88QbOOOMMAMA///lPjBo1Ct9++y2mTp2auI3vI0TKuGWw66zx2hISkJZQnpcBjhNUsxaLE8XZxuh3IiQRmHPLptfYXV502N3IU7ApMB1h/rWqokxoNRzKck0wW5xoaLdjlM/TplY8Xh5LV+5CqLKIh5B9uXTlLswdXdbDh+/x8thcY0ZTpx2lOULwezo3paQTq3fUY+nKXUEnJOV5JixZODoto5yI5MH2V0NLs6HVcOhfmIGDxy04bLZiQGFmirdOHqqNAvN6vfjoo4/w29/+FmeffTZ+/PFHDB48GPfffz8uuOACAMAPP/wAl8uFOXPmiPcbOXIkBg4ciI0bN4Ytbh0OBxwOf+NLR0cHAMDlcon/2N99nU6b8D6Z9Jqw70eGQVgA6LA54nrPWHGbqecUe+85AKXZRjR2OlB7vBN5Rg19vgrRahG+GzlGDXScF7kmHTrsbtSZu5BZmp2y7VLD57u/UdinDC7OhMvlQr9cA3bVA0fNFtV/7zbVmCMqzDwEBXrjgSacEjC16JOdjXhk1R40BMTBleUa8fsFI3H2mH6KbZ8aPl+18cnORtz+1rYeJyRMaX/2sgmKfgaJhD7f5LOvQdhfDSkS9lcDCoTi9mBTJ6ZU5Sn6XPF+vlLvp9ritqmpCV1dXXjsscfwyCOPYNmyZVi9ejV+9rOfYd26dZg5cyYaGhpgMBiQn58fdN9+/fqhoaEh7GM/+uijWLp0aY/LP/30U2Rm+s9S1qxZo9jrSVc2NXIAtOhsbcGqVatC3sbWoQGgwTebf4DjoPxlsKY2LQAO23/YhLa9sh+mBxm88LgfrvsGR4v820efb3w0tArv684tm9G5D8jktOgAhw8/24AR+alfDk3l5/vFQeE34W1vwKpVq+BsE/7e8MMO5B7fnrLtksIPzcJvPhr//mwTjlfw0HDAthYOL+9jLje/UtvQYcdtb23FdSd4MaFI2e8E/X4FvDywdIvWV9gGq+S8739//+5WuA55eoyDVjP0+SaP9fuF/ZPLfBSrVh2B13dM/+L7xO2v5H6+Vqu0FAfVFrder5CZev755+Ouu+4CAEycOBHffPMNXnrpJcycOVP2Y99///1YvHix+HdHRwcGDBiAs846C7m5uXC5XFizZg3mzp0Lvb5vL68e31gLHNyLQf3LsWDBhJC3ed+8Bfs7mjFi9DgsOKm/7Of63ZbPAXgw78yZGFSUJftxuvNp13Yc+qkB/YaMwoLTBtHnqxD3fv8ZAC/OmTsLAwoy8Z+mH9BQ3YJBoyZgwYkVKdsuNXy+b778HYBWzD1lHBacWInaLw/i68YDyC7tjwULxqZkm6RSVGPGv/Z/H/V2Kw9r8VWzHpMH5mPT4VYAoWxJHDgAHzdm4rdXnq6IRUENn6+a2FRjRtu3kT4vDm1OoGT01CClXa3Q55t8/t9L3wLowILpk3DW6H5o/KYWGz7eC31B+OO+XOL9fNlKezRUW9wWFxdDp9Nh9OjgmcejRo3CV199BQAoKyuD0+lEW1tbkHrb2NiIsrKysI9tNBphNPb0Xur1+qA3u/vffRGHr0csyxj+vcg2GcTbyn2/PF4eFt+TFWZnKPq+DygUCuX6dgd9vgphd3lgdwknoMW5mdDr9SjzjTputrpU8b6m8vOtaRHUheFledDr9agsEL6DTZ1OVbw3kZg2rBTleSY0tNtD+m4BwKDTQAOg1erCZ3uOR3w8wcbgwI9HOzFtaJFi20m/X4EWq7RehxarO63eL/p8kwPP82Js4YhyYX81pCQHAHCk1Zawz0Du5yv1PqrNuTUYDDj55JOxd2/w+vS+fftQVVUFAJg8eTL0ej0+//xz8fq9e/fi8OHDmDZtWlK3t7ciKS1B7x/BK5eugGY0JXNugYApZWnc+ak2WDOZVsOJE7hYYkJfH8Hb5XCj0fceDC0WvMfleULDXX27+r+DWg2HJQtHh7yO8/175rKJ2P7Q2Xjn5lNx7nhpzUpNnemRFJFusGZOpW5H9C0aOuywOD3QajgM9AlBVUWCPfNwizVt029Sqtx2dXXhwIED4t81NTXYunUrCgsLMXDgQNxzzz249NJLcfrpp2P27NlYvXo1Vq5ciS+++AIAkJeXh+uvvx6LFy9GYWEhcnNzcfvtt2PatGmUlKAQYlqCMULOrVEbdFs5sGYyo04Dg07Zcy6WdUuDHJSjzeabTpahB8cJS800yEGgxqeCFGcbkJcpnKiVicWtEJXG3jO1Mm9sOV68ahJueX0LAtOkyrp130+uKoDT7cWH26NHg1FxlRimDC5Ev1yjeELVHQ7C5zYlDSwJRPKpbhL2V1VFmeKxlyUkdDrcaLW6xCjDdCKlxe3333+P2bNni38zH+yiRYvwyiuv4MILL8RLL72ERx99FHfccQdGjBiBd955B9OnTxfv8/TTT0Oj0eCiiy6Cw+HA2WefjRdeeCHpr6W3wtRYps6GQowCi6O4ZRm3Squ2ACm3iaDV4p9OxmDKbV8vblmszpBif2IEK26tTg86HW5Fs5wTxawRpWJh+6cLxmJISXbIaK8pgwsj2hiouEosWg2HiQPy8cnOnsOL2Ce1ZOFoimQjQnKgqRMAMLTEv78y6bXiCdNhs5WK21iZNWtWVMn7uuuuw3XXXRf2epPJhOeffz7sIAgiPljBmiFpiIN8W0Knb/RubobyX8lKn3LbaXejw+5CRvRGcCIK7Uy5zfTv9EpF5bZv2xIOsuK2xN8UmWnQIS9Dj3abCw3t9rQobmt9vuFckw5XnDIwrNrMbAw3r9gCDggqcKm4Sjz7Gzvx+e4mABC/Y4zuSjtBdKfat9I0rFt8Y1VhFho7HKhtsWDigPwUbFl8qNZzS6gD/xCH6ON347IlJFC5zTLqRIWxjqwJitDq89wWBCm3vhG8nX17Slm1b+xuoBIC+H236TL1h40PHlycFdVGwWwMTKFmlOWZ8OJVk6i4ShA8z+P37++A28tjzqh+2Py7M8Xr/n71ZHx17xn03sdBX5j4dqDJN8Ch2/5qYIDvNh1RbVoCoQ5sLp8tQcqEsrhsCT7lVsHpZIFU5megzepCXasNw4ozEvIcfQn/dDK/clvim/7m8vBp69NSAtZ5HKjcAkJxu6ehEw1pMoI3sLiVwryx5Zg7ugyz/rIOR1ptuG/+SNwwY4iiiq3Hy2NTjRk/NHMoqjFj2rDSPq0Iv7ulDptqzMjQa/HQeaNh1GuRZdDC4vTghH45ffq9iZe+MvFNnE7WbX9V5fPd1prTs7gl5ZaISPJsCcJ9E7Vcy6wJ5LtVhjarYEsIVG4NOg2KfAVtX/Xder08apqZLSFYCWFRaZGmf6mJQ77idpDE4hYQLArs9sXZRkWLq9U76jF92Vpc9fL3+Nd+La56+XtMX7YWq3dEb2brjbRZnfjzqt0AgDvOHI7+BUIxwkZfB9oTiNhYvaMeN6/Y0uO3yia+9ZbvXIfdhaZOX7JLae9Sbqm4JSIiKQpMCVuCb0eckyjllprKFIUpt4ENZUCg7zY9CjilOdZug93lhV7LYUBB8AoBsyX0VuWWUZIjKPjHO5XzXveVYiMWHv9kL1osTgwvzcb10weLl+f6itsOOxW3cvB4eSxduStkcyS7bOnKXb3ColDtsySU5hh7CEsDfcrtYVJuid6IVUJxm6GELcHBPLeJsyUA5LlVilZrz4YygBITmCWhqigLOm3w7lWMA0uT96amRR3FbV8qNqSy5XAr3th0GADwyAVjg+ITc0m5jYvNNeaIqyvCUBI7NteYk7dRCSJcMxkg7MMAIQfX7pJ/bE8VVNwSERFtCfrwRWeWz5ZgU8RzmxhbQn+finaUlFtFaLOFVm775fTtxAQxKSFEQehXbtX/Hey0u8TiNBZbAuD3Xis1tKEvFRtScHu8eOC9HQCAiyb1xylDgqe+MVtCh02+TawvI/V72xuGkoRrJgMEyxkb0HMkDdVbKm6JiDAfbZYxui3BEofnlu2IE6fcCksspNwqg99zS8ptINViM1nPg0U589y2qf+9YTFgxdmGmE84lVZu+1KxIYVXN9Zid30H8jL0+N2CkT2uZ58XKbfy6EsT31gzWSjlluM40Xdbm4a+WypuibDwPA+bS0JDmZE1lMUTBcY8t4lVbpu7HHCk4RKL2vCnJYTz3PZR5ba5Z8Ytg9kSOh1ucaVCrRyU6bcFAorbLmW+A32p2IhGQ7sdT30qjKS/d95IFPlU8kDyyHMbF9lGHSK1QXIQVmF6w1CS6gjKLZDevlsqbomw2F1esLjSiDm3vullTrcXbo9X1nOJaQkZiSlu8zP1osJ8LE0aetQKz/NhG8rKArJu+yLMcxvqYJFt1IkrE2pXttkI4UFFsRe3pQort2wCWriCozcVG9F4+MNdsDg9OHFgPi47eUDI27BBOKTcxk5Dux03/Ov7kP5uoHcNJXG6vWLM19DS0L9zMTGBiluiNxEY7ZURYfxuoKprlamK+pXbxNgSOI4LiANTd2GhdmwuD5y+k5ietoS+m5ZgcbhFb2j3zEgG892qPQ7sEGsmC/M6IlGS7VOo7W5FGlHYBLRw8OgdxUY0vtx3HB/9VA8NJzSRacK8Xr/nlorbWLA43Lj+1e/Q0GHH8NJsPHnJBPFEjdGbhpIcNlvg8fLIMmhFUaI7VYXC77/Wtz9IJ6i4JcLCbAZGnSbigSPwerlNZZ32xHpuAX8cWLpMiFIrbDqZXsv1SNFgntvjnY4+1b0O+KOzCrMMPVIkGOmSdSvaEmQot7kZOrF7Xyn1lk1AC0wFYHAIHibSm2ATsv77wxH89r/bAADXnjoYYyrywt6HPLex4/Hy+PVbP2LnsQ4UZRnw8rUn46JJ/bFm8UzxNq/+4uReNfFNbCYrzQ47gbCqKH0HOVBxS4SF+W0jxYABgirKrAkWh7ymskSnJQAg5VYh2gJiwLrvFIuyjdBwgJcHWhTyXKYL4Sb9BFKeq/6sW57nUeN7LXKUW47jxMQEpXy3gFDgDvJ5AOdUePHaLybjwokV4AHc/uYWVb+ncmBDKy5f/i1+8/Z2NHY4oOGAcf3DF7YAKbdy+NNHu/HZ7iYYdRosX3QSBvi+Z7kmHZiuM7I8t1etDogxYGH8toDfc3vUbEs7sYKKWyIs/ozb6GpqplF+1q3T7YXdJSxzJ7S4JeVWEdqZ3zaEP1qr4cSGor7WVCaO3S0Of7Aoz2e2BGW+g0zZ+9/WOmysblHkANRqdaHDt5LCliVjJRGDHACgyVcsn1TixdQhRfjzz8ZjZFkOmrucuPWNLXC65Xn+1Ua4oRVeHlj8760Rh1b4hzhQFJgUXtt4CC9/XQMAeOqSiZg0sEC8juM4sclZ7U2gsRKo3IajPM8EnYaD0+NNO6sZFbdEWJjnNlJSAsM/gjf24jZwp5GdSFsCU257mcKTbJgtobvfltFXfbdMuQ2VlMBQ0nMbqOz9+q2tuHz5t4qMo2X2ioo8k6TffigSUdzaXR5/Sofvq5dh0OKlqyYjx6TDD7Wt4jjadCbS0ApGpKEVNH5XOuv2NmHJBzsBAPecPQLnjO9pOfA36PWukwUpK006rUZMGkq3ODAqbomwMP9sloQDHGs4s8rIumV+22yjLqHLPv1JuVWENptgS8jLDK2ys0imxj6WmHAwQsYtg3lu411CT+Q4Wlbcxjq8IZBEFLfssYw6DTICdkmDirPw9CUTAQCvfHMI/9tap9hzpoJ4h1awYqzD5gLPp9dScqIJXOn493eHceuKH+DlgUtO6o9bZg0NeZ8cY++LVuN5XowBC5VxG8hAn+/+sDm9msoSJ5MRaY/FGT3jlsGGPMhpKEt0UgKDDXJo6HDAQ/t82bSJym3o4tY/yKHv2BK8Xl4sCiN6bhVQbqONo+UgKHtzR5fJOlk8FEfGLSMRnlu2ElCaYwTHOYOumzO6H26dPRTPr6vGfe/8hJFluRhRlqPYcyeTeIdWMOXW7eVhdXqQZaTDPCCcEC5duavHb++Eftl45IJxYZuq2MlCZy+yeTR02GFxeqDVcBgYxXpUVZiegxxkKbfV1dX4/e9/j8svvxxNTU0AgI8//hg7d+5UdOOI1GLzqbBSPLcZvttYZNkSEp+UAAgHRb2Wg8fLo90Z/fZEaAIbykLBbAlNfciW0NBhh83lgU7Dic0ooWCDHNptLlmrHEDix9HWKFHcJkC5ZSdL7OSpO4vnjsD0YcWwuTy4ecUPaau0xTu0IkOvhc53UpOu74HShFvpAID9jV1Yu6cx7H2Z57Y3NehVNwm/8aqizJAJJIGk6yCHmIvbL7/8EuPGjcOmTZvw7rvvoqtLkLa3bduGJUuWKL6BROqwxqLcGphyK8eWkPikBADQaDhxBGpr3xEVFac1zAAHRl8cwcv8awOLMqHXht+t5hh14m9FrjUh0eNo1Vvc+pXbUGg1HJ65/ERU5JlwsNmCe97eBrfHq3jDXaKJd2gFx3Hkuw0gXg9zrthQ1nuU2wNNnQDCTyYLJF0HOcRc3N5333145JFHsGbNGhgMfuXmjDPOwLfffqvoxhGpRUxLiDDAgcEKYDnKbYctOcotIDTJAMAPzRpsqjGnxcFObYjTycJki/bFEbxSkhIAofBg6q3c4jaR42h5nhcHOKjNc8s83OGKW0DIGH7hqskwaDX4ZGcjTnx4jeINd4km0tAKqROyxMSEXtYEJQfFPMy9SAWvjjBJsTti1m1vtyX89NNPuPDCC3tcXlpaiubmZkU2ilAHNqe0nNvA28hJS/B7bhOr3K7eUY9tR9sBAF83anDVy9+nxcFObTBbQljPLWso60PK7UHWeRxmjGUgFb7UDrljoBM5jrap0wGrz4s3oCC8vSIagZ5bpZqamnwnS6VhbAmMiQPycfHkSgA91TYlGu6SgTi0otsqgNQJWbmk3IrEu9LRK20Jx6U1kwF+W0K7zSXGQKYDMRe3+fn5qK/vuWP48ccfUVlZqchGEerAb0uIrqhm+W4jz5Yg3IedIScC5rmydRsHmi4HOzXR5tvJh0tLYLaEFouz1+SORoNN9BoaRbkFII66bJCZdauEshcOpkD3L8iI6sWLBFNunW6vYnmrfltCZEXa4+Wxdu/xkNexMjvSMrRamDe2HIN8qtkts4bizRumSp6QlWvyJyb0deJd6WDvZe+yJUSPAWNkGnQo9p2s1qZRYkLMe6/LLrsM9957LxoaGsBxHLxeL77++mv85je/wTXXXJOIbSRShM3FGsoSbEtIsHIbrbscSI+DnVrwK7ehbQkFmQbotUJhpWS3vJphsTqRMm4ZSiQmzBtbjicumdDjcqnKXjiYJSEevy0AmPRa0WaklDWhwVfclkVRbjfXmCNaPuJtuEsmZt9v7dzxFZg2tEjyCQt5bv3Eu9LBPLe9xZbQYXehyfebjDTAIZCqNPTdxlzc/vnPf8bIkSMxYMAAdHV1YfTo0Tj99NNx6qmn4ve//30itpFIEdYYbAl+5VZ9aQmJ7i7vS/A87/fchlFuNRrOn3XbB6wJVqdbtBhEyrhlKJV1y1Q91hmv03BYe/cs2YUtEJBxWxRfcQso77sVbQkRPLdA4hvukoXXy8NsEYrb4uzQJ5Lh8E8p6x0FWTzEu9LR26LA2Il4aY5RchN3OsaBxVzcGgwGLF++HAcPHsSHH36IFStWYM+ePXjttdeg1cqbZkOoE4tD+vhdUbl1qC8tobcc7NRAl8MNt0/hDqfcAn5rQl+IA2MFYUGmHoVZ0YsQpaaU7W0QDlLThhYh16SD28uLXjq5sNciRYGOhpJZt10ON7p8+5aSKMVtIhvukkmbzQW2mFQg4XsVCCm3wcwbW47Hfjaux+VSVjpye5nnljWTSfHbMsTEhDQqbmVLZQMGDMCAAQOU3BZCZcRiS2C36e5plUKi0xJ6y8FODTDV1qjTwBQhRaOfQokJHi+PzTVmNHXaUZojLB0mcoqdHKolTCYLRExLiLPw39coxPmM6JcDnge+OtCM7UfbMbYyT/ZjqlW5ZSdJ2UYdsqMMJWDL0A3t9rDxT3Ib7pJJi++kIC9DHzFeLhR5lJbQA5b+UZpjxAPnjJK8P8npZbYE/9hd6cWtmJiQRp7bmKuJiy66CFOmTMG9994bdPnjjz+O7777Dm+//bZiG0ekllhybpm6KyctodORWOU22sGOg1BwqP1gpwb808kiK0n+4lZ+ARdqolB5nglLFo6Oa+ldaVhSwhCJPtUKny3BbHHC7vJEPEmIBCtuTyjLgUGnwVcHmvFTXRuAgbIez+PlRWUmXs8toGxx2ygxKQHwL0PfvGILOCDkb/63Z49Q3UlSd1p8loSiGC0JgH9fSsqtH+YnH1mei/MnSm9+7222hFiayRjiIIc0Um5jtiWsX78eCxYs6HH5/PnzsX79ekU2ilAHcqLA5NkSEpuWEOi56n44i7e7vK/RZmPTySKfiJTGOYI33EQhNaZbHIxRuc3N0CFDH98gBwDY1ygcpE7ol4Px/fMBANuOtMt+vGNtNjg9Xhi0GjGuLB5YcauE3Yc9Rj+JqyssSoup5Az2E/9kZ6NiEWWJoqXL57fNil7QdyePPLc9qGn2nbgVxRZxx5Rbq9MDlyf901/8MWDSx1OzEb31HXY43LELWKkg5uK2q6sraHgDQ6/Xo6OjQ5GNItRBTA1lRvm2BH9DWeJybsMd7OLtLu9rRJtOxmBFiJzCJt3SLQ42x6aEcBwXt+/WbHGi2bdsPbw0G+P7C1aEfY2dsMv4DQJ+S0JVUaYiJ3qi51YR5dZX3EpQbhnzxpbjq3vPwJs3TMX/XTYRb94wFW/fdCoMWg1W72zA39cfjHu7EkmLRXjfpPi4uyMOHiDlVuQQs9zEuCoRaJfrSnP11un2ik1hUjK5GcXZBmQatOB54GirvAjDZBNzcTtu3Dj8+9//7nH5W2+9hdGjQ3ckEumJaEvQS2go892GNaFJhed5cQec6All7GA3sp+gsN06c7Dk3EhCoN0XTRRuOhkjHltCOqVb8Dwfs3ILBPpu5R0omCVhQGEGsow6lOeZUJxthNvLY1e9PJGhRubBPxyJsCWw75VUtBoO04YW4fyJlZg2tAiTqwrwB98qzrLVe7CxuiXubUsUTLmVY0ughrKeyJ28p9dqRIEn3ZXww2YLPF4eWQatmLctBY7j0s6aEHM18eCDD+JnP/sZqqurccYZZwAAPv/8c7z55pvkt+1lsIEMMTWUxTjEwe7yit33ifLcBqLVcKgqysSexi4U5xjJihAjkpXbOGwJ6ZRu0dBhFyd6sZ2/FMriVG5Fv61vaZHjOIzvn4e1e5qw/UgbJg0siPkxxaQEhYvbZgXSEsQBDjEWt6G48pSB2HK4Fe9uqcPtb27Bh7fP6LGiowaYcluUHbstobd1+MeL1+sfKz1YRrNkjkkHq9OT9g16ot+2NBscF9uxb2BhJvY0dKK2JT2aymJWbhcuXIj3338fBw4cwC233IK7774bR48exWeffYYLLrggAZtIpAKe52F1xeC59dkSrC5PTF42FgOm1XCSnkcJWKxOq4V2/LHiz7iNrCaxIqTd5op5mTyd0i2YajuwMDOmiV7MliDXc7u3wd9MxmDWhO118ny3Siu37PNpsTjhjtOr2CQqt7EXet3hOA5/umAcRpbloLnLiVvf2KLKSXqicivDlsCUW0sv8YnGS2OnHXaXFzoNh/4FsfvJ2clCZ5ortyzZJZakBIZ/kEMvtSUAwDnnnIOvv/4aFosFzc3NWLt2LWbOnKn0thEpxOH2gtWomVGidwB/WgLPC2qsVNgyT7ZRF/OZpFwKfKpjq2+JnZAOm04WTbnNNelg0gu7l6YY1dt4Jwolk4PHY+88BoByX2LCsTZ5xe1+sZnMf5ASi9uj8opbpaaTMQqzDNBwwj6BDSOQSyNrKFNAuQWEBJi/XT0ZOSYdfqhtxZ9X7VbkcZUknrSEQItXb+nyjwd24jagMBO6GGPVAP/7me62BDbAIZaMW8ZAn+J9OE3iwGQPD3c6nTh69CgOHz4c9I/oHQSmHmRIiCoKvI01BmtCR4KTEkLBYqzM1vTeUaWCNhuLAotc3HIc5/fdxmgfiHeiUDKJNeOWUR6H55bneexltoR+fuV2XGW+b5u6xIEHUnG6vThiVi4GDBA+R7ak3hSH75bneVHhjsUnGI2qoiw8fclEAMAr3xzC/7bWwePlsbG6Bf/bWoeN1S0pbVpkObdFMtISdFqNmAdMvlvgkC8pYVCMSQkM/8S39D5ROCDzZBxIvyllMVcU+/fvx3XXXYdvvvkm6HKe58FxHDye9IiJICLDmsmMOo2kIkKr4WDSa2B3eWF1elAk8XnEpARj4v22jEJSbmXD3rO8KA1lgJCYUNtilbX0Pm9sOR48dzT++OGuoMvLVJZzWx1jxi2jLA5bwvFOB9ptLmi44OXFkhwjKvJMONZux466dkwdIvVXCBxptcLLCxakaONtY6Ek24jjnY64ppR12Nxw+GwDgo9XuWX2OaP74dbZQ/H8umrc8/Z2PPzhLjR3+fcLqcxVjke5BYTVky6Hm3y3kN9MxugNHmae5+NSbv22BCu8Xh4aFYgLkYi5uL322muh0+nw4Ycfory8PGlLyURyscXgt2VkGnSwu5wxDXJIVlJCIOS5lU+7VZpyCwRm3cpbemdqCWPqkEK8/supqlBsGcxzOzTGgwWzJTR3OeFwe2DUSf+dMdV2UFFWjwEQ4/vn41h7A346GltxW3PcP5lMyX16SY4RqI8vMYEp//mZepj0WrhisD1JYfHcEfh8dxP2NHQGFbaAP1c52XGBbo9X9LfL8dwCwu/nWLudlFv4bQlyVyX8toT0VW4bOuywiM2vsb8PFfkZ0Go4ONxeNHU6VNmEGUjMFcXWrVvxww8/YOTIkYnYHkIl+DNupX9FMg1amC2x2RKSkXHbHfLcyofZEqI1lAF+f6TcJemfjrYBEJYSD7VYYXF4VFXY2pweHGsXbAWxKrcFmXoYdBo43V40dTgwIIakhcDhDd0ZPyAPq3c2YJvvvZOK6LeVsVwZCSXiwMSM2wQ2EIbzBPMQrDBLV+7C3NFlSfv+mX37Jo6T9lsLRS4NchA5FOdYafZepnNDWXWTP8c6luZXhl6rQUW+CUfMNhw2W1Vf3Mb8CkePHo3m5uZEbAuhIliBKmX0LoOpvLEot2xnkQrPbavVpfopRWrC6+XFhjIpym1ZnCN4Wdf/wgkVAIQCTE2fV02zBTwvdKbHGrQfzyCHfSwpoV9PtXi8z3cba1PZQaZsyTz4h0OZ4lb66F05bK4xRzwBS0WuMktKKMw0yC6oKetWwOvlURunn1xUbtM4Cqxa9NvGbklgVPkU33SIA4u5uF22bBl++9vf4osvvkBLSws6OjqC/hG9g1hG7zKYyhuTLYEVtylQbh1ur6yJan2VTocbrL8mL8G2BJfHi13HhP3JOeOF5eBOu1vM2VUDbDLZkBJ5S/n+4ja2pjKxmaysp3I7rlJITDhstoonIlI4FOeybTjEKWVxeG7908kSoxSpMVfZHKffFgj0iaZvQaYEx9ptcLrjGyvdG6LAxIzbOIrbgQG+W7UTs1w2Z84cAMCZZ54ZdDk1lPUu/NPJ5Ci3cmwJyVNuMw1a6Dgebp6D2eKMyXrRl2HFUqZBK8kjKtoSZAxy2N/YBYfbixyTDiP65aA8z4T6djtqWyyyxpEmgoNxZEYCft9tLMotz/PYHyIpgZGXqRdtHNuPtuP0E0okPa7SGbcMJZTbJhmjd2NBjbnKbPBFPN91Um4FWFLCgMIM2Sp4b7B4MOVWTjMZY2AaJSbEfFRft25dIraDUBnylFs5tgRfFFgSlVuO45ClB9qdQlNZ/9iHOfVJxAEOGdI+q3hG8P5U1wZAyG5lox+F4taKE2VM30oELON2iEyfqpzEhLo2GyxOD/RaLqx/cHz/fBxqseKnOmnFrc3pEQtspaaTMcQpZQrYEhKl3LJc5YZ2O0KZXjgIn1Uyc5X9o3flF/TM6pXOBZkS1CiQ39wbbAl+5Vb++yDGgfVG5ZaGNfQNmPoqZYADQ5YtIQVpCQCQpROKWzM1lUmmVRzgIE1NYpFSFqcHXQ63mLspBeYZZdmtg4qysKnGLDY+qQEx47ZYrnIbuy2BDW8YXJwVtilkfP88fLDtGLYdaZP0mOw9zcvQi0kiSqGI59ZnB0iUcspylW9esQUcEFTgpipXmdkSikm5jZt4m8mAAFuCIz3fyw67S/SVx5rsEgizJRzpjcUtw2q14vDhw3A6g4uD8ePHx71RROqxMOVWji0hhgD5VKQlAECWTuiDjsWXqAY8Xt7XAGNHaY6gJiXroNsuJiVI+6yyjDrkGHXodLjR2GFHdgzL9z/5msnY1K2qYp/XSyXLYTzPy55OxmANd7Eot6GGN3RnfP98AP73MBqJ8tsC/uK20+GGzemJqUGVoeTo3XDMG1uOF6+ahKUrdwXZRFKVq9xiYbaEOJTbXpDNqgSHFLDc5Ka5csssVKU5xrhWSat8JwhmixOddlfSj9uxEHNxe/z4cfziF7/Axx9/HPJ68tz2DuJqKIuhSasjBWkJAJDt+03GOxY0mazeUd/j4JvMkPlWC0tKkK4mleYa0XlcKG6lelMdbg921wvNZKxBinXpqkW5bep0+DMjZU49kuO53ecrbkdEKG7HVORCwwmPy06CInEwgcVtjlEHo04Dh9uL5q7YIs8AodO9SeHRu+GYN7Ycc0eX4W9fHsDjn+xDRb4JG357Rkri5/y2hPiV275e3CphSwiMAmP9RemEEs1kAJBt1KEoy4AWixO1LVaM9e2f1UjMaQl33nkn2trasGnTJmRkZGD16tV49dVXMXz4cHzwwQeJ2EYiBYgNZTHm3ALpotwK/9+aJsXt6h31uHnFlh6FEAuZX72jPuHbwDJupSQlMOQ0le1r6ILLw6MgU4/+BUIByKbjqKWRgU36GVCQEdMAhkCY5/Z4lwMuj7TBBKy4HR6huM0y6sSmke1Hoqu3iVRuOY4T1Vs5ecdmqxMuDw+O86vAiUSr4XDxSQMACCcH9hSlqbDpZMXxFLeZvWNkbDy4Pf6x0vEpt8J76eX9q5rphBLNZAx2gqr2xISYi9u1a9fiqaeewkknnQSNRoOqqipcddVVePzxx/Hoo48mYhuJFGBz+Ty3MSi3GTIayphym3TPLVNu08CW4PHyWLpyV8hmF3bZ0pW74PEmNgO2LYbpZAw5TWXbfc1k4/rniwoJK25bfMthqabaVxAOiUMJKcoywKDVgOelvT8eLy96bkeEiAELhFkTtkuwJiQqKYERj++WvS9FWUbotbEHz8uhNMeEfrlG8Dywqz418ZYtXcrZEvqy5/ZYmx0uDw+jToPyOJR/k14DnU/BT0clXIlmMkZVmsSBxby3sFgsKC0tBQAUFBTg+PHjAIBx48Zhy5Ytym4dkTKsMmwJWay4lah2eL08uhzJT0sAgGydUAimwwjezTXmiEvXyQqZZ/7k/IzYbAmAv+NdCj/5msnGByx55Zj04hhSNai3YlJCHAWhRsOhX57w/kjx3R4xW+Fwe2HUacRInnAwr/J2CZPKmNVD6aQERjxZt8nw24ZinMxhGErRokDObaAtQU3DT5IJsyRUFWVCE4e9hOO4AGtC+inhfuU28kmxFKrSJA4s5uJ2xIgR2Lt3LwBgwoQJ+Nvf/oa6ujq89NJLKC9PrumeSBx+W4IMz61EW0KX0w22z02ZcpsGtgS1hMyzAQpSG8oA/8jUxhi2TUxK6B/s51KTNUHMuI1zma88V7rvljWTDSvNjuoDFZvKjrZHLGw67C40+/ydalZuE+237Q7zeu+Q2JSnJA63RyygiuNRbn19DG4vH9NqWm9CiaQEhhgHpoKVo1hwebxiI+7Q0vjfh4G+9/KwWR39D+GIuaL49a9/jfp6wd+3ZMkSzJs3D6+//joMBgNeeeUVpbePSBGyGsqMsdkS2A7coNXAFEMqgxKInts0sCWoJWS+TUxLkK4m+T230opbu8sj+krHdytuBxVlYcvhNlU0lVUroNwCsWXd7pfQTMYYWZYDnYZDi8WJujYb+heEVnrZwb8kxxhTVFssxFfcpki57Z8LQHrihJKwE26dhour0TZDr4Vey8Hl4dFucyErQZ+vmqlR0E+erlPKalsscHt5ZBm0YkJLPKTLIIeYv+1XXXWV+N+TJ09GbW0t9uzZg4EDB6K4uFjRjSNSh5hzK6ehTHJxm5qkBADI1gtqVjoot2oJmRdtCTF5bn3L7hKL2931HXB7eRRnG3vsiFkMjZJxYHKi1ewuD+rahGzaeDy3QGDWrRTlViioIzWTMUx6LUaW52BHXQd+OtoetrgVD/4KKFvhYCddx2WsLCQ64zYcrAu8+ngXLA53UgtDlpRQmGWIqyuf4zjkmvRosTjRYXehAvJGz6Yz7ERYiVUJcShGmsWBHWjyrzIpkfLAVtCOtfnGGofJ2041cW9VZmYmJk2aRIVtL0OO5zZDz4Y4SPvxs51EKrLyApVbtfvRWMh8KJIZMh9fQ5lD0vscmG/bfUfMdqpKKberd9Rj+rK1uHz5t/j1W1tx+fJvMX3Z2qjJE4daLOB5YZkynm52IEC57Yg+yEFUbsukFdTMN7otgm9USWUrHPEot00psiWksqnM77eNX60WBzlY00ttVApFbQnG9FRuq48rEwPGKM0xwqTXwMsLBa5akXQ6unjxYjz88MPIysrC4sWLI972qaeeUmTDiNQiq6HMZ0uwxajcJttvC/iLW5dHaGpTcxg14A+Zv/3NH+Hy+IvE4mwjHr5gTMJzbj1eXvSa5cloKHO6vWi3uaJaGvyTyXrmJyrpuWXRat3LbRat9uJVk8K+p6LftiR+JYRl3R5ri6xqujxe8SA1XGJTyIT+eXhzs3+UcSgSnZQApKctARC+g40dTfjpaDtOHpTM0bvCay5SYFpcDmsqS8MmqHhxebw40ioUX4rYEsRxxun1XrLYQiViwACI49D3NXah1mxN6L4jHiRVFT/++CNcLuHAtmXLlrA79HQLNibCIzaU6WO3JUjNAWSe22QnJQCAQQtk6DWwubxotah70gpj3thyFGXtREOHA1lGLSwOD341c0hSBjgIHdfCf8diSzDqtCjI1KPV6kJjhyNqcSsmJfTvWdwy9aWhQ8gflevTjhatxkGIVps7uiykGs4OFkMUiNUpl+i5PdRsgcsj+OYq86UtL4txYEfb4fXyIbvFE5lxyxCL2y5HzAH4qWooAwRrwme7m5LeVGZWICmB0ZdH8B5ttcHj5ZGh1ypycpSThhPfPF4eW31juN0eLzxeXpEVvoGFWdjX2IXDLRYAJXE/XiKQVLmsW7dO/O8vvvgiUdtCqAibU07Orc53X2nFbaoybhkFmQbY2u0wW52yp0wlE6fbi0af+nXFlIFYvqEGG6tb8MsZQxL+3KzxLtuoizlvtF+uyVfc2iPms1qdbuxvEpbeQym3+Zl65Jh06LS7cdhsjTiCNhKxRKtNG1oUdJ3Hy2OTL3JNr9XEfbBgxW1Tpx1ujxe6MO/tPp/fdli/HMmRRsP7ZcOo06DT7sahFksPfzDP8wmdTsZg1g3W2CS1IdHtEaaaAf4VgGTCvoPJbiprDvDcxot/bGz6FGRKwU7cqooyFRHexHHGaaLcrt5Rj4dW7hJPnJ/+bD/e+u6IIhMt06GpLKajlMvlgk6nw44dOxK1PYQK4HlezKqVk3Pr9HglTVzyTydLTXHLFMh0SEwABH8TzwuB4udNqAQAfHuwRfJ0q3jwJyXErnCXShzksOtYB7w8UJZrEu8TCMdxonrLDlxykBqZ9q+Nh7DzmD9Ki3l0vzrQDAD493dHJHl0I1GUbYROw8HLR86B3SsmJUhfWtRrNRhTEb7rX5gP7wbH+S0ficCo04oKYizWhBaLE15e8JzHE4klF1bcHvA1lSULZksoVtJz2weLW6X95H5bgnLvpcfLY2N1C/63tQ4bq1sUG8TDbFfdV4SUmmiZDoMcYqoq9Ho9Bg4cCI+nb2bm9RUcbq+4BB1Lzm3gba1OD/IyIp87sZ1EKmwJgKDcAukzgveozz/WvyATYypyxeX+bUfacFKCPYFykhIY/SSOXw2XbxtIVVEmfqprj0sxkNp5//GOBny8owEVeSYM75eDL/cd73EbKR7dSGg1HPrlmlDXZkN9u1304HaHNZPFqlaP75+PLYfbsO1IO86fWBl0HTv4V+RlJDyKryTHiHabC8c7HZLSHgC/VaM0xxhXAL9cSnOFprLGDgd21XckzXcr2hKUUG5Fz21qils5aSRKoWRSAuC3JSg1xGH1jnosXbkraBWpPM8Ut7Iar+1KCgPToLiNOS3hgQcewO9+9zuYzYmdhkSkjsAor1iiwAxa/4hCKdaEVKYlAP6u/3SIAwOAo63CjqR/QQY0Gg6nDhMSSpiSmEj8SQmxH3CljuAVkxJCWBIYYlNZHAHiLFot0m49L0OPOaNKYdJrcKzdHrKwBZQZfywl63av7OKWLa239bguGUkJDDlTytj3JZSKnyxEa0ISJ5U1W5SzJaRSuZWbRqIUSsfcKWnxYMpqd3uUEspqMiZasillh81W1aYNxVzcPvfcc1i/fj0qKiowYsQITJo0Kegfkf6wKC+DThPTmR3HcaJ6a5EQB5bKtAQAKPAdPNLFluBXbgV1bzorbvcnvrhl08nYwTIW+okjeCMXt2xUbGTlVjhQxaPcRotW4wAsu2gc/t+ik7H1D2fhnrNPiPh48R4somXd2l0e8fVG8iyHghW3O+o64O5mX/EnJSTeby4nMYH5y5nynwrGpmBSmZiWoIAtQfSJJjmbNZHFm1QSpdzGq4JHU1aB+E6WkzHRsrIgAxwnCGFyxmong5irigsuuCABm0GoCaa6ZsVgSWBkGrTotLslKbdiWoKMgkkJ/MptevjR/MqtUIyw4vbHI23otCc28aHddwIgR7ktDci6DUen3SU2N4VqJmOInts4s27njS3HkvNG46EPdgVdXtZtWdCk14YdgNAduQcLsbgNkxl58LgFHi+PXJMOpTEWekOKs5Fl0MLi9KD6uCWoOGbv4eBiZSKCIiGnuE1Vxm0gqWgqYytJ8WYoA/6T0WQ2lCVjWTwaTrcXdT4xQKmTN+a5jdeWEE9DqxSSMdHSqNOiIi8DdW02HG6xJn3IihRiLm6XLFmSiO0gVIRFzLiNXVHNMugAOCQ1YKQ6LaGQNZSljS1B2FkP8BVbAwozMbAwE4fNVmyuMePMUf0S9tzxNJRJGcG781gHeB6ozM+IqFgxW0Jda/zTcYp8TUpDS7Jwx5nDw3oCE32wKPP5bOvDvD/7xOENOTF3fWs0HMZW5mFTjRnbjrYFFbcsr3ewWpVbsbhNnXI7LmBSmdXplrVPjAWb0yPawhRJS0hAE1Q0El28SeGw2QovLwg0JQoo4ECgCh7fe5loZTVZEy0HFmYKxa3ZmvCeDzmoc24akVKYLSGWZjIGuw9LW4hEqtMSmAppThNbwpEAzy1j+vDk+G6ZLUFqjFMgrDhp6nTAG2apLVK+bSCB03Hq4pyOs+OY8JynDCnC+RMrMW1oUUglKZpHl4Ogvso9WETLut0n02/LmDAgH4Df9gEAXi8vWh2SotzK8tyyGLDUqUKluSaU5hjh5YU0j0TTYhFes0GnQbYCI39T4blNxrJ4NA4FDCdRKn+fFbcOtxcOt/ym+kSfLCdroqWSQ3USQczFrcfjwRNPPIEpU6agrKwMhYWFQf+I9McmYzoZIyuGrNvOVKclZKWPcutwe8SDfVBx67MmfJ3g4lZMS5BhISnONoLjALeXD3sisb0uelIC0C0OLE5rAitWxlZEfs7Ag0X3w4ESB4toDWXxFrdiU1lAU1Rjpx02lwdaDRf0fUoU8Sm3qV3yTKY1ocWXcVucZVA2mzWJxW0ylsWjobTfFgCyA0SYeKwJiT5ZBgTb1ROXTOhxeVmeSXayS3fUnpgQc3G7dOlSPPXUU7j00kvR3t6OxYsX42c/+xk0Gg0eeuihBGwikWz808nkK7eSbAm21E0oAwKiwNJAuWXjWTP02qDlymlDisBxQsh/tIateBDTErJi/6z0Wo1oAQi3jT/5VMXxlflRH0/MWIxDMeB5Hjt9xS3Lgo0EG3/MClGGEgcLptw2dthDNpGwAQ6yi1vfe7q7vhNOt9BUxprJBhZmxjyUQw6yPLesoSyFtgTAf8KVjMQEptwWKuC3BfzKrcXpSUoeNpCc4i0aSiclAMJJLlPT4zlZSJayOsK3v8g16fB/l03EmzdMxVf3nqHYREv/IIf4RIZEEfNe7fXXX8fy5ctx9913Q6fT4fLLL8f/+3//D3/4wx/w7bffJmIbiSQTj3LL7mOLYktwebzibVJnS2BDHFxhl8vVQmAMWKCiU5BlEJXHRKq3bTbhBCAvQ95BN1JiQrvVhUO+QjVSMxmjSgHltr7dDrPFCa2Gk5xAMG9sOb669wy8ecNURQ8WpTkmaDUc3F5e7JRnWJ1uURk5IYYBDoEMKMxAfqYeTo8XexsEFVhMSkjSZD5W3JqtTklFlsPtERur+qW4WSUVym2RQkMrchRSG2MhWcVbJBKh3AL+OLB430t2sqzv9h4oqayyHo3BJdkRbVdyqSoU3tteo9w2NDRg3LhxAIDs7Gy0tws/+HPPPRcfffSRsltHpASrOHo39qKT3cfiiFzcdgXsHFI3oUwo1DxePmk7frl0jwEL5LQk5N22WVjOrTyVvV+ExATmfa0qykSehMdXwuvFVNvhpdkxDTDQajhMGxrZoxsrWg0npiAc62ZNONAkqLbF2QbZ0VAcx4kF2jafQn6oOXlJCYCwSqLVcOB5abnSTOE16DSymhiVpHtTWSJpYQMcFFJudVq/dzeZvtt5Y8vx1KUTe1yuZPEWiUPNzE+u7MmbkkMx5o0tD0rEuH76IEWVVSaIDEiQ7YjZEpq7nPjP90cUnbCmBDEXt/3790d9vZBRN3ToUHz66acAgO+++w5GY2qXjwhlYM1gchrKROU2ykGA7RwyDVrokrAsGgpjQNOG2pvKuseABTJjuN93m4hAbZfHi06fzUROQxkQWbkVJ5NJUG0BZeLAWG7pmCh+22Th990GN8kxpXV4qTxLAmNC/3wA/qV1/wCH5Ci3Wg0nTtySYk1gJ0H9co2KNQTJJZlNZWLGrQJJCYxUxIEBPVca/nbVJEWLt3DYXR4c8/2OBiloSwD8QowSYgjP8zBb/Z+JXqtVVFk9Yg5/zFCCjdXNYD/N3/53e9KHdEQj5qriwgsvxOeffw4AuP322/Hggw9i+PDhuOaaa3DdddcpvoFE8okr59boS0uI0lCW6qQEhthUpvri1hcDVtjzLHxyVQGMOg0aOxyoPt6l+HMHKj5yhjgAkZVbNj0rWlICg3m9jpptspWCWPy2ySDcIIfAGLB4YL5RptzWJFm5BWLz3YrNZCrJz0yWNcGv3ConFLF9bLKnlHX3xA/vl5OU0bvC1CzhdSsRpxaIkg16FqcHDrffonNE4eX9IxGOGfHChnR011KSOaQjGpIri+eeew5XXXUVHnvsMfGySy+9FAMHDsTGjRsxfPhwLFy4MCEbSSQXZinIkGNL0PtsCVGK244UJyUwCjINOGK2qT4xIdJZuEmvxcmDCvHVgWZs2N+MYXGqfN1hzWS5Jp3sg1OkrFu/cpsv6bEq8jOg13Jweryob7fJUiZ2+qwQYyWqxYmmLFc4AHVPTIi3mYzBlNv9TV3ocvh9vMmYTsYozTFiJ2IsblOclMAYW5mHz/c0Jb64FT23yiu3yS5uD3UrbjuSZP0KHCuttOrPThSUsCWYu4KPOSzqUSn8tgRlf+NqGNIhBcnK7QMPPICKigpceeWVWLt2rXj5tGnTsHjxYipsexE2F/PcJtCWYFOJcsuyblVe3Eby3AJ+320imspYDFhBHAdc0ZbQLdvSbHGKr21spTQVVavhMKBQvu+2pcshKqSjypU9EZBLNOVWbjMZo1+uESU5Rni8PNbsaoDLw8Og06AiL/ExYAxRuZWQdevPuFWH1W1cksbwsrQEpTy3gLI+0Vjo3kWfrOJazLhV2JIA+N9LJWwJ7LNmKNmYxfM8jpiZcqtscRvLkI5UIrm4bWhowEsvvYRjx45h7ty5GDx4MB5++GEcOXIkkdtHpABrPGkJPltCNOW2U5xOllrlli1bqdmWYHd5xFikcColy7v99qBZ8cgfptzKybhlsEzL7rYEpoQNKcmK6btQFUdxyywJg4tje85EEirrtsPuEg8iw+NUbjmOwwSfNeF/W48BEJISNElUVmKxJahh9G4gzNZxoCmxTWVmhdMSgFQqt8HFbbI8v4lKSgCUtSUwlX5oibCdbVaXYicgLRYnbC4POA6oyFf2N6SGIR1SkFzcZmRk4JprrsG6deuwf/9+XH311fjHP/6BwYMHY968eXj77bfhciX3x0MkBjHnNi7lVprnNjeOgkkJ/Mqter+7x3yTuDIN2rBpBaMrcpGfqUeXwx00iUoJWOGfJ7OZDPAXKc1dDrgDim9/vm1s9gAWByYnY5EVt6NV4rcF/AegYwENZft9qm1Zrkm21zmQ8T5rwob9gro/OAEH/0iwKWVSDnpM4U91xi2jXxKaynieR7NvBUlJr6i/IEtuIgw78WQnNckqrhPZLKlkQxlbLRxYmCl+3kr5btnj9MsxwaiL/TgeCTUM6ZCCrDb1IUOG4I9//CNqamrw8ccfo6ioCNdeey0qKytjepz169dj4cKFqKioAMdxeP/998Pe9qabbgLHcfjrX/8adLnZbMaVV16J3Nxc5Ofn4/rrr0dXl/JNNX2J+HJuhR9/NHWjQ1RuU2tLKEyDKWWBloRwHjKthsNpQ32RYPtbFH1+dlCSGwMGCB5CFgXVHOA1E/22vsJLKiyfVU5iAoseizaZLJmU+ewBjR12MXNZ9NvG2UzGYOoja8Iz6DRJje4p8R3sYkpLUElDGZD4prIuh1scsqGkLSEVyq3d5RFXHdiKQbJsESwGLJG2BCVeS4t4ImMUrQNKFbeRGpDjRQ1DOqQQVwYTx3HQ6XTgOA48z8es3FosFkyYMAHPP/98xNu99957+Pbbb1FRUdHjuiuvvBI7d+7EmjVr8OGHH2L9+vW48cYbY9oOIhhWmGbo5eTcpltagk+5VbEtQdxRRWkMSJTvtjWO0bsMTUCWa2AcGCsUpCYlMPzKbewHg10qS0oAhGYrjgNcHl486LEYsBNKlUk0aO5WVK7cVp/U6B45aQmlKrElAP7mw0QVt0zJyzRoZWWMhyM3Q7kmKKkw/2iOSSf+VpNRXNucHjT4vjuJWJkQG8oUUMFZ7FtxtkHMomU+2Xg5kqBmMiDx48iVQtYv6MiRI/jnP/+JV155BYcPH8bpp5+O5cuX46KLLorpcebPn4/58+dHvE1dXR1uv/12fPLJJzjnnHOCrtu9ezdWr16N7777DieddBIA4Nlnn8WCBQvwxBNPhCyGAcDhcMDh8O9gOzqEg53L5RL/sb/7IlZfpqlBG/sJi8F3umRxuCPet91XMGXpNUl/nwM/31yfR9jc5VDt513bLCh4FXnGiNt4yiDh4LvlcCtau2xihm+8mH074VyTNq73qCTHgPp2O461WjC6LAvHO4XGLg0HDC/OiOmxK/OEk5LaFgucTmeQoh3p99tpd4vLlieUZqrqMy/JNqKp04GjLV3IN2mwt0HYLw0tiX87P9nZiN/+d3uPy1l0z7OXTcDZY/rF9RzRKMgQdg7HOyP/1qxOt3jyW5jR8zuXqv3zqDKhWPrpaFtCnruxTShICjP1ij5+tm+n3GZxJu09O9gofHerCjNjfv54Pt8DPitPfoYeWXpO8debqRf2Mx22+N/LZp/1Ji9DCw7CSdyh5i5FtrnWt48rj3LMkMuZI4rx7GUT8MiqPWgI6KMoyzPigfkjceaI4rDPG+/vV+r9JB/9nE4n3n33Xbz88stYu3YtysvLsWjRIlx33XUYMmSIrI2MhtfrxdVXX4177rkHY8aM6XH9xo0bkZ+fLxa2ADBnzhxoNBps2rQJF154YcjHffTRR7F06dIel3/66afIzPSf6axZs0aBV5F+NLdpAXDY9v1mdO6L7b51FgDQobXLilWrVoW93b5DGgAaHK7ei1WWPXFsrXzWrFmDA+0AoMORptaI25tKvtsnvFcdDYewalVNxNsWGbVocQAv/ncNxhQos+S8+6Dw/HU1+7FqVYxfiAB4i/A4azf+AGcNj52tHAAtSk08vvz805gey+0FOGhhc3nx1v8+Rl6IVdxQv9/qDgDQId/AY9OXn8l5GQnD5BV+dx+t+xqHC3nsOCL8ffzANqxq2Cb7cb08sHSL1hfdE6ym8L7//f27W+E65EEixRa7BwB0sDg9eG/lKhjDuJ6O24TbGTQ81n/+KcKlOSV7/9zuBAAdDjR1Rdx+ufxkFn4PWrdN0X3RPt/jHmloTto+bt0x4Tn1jjYcPdgKQIu9NYexatUhyY8h5/Pd2iI8b57WmZDXWtsJADo0tnbG/fh7fMfAowf2QHAHabFlX23UfbwUtu4XHtt8JL59djTuHQ1Ud3DocAG5emBorgWe2h+wqjb6feX+fq1Waat1kovbsrIyWK1WnHvuuVi5ciXOPvtsaDSJnSy1bNky6HQ63HHHHSGvb2hoQGlpadBlOp0OhYWFaGhoCPu4999/PxYvXiz+3dHRgQEDBuCss85Cbm4uXC4X1qxZg7lz50KvV0c3dTJ55KcvAIcTZ86cEXNUUq3Zise3fwUvp8OCBWeHvd2/G78HzGZMnTwRCyYkdmJNdwI/3+FmB57d9Q1cGgMWLJid1O2Qyj+PbgJa2jFn2iTMi6KufePaiX9/XwdnwWAsWDBSkef/d+P3QIsZp54U32e12bMbP20+gpKBw7FgzjBUr60G9lRj2shKLFgwNubHe3rfBhxttWH4idNwUlWBeHmk3++rG2uBnXsxeUgpFiw4UfZrSQQftm3F4d1NqBw+BlPHlqFz4xcAgGvOPwtZcajwm2rMaPv2+wi34NDmBEpGT8UpCfTJ8TyPh378HDaXF5NOmyUmXnRn8yEzsPV7VBRk4Zxzpve4PpX752f3foHjXU5UTTgVkwbmK/rYXd8fBfbuwpDKEixYMEmxxy2tbcXyvd+BM2ZhwYKe72ci2LRyF1B7FFPHDMXQkiy8c2gHsvJLsGDB5Kj3jefzPbK+Bti3HxOHVmDBgnFyNz8sB49b8NSOr+HW6CMe36Tw99qNQHsnZp96EgxaDd46+AMcumxFPqOn930FwIpzZp6S0N+0HOL9/bKV9mhI3mP+/ve/x9VXX42SkpKYN0YOP/zwA/7v//4PW7ZsUTyI2Wg0hhwVrNfrg97s7n/3FZhfNjfTGPPrz8sUlldsLg+0Wl3YqKEu33MUZMX+HEqh1+tRkifIL202FzRa+UMKEkldm7B8Nag4J+p7dfoJ/fDv7+uw8WCrYu9rm89fVpRjiusxy/MFX1mzxQm9Xo+d9cIS4sQBBbIed1BRFo622nC0zYFpw3reP9Tvd3eDsFw3tjJfdb/tSp8/rqnLhRqz8JkPKMxAfnZ8TSEtVmn+wBarO+HvSUmOCYfNVrTZPBgW5rlarMK+oSwv8vctFfvncf3zsXZPE3Y3dOGUocoeC9sEaRvF2fH9zrpT6Pv+dDoS//kyjrT6fK+lOWJfQ6zPL+fzPezrTxhSEn1fKYfCHOG97HK4Ix7fpNDqS+gpzfWnJRxts8f9uF4vj2PsmJGg90EJ5P5+pd5HsvS6ePHipBW2ALBhwwY0NTVh4MCB0Ol00Ol0qK2txd13341BgwYBENTkpqamoPu53W6YzWaUlZUlbVt7EzzPw+qKJy1B63scwO4O31SmliiwfF8CAM8nPwdSCnaXR2zACTfAIZBpQ4vAccDexk7Fcgb9aQnxdXCz5qCGDgd4nsf2OpaUIC+1oKoo9qxbNplMTc1kDHGQQ5vNP7xBgWlzaorukdJUpraM20D8iQnKx4GJ08kUHL0LBKcl8N3npSYIMWu2KEt8/mTk3IpJCQmavMcaynheKNblEhj7VpRtQHmeCVoNB6fbK2aay6Wx0w6nxwuthkOZCn9DySKxvoI4uPrqq7F9+3Zs3bpV/FdRUYF77rkHn3zyCQBhOlpbWxt++OEH8X5r166F1+vFKaeckqpNT2scbq84L1pOzm2G3n+fSIkJbEeX6rQEvVaDXN82qHFKWZ0v4zbLoBUL8UgUZhnEwk2p1AQl0hKA4BG8jR0OHO90QKvhMLpcXqHJon6kxoHZXR7sbxKa89QydjeQsoApZWJxq0AMmJqie1jWbaQpZWyQhbqL2zbFH5tNrCpWMAYM8KcleLx81BQbJXC6vajzKaiDijID4rMSn7Nb0+IfvZsITHotDDqhbOqMI33C4vT4Y9+yjNBpNWLWdbyTyljiQkW+CTqtaku8hJPSV97V1SUWrgBQU1ODrVu34vDhwygqKsLYsWOD/un1epSVlWHEiBEAgFGjRmHevHm44YYbsHnzZnz99de47bbbcNlll4VNSiAiE7jzkxNHo9FwYoFrdURXbtUwIYotCbWpMA7Mn1eYKdmewyLBlMi7dbg94nciXuVWHMHbYRcHTZzQLwcmvbzOnIE+5VbqwWBfYyc8Xh4FmXpRJVUT5b6s24YOO/Y1CEX4iDgnkwHqiu6Rotw2+q5j0XFqIpGTyphyq+QAB0AQHPRa4bNNxurU0VYrvLzwvCU5RnGIRKKV4y6HW/xeJWI6GUOJoRgsBixDrxVFJBbbFW/W7dEExoClE5KKW6kG3lj5/vvvceKJJ+LEE4XGjsWLF+PEE0/EH/7wB8mP8frrr2PkyJE488wzsWDBAkyfPh1///vfE7K9fQG2wzboNLIPdmLWrSv0j9/u8sDpm1KVm2LlFgDyxSll6itu2Y5OiiWBMT0g7zbeg0m7b/SuhotfZWdLZK1WF36obQUQ+2SyQJhyW9NskfQ6d/iWksdW5inu41eC8gDldq9PuR3eT5mM23ljy/HiVZNEdZhRlmfCi1dNwryxyWnqlFTcqtiW0C/XhBLfpLLd9coeF1ssibElcBznL8iSkHVb69tnVRUJJ+TMlpBo5fiQL/6qKMsgvt5EkCtOKZP/XrYEWBIYAwtjO1kPB1Nu+3pxK+loVVBQgPr6epSWluKMM87Au+++i/z8/LiffNasWTEdfA8dOtTjssLCQrzxxhtxbwshEM90MkamUYsWS3hbAtvBchyQpWBYuVyYUtKqYuW2fww7qpMHFcKg06Chw47q4xYMi2MIQJtP6cnL0MfV5MAew6DTwOn24rPdjQDk+20B/8Gg0+5Gm9UlNq6Eg/lt1TR2N5BSn7LtdHvhdHuh4YChJcoUt4BQ4M4dXYbNNWY0ddpRmiNYEZLZRJnunltAsCas3dOEn462Y3KVclYOpuYVKazcAsJvr8XiFE9WEwnLWGUnnya9BnotB5eHR7vNFVfyRyREn2+Cx0rnKGCzMDN/dcBnLU4pa42zuG2NXRDpjUhSbrOzs9HSIixxfvHFF6oKPieUhRWkmTKXioX7+kbwhrElMEtCtjG+rlClKBCVW/V9r4/K2FGZ9FqcPEiIxorXd9vmOxjmx2lJAAQFiVkTqo8LB6JYJ5MFkmHQio9XK0Ht2OGbTKamsbuBGHVaFAeodoOKsmRbNsKh1XCYNrQI50+sxLShRUlPB4nmueV53j96N1d9tgQgcFKZcsotz/PiypGSo3cZyfS9HmrxK7cAgtTbRCrHh7oV1YkiV5xSFo9yK3zHC0MVt0rZEsJE7fUVJJ1CzZkzB7Nnz8aoUaMAABdeeCEMhtA/wLVr1yq3dUTSEYvbOM6uM8QRvKF3pGJSggr8tgBQmCVsh7qV29jOwk8bVoyvD7Rgw/5mLDp1kOznF5vJJDSzSaFfjklcNtNrOYyIs2GqqigLjR0O1LZYMHFAftjbuT1e7KlX39jd7pTlGtHMFLxsAzxeXpXxdHKJptx2Otyw+dJakpHeIAfWVLZDwTG8HTY33EKSv+KeW8Bf3CbDc1vrU1CrAorMXJMezV2JVY5rfEkJgxOUlMBgxy1lbAn+E7iBYnEb3whe0ZZQ2LeVW0kVzIoVK/Dqq6+iuroaX375JcaMGRM0yYvoPbCCNB5bQpaRFbdhbAkqSUpgsOVsNXpu5dgSAMF3+zj24tuDLXB7vLK7ZtnBKN6kBEZgk1D/gkzo4hwEM6goE5trzGIEUDiqj1vgcHuRZdAmXNmRy+od9WKaAwB8d6gV05etxZKFo5PmiU00rLht7nLA6+V7rNwwS0KuSScrrSUZsOJ2f1MnbE6PItvZ7FPyckw6GHXKv+5kxnGxaL5BRf59VjKU42TZElj6RDyvpSWULaHA31Bqd3lkrdq4PF7Ut8s7ZvQ2JFUXGRkZuOmmmwAITWDLli1TxHNLqA9WkGbEsRyawWwJYYpb1Sm3viX3VpUVt3aXR1TxYm0OGFORh7wMPdptLmw72o7JARO8YoEpt/EmJQBC8fbFvuPi3zXNlriLN6YO1Zojx4EF+m3VYIXpzuod9bh5xRZ070BoaLfj5hVbktr0lUiY7YL5L7v7pP2WBHWqtoBglyjJMeJ4pwO76jtk/7YCCVXsKAlbSk+0cuv2eEXPZ1VAkZkM5ThZtoQcBZTbUBaUwiwDsgxaWJweHG21yeqVqG+zw8sLDeElCjcmphsxyybr1q0TC1ue55MWCk0kByUayvzKbThbgrBTYGfAqUZUblVmS2DeqRyjLub3SqvhcNqwIgDx+W7FhrI4bQmseOt+wsOKt9U76mU9rtRBDiwpYYwK/bYeL4+lK3f1KGwBiJctXbkLHm/672sNOg0KfN+lUL5bNSclMDiO8+fd+iLt4sVsYVaUxBQkeUmyJdS32+Hy8DDoNCgP+AwTrRx32F3iUn/ClVvRcxuHcmthsW/+z5vjuLibygJ7NNR4Ep9MZK0J/utf/8K4ceOQkZGBjIwMjB8/Hq+99prS20akAL8tQX7hKUaBRUlLUEPGLRCQlqAy5faIz5JQWZAhK7qK5d2u+qke/9tah43VLTEXSG0KKLeJLN6YSlMbZZCDmieTba4xo749/DQ5HkLRsLnGnLyNSiCRfLfpoNwCyjeVNSdauU1CQxfgtwYMLMwMKq4SrRwz1bYkx4jsBKUxMHIUiFULl4wRb1PZEcq4FYn5W/DUU0/hwQcfxG233YbTTjsNAPDVV1/hpptuQnNzM+666y7FN5JIHmz0bjw+Mqm2BNV4blWacyvXb8vw+orFPQ2d+PVbWwEIWaqx2AD8aQnyT0RiKd6mDS2K6bHZIIfmLie6HO6QBzavl8euY/6MW7UhdUyyUuOUU01JjhH7GrvCFLdMuVX3kqrSTWX+0buJKW6T5bkN5bcNev4EFdc1vuJ2cBL89GwVrTOeKLAwyRgD4y1uzfIakHsjMVcXzz77LF588UVcc8014mXnnXcexowZg4ceeoiK2zQnObYElXlufWfPHXY3XB4v9CoZWSgnBoyxekc9/vC/nT0uj9XD6U9LkH/QTWTxlmvSozDLALPFidoWS0jbwZFWKzodbhh0mrgyfxOF1FQAtaYHxIoYBxaxuFX3a1W6qUy0JWQlpqhXYqqWFEIlJQCJ99yyhtJBCU5KABD3QAye58NOo2NNZXIHORyhGDCRmI/i9fX1OPXUU3tcfuqpp6K+Xp5vjlAPYkNZPMptNFuCytIS8jL0YKv+bUkIOZeK3BgwJW0AbQqkJSS6eIvmu93pU21HluWo5sQlkCmDC1GeZ+oxGpfBQVDcpwxWbmBAKhFtCRE9t+pWbvvlGlGcLUwq26XApLJmS+hiRymS5bntnnHb/fkTVVwnKykBCGwok/dauhxucUJn95MZthIlNw5MHNdOtoTYi9thw4bhP//5T4/L//3vf2P48OGKbBSROvxDHOQXnmzqmC2s55bZEtSh3Go1nFi8tamoqUzcUcV4Fq6kh1MJW0Kiizfmuz0UxnfLlo7V6LcFhO/fkoWjAaDHe8T+XrJwdK/Ju2XFLYv9CoR5bktVrtwKTWXC90kJa0JLQLZxIvDHVyXalhBGuTUl1hZRk6SkBCDgvZT5WpglIdOg7SEisaL0iNkqq1mf2Rn6esYtIMOWsHTpUlx66aVYv3696Ln9+uuv8fnnn4cseon0wuazEjBrgRzYD9aSJmkJgJCY0Gp1qcp3WyfTlqCkDaDNFn9DGSvebl6xBRwQpCgrUbyJM9mjKLdqTEpgzBtbjhevmoSlK3cFnZiUxeiRTgfCKbc8z4vfSbXbEgDBmrBu73H8pEBxy/Y7xWmcluD18mE9t4kurkXlNgnFbaByy/N8zM2+zWEsCYC/v6LT4Ua7zRWTHczu8qDJZ/Xp6xm3gIzi9qKLLsKmTZvw9NNP4/333wcAjBo1Cps3b8aJJ56o9PYRScaigC0helqCupRbgBVvFtVMKbM63eJOMNYdlVI2ALvLA7tLWD6LNwoskcUb89mFUm55nld1UkIg88aWY+7oMmyuMaOp047SHEHN7i2KLaMkW/jedffctlpdcHl4323UbUsAgHH98wEAmw624H9b6+L6vMJ5MJWCKadWpydhfQWNnXY43F7oNBwq84NPyBPZ0NZmdYorTMnx3Aplk9PjhcPtjXnYgjnEdDJGhkErZigfNltjKm7ZSl+WQSvG7fVlZElnkydPxooVK5TeFkIFKNJQZmBpCZGVW7V4boHAxAR1eG7rfDuqHJNOPDBIhdkAGtrtIX23HISiMpoNgB0wtBoOOQrE6ySqeBMHOYRQbps6HWjuckKr4TCqXN3FLSC817EmRqQb4aLAmN+2KMsAg0593ujusAErR1ptstNIAMEjz06qE2VLCNzXdthcCcnTZU1d/QsyekxEZMV1IpRjZknol2uMK8JSKlkGHTQc4OWF9zL24jZ0DBhjYGGmWNyO951ASeFoQDOZnOjI3ob69yBEUmEFaUYcnttoDWVqS0sAgMIsYVvUotzGEwOmlIdTTErI0Cu2s2TF2/kTKzFtaJEiqmSVz5ZQ3y6MrQyE+SGHlmTJGmdJKA8rblutLjjdXvFyVtyq3W8LCGkkv3v3px6XyxlK0mZ1gvV2FiowCTAUOq1GjMlL1Ajcw+bQflvAr9xanB64Pd4e18dDMi0JAKDRcHG9l9Eyjf1xYLE1lR2JMzqyt0HFLRGEVUHlNlRDGc/zfs+tmpRbNqVMJZ7beGLAAL8NoCwvuFAozjFKjgFTopksGRRmGURluXs+JPPbjlWx37avkZ+hh853UtNi8au3TeIAB3VbEpQeSsKmVeVn6nsonkqSaN/toTB+W6CbcqxwcV3jU4wHJyEpgRHPUAx2jCkMo9LLjQM7ao7vmNHboOKWCMLmir+4FRvKHD13YhanR1Qp1OS5ZYqJWqaUyY0BC2Te2HJ8de8ZePOGqRhaIuz4bz9jWAwDHOLPuE0GHMehSvTdBh8QmHI7WuV+276ERsOJjVOB1gSm3JapXLlVeqJcS4KnkzFyTPF1+UcjXFIC0E05Vvj52XSyZMSAMeKJAws3nYzB0nGOxjiClzJug6HilghCiZxbVhjbXD2VW6ba6rUcTHr1fP1E5VZltoR48woDbQAAsLG6RfJ923wHoXRoTqgqDD2Gd6eKJ5P1ZUL5bhs708OWoPRQEqZeJ8IHG0jCldsogxQSMYLX4+XFE1iHyytrhLcccuM4UWBKfbiBHaw4jVm5FY8ZpNwCVNwS3fA3lMWfc+vy8EGeOsAf4p1jUs7HqQTqU26VXWI6bVgxAGDjwRbJBwDmuc3LULdyC4Qe5NBqdaKuTdjhk3KrLkIWt2liS1B6KEmylNt4ltKjwfO8eGI5sDC0gqr086/eUY/Tlq3FQZ9y+/Rn+zB92dqY/M5ySaQtgXlu61ptMRXr/oxbUm4BGWkJdrsdzz77LNatW4empiZ4vcHFy5YtWxTbOCK58DwvNpRlKWBLAIRiObDzWY1JCYD6lFulmwMm9M9DtlGHNqsLu451YFz/6EpmuzV9lNtQgxx213cCEApfNTUvEqFH8IrTyVQ+ZlipNBKGqOQlKCmBkUjltrnLCYvTA44LP0BAyRG8q3fU4+YVW3q8/7GOF5cLO37JsyVEPpnpl2uCQauB0+NFfbtN0jGgy+FGq29/TZ5bgZgrjOuvvx6ffvopLr74YkyZMkVV6hsRHw63V/TDxmNLMOg00Gs5uDw8rC438uAvLNSYlAD48yVbVRAFZnG4xbP7SoV2VDqtBlOHFOKz3U346kCzpOJWTEtIg+I2lHK7s54NbyDVVm2EGuTgH72r7uJW6aEkfg9mcmwJiRiBy1TbirwMGHWhjx1KPX+0hj4OQkPf3NFlCcuIljtxjef5iDm3gPD9qizIQE2zBYfNVknFLVNt8zP1quplSSUxF7cffvghVq1aJU4nI3oPgdFd8eYFZui1cHncsDiCfbcdKlVumS2hy+GG0+1Nac4mW0rPlZFxG4nThhXjs91N+Ka6GTfPGhr19v60hHSwJQjKbV2bDS5f1NCuY4Jyq+bJZH2V7rYEj5cX/1vttgRA2aEkopKXYOU2kVmz4mSyCEMUlHr+WBr6EpUZnStTue10uOH07Z8i2VAGFGaiptmCo2YbEH1XrViPRm8i5iN4ZWUlcnJyErEtRIphlgSDThP3GW9mmDgw/3QydRW3OSad+JrbUmxN8Pttld1RTff5bjfXmHvkwYYiXaLAAKA0xwiTXgOPl8exNuHAt4uUW9XSvbht6XLAywMaLvGNVUrB0kjuOfsEAEBlvglf3XtGzMvh5igNRkqRl8ARuJGSEvzPr4znVumGPjnI9dyafScyWQZtxNztWOPA/H5bsiQwYi5un3zySdx7772ora1NxPYQKUSJ6WSMTKMvDqzblDJ/xq26CiaNhhO9pan23Ypn4QrvqIaVZqM0xwiH24stta1Rb99mE96HgjRQbjUazp+YYLbC4QFqfGoSKbfqo7SbLYE1k5XkGNNq3LBWw+HnkwcAAI6FGCIihWYxLSFJDWUJUG4jZdz6n1+ZtASlG/rkIDdWrSVKMxlDHOQgMQ7sSIIEkXQm5uL2pJNOgt1ux5AhQ5CTk4PCwsKgf0T6Ig5wUGCSkxgH1l25DUhLUBv+EbzqKG6V3lFxHCemJnxd3Rz19ky5VdIakUgGFvkjdI5ZAZ4XlriZSkioh+7Kbbr4bUNRmmtCWa4JPO9fLYiFZKUlJLKhLCblNs7nZw194U6BOAhjkKU29MkhV2bOLfNXF0ZR6WONA2PTzCgGzE/Ma8OXX3456urq8Oc//xn9+vWjhrJehBIZtwxmS+g+gletaQmAv7hNdVPZkQROmjltWDHe+7EOXx1owT1nh78dz/NicVuQ4IOuUgwKaCrr7BL2S6TaqhM2xMHq9MDicPszblWelBCOcf3z0LDLju1H23HyIOlFlcvjFYvNRNsxkqPchi9ulfLcBjb0dUdOQ58cZNsSfMJJcZR9aqwjeEUrG8WAicRcYXzzzTfYuHEjJkyYkIjtIVKIzSWchcbbTCY8Rjhbgi8tQYVqYEGWumwJiVhiOm2Y0GDx09E2tNtcYVVZm8sjNj7kq/CzCgVTjWrNVlgtwoFtLPltVUmWUYcsgxYWpwfHOx1pk3EbjnGVeVizqxE/HW2L6X4sV1vDJf53lijlts3qFB9zYITiyl8Qxp/WwBr6bn/zR7g8/twEOQ19cpAbBSbaEqIUt0y5be5ywOp0Rzwm8zxPAxxCEHMVM3LkSNhs0s4miPRCWeU2jC1BxcqtPw4s1cVt4pTb8rwMDCnJwsHjFnx7sAVnjykLeTuWmWjQahTxYCeDKtGWYIPdV9yOJuVWtZTkGGFpseJ4lwNNaTJ6NxwsWm+7b1qWVJq7/MWOJsFeYzG+yu4Gz/OKrboy1bZfrjHisYMV150KFdfzxpajJHsXjrXbsXjucJw8qAhTBhcmxbMtNwrMn4wR+SQuL0OPXJMOHXY3jphtGFEWvom/zepCl2/UPXlu/cTsuX3sscdw991344svvkBLSws6OjqC/hHpCytu4xngwGBnmmGVWxUWt2rw3AaGcSuVcdsdlprw9YHwvluWGJGXqa5JcpFgS6KHzVY0+M6/x1aScqtWAn236ey5BQTlFgBqmi2i9UoKyUpKAPzFpcfLw+KMvfEtHFL8toByDWWBsFW2Cyb2x7ShRUlrRmTijMXpgdvjjXJrP2bWPCjB6sV6CI5E8d0y1bYkxxgxgaGvEXNxO2/ePGzcuBFnnnkmSktLUVBQgIKCAuTn56OgoCAR20gkCatDeVtCd+XW77lV31K3qNym0JZQ59tRCWfuiXmPTh0qFLdfRSxu02c6GaM8zyQOD/HwHPIydKjMp2U6tRJc3AoH/dI0tSUUZxtRmZ8Bngd2HpMu8rRYWINR4n3tJr0wXAdQ1ndbKyEpAQiOAuN56WNlw2F1umF3+TJjE5w00Z3A4xdTTaUg1ZYA+DNrozWVsaQEsiQEE3MVs27dukRsB6ECrK7EN5SxtAS1RYEB6lBumSUhkXmF04YUQcMBB49bUN9uQ3lez+cSM24z0qOZDBCmsFXmZ4jLpP3zM+DlAW16CM99jsARvOmu3ALCKkFdmw0/HW3H1CHShgcka4ADIKSl5GXo0dwleGQrFDrxOyRVufXt810eHjaXJ24Rhb13Rl3yrVMGnQYZei1sLg86bG7Jg25i+bylxoH5G5DJkhBIzN+umTNnJmI7CBWgaM6t7zGsYXJuVe25TaFyKzaT5SduR5WXqce4/vnYdqQNXx9owcWT+/e4TWuALSFdWL2jPmhy0c76TkxftjYpDSZE7DDl9libTVS00rm4Hd8/H5/sbIzJd8uU2+IkDa7INQnFbWKU28jFbaZBC52Gg9vLo8MWuUlKCi2ipcOQEutUjkknFLcx2FBaLNJHLfcvlGZLOJIEQSQdifnbtX79+ojXn3766bI3hkgtiWgoC1Ru3R6v6PVSY3FbIDaUpS4KLJExYIGcNrTIV9w2hyxumS8uXWwJq3fU4+YVW3rMm29ot+PmFVvw4lWTqMBVGay4Zcv4ei2XNt+3UDDf7Y5Yitsu6cvUSpCbgMQEv+c28gk5x3HIzdDDbBGU47K8+E5kRP9qiiba5Wbo0dTpkFzc8jzv91jHotxGiQOj0buhibnCmDVrVo/LAs+aPB7ljOpEcvEPcVDCc+sz3Dv834dAb5IqPbeqsCWwGLDEFrfThxXjhS+q8fWB5pCd0ywxQupyWyrxeHksXbmrR2ELCHPmOQBLV+7C3NFlaTX9qrfDitsDx7sACBm36dK8GIrAprJIMXuBtMRQ7CiBknFcgLASxxIfohW3gOC7NVuciowAbk7yiUF3/FPKpL2XnQ63GFsmZZsHBgxyiJRu4R+9S8VtIDE3lLW2tgb9a2pqwurVq3HyySfj008/TcQ2EknC5mQNZQpGgbn8P3yWlGDSa2DQxfzVSzgs59bm8sgao6kER9uS45+aVFUAo06Dpk4HDjR19bi+zafs5KeBkra5xhxkR+gOD6C+3Y7NNebkbRQRlZJsQbnzeIUDfrpm3DIKsgziSelOieotm1iVjLQEQPmsW2ZJKMoySBIsWEpOuzX+549FBU0E/ill0l4LU+mzDFpJqQYV+SZwnHA8YoV8dwIzbhMtiKQbMVcYeXl5Qf+Ki4sxd+5cLFu2DL/97W8TsY1Ekki0LaFDxUkJAJBt1IndxKny3Yo7qgT7p0x6rThJKVRqAosCS4eGsqbO8IWtnNsRyaH7WOR09tsyxseYd5t05VZUG5UtbqWotoD8yV6h8J8YpKi4jVEFj9VGYdRpUe77TYRrKjve6YDD7YWGg2INgr0FxeSzfv36Ye/evUo9HJECbD61MsuoYFpCgC3Bn5SgPr8tINhrUpmY0Gl3iSkFyeh8PU3Mu23pcV06RYFJHdmarqNdeyvdC7reUNyOq8wHAPwksbg1d/mbopKB4sqtWfDbRmsmYyjp+fXHaqVG8fdPKYtNuY3FRhGtqeyITwwpz8uAXqu+1dBUEnOVsX379qC/eZ5HfX09HnvsMUycOFGp7SJSgKjcKuC5ZeqvNciWoG7lFhDiwJo6HSlpKqtrs/m2QY9sY+JPAKYPK8YyAJsOtsDt8UIXsHNMp7SEKYMLUZ5nQkO7PaTvloMwlnPK4MJkbxoRAb1Wg8Isg3gima4Zt4Ew5fano9GLW7vLg05fH0KymqKUVE4BoLaZKbfSilsx61aiTzUSarElSH0tgekOUhlYmInNNeawxW0ip1mmOzEfQSdOnAiO43qEME+dOhUvv/yyYhtGJB+LQznPLVN/A5Vb5rlVY1ICg/luzSmwJbCu2GTlFY6uyEVehh7tNhe217Vj0kD/EBZ/WoL6bQlaDYclC0fj5hVbwAFBBS5rwViycDQ1k6mQkmyjWKSk6+jdQMb6xj0fNlvRZnVGbMhkr1uv5ZK2muUvLpUpblnG7aBiibYEk4LKbZJV7+6IDWUSTxTkFOPRBjlQxm14Ytaxa2pqcPDgQdTU1KCmpga1tbWwWq345ptvMHLkyERsI5EkmC1BkYYyfc8hDmwnkCuhizhViFm3KbAlJPssXKvhcOpQIWz+6/1+3y3P8/4hDmmg3ALCnPkXr5rUI16oLM9EMWAqpjjgQN/S5RSby9KVvEy96D+NZk0wB0yrSlZKhJLKKRDouZVqS4itIIyEOYZpX4mAHcek2hKau9g0Oukq/cAi4VgQLg6MXU4Ztz2J+XSxqqoqEdtBqABFG8qMLC3BA6+Xh0bDicqtWj23QGqnlKWi6/W0YcX4eEcDvjrQjNvPHA5AiGxz+4qMdFBuGfPGlmPu6DJsPNCETzdswlkzTsG0YaWk2KqU1Tvq8cPhVvHvP63ajZe/rkn7oRvjKvNQ22LF9qPtmDG8JOztmpOclAAoq5zanB40+CbLRRu9y1DK88vzfNIHYHQnN8YoMHZMKY5BuQ2MAwsFS9ehjNueSFZuN27ciA8//DDosn/9618YPHgwSktLceONN8LhcCi+gUTy8E8oUyLn1l8gM0U4HTy3qZxS5lduk7ejYk1lPx5uE6fJMdXWqNNIiqxRE1oNh1MGF2JyMY9TBhdSYatS2NANu8sbdDkburF6R32Ktix+mO822jCHZI7eZeQp6LllBVdehl5yHrbfpxrf81udHvG7kzLllkWBOWKzJcSyvaxorW+3weXx9rjer9xScdsdycXtH//4R+zcuVP8+6effsL111+POXPm4L777sPKlSvx6KOPJmQjicTD87xY3ChhSzDp/I/BFGG1pyUAfU+5HVSUicr8DDg9Xnx3SFDR/EkJ6aPaEulDtKEbgDB0I10tCiwxYXuUpjKzjAajeGG2ACWU20MSJ5MFkqfQEAn23pn0GkWOV3IQLRYSlVs5QydKcoww6jTw8sKY6kA8Xl68jBrKeiK5uN26dSvOPPNM8e+33noLp5xyCpYvX47FixfjmWeewX/+85+EbCQhHY+Xx8bqFvxvax02VrdIPkA43F6wmyphS9BouICsW+HHz85wSbkNjThGMYln4RwX4Lv15d2y154uflsivejtQzfGVOYCENJPWBZrKJotsXsw44UVl1anJ6QSGAuHY/TbAgFpDXEW14GWjlRNtWPHMekNZbHbKDiOE48H3a0J9e02uL089FquV8ToKY1kCa21tRX9+vUT//7yyy8xf/588e+TTz4ZR44cUXbriJhYvaMeS1fuCjpwlOeZJHnYbAGNX5kKLUVnGrSwOj2icpseaQlMuU1uFFiH3SWqKZVJDuOePrwYb/9wVCxu02k6GZF+9PahG7kmPYYUZ+FgswU/1bVj1ojSkLczp8CWECgsdNhccUWQiUkJcpTbOIvbVDeTAYETytwRx+MCwsqo3G0eWJiJA01dPZrKmBhSmZ9B9qsQSFZu+/Xrh5qaGgCA0+nEli1bMHXqVPH6zs5O6PV0MEwVzMPWXRGR6mGz+nyxBp0mKO80HsRBDsyWIDaUqfd7UpiZmrSEo74dV2GWAVlJyLgN5NShgu9257EOmC3OtJpORqQffWHoxjgJvtsWGQ1G8aLVcMgxKmNNiDUpAfBb0jod7rhsJ8me7BYKZkvwePmgVKBQdNjdcHmE1xtrcTvAZznortxSDFhkJFcxCxYswH333YcNGzbg/vvvR2ZmJmbMmCFev337dgwdOjQhG0lERgkPm1XBjFtGD1uCjdkS1Kzc+nNuu2c5J5JUhnGX5Bgxol8OAOCb6ma/5zZLvSchRPrChm6E05o4CCtO6Tx0Y1ylbwxvBN9ti4xoKCWIdWxsOOQot4ExkFIjtEIhZ9qX0mTotaJi2hnlvWSqbbZRF3OTLrMldB/Be6SVYsAiIbm4ffjhh6HT6TBz5kwsX74cy5cvh8Hg/2K9/PLLOOussxKykb0JuZ7YSCjhYWNnnkpZEoCAKWXdlNt08Nw63V4x5SEZpKKZLJDAUbysuM0j5ZZIAGzoBoAeBW5vGbrBittIWbepUh+VGIHrcHvEZqZYlFu91t8AFs/zy/GvKg3H+YdvRPPd+k9kYv+sB4YZwXuUlNuISJbQiouLsX79erS3tyM7OxtabXAR9PbbbyM7O1vxDexNxOOJjYQSHjYlM24ZWaItwafcikMc1KvcZui1MOo0cLi9MFucisSiScFf3KZmRzV9eBFe/roGXx9oxklVwqSyAvLcEgmCDd3ovj8sU2B/qAbGVOaB4wRR4XinAyU5PYswpj4WJ1u5FfNZ5ReXR1tt8PJAlkEbs60iL0MPq9MT1yAJNSi3gCDUtFpdUd/LeE5kBoQrblPQgJxOxHzkzsvLC3l5YWH6LiElA+aJ7a7TMk9sPFOUlPCw2VzMlqBcMReo3DrcHjjcQneumpVbjuNQmGVAfbsdrRYX+hdEv48SMFvCgBQpt1MGF0Gn4XDYbIVRJyzoUEMZkUjY0I3NNWY0ddpRmiNYEdJZsWVkG3UYWpKNA01d2FHXjtkjg5vKrE63uDJUmGTlVolBCrViDFhWzGkFuSY96tvtcT1/iwoaygC/UBPNlhDPqGBWvLZaXeiwu8SelSMptLKlA8p0DhERSXSuI/OwhUOKhy0Ryi1bfrI5PUE//uwkN0zFCgskNycxDizVym22UYeJA/IBAPubugBAcjA7QchFq+EwbWgRzp9YiWlDi3pFYcsYH8F3y4odo06DrCTntOYqMMjB30wW+/5KiUEScqZ9JYJciXFgzEYhZxpdtlEnFvFMvXW4/dPhaDpZaKi4TQKJznXUajgsnntCxNtE87CJnltFi1uhiLU4/MVtjlGn+gNYoa+RKpmJCWo4C2e+W0ZdqzVtg/QJItWMFX23bT2u8yclJD+nVRnlNvakBIYSgyRS1YzXnRzRcxtFuWVKs8xi3G9NEESQ+jY7eF6w0aW6wFcrVNwmgWTkOrIzOn23wjE/Qy/J8mBLSHHrsyW43KInSc1JCYxkTylrt7nE4r8yhcWtrtt3548f7sb0ZWvTehQqQaQKNoY3tHIrv8EoXvwjcOV7XuUkJfR8fnnFLc/zfg9rqm0JEl9LPLYEwG9XY8f5QDEkVUMs1A4Vt0kg0bmOFocbr26sBQA8felEvHnDVJw9Whi4MWN4sSQvr1+5Va74ZMtt1kDlVsV+W0ayp5Qxv21RliFpDWzdWb2jHk+t2dfjcqk5yQRBBDO6IhcaDmjqdKCxI1i4SGVOa15G/A1l8Sm38SnHFqe/fyOVObeA/3gmNQpM7vYO7BYHxhRc8tuGh4rbJJDoXMe3vjuCdpsLg4uzMH9cOaYNLcIvTx8CAPi6ugVeCUvLNqfyObcZAUMc0iEpgZFs5TbVMWCJ9oQTRF8k06DD8FIhP/qnbuqtX8lL/rJ6vJ5bt8crKoiDimUot3E+P5vsZtJrUiYGMNjxLNpraY7TRjGw2wheVuRSUkJ4qLhNApFyHQGhgJCb6+jyePGPDQcBADfMGCI+xsQB+cg26mC2OLGrviPq41gS2VDmcos/flJue5LqZrJEe8IJoq/CfLfb67oXt74Go5Qot/Epp8fa7HB7eRh1GvSTsdrof355toiWOJqzlEaqLcEcp42iexyYGANGzWRhoeI2SbBcx7IQqQanDC6UHQP2wdZjONZuR3G2ET+bVClertdqMG1oEQBg/f7jUR/HP8RBuTNhVtwGNZSlg+c2K3nKrcfL47tDLQAAjQYpUUeT4QkniL4I893+dLQt6PJ4i514EJVTmcXtITEGLBMaGYJMvDm7ouqtgkYqdjyLZEvgeV5BW4INXi8vFrk0nSw8VNwmkXljy/HVvWfgzRum4v8um4iHLxgLANhUY8b2bjs/KXi9PP62vhoAcN30QT3G+p0+XOh+37CvOepjJcKWwJaMbE6P2E2amw7Krc+W0GqJb/Z6NFbvqPc1bDUCAFZuq09JA1eiPeEE0VcZx4rbuo6gcd7NYrGTfPUxXuU2MOM2nueXbUtQScYtIM1i0WFzw+0TLeRuc3meCVoNB6fbi6ZOR8C4dlJuw0HFbZIJzHW8emoVLphYAQB45MPdQTs/Kazb24R9jV3INupw5SlVPa6fMbwEAPB9rRkWR+QloITk3Bp9yq0zzdISfFFgicy5ZUM9utsBUtHAlWhPOEH0VUaX50Kr4dDc5RBzSYEAW0IKCjR/cemO+ZgDBDSTyfR7xttQ5k9KSL0tQYpyy2wUOUYdjDp5x1edVoOKfEFc2NvYiWafek22hPBQcZtifjtvJEx6DTYfMmP1joaY7vvSl4Jqe+UpA8UdViBVRZkYUJgBl4fHppqWiI/FpuUoqtzqew5xSCfPbZvVKWvnHw21NXBF8oSzv+V6wgmiL2PSazG8VBhLHxgJFu8ydTyw1TOPlxd7LaTi8fLYcrgNAODleVn7KLG4luu5TaFfuTtSPLfxZtwyWCG7sVo4lueYdMijKZJhoeI2xVTkZ+DGGUKywaMf74HDLW1n80OtGd8daoVBq8F10weHvA3HcaJ6uz6KNSGRQxzSNS3B5eHRFUXxloMaG7jCecLL8kxxjYYmiL6O33crFLc8z4u+0VQsrZv0Ghi0wqE/Ft8rs1FtOdwKAHj560OybFSBnl854kEq/crdkWKxUOqzZr7bjdXCsZxU28hQcasCfjVzKEpzjDhstuKVrw9Jus+LXwgJCT+bVIl+ueG9kKLvNkpTmd+WoGBDWaAtIY3SEkx6rVjkJ8J3q9YGru6e8DdvmIqv7j2DCluCiINx/fMBAD/5EhO6HG44Pb6c1hQsrXMcF/OUMCVtVKwgdHq8Yl5tLDSryHPLbAl2lxfOMK/FrJCNgiUmsO8RZdxGhopbFZBl1OE3Z48AADy39oC47BKO/Y2d+Gx3IzgOuNGXZxuOaUOLoeGA6uMW1LXZwt6ONZQpOedcjAJzpldaAhCQdZsA362aG7gCPeHThhaRFYEg4mS8OIa3PUi1zTJoFe1xiIVYfK9K26iyDFpxvyLHd2u2qMeWkG30H886w6i3SvmrWXHL3mbKuI0MFbcq4eJJ/TGmIhedDjee/qznpKhAXvpSUG3PHl2GISXZEW+bl6HHxAH5AICvIqi3icm5FX74bq9/h56bLsWtr6msNQFxYFMGFyI/gleKGrgIovcwsjwHei0Hs8WJujab2GAUrwczHmIZgau0jYrjuLjiwMwpHIDRHZ1WIwpC4ZrKlJpGN7BbMTuAlNuIUHGrEjQaDg+eKzT1vLHpMPY1doa83bE2G/63tQ4AcNOsoZIeW/Td7g/vu7UlYPxuoH/3uO/sNR2iwIDETinbeqQVXWF2hNTARRC9C6NOixP6+SeVpXI6GSOWOLBE2KjkJibwPK8qWwIQPQ5Mqeiy7sWsxemmqZERoOJWRUwdUoSzx/SDlwce+Wh3yNv846sauL08pg4pFBXZaJx+guC7/fpAc8gfA8/zsCYg51av1UCvFQo09rzp4LkFEjel7FCzBb989Xu4vTzG989DWS41cBFEb4c1lW2vaxeVvOJUKrcBcWDRSISNSlSOY8y6tTg9ordVDbYEIFAFD6fcKmOj2FxjDkqz+csn+1KSi54upMcacR/i/vmjsHZPE9bvO44v9jZh1ohS8bo2qxNvbj4MALhppjTVFgAm9M9HjkmHNqsLO+raMaFbUexwe0Ufj9IesEyDLujsPO08twoqt2aLE9f+czNarS6M75+Ht26cCqNOi801ZjR12lGaI1gRSLEliN7FuMp8vIkj2FHXLi5jp1J5zIuhoYzlYIezJnAQTspjsVHJHSTB/KsZeq2iq4zx4M+6Dee5jV+pX72jHre8vqWH75k19JEg0hNSblXGoOIsLJo2CADwp492w+3xd2C+trEWVqcHo8pzMfOEEsmPqdNqcNrQ8KkJtoCsw0y90sWt//G0Gk5RZTiRKK3c2l0e3Piv73GoxYrK/Az8v0UnIdOgowYugugDiMrt0XYxgD8V08kYsXhuA3OwuyPXRsXSGmLNum1RmSUBiG5LiHeb1ZaLni5QcatCbj9zOAoy9djf1IXXN9ViY3UL/vvDESzfIDSS3TRzCDgutiJohs+aEMp3a/UNcDBoNdBplf1KBBazOSZdzNudKgqylFNuvV4ev3l7G76vbUWOSYdXfnEyjbIliD7ECf1yYNBq0G5zYeuRNgCpzWnNy5Be3AJCTODg4p7d+XJtVHKVW9ZMlkpLR3ciTSnjeV5sSi6WeTKjxlz0dEAduj4RRF6GHnfNPQF/+N9OPLRyFwJzrrUcoJOh7p3uayrbUtuKLoc7KMKExYAlIpYmcOkoXSwJAFDosyUokXP7l0/34sPt9dBpOPztqskY7msuIQiib2DQaTCyPAfbj7Zj29E2AKn1jEZTG7tT325DTbMwdveFKyfB5fHGZaOKRTkOREyaUJNyG+G1dNjccPsUVZbAEytqzUVXOylVbtevX4+FCxeioqICHMfh/fffF69zuVy49957MW7cOGRlZaGiogLXXHMNjh07FvQYZrMZV155JXJzc5Gfn4/rr78eXV1dSX4lysPO6rsPcPHwwG1v/BiziXxAYSYGFWXC7eXxbXXwKF42wEHJjFtGYMGcLkkJgH9HFGvOrcfLY2N1C/63tQ4bq1vw+qZavPiFMCb5sYvG49RhxYpvK0EQ6mecL++W7dPTJS0BgDga/qSqAiwYVx63jUpuWoJ/iT/1MWAM0WIRQrlt9hXjOUYdjDp5x1c156KrmZQWtxaLBRMmTMDzzz/f4zqr1YotW7bgwQcfxJYtW/Duu+9i7969OO+884Jud+WVV2Lnzp1Ys2YNPvzwQ6xfvx433nhjsl5CQvB4+bBpCQw5HhsWCdbdd2tNQMYtI6ubLSFdYMpAWwzFLRtPefnyb/Hrt7bi8uXf4oH3dgAAfn3mcFw8uX9CtpUgCPXDfLeMlCq3UTr8u/PxT0JxO3+cMk1LsSrHjBZV2hLCvxazAhm3rKEv3GkE5aKHJqXVxvz58zF//vyQ1+Xl5WHNmjVBlz333HOYMmUKDh8+jIEDB2L37t1YvXo1vvvuO5x00kkAgGeffRYLFizAE088gYqKioS/hkQQi8dm2tAiyY87Y3gxXvu2Fhu6+W79MWDKfx2CbQnpo9yKtgSrC14vD00UhYKNpwx3ujGyjKwIBNGXGVsZXNwearZiZFluSppIY825/a5W8HPOG1uW9OcPRKnMWCWJdKLA0h3i2V7W0Hfzii3ggKBjDOWihyd9pDQA7e3t4DgO+fn5AICNGzciPz9fLGwBYM6cOdBoNNi0aRMuvPDCkI/jcDjgcPhH3HZ0dAAQrBDsH/s7FdS3WSTfzuXKlfy4Jw3Mg1bD4WCzBTVNHeJs6k6fOmnSaxR/zSa9/weXbdSm7D0NRMrnm6X35/Oau2zizjgUHi+Phz7YGbaw5QD88cOdmH0CpSEkg1T/fonEkq6f74GGjqC/b31jC8pyjfj9gpE4e0y/pG4L25112F1R38dV24+B54Hx/XNRmqVT5H1n+9d2a8/nj/T5Nvt8pfkZ6jiWAECm77V02Jw9tqmpQxh5X5Cpj2t7zxxRjGcvm4BHVu1BQ4e/dinLM+KB+SNx5ohi1bwf0Yj39yv1fmlT3Nrtdtx77724/PLLkZsrFHQNDQ0oLS0Nup1Op0NhYSEaGhrCPtajjz6KpUuX9rj8008/RWamvyO0u3KcLA62cwCiWwQO7tyKVUd/jOmxq7K0ONjJ4aX3v8Cp/YRy7Nsm4fm62lqwatUqGVscnqZjGjD3S0v9UaxadVjRx4+HaJ+vSauF3cPhvVVrUBph0uH+dg4NHeE/L0Fpd+C5f6/G8DyKa0kWqfr9EskhnT7fbS0cXt7HXID+E9yGDjtue2srrjvBiwlFyds3CH2yOlidHqz8cBUiheS8vlPYhw/StCp2fDjUKTx/Y2tH2McM9fnW1GsBcKjetR2r6rcpsi3xsqdNOH7WNZl7vJZvjwrXWc2Nirx3944Gqjs4dLiAXD0wNNcCT+0PWFUb90MnHbm/X6vVKul2aVHculwuXHLJJeB5Hi+++GLcj3f//fdj8eLF4t8dHR0YMGAAzjrrLOTm5sLlcmHNmjWYO3cu9PrkL6V7vDz+++R6NHY4QqqBQmi2EbddenrMSuDBjGr839pqtJnKsWDBRABAy7eHgeo9qKosx4IFE+Le/kB2froPGxoOAQDGjRyGBWcOU/Tx5SD1831izwYcabVhwsmn4sSB+WFvt3J7PbDrp6jPO2TMRCwYT0HbiSbVv9//396dh0dV3f8Df89MkpnsG5CZsKPsS9hDBBUlkoClYFHAJyqoX62SoBS0v9JHjVCVRWoVS6G2FbQqICoIKgFkCRUxgdAIQYhAgyBkkYSQPZnMnN8fyb1kkknIfu/cvF/PM8/DXebeM3OY5JMzn/M51LZcrX9tdoHlfz4EoNzJUR10AHZle+H3MU3/ed6SNv3xWFVwcdtdkfWWJcstrsDvvjsIAHh25p3oEVS3HFhz/O+XYvwl7TCsOndMnRrlcKyh/l1+KhFAOaLuvK1ODrNSQi/lY/3pZMDDE1On3uFw7NiXZ4BLFxE24BZMvaevQi1Ul5Z+fqVv2m9G9cGtFNj+9NNP2L9/vzxqCwBmsxk5OTkO51dWViIvLw9mc/25QUajEUZj3dmW7u7uDm927e324g7g5V8PvkmOzWCYjE3P45k4IARv7T+PI//Lg05vgJtBj/LqNRy8ja3/en1NN9oY6G1U1S+jm/VvkLcHLl0rRUG5vcHzLAHejbqfJcBbVa9f65T6/FL7cJX+PXY+1+Gr5Nqkb3b++3Nhk+ZQtIQ7qmbwF5ZXosQqYK7nfTz4YybsAhjS1Q+3hLReMBnsV/VVWFF5JQwGN6dzGmr3rxACeSVVX0mHBHippu8DfarT+8oq67QpvzoPt7Ofp2raqxbN/fw29jmqXsRBCmzPnj2Lr7/+GsHBjh/8iIgI5OfnIyUlRd63f/9+2O12hIeHt3dzW1X0EAvWPTQSZn/H8h7NLZotGdYtAH4mNxSUVeLE5esAbtS5bYvVwzxdtFoCUGMhh5tUTJBms9aHs1mJOi611im9UbGg/ooJX1WXAJvSyku7Sr8LhHC++IEzReWVqKisWrFTyTJqtUmlwArLK2GvVcFImlCm5IIdHZWi0UZRURHOnTsnb2dkZCA1NRVBQUGwWCy4//77cfz4cXzxxRew2WxyHm1QUBA8PDwwcOBAREdH44knnsD69ethtVoRFxeHOXPmuGylhJqih1hwzyAzkjPykFNY1qKi2RKDXocJfTvhq5NZ+M+PVzGyR6BcCqwtgltvo2tWSwBqLuTQcHBr0OvwzKS+WPJZ3dQEzmYl6tjUWqfUz9Mdl/NL661YcL3Eim/PVVXWmdJKVRIkRjcDTO56lFntKCizwt/r5r8bpEoJXh6GNilb2VxStQQhgOKKSoffc2qs7tBRKDpye+zYMYwYMQIjRowAACxatAgjRozASy+9hMuXL2PHjh34+eefMXz4cFgsFvnx7bffytf48MMPMWDAAEyaNAlTp07FhAkT8M477yj1klqdQa9DxC3BLS6aXVPterfS8rttUwrMNRdxABo/cgsA31cvqelucOyflo60E5FrU2udUn9p8YF6gtu9p7NRaRcYYPZFn84+bXD/ppUDu1qkzkDR6KaHR/WMvNqj4LmtUOeWmkfRkduJEydC1F6Cq4aGjkmCgoLw0UcftWazNO/2vlWrZP33Uj4KyqwoKW+7tARjjWm4F3KLWy1Abw/SD9GbjdyeyynEx8cuAQA+/L9w2OxotZF2InJtaq1TKg021Bdc7jpZtQpma6ck1Lx/dkF5o5fglRdEUFlwq9Pp4OfphqtFFSgotaJrQFUOrt0uarRZPWkUHYWqc26pbXQL9EKfzt7yUrFttUJZQlom/rg9Td5+YXsaJqzc3+Slg5USWJ2WkFfc8A/fVQnpsAtg8qAQjO0d3Ooj7UTk2tpqDkVLNDRyWlBmlRf7mTK0dVMSGnN/Z/Kql7IN9lFfoCilItTMHy4os8qriKpttLkjcK0ZPtRq7ujbGf/7pRj/OfsLSq2tn3Nb34pdWdfL8PQHx13iq/og76ofWNcaSEtI+SkPe37Ihl4H/D66f3s1jYhcTFvMoWiJhpbA3X86BxU2O27p7I2+XVo/JeFm93dGrWkJAOBnqpviIbXX1+QGDzeOI7Y3vuMdlJSa8J+zV1t9QpnNLrB05w9Oa/RK+5bu/EH+q1atAm8yoUwIgeVfnQEAzBrdHbd24RK7RFS/tphD0VzSyKmztIBd1d+uTR1qgU7XNm1s+sitevNX5ZHb8huvRa1pFB0Fg9sOalyfYLgbdPgptwTncooAAJ6tNKEsOSMPmdfrL2tTVdexDMkZea1yv7Yi59zWM3L79ekcHPvpGkzueiyM7NeeTSMiapEbo42Ok6CKyytxML1qsnF0K1dJaMz966Pmslp+nnVfi5rTKDoCBrcdlLfRDSN7BAK48Zdza43cqrWuY1NJ1RLyS611RpkrbXasSqgatX1sfO86uXRERGomld+qPXJ6ID0H5ZV29Az2wiCLn7Onts79mzhymyuX1VJfsChNznOWlqDGNIqOgMFtB3ZHv84O22ezC1slVUCtdR2bKsDzRv3C2j+APzt+GWdzihDg5Y7f3nmLEs0jImo2OSCrlfO66+SNhRvaKiUBaHrOrbrTEm4s5CBhWoKyGNx2YLXzvf64rXWqGai1rmNTuRn08uhCXo2829IKG97Y+yMAIO6uW+VziIhchbOR09IKGw6kVy1pP7WNqiRI/Jo6cluk3mDR2citmoPxjoDBbQeVkJaJlbvO1NkvVTNoSYAr1XUEUCfAdbUVu5zl3W789gKyCsrQNcATD43rqVTTiIiazc/JhLLEH39BSYUNXQM8MbSrf9ve30lAWB8hhKpX+5JHbmuUArtanSOsxjSKjoDBbQfUHtUM1FjXsTkCvBxHbvNLKvC3g1VLRi+e3A8md/UsA0lE1FhytYSySnnBJKlKwpQh5jZNSah9/5spKq9Ehc0OQJ0LIjhLsZB+Z3TiyK0iWOe2A2pKNYOIW4KbfR+11XVsjqBa5cD+dvA8CssqMcDsi+nDuyrZNCKiZpNGTm12geIKG9wNOuw7XZWSMGVo2w8+SBUGGpOWIKUkeHkYWn2xodbgbBQ6lxPKFMXgtgNqz2oGUl1HVyVVTMgrqcDl/FJs/PYCAOD/TRngUkE6EVFNJnc9PAx6VNjsuF5qxZnMAhSVV8LsZ8KI7gFtfv+G6uzWlqvy/FVnaQm5Kk6j6AgY3HZAWqlm0B6ktISjGXn47nwuKirtGNcnCBNrVZogInIlOp0Ofp5uuFpUgYJSK76qrpIQPcQMfTv84S59lV9eaUeZ1dZgileuyvNXa6cl2O1CnqfRiXVuFcHgtgOSqhlkXS9zmnerQ1VurNqrGbS1hLRMbEm+BAA4UF3UHAAm9uvS5vloRERtzc/THVeLKpBbVIG9P0glwNq2SoLEx8MNOl1VqcWCMmuDwa3ay2pJI7dS/vD1GrXRpZUuqX1xQlkHpKVqBm0lIS0TT39w3KFuoWRlwpkWl0sjIlKalCu6Ky0TBWWV6ORjxOhe7TOoodfrGl0xIVflwa00cltRPQottdfP5AYPN4ZZSuC73kFppZpBW2iomoSkpdUkiIiUJuW97ki9AgCIGhzSroMaNyaVNVwxQZ6cpdKcW2kUGqgahZaXCmZKgmKYltCBaaGaQVtor2oSRERK8qu1slb04PZJSZD4e7rjEkpvOnKbV1wVLHZSac6tXq+Dj9ENhWWVKCyrVHVN3o6CI7cdnFTNYPrwroi4JbjDB7ZA+1aTICJSQkJaJvadyXHY9/wnJ9o15aq+JYBrc4XKAzVTLNSeRtERMLglqoXVJIhIy6Q5BSUVNof92QUtX6GyKZwtAeyM2tMSAMdyYPJSwSpur9YxuCWqRaomUd8Ytg6AhdUkiMgFtccKlY3V2All8mpfKk1LABzLgUlpFGpcTa2jYHBLVAurSRCRVjVlTkFb8/e6+citEAK51cGimkdupUC9sKwSV10gjULrGNwSOcFqEkSkRWqaUyBNaCtooFpCYXklrLaqUWQ157DeeC1W5DEtQXGslkBUD1aTICKtUdOcgsbk3Er5q94ehgYXelCaY1qCNKGMaQlKYXBL1ACpmgQRkRaoaYXK2svWOpPnAikJQK0JZVKbVTzSrHVMSyAiIuog1DSnoDHBrVx5QOWjoFLObX5JjZFblQfkWsbgloiIqANRy5wCKSBsMC3BRWrGSqutXbpWAqnQRKCXutusZUxLICIi6mDUMKfA3/PmE8pcZbUv3+pA/cLVYgBVE8w83Dh+qBQGt0RERB2Q0nMKaqYl2O0CeieB9Y0FEVwjLeFaSdUodCeVt1fr+GcFERERtTspIBQCKKpwPnqbKy+IoPaRW8exQrWPNGsdg1siIiJqdyZ3A4zVX91fL3Ged+sqk7OkUWgJg1tlMbglIiIiRdysYsLVItfIufWrNXKr9jQKrWNwS0RERIq42UIOeXJagrqDRWlCmUTtaRRax+CWiIiIFNHQErxCCJdJS/Bw08PkfiOkUnt7tY7BLRERESlCGrktcDJyW1BWCautqmis2tMSAMfRW1dor5YxuCUiIiJFNJRzK43a+hjdYHI3tGu7mqNm3q3a0yi0jsEtERERKaKhnNvcoqp8W1cZBa1ZMYFpCcpicEtERESKkGrdOktLyHWR1ckkNdMSOKFMWQxuiYiISBENjdxKaQmdXGQU1Nd4I3Xix+xC2OxCwdZ0bAxuiYiISBF+ntXVEsrqVktwpbSEhLRM7E//Rd5+6F/JmLByPxLSMhVsVcfF4JaIiIgU0bi0BHVPzkpIy8TTHxxHaYXNYX/W9TI8/cFxBrgKYHBLREREinD1tASbXWDpzh/gLAFB2rd05w9MUWhnDG6JiIhIEQ2VAst1gaV3kzPykHm9rN7jAkDm9TIkZ+S1X6OIwS0REREpo8FSYPLqZOpNS8gprD+wbc551DoY3BIREZEipJzbMqsd5ZWOOavShDI1l9Xq4mtq1fOodTC4JSIiIkX4mtyg01X9u6D0RsUEIQSulag/LWFs7yBY/E3Q1XNcB8Dib8LY3kHt2awOj8EtERERKUKv18HHKJUDu5GaUFhWCautahKWmoNbg16H+GmDAKBOgCttx08bBIO+vvCX2gKDWyIiIlKMs7xbKd/Wx+gGk7vB6fPUInqIBeseGgmzv2PqgdnfhHUPjUT0EItCLeu43JRuABEREXVcVXm3pQ61bvPkyWTqHbWtKXqIBfcMMiM5Iw85hWXo4luVisARW2UwuCUiIiLFNDRyq+aUhNoMeh0ibglWuhkEpiUQERGRgpwtwZtXXBXoqrlSAqkXg1siIiJSjDRy6zQtQeVL75I6MbglIiIixUi1bgucpSW4SM4tqQuDWyIiIlKMn5Oc2xsjtwxuqekY3BIREZFi5LSEMtetlkDqwuCWiIiIFCNPKCutOaFMqpbAnFtqOga3REREpBhnpcDySlgtgZqPwS0REREpRp5QVp2WIATTEqhlGNwSERGRYmqP3JbagEq7AOBaiziQejC4JSIiIsX41ahzK4RAUXV2gq/RDUY3g4ItI1fF4JaIiIgUI43c2gVQVG5DYXVwyxq31FwMbomIiEgxRjc9PAxV4UhhmRVFVh0ATiaj5mNwS0RERIrR6XQ1FnKoRFF1RTCWAaPmYnBLREREipJr3ZZZ5ZxbjtxSczG4JSIiIkXJq5SVVt5IS2DOLTUTg1siIiJSVM1at9LILcuAUXMxuCUiIiJFyeXAym7k3HbyYc4tNQ+DWyIiIlKUv5RzW2pFYXVaAkduqbkY3BIREZGipLSE62WVKGZaArUQg1siIiJSlLwEb4mVaQnUYgxuiYiISFFSzu3l/FLYRVVaQqC3u5JNIhemaHB76NAhTJs2DaGhodDpdNi+fbvDcSEEXnrpJVgsFnh6eiIyMhJnz551OCcvLw8xMTHw8/NDQEAAHn/8cRQVFbXjqyAiIqKWkEZuL+SWAAB8jG4wuhmUbBK5MEWD2+LiYoSFhWHt2rVOj69atQpr1qzB+vXrkZSUBG9vb0RFRaGsrEw+JyYmBqdOncLevXvxxRdf4NChQ3jyySfb6yUQERFRC0k5t7nFFQC4gAO1jJuSN58yZQqmTJni9JgQAm+++SZeeOEFTJ8+HQDw/vvvIyQkBNu3b8ecOXNw+vRpJCQk4OjRoxg9ejQA4O2338bUqVOxevVqhIaGtttrISIiouaRRm4lQUxJoBZQNLhtSEZGBrKyshAZGSnv8/f3R3h4OI4cOYI5c+bgyJEjCAgIkANbAIiMjIRer0dSUhLuu+8+p9cuLy9HeXm5vF1QUAAAsFqt8kPaJu1h/2ob+1fb2L/aVCu2RaCXO/tYg1r6+W3s81Qb3GZlZQEAQkJCHPaHhITIx7KystClSxeH425ubggKCpLPcWb58uVYunRpnf179uyBl5eXvL13795mt5/Uj/2rbexfbWP/aktV+a8bIUnptRx89dVXirWH2lZzP78lJSWNOk+1wW1bWrJkCRYtWiRvFxQUoHv37pg8eTL8/PxgtVqxd+9e3HPPPXB351cjWsP+1Tb2r7axf7XJZhf447EbAc+Qvr0wNXqAgi2ittDSz6/0TfvNqDa4NZvNAIDs7GxYLBZ5f3Z2NoYPHy6fk5OT4/C8yspK5OXlyc93xmg0wmisWz/P3d3d4c2uvU3awv7VNvavtrF/tcUdgK/RDYXlVUVuO/t5sn81rLmf38Y+R7V1bnv37g2z2Yx9+/bJ+woKCpCUlISIiAgAQEREBPLz85GSkiKfs3//ftjtdoSHh7d7m4mIiKh5/Gok3nJ1MmoJRUdui4qKcO7cOXk7IyMDqampCAoKQo8ePbBw4UK88sor6Nu3L3r37o0XX3wRoaGhmDFjBgBg4MCBiI6OxhNPPIH169fDarUiLi4Oc+bMYaUEIiIiF+Ln6Y7L+aUAWAqMWkbR4PbYsWO466675G0pD3bu3LnYuHEjfv/736O4uBhPPvkk8vPzMWHCBCQkJMBkMsnP+fDDDxEXF4dJkyZBr9dj5syZWLNmTbu/FiIiImo+P9ONkISlwKglFA1uJ06cCCFEvcd1Oh2WLVuGZcuW1XtOUFAQPvroo7ZoHhEREbUT3xrB7U+5JRjSLQgGvU7BFpGrUm3OLREREXUMCWmZOHwuV95+ZssJTFi5HwlpmQq2ilwVg1siIiJSTEJaJp7+4DhKrTaH/VnXy/D0B8cZ4FKTMbglIiIiRdjsAkt3/gBnCYrSvqU7f4DNXn8KI1FtDG6JiIhIEckZeci8XlbvcQEg83oZkjPy2q9R5PIY3BIREZEicgrrD2ybcx4RwOCWiIiIFNLF13Tzk5pwHhHA4JaIiIgUMrZ3ECz+JtRX8EsHwOJvwtjeQe3ZLHJxDG6JiIhIEQa9DvHTBgFAnQBX2o6fNoj1bqlJGNwSERGRYqKHWLDuoZEw+zumHpj9TVj30EhED7Eo1DJyVYquUEZEREQUPcSCewaZceRcDvb8JwmTbw9HxK1dOGJLzcLgloiIiBRn0OsQ3jsIuacFwntz6V1qPqYlEBEREZFmMLglIiIiIs1gcEtEREREmsHgloiIiIg0g8EtEREREWkGg1siIiIi0gwGt0RERESkGQxuiYiIiEgzGNwSERERkWYwuCUiIiIizeDyuwCEEACAgoICAIDVakVJSQkKCgrg7u6uZNOoDbB/tY39q23sX21j/2pbS/tXitOkuK0+DG4BFBYWAgC6d++ucEuIiIiIqCGFhYXw9/ev97hO3Cz87QDsdjuuXLkCX19f6HQ6FBQUoHv37rh06RL8/PyUbh61MvavtrF/tY39q23sX21raf8KIVBYWIjQ0FDo9fVn1nLkFoBer0e3bt3q7Pfz8+OHS8PYv9rG/tU29q+2sX+1rSX929CIrYQTyoiIiIhIMxjcEhEREZFmMLh1wmg0Ij4+HkajUemmUBtg/2ob+1fb2L/axv7VtvbqX04oIyIiIiLN4MgtEREREWkGg1siIiIi0gwGt0RERESkGQxuiYiIiEgzGNzWsnbtWvTq1Qsmkwnh4eFITk5WuknUTIcOHcK0adMQGhoKnU6H7du3OxwXQuCll16CxWKBp6cnIiMjcfbsWWUaS02yfPlyjBkzBr6+vujSpQtmzJiB9PR0h3PKysoQGxuL4OBg+Pj4YObMmcjOzlaoxdQU69atw7Bhw+RC7xEREdi1a5d8nH2rLStWrIBOp8PChQvlfexj1/Xyyy9Dp9M5PAYMGCAfb4++ZXBbw5YtW7Bo0SLEx8fj+PHjCAsLQ1RUFHJycpRuGjVDcXExwsLCsHbtWqfHV61ahTVr1mD9+vVISkqCt7c3oqKiUFZW1s4tpaZKTExEbGwsvvvuO+zduxdWqxWTJ09GcXGxfM7vfvc77Ny5E1u3bkViYiKuXLmC3/zmNwq2mhqrW7duWLFiBVJSUnDs2DHcfffdmD59Ok6dOgWAfaslR48exd///ncMGzbMYT/72LUNHjwYmZmZ8uObb76Rj7VL3wqSjR07VsTGxsrbNptNhIaGiuXLlyvYKmoNAMS2bdvkbbvdLsxms3j99dflffn5+cJoNIpNmzYp0EJqiZycHAFAJCYmCiGq+tLd3V1s3bpVPuf06dMCgDhy5IhSzaQWCAwMFP/85z/ZtxpSWFgo+vbtK/bu3SvuvPNO8eyzzwoh+Pl1dfHx8SIsLMzpsfbqW47cVquoqEBKSgoiIyPlfXq9HpGRkThy5IiCLaO2kJGRgaysLIf+9vf3R3h4OPvbBV2/fh0AEBQUBABISUmB1Wp16N8BAwagR48e7F8XY7PZsHnzZhQXFyMiIoJ9qyGxsbG49957HfoS4OdXC86ePYvQ0FD06dMHMTExuHjxIoD261u3VruSi7t69SpsNhtCQkIc9oeEhODMmTMKtYraSlZWFgA47W/pGLkGu92OhQsXYvz48RgyZAiAqv718PBAQECAw7nsX9dx8uRJREREoKysDD4+Pti2bRsGDRqE1NRU9q0GbN68GcePH8fRo0frHOPn17WFh4dj48aN6N+/PzIzM7F06VLcfvvtSEtLa7e+ZXBLRC4tNjYWaWlpDjld5Pr69++P1NRUXL9+HZ988gnmzp2LxMREpZtFreDSpUt49tlnsXfvXphMJqWbQ61sypQp8r+HDRuG8PBw9OzZEx9//DE8PT3bpQ1MS6jWqVMnGAyGOjP2srOzYTabFWoVtRWpT9nfri0uLg5ffPEFDhw4gG7dusn7zWYzKioqkJ+f73A++9d1eHh44NZbb8WoUaOwfPlyhIWF4a233mLfakBKSgpycnIwcuRIuLm5wc3NDYmJiVizZg3c3NwQEhLCPtaQgIAA9OvXD+fOnWu3zy+D22oeHh4YNWoU9u3bJ++z2+3Yt28fIiIiFGwZtYXevXvDbDY79HdBQQGSkpLY3y5ACIG4uDhs27YN+/fvR+/evR2Ojxo1Cu7u7g79m56ejosXL7J/XZTdbkd5eTn7VgMmTZqEkydPIjU1VX6MHj0aMTEx8r/Zx9pRVFSE8+fPw2KxtNvnl2kJNSxatAhz587F6NGjMXbsWLz55psoLi7Go48+qnTTqBmKiopw7tw5eTsjIwOpqakICgpCjx49sHDhQrzyyivo27cvevfujRdffBGhoaGYMWOGco2mRomNjcVHH32Ezz//HL6+vnKulr+/Pzw9PeHv74/HH38cixYtQlBQEPz8/LBgwQJERERg3LhxCreebmbJkiWYMmUKevTogcLCQnz00Uc4ePAgdu/ezb7VAF9fXzk/XuLt7Y3g4GB5P/vYdT333HOYNm0aevbsiStXriA+Ph4GgwEPPvhg+31+W63ugka8/fbbokePHsLDw0OMHTtWfPfdd0o3iZrpwIEDAkCdx9y5c4UQVeXAXnzxRRESEiKMRqOYNGmSSE9PV7bR1CjO+hWA2LBhg3xOaWmpmD9/vggMDBReXl7ivvvuE5mZmco1mhrtscceEz179hQeHh6ic+fOYtKkSWLPnj3ycfat9tQsBSYE+9iVzZ49W1gsFuHh4SG6du0qZs+eLc6dOycfb4++1QkhROuFykREREREymHOLRERERFpBoNbIiIiItIMBrdEREREpBkMbomIiIhIMxjcEhEREZFmMLglIiIiIs1gcEtEREREmsHgloiIiIg0g8EtEVEtFy5cgE6nQ2pqqtJNkZ05cwbjxo2DyWTC8OHDlW4OEZFqMbglItWZN28edDodVqxY4bB/+/bt0Ol0CrVKWfHx8fD29kZ6ejr27dtX73lZWVlYsGAB+vTpA6PRiO7du2PatGkNPqcjmjdvHmbMmKF0M4ioDTC4JSJVMplMWLlyJa5du6Z0U1pNRUVFs597/vx5TJgwAT179kRwcLDTcy5cuIBRo0Zh//79eP3113Hy5EkkJCTgrrvuQmxsbLPvTUTkShjcEpEqRUZGwmw2Y/ny5fWe8/LLL9f5iv7NN99Er1695G1phO61115DSEgIAgICsGzZMlRWVuL5559HUFAQunXrhg0bNtS5/pkzZ3DbbbfBZDJhyJAhSExMdDielpaGKVOmwMfHByEhIXj44Ydx9epV+fjEiRMRFxeHhQsXolOnToiKinL6Oux2O5YtW4Zu3brBaDRi+PDhSEhIkI/rdDqkpKRg2bJl0Ol0ePnll51eZ/78+dDpdEhOTsbMmTPRr18/DB48GIsWLcJ3330nn3fx4kVMnz4dPj4+8PPzw6xZs5CdnV3nfX333XfRo0cP+Pj4YP78+bDZbFi1ahXMZjO6dOmCV1991eH+Op0O69atw5QpU+Dp6Yk+ffrgk08+cTjn5MmTuPvuu+Hp6Yng4GA8+eSTKCoqqtNfq1evhsViQXBwMGJjY2G1WuVzysvL8dxzz6Fr167w9vZGeHg4Dh48KB/fuHEjAgICsHv3bgwcOBA+Pj6Ijo5GZmam/Pree+89fP7559DpdNDpdDh48CAqKioQFxcHi8UCk8mEnj17Nvj/j4jUicEtEamSwWDAa6+9hrfffhs///xzi661f/9+XLlyBYcOHcIbb7yB+Ph4/OpXv0JgYCCSkpLw1FNP4be//W2d+zz//PNYvHgx/vvf/yIiIgLTpk1Dbm4uACA/Px933303RowYgWPHjiEhIQHZ2dmYNWuWwzXee+89eHh44PDhw1i/fr3T9r311lv485//jNWrV+PEiROIiorCr3/9a5w9exYAkJmZicGDB2Px4sXIzMzEc889V+caeXl5SEhIQGxsLLy9vescDwgIAFAVSE+fPh15eXlITEzE3r178b///Q+zZ892OP/8+fPYtWsXEhISsGnTJvzrX//Cvffei59//hmJiYlYuXIlXnjhBSQlJTk878UXX8TMmTPx/fffIyYmBnPmzMHp06cBAMXFxYiKikJgYCCOHj2KrVu34uuvv0ZcXJzDNQ4cOIDz58/jwIEDeO+997Bx40Zs3LhRPh4XF4cjR45g8+bNOHHiBB544AFER0fL7xcAlJSUYPXq1fj3v/+NQ4cO4eLFi/L79txzz2HWrFlywJuZmYnbbrsNa9aswY4dO/Dxxx8jPT0dH374ocMfSkTkIgQRkcrMnTtXTJ8+XQghxLhx48Rjjz0mhBBi27ZtouaPrfj4eBEWFubw3L/85S+iZ8+eDtfq2bOnsNls8r7+/fuL22+/Xd6urKwU3t7eYtOmTUIIITIyMgQAsWLFCvkcq9UqunXrJlauXCmEEOJPf/qTmDx5ssO9L126JACI9PR0IYQQd955pxgxYsRNX29oaKh49dVXHfaNGTNGzJ8/X94OCwsT8fHx9V4jKSlJABCfffZZg/fas2ePMBgM4uLFi/K+U6dOCQAiOTlZCFH1vnp5eYmCggL5nKioKNGrV6867+Py5cvlbQDiqaeecrhfeHi4ePrpp4UQQrzzzjsiMDBQFBUVyce//PJLodfrRVZWlhDiRn9VVlbK5zzwwANi9uzZQgghfvrpJ2EwGMTly5cd7jNp0iSxZMkSIYQQGzZsEADEuXPn5ONr164VISEh8nbN/2OSBQsWiLvvvlvY7fZ63z8iUj+O3BKRqq1cuRLvvfeePPrXHIMHD4Zef+PHXUhICIYOHSpvGwwGBAcHIycnx+F5ERER8r/d3NwwevRouR3ff/89Dhw4AB8fH/kxYMAAAFWjnpJRo0Y12LaCggJcuXIF48ePd9g/fvz4Jr1mIUSjzjt9+jS6d++O7t27y/sGDRqEgIAAh/v16tULvr6+8nZISAgGDRpU531s6D2TtqXrnj59GmFhYQ4jy+PHj4fdbkd6erq8b/DgwTAYDPK2xWKR73Py5EnYbDb069fP4b1PTEx0eN+9vLxwyy23OL1GfebNm4fU1FT0798fzzzzDPbs2dPg+USkTm5KN4CIqCF33HEHoqKisGTJEsybN8/hmF6vrxPU1czNlLi7uzts63Q6p/vsdnuj21VUVIRp06Zh5cqVdY5ZLBb5385SBNpC3759odPpcObMmVa5Xlu8Zy25t3SfoqIiGAwGpKSkOATAAODj49PgNW72B8DIkSORkZGBXbt24euvv8asWbMQGRlZJ2+YiNSNI7dEpHorVqzAzp07ceTIEYf9nTt3RlZWlkPQ0pq1aWtOwqqsrERKSgoGDhwIoCoQOnXqFHr16oVbb73V4dGUgNbPzw+hoaE4fPiww/7Dhw9j0KBBjb5OUFAQoqKisHbtWhQXF9c5np+fDwAYOHAgLl26hEuXLsnHfvjhB+Tn5zfpfvWp+Z5J29J7NnDgQHz//fcO7Tt8+DD0ej369+/fqOuPGDECNpsNOTk5dd53s9nc6HZ6eHjAZrPV2e/n54fZs2fjH//4B7Zs2YJPP/0UeXl5jb4uESmPwS0Rqd7QoUMRExODNWvWOOyfOHEifvnlF6xatQrnz5/H2rVrsWvXrla779q1a7Ft2zacOXMGsbGxuHbtGh577DEAQGxsLPLy8vDggw/i6NGjOH/+PHbv3o1HH33UadDUkOeffx4rV67Eli1bkJ6ejj/84Q9ITU3Fs88+2+T22mw2jB07Fp9++inOnj2L06dPY82aNXK6QGRkpPx+Hj9+HMnJyXjkkUdw5513YvTo0U26nzNbt27Fu+++ix9//BHx8fFITk6WJ4zFxMTAZDJh7ty5SEtLw4EDB7BgwQI8/PDDCAkJadT1+/Xrh5iYGDzyyCP47LPPkJGRgeTkZCxfvhxffvllo9vZq1cvnDhxAunp6bh69SqsViveeOMNbNq0CWfOnMGPP/6IrVu3wmw2y5PxiMg1MLglIpewbNmyOl+BDxw4EH/729+wdu1ahIWFITk52WklgeZasWIFVqxYgbCwMHzzzTfYsWMHOnXqBADyaKvNZsPkyZMxdOhQLFy4EAEBAQ55qY3xzDPPYNGiRVi8eDGGDh2KhIQE7NixA3379m3Sdfr06YPjx4/jrrvuwuLFizFkyBDcc8892LdvH9atWweg6uv5zz//HIGBgbjjjjsQGRmJPn36YMuWLU26V32WLl2KzZs3Y9iwYXj//fexadMmeUTYy8sLu3fvRl5eHsaMGYP7778fkyZNwl//+tcm3WPDhg145JFHsHjxYvTv3x8zZszA0aNH0aNHj0Zf44knnkD//v0xevRodO7cGYcPH4avry9WrVqF0aNHY8yYMbhw4QK++uqrJvcnESlLJxo7C4GIiKgBOp0O27Zt48pfRKQo/jlKRERERJrB4JaIiIiINIOlwIiIqFUwy42I1IAjt0RERESkGQxuiYiIiEgzGNwSERERkWYwuCUiIiIizWBwS0RERESaweCWiIiIiDSDwS0RERERaQaDWyIiIiLSjP8PvkU56d27aawAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "optimal_dims = 40  # Example, replace with the value from the plot\n",
        "\n",
        "# Apply UMAP with optimal dimensions\n",
        "umap_reducer = umap.UMAP(n_components=optimal_dims, random_state=42)\n",
        "reduced_embeddings = umap_reducer.fit_transform(embedding_data)\n",
        "\n",
        "# Add reduced embeddings back to the DataFrame\n",
        "for i in range(optimal_dims):\n",
        "    top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]"
      ],
      "metadata": {
        "id": "XZbYj6Eqp9Hf",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "54e88763-5ff2-401e-e6b1-e6d3f6d1705c"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.\n",
            "  warnings.warn(\n",
            "/usr/local/lib/python3.10/dist-packages/umap/umap_.py:1952: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.\n",
            "  warn(\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n",
            "<ipython-input-14-de94449a2449>:9: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  top_1000_rows[f\"UMAP_{i+1}\"] = reduced_embeddings[:, i]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n",
        "from sklearn.metrics import mean_squared_error\n",
        "import tensorflow as tf\n",
        "from tensorflow.keras.models import Sequential\n",
        "from tensorflow.keras.layers import SimpleRNN, Dense, Dropout\n",
        "from tensorflow.keras.optimizers import Adam\n",
        "from sklearn.compose import ColumnTransformer\n",
        "from sklearn.pipeline import Pipeline\n",
        "\n",
        "# Step 1: Prepare features and target\n",
        "# Select relevant columns\n",
        "input_columns = [\n",
        "    'Sex', 'Age', 'Phases', 'Enrollment',\n",
        "    'Study Title', 'Study Status', 'Brief Summary', 'Study Results',\n",
        "    'Conditions', 'Interventions', 'Primary Outcome Measures',\n",
        "    'Funder Type', 'Study Type', 'Study Design'\n",
        "]\n",
        "\n",
        "target_column = 'Time taken for Enrollment'\n",
        "\n",
        "# Ensure the columns exist in the dataframe after UMAP processing\n",
        "input_data = top_1000_rows[input_columns]\n",
        "target_data = top_1000_rows[target_column]\n",
        "\n",
        "# Step 2: Preprocess data\n",
        "# Handling categorical features using one-hot encoding and scaling\n",
        "# Columns for one-hot encoding\n",
        "categorical_columns = ['Sex', 'Age', 'Phases', 'Enrollment']\n",
        "\n",
        "# Scale numerical features (UMAP embeddings)\n",
        "scaler = StandardScaler()\n",
        "\n",
        "# Identify numerical columns (excluding categorical and text columns)\n",
        "numerical_columns = [col for col in input_columns if col not in categorical_columns and col not in text_columns]\n",
        "\n",
        "# Ensure all columns are of numeric type before applying preprocessing\n",
        "# Convert to numeric, replacing non-numeric values with NaN\n",
        "for col in categorical_columns + numerical_columns:\n",
        "    input_data[col] = pd.to_numeric(input_data[col], errors='coerce')\n",
        "\n",
        "# Impute NaN values if any (you can use a different strategy if needed)\n",
        "input_data = input_data.fillna(0)\n",
        "\n",
        "# Column transformer to apply one-hot encoding to categorical columns and scaling to numerical columns\n",
        "preprocessor = ColumnTransformer(\n",
        "    transformers=[\n",
        "        ('cat', OneHotEncoder(handle_unknown='ignore', sparse_output=False), categorical_columns),\n",
        "        ('num', scaler, numerical_columns)\n",
        "    ])\n",
        "\n",
        "# Apply the preprocessor to the input data\n",
        "X = preprocessor.fit_transform(input_data)\n",
        "\n",
        "# For the target, make sure it's in a numeric format\n",
        "y = target_data.values\n",
        "y = pd.to_numeric(y, errors='coerce')\n",
        "\n",
        "# Impute NaN values if any (you can use a different strategy if needed)\n",
        "y = np.nan_to_num(y)  # Replace NaN with 0\n",
        "# --- End of the code to insert ---\n",
        "\n",
        "\n",
        "# Step 3: Split data into training and testing sets (80:20)\n",
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
      ],
      "metadata": {
        "id": "mm6YOeG_p-I0",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "eda3e0ca-7be4-454f-c7cf-3705c158c2dc"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-26-207c951d05e0>:42: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame.\n",
            "Try using .loc[row_indexer,col_indexer] = value instead\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  input_data[col] = pd.to_numeric(input_data[col], errors='coerce')\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from tensorflow.keras.layers import Bidirectional, LSTM\n",
        "\n",
        "# Step 4: Build the BiLSTM model\n",
        "bi_lstm_model = Sequential()\n",
        "\n",
        "# Input layer: BiLSTM expects 3D input (samples, time steps, features)\n",
        "# Reshaping input to (samples, time steps, features)\n",
        "bi_lstm_model.add(tf.keras.layers.Reshape((1, X_train.shape[1]), input_shape=(X_train.shape[1],)))\n",
        "\n",
        "# BiLSTM layer with 64 units\n",
        "bi_lstm_model.add(Bidirectional(LSTM(64, activation='relu', return_sequences=False)))\n",
        "\n",
        "# Dropout layer to prevent overfitting\n",
        "bi_lstm_model.add(Dropout(0.2))\n",
        "\n",
        "# Output layer: predicting a continuous value (Time taken for Enrollment)\n",
        "bi_lstm_model.add(Dense(1))\n",
        "\n",
        "# Step 5: Compile the BiLSTM model\n",
        "bi_lstm_model.compile(optimizer=Adam(), loss='mean_squared_error')\n",
        "\n",
        "# Step 6: Train the BiLSTM model\n",
        "bi_lstm_history = bi_lstm_model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))\n",
        "\n",
        "# Step 7: Make predictions with the BiLSTM model and evaluate the RMSE\n",
        "y_pred_bilstm = bi_lstm_model.predict(X_test)\n",
        "\n",
        "# Calculate RMSE (Root Mean Squared Error) for BiLSTM model\n",
        "rmse_bilstm = np.sqrt(mean_squared_error(y_test, y_pred_bilstm))\n",
        "print(f\"RMSE for BiLSTM: {rmse_bilstm}\")\n"
      ],
      "metadata": {
        "id": "0MpM2NkTqGYe",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "ed87b58e-5718-4f35-da94-a8a36b3648f0"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/keras/src/layers/reshaping/reshape.py:39: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
            "  super().__init__(**kwargs)\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 36ms/step - loss: 667.7067 - val_loss: 609.3492\n",
            "Epoch 2/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 617.5209 - val_loss: 591.2498\n",
            "Epoch 3/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 9ms/step - loss: 561.6722 - val_loss: 557.8972\n",
            "Epoch 4/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 528.3793 - val_loss: 507.4259\n",
            "Epoch 5/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - loss: 455.1757 - val_loss: 443.5311\n",
            "Epoch 6/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - loss: 386.5001 - val_loss: 378.3217\n",
            "Epoch 7/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 22ms/step - loss: 335.8933 - val_loss: 329.0683\n",
            "Epoch 8/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 278.2339 - val_loss: 300.2128\n",
            "Epoch 9/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 21ms/step - loss: 305.0649 - val_loss: 287.5830\n",
            "Epoch 10/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 20ms/step - loss: 273.1591 - val_loss: 280.5639\n",
            "Epoch 11/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 234.1577 - val_loss: 276.5512\n",
            "Epoch 12/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 22ms/step - loss: 235.5674 - val_loss: 273.2498\n",
            "Epoch 13/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - loss: 216.2296 - val_loss: 270.5114\n",
            "Epoch 14/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 216.4830 - val_loss: 268.1384\n",
            "Epoch 15/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 241.6802 - val_loss: 266.0169\n",
            "Epoch 16/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 19ms/step - loss: 197.7046 - val_loss: 264.7904\n",
            "Epoch 17/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 19ms/step - loss: 254.8440 - val_loss: 263.2259\n",
            "Epoch 18/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 22ms/step - loss: 217.4115 - val_loss: 262.4696\n",
            "Epoch 19/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 220.9622 - val_loss: 261.7163\n",
            "Epoch 20/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 19ms/step - loss: 203.3700 - val_loss: 261.1432\n",
            "Epoch 21/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 204.3532 - val_loss: 260.6401\n",
            "Epoch 22/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 206.5609 - val_loss: 260.3468\n",
            "Epoch 23/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 200.0678 - val_loss: 259.9577\n",
            "Epoch 24/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 205.6685 - val_loss: 259.8051\n",
            "Epoch 25/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 200.1108 - val_loss: 259.6185\n",
            "Epoch 26/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 190.1116 - val_loss: 259.4397\n",
            "Epoch 27/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 11ms/step - loss: 188.8570 - val_loss: 259.6147\n",
            "Epoch 28/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - loss: 192.8143 - val_loss: 260.2402\n",
            "Epoch 29/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - loss: 173.7915 - val_loss: 260.1749\n",
            "Epoch 30/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - loss: 184.3625 - val_loss: 260.5374\n",
            "Epoch 31/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 11ms/step - loss: 171.2388 - val_loss: 260.4700\n",
            "Epoch 32/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - loss: 178.1833 - val_loss: 261.1990\n",
            "Epoch 33/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - loss: 178.0006 - val_loss: 261.4209\n",
            "Epoch 34/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - loss: 187.6684 - val_loss: 262.2680\n",
            "Epoch 35/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - loss: 159.2341 - val_loss: 262.3969\n",
            "Epoch 36/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - loss: 160.0466 - val_loss: 262.5146\n",
            "Epoch 37/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - loss: 176.0917 - val_loss: 263.1417\n",
            "Epoch 38/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - loss: 151.0455 - val_loss: 263.6153\n",
            "Epoch 39/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 24ms/step - loss: 146.4944 - val_loss: 264.1271\n",
            "Epoch 40/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 19ms/step - loss: 165.9863 - val_loss: 264.9947\n",
            "Epoch 41/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - loss: 153.2215 - val_loss: 265.0475\n",
            "Epoch 42/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 18ms/step - loss: 154.0866 - val_loss: 265.6365\n",
            "Epoch 43/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 26ms/step - loss: 147.2036 - val_loss: 266.3539\n",
            "Epoch 44/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 18ms/step - loss: 175.0763 - val_loss: 266.5692\n",
            "Epoch 45/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - loss: 175.0344 - val_loss: 267.5154\n",
            "Epoch 46/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 154.6448 - val_loss: 267.3886\n",
            "Epoch 47/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 19ms/step - loss: 145.1259 - val_loss: 267.1888\n",
            "Epoch 48/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 20ms/step - loss: 160.2450 - val_loss: 267.4206\n",
            "Epoch 49/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - loss: 144.1925 - val_loss: 267.6102\n",
            "Epoch 50/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - loss: 144.6609 - val_loss: 268.0196\n",
            "\u001b[1m7/7\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 51ms/step\n",
            "RMSE for BiLSTM: 16.37130237010102\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "model = Sequential()\n",
        "\n",
        "# Input layer: RNN expects 3D input (samples, time steps, features)\n",
        "# Here, we'll use a single time step (1) for each sample (flatten the data to time steps)\n",
        "model.add(tf.keras.layers.Reshape((1, X_train.shape[1]), input_shape=(X_train.shape[1],)))\n",
        "\n",
        "# RNN layer with 64 units\n",
        "model.add(SimpleRNN(64, activation='relu', return_sequences=False))\n",
        "\n",
        "# Dropout layer to prevent overfitting\n",
        "model.add(Dropout(0.3))\n",
        "\n",
        "# Output layer: predicting a continuous value (Time taken for Enrollment)\n",
        "model.add(Dense(1))\n",
        "\n",
        "# Step 5: Compile the model\n",
        "model.compile(optimizer=Adam(), loss='mean_squared_error')\n",
        "\n",
        "# Step 6: Train the model\n",
        "history = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))\n",
        "\n",
        "# Step 7: Make predictions and evaluate the model\n",
        "y_pred = model.predict(X_test)\n",
        "\n",
        "# Calculate RMSE (Root Mean Squared Error)\n",
        "rmse = np.sqrt(mean_squared_error(y_test, y_pred))\n",
        "print(f\"RMSE: {rmse}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "A6JHsy5sBjRs",
        "outputId": "997929af-bf12-4569-90ba-779b22ada812"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/keras/src/layers/reshaping/reshape.py:39: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
            "  super().__init__(**kwargs)\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 26ms/step - loss: 579.7545 - val_loss: 598.7670\n",
            "Epoch 2/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 5ms/step - loss: 541.1518 - val_loss: 571.0222\n",
            "Epoch 3/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 532.0207 - val_loss: 529.2407\n",
            "Epoch 4/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 454.2565 - val_loss: 477.3809\n",
            "Epoch 5/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 415.7916 - val_loss: 424.5004\n",
            "Epoch 6/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 452.6029 - val_loss: 376.9656\n",
            "Epoch 7/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 358.6606 - val_loss: 340.9701\n",
            "Epoch 8/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 310.2562 - val_loss: 314.1212\n",
            "Epoch 9/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 305.6849 - val_loss: 297.5801\n",
            "Epoch 10/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 249.7126 - val_loss: 288.5488\n",
            "Epoch 11/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - loss: 230.8337 - val_loss: 281.9182\n",
            "Epoch 12/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - loss: 264.7994 - val_loss: 277.4290\n",
            "Epoch 13/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 230.6227 - val_loss: 274.1347\n",
            "Epoch 14/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 224.2143 - val_loss: 271.3199\n",
            "Epoch 15/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 218.0156 - val_loss: 269.0135\n",
            "Epoch 16/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 235.3152 - val_loss: 266.9712\n",
            "Epoch 17/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - loss: 251.2175 - val_loss: 265.0502\n",
            "Epoch 18/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 251.1464 - val_loss: 263.4379\n",
            "Epoch 19/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 220.6263 - val_loss: 261.9560\n",
            "Epoch 20/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 232.6349 - val_loss: 260.8833\n",
            "Epoch 21/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - loss: 230.8253 - val_loss: 259.8926\n",
            "Epoch 22/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - loss: 226.6449 - val_loss: 258.7480\n",
            "Epoch 23/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 211.2643 - val_loss: 258.2128\n",
            "Epoch 24/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 204.0192 - val_loss: 257.8778\n",
            "Epoch 25/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - loss: 246.8270 - val_loss: 257.0885\n",
            "Epoch 26/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - loss: 221.6270 - val_loss: 256.7341\n",
            "Epoch 27/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 190.9916 - val_loss: 256.3143\n",
            "Epoch 28/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 205.6945 - val_loss: 256.1562\n",
            "Epoch 29/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - loss: 238.1927 - val_loss: 255.8900\n",
            "Epoch 30/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - loss: 199.9858 - val_loss: 255.9863\n",
            "Epoch 31/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 218.4140 - val_loss: 256.0137\n",
            "Epoch 32/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 8ms/step - loss: 233.9201 - val_loss: 255.7076\n",
            "Epoch 33/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - loss: 216.9118 - val_loss: 256.2441\n",
            "Epoch 34/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 214.1853 - val_loss: 255.9830\n",
            "Epoch 35/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 9ms/step - loss: 216.3486 - val_loss: 256.2111\n",
            "Epoch 36/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 175.9630 - val_loss: 256.3767\n",
            "Epoch 37/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 9ms/step - loss: 204.1494 - val_loss: 256.2661\n",
            "Epoch 38/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 6ms/step - loss: 205.1333 - val_loss: 256.2394\n",
            "Epoch 39/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 194.3962 - val_loss: 256.8536\n",
            "Epoch 40/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 8ms/step - loss: 192.2582 - val_loss: 257.1403\n",
            "Epoch 41/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 200.7191 - val_loss: 257.0217\n",
            "Epoch 42/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 179.5457 - val_loss: 257.5062\n",
            "Epoch 43/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 182.3336 - val_loss: 257.6974\n",
            "Epoch 44/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 186.9329 - val_loss: 258.0083\n",
            "Epoch 45/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 175.0525 - val_loss: 257.9814\n",
            "Epoch 46/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 208.5019 - val_loss: 258.1638\n",
            "Epoch 47/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - loss: 204.7254 - val_loss: 258.5562\n",
            "Epoch 48/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - loss: 185.3362 - val_loss: 258.8849\n",
            "Epoch 49/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - loss: 185.8382 - val_loss: 259.3331\n",
            "Epoch 50/50\n",
            "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 4ms/step - loss: 179.8962 - val_loss: 259.4713\n",
            "\u001b[1m7/7\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 24ms/step\n",
            "RMSE: 16.108112997784122\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "cB3wFHSgCFjN"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}