CristopherWVSU commited on
Commit
d92e33e
·
1 Parent(s): 034574b

Added Model Evaluation Tab

Browse files
app.py CHANGED
@@ -13,21 +13,45 @@ reverse_mapping = {v: k for k, v in weather_mapping.items()} # Reverse mapping
13
  feature_columns = ["precipitation", "temp_max", "temp_min", "wind"]
14
 
15
  # STREAMLIT UI
16
- st.title("🌦️ Weather Prediction App")
17
- st.write("Enter weather conditions, and the model will predict the weather category!")
 
 
 
18
 
19
- # User inputs
20
- precipitation = st.number_input("Precipitation (mm)", min_value=0.0, max_value=100.0, step=0.1)
21
- temp_max = st.number_input("Max Temperature (°C)", min_value=-50.0, max_value=50.0, step=0.1)
22
- temp_min = st.number_input("Min Temperature (°C)", min_value=-50.0, max_value=50.0, step=0.1)
23
- wind = st.number_input("Wind Speed (km/h)", min_value=0.0, max_value=100.0, step=0.1)
24
 
25
- if st.button("Predict Weather"):
26
- input_data = pd.DataFrame([[precipitation, temp_max, temp_min, wind]], columns=feature_columns)
27
 
28
 
29
- prediction_num = model.predict(input_data)[0]
30
 
31
- prediction_label = reverse_mapping.get(prediction_num, "Unknown")
32
 
33
- st.success(f"🌤️ Predicted Weather: **{prediction_label.capitalize()}**")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  feature_columns = ["precipitation", "temp_max", "temp_min", "wind"]
14
 
15
  # STREAMLIT UI
16
+ app, model_eval = st.tabs(["Application", "Model Evaluation"])
17
+ # STREAMLIT APP TAB 1
18
+ with app:
19
+ st.title("🌦️ Weather Prediction App")
20
+ st.write("Enter weather conditions, and the model will predict the weather category!")
21
 
22
+ # User inputs
23
+ precipitation = st.number_input("Precipitation (mm)", min_value=0.0, max_value=100.0, step=0.1)
24
+ temp_max = st.number_input("Max Temperature (°C)", min_value=-50.0, max_value=50.0, step=0.1)
25
+ temp_min = st.number_input("Min Temperature (°C)", min_value=-50.0, max_value=50.0, step=0.1)
26
+ wind = st.number_input("Wind Speed (km/h)", min_value=0.0, max_value=100.0, step=0.1)
27
 
28
+ if st.button("Predict Weather"):
29
+ input_data = pd.DataFrame([[precipitation, temp_max, temp_min, wind]], columns=feature_columns)
30
 
31
 
32
+ prediction_num = model.predict(input_data)[0]
33
 
34
+ prediction_label = reverse_mapping.get(prediction_num, "Unknown")
35
 
36
+ st.success(f"🌤️ Predicted Weather: **{prediction_label.capitalize()}**")
37
+
38
+ with model_eval:
39
+
40
+ st.header("Model Evaluation")
41
+ st.write("The Weather Prediction model was trained in order to determine the type of weather based on weather conditions. The dataset was taken from kaggle.")
42
+ st.write("dataset by Dataset by dataset by ANANTH R. Link to the dataset: https://www.kaggle.com/datasets/ananthr1/weather-prediction")
43
+
44
+ # CORRELATION MATRIX
45
+ st.title("Correlation Matrix")
46
+ st.write("The Correlation Matrix presents the relationship between each features.")
47
+
48
+ # WEATHER PREDICTION
49
+ st.title("Weather Prediction")
50
+ st.write("The image below shows the predicted vs actual weather conditions")
51
+ st.image("weather_predictions.png")
52
+
53
+
54
+ # EVALUATION MATRICS
55
+ st.title("Evaluation Metrics")
56
+ st.write("The image below represents the Accuracy, F1 score and the classification report of the model")
57
+ st.image("classification_report.png")
classification_report.png ADDED
correlation_matrix.png ADDED
main.ipynb CHANGED
@@ -13,7 +13,7 @@
13
  },
14
  {
15
  "cell_type": "code",
16
- "execution_count": null,
17
  "metadata": {},
18
  "outputs": [],
19
  "source": [
@@ -23,7 +23,7 @@
23
  "import seaborn as sns\n",
24
  "from sklearn.model_selection import train_test_split\n",
25
  "from sklearn.tree import DecisionTreeClassifier\n",
26
- "from sklearn.metrics import classification_report, f1_score\n",
27
  "\n",
28
  "import joblib\n"
29
  ]
@@ -38,7 +38,7 @@
38
  },
39
  {
40
  "cell_type": "code",
41
- "execution_count": null,
42
  "metadata": {},
43
  "outputs": [],
44
  "source": [
@@ -48,7 +48,7 @@
48
  },
49
  {
50
  "cell_type": "code",
51
- "execution_count": 295,
52
  "metadata": {},
53
  "outputs": [
54
  {
@@ -77,7 +77,7 @@
77
  },
78
  {
79
  "cell_type": "code",
80
- "execution_count": null,
81
  "metadata": {},
82
  "outputs": [],
83
  "source": [
@@ -93,7 +93,7 @@
93
  },
94
  {
95
  "cell_type": "code",
96
- "execution_count": null,
97
  "metadata": {},
98
  "outputs": [],
99
  "source": [
@@ -102,7 +102,7 @@
102
  },
103
  {
104
  "cell_type": "code",
105
- "execution_count": null,
106
  "metadata": {},
107
  "outputs": [
108
  {
@@ -133,20 +133,18 @@
133
  },
134
  {
135
  "cell_type": "code",
136
- "execution_count": 300,
137
  "metadata": {},
138
  "outputs": [],
139
  "source": [
140
- "# Define manual mapping\n",
141
  "weather_mapping = {\"rain\": 0, \"sun\": 1, \"fog\": 2, \"drizzle\": 3, \"snow\": 4}\n",
142
  "\n",
143
- "# Apply mapping\n",
144
  "df[\"weather\"] = df[\"weather\"].map(weather_mapping)"
145
  ]
146
  },
147
  {
148
  "cell_type": "code",
149
- "execution_count": null,
150
  "metadata": {},
151
  "outputs": [
152
  {
@@ -164,7 +162,8 @@
164
  "plt.figure(figsize=(8, 6))\n",
165
  "sns.heatmap(df.corr(), annot=True, cmap=\"coolwarm\", fmt=\".2f\")\n",
166
  "plt.title(\"Correlation Matrix\")\n",
167
- "plt.show()\n"
 
168
  ]
169
  },
170
  {
@@ -177,7 +176,7 @@
177
  },
178
  {
179
  "cell_type": "code",
180
- "execution_count": null,
181
  "metadata": {},
182
  "outputs": [],
183
  "source": [
@@ -187,23 +186,22 @@
187
  },
188
  {
189
  "cell_type": "code",
190
- "execution_count": 303,
191
  "metadata": {},
192
  "outputs": [],
193
  "source": [
194
- "# Train-test split\n",
195
  "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n"
196
  ]
197
  },
198
  {
199
  "cell_type": "code",
200
- "execution_count": 304,
201
  "metadata": {},
202
  "outputs": [
203
  {
204
  "data": {
205
  "text/html": [
206
- "<style>#sk-container-id-20 {\n",
207
  " /* Definition of color scheme common for light and dark mode */\n",
208
  " --sklearn-color-text: black;\n",
209
  " --sklearn-color-line: gray;\n",
@@ -233,15 +231,15 @@
233
  " }\n",
234
  "}\n",
235
  "\n",
236
- "#sk-container-id-20 {\n",
237
  " color: var(--sklearn-color-text);\n",
238
  "}\n",
239
  "\n",
240
- "#sk-container-id-20 pre {\n",
241
  " padding: 0;\n",
242
  "}\n",
243
  "\n",
244
- "#sk-container-id-20 input.sk-hidden--visually {\n",
245
  " border: 0;\n",
246
  " clip: rect(1px 1px 1px 1px);\n",
247
  " clip: rect(1px, 1px, 1px, 1px);\n",
@@ -253,7 +251,7 @@
253
  " width: 1px;\n",
254
  "}\n",
255
  "\n",
256
- "#sk-container-id-20 div.sk-dashed-wrapped {\n",
257
  " border: 1px dashed var(--sklearn-color-line);\n",
258
  " margin: 0 0.4em 0.5em 0.4em;\n",
259
  " box-sizing: border-box;\n",
@@ -261,7 +259,7 @@
261
  " background-color: var(--sklearn-color-background);\n",
262
  "}\n",
263
  "\n",
264
- "#sk-container-id-20 div.sk-container {\n",
265
  " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
266
  " but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
267
  " so we also need the `!important` here to be able to override the\n",
@@ -271,7 +269,7 @@
271
  " position: relative;\n",
272
  "}\n",
273
  "\n",
274
- "#sk-container-id-20 div.sk-text-repr-fallback {\n",
275
  " display: none;\n",
276
  "}\n",
277
  "\n",
@@ -287,14 +285,14 @@
287
  "\n",
288
  "/* Parallel-specific style estimator block */\n",
289
  "\n",
290
- "#sk-container-id-20 div.sk-parallel-item::after {\n",
291
  " content: \"\";\n",
292
  " width: 100%;\n",
293
  " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
294
  " flex-grow: 1;\n",
295
  "}\n",
296
  "\n",
297
- "#sk-container-id-20 div.sk-parallel {\n",
298
  " display: flex;\n",
299
  " align-items: stretch;\n",
300
  " justify-content: center;\n",
@@ -302,28 +300,28 @@
302
  " position: relative;\n",
303
  "}\n",
304
  "\n",
305
- "#sk-container-id-20 div.sk-parallel-item {\n",
306
  " display: flex;\n",
307
  " flex-direction: column;\n",
308
  "}\n",
309
  "\n",
310
- "#sk-container-id-20 div.sk-parallel-item:first-child::after {\n",
311
  " align-self: flex-end;\n",
312
  " width: 50%;\n",
313
  "}\n",
314
  "\n",
315
- "#sk-container-id-20 div.sk-parallel-item:last-child::after {\n",
316
  " align-self: flex-start;\n",
317
  " width: 50%;\n",
318
  "}\n",
319
  "\n",
320
- "#sk-container-id-20 div.sk-parallel-item:only-child::after {\n",
321
  " width: 0;\n",
322
  "}\n",
323
  "\n",
324
  "/* Serial-specific style estimator block */\n",
325
  "\n",
326
- "#sk-container-id-20 div.sk-serial {\n",
327
  " display: flex;\n",
328
  " flex-direction: column;\n",
329
  " align-items: center;\n",
@@ -341,14 +339,14 @@
341
  "\n",
342
  "/* Pipeline and ColumnTransformer style (default) */\n",
343
  "\n",
344
- "#sk-container-id-20 div.sk-toggleable {\n",
345
  " /* Default theme specific background. It is overwritten whether we have a\n",
346
  " specific estimator or a Pipeline/ColumnTransformer */\n",
347
  " background-color: var(--sklearn-color-background);\n",
348
  "}\n",
349
  "\n",
350
  "/* Toggleable label */\n",
351
- "#sk-container-id-20 label.sk-toggleable__label {\n",
352
  " cursor: pointer;\n",
353
  " display: block;\n",
354
  " width: 100%;\n",
@@ -358,7 +356,7 @@
358
  " text-align: center;\n",
359
  "}\n",
360
  "\n",
361
- "#sk-container-id-20 label.sk-toggleable__label-arrow:before {\n",
362
  " /* Arrow on the left of the label */\n",
363
  " content: \"▸\";\n",
364
  " float: left;\n",
@@ -366,13 +364,13 @@
366
  " color: var(--sklearn-color-icon);\n",
367
  "}\n",
368
  "\n",
369
- "#sk-container-id-20 label.sk-toggleable__label-arrow:hover:before {\n",
370
  " color: var(--sklearn-color-text);\n",
371
  "}\n",
372
  "\n",
373
  "/* Toggleable content - dropdown */\n",
374
  "\n",
375
- "#sk-container-id-20 div.sk-toggleable__content {\n",
376
  " max-height: 0;\n",
377
  " max-width: 0;\n",
378
  " overflow: hidden;\n",
@@ -381,12 +379,12 @@
381
  " background-color: var(--sklearn-color-unfitted-level-0);\n",
382
  "}\n",
383
  "\n",
384
- "#sk-container-id-20 div.sk-toggleable__content.fitted {\n",
385
  " /* fitted */\n",
386
  " background-color: var(--sklearn-color-fitted-level-0);\n",
387
  "}\n",
388
  "\n",
389
- "#sk-container-id-20 div.sk-toggleable__content pre {\n",
390
  " margin: 0.2em;\n",
391
  " border-radius: 0.25em;\n",
392
  " color: var(--sklearn-color-text);\n",
@@ -394,79 +392,79 @@
394
  " background-color: var(--sklearn-color-unfitted-level-0);\n",
395
  "}\n",
396
  "\n",
397
- "#sk-container-id-20 div.sk-toggleable__content.fitted pre {\n",
398
  " /* unfitted */\n",
399
  " background-color: var(--sklearn-color-fitted-level-0);\n",
400
  "}\n",
401
  "\n",
402
- "#sk-container-id-20 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
403
  " /* Expand drop-down */\n",
404
  " max-height: 200px;\n",
405
  " max-width: 100%;\n",
406
  " overflow: auto;\n",
407
  "}\n",
408
  "\n",
409
- "#sk-container-id-20 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
410
  " content: \"▾\";\n",
411
  "}\n",
412
  "\n",
413
  "/* Pipeline/ColumnTransformer-specific style */\n",
414
  "\n",
415
- "#sk-container-id-20 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
416
  " color: var(--sklearn-color-text);\n",
417
  " background-color: var(--sklearn-color-unfitted-level-2);\n",
418
  "}\n",
419
  "\n",
420
- "#sk-container-id-20 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
421
  " background-color: var(--sklearn-color-fitted-level-2);\n",
422
  "}\n",
423
  "\n",
424
  "/* Estimator-specific style */\n",
425
  "\n",
426
  "/* Colorize estimator box */\n",
427
- "#sk-container-id-20 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
428
  " /* unfitted */\n",
429
  " background-color: var(--sklearn-color-unfitted-level-2);\n",
430
  "}\n",
431
  "\n",
432
- "#sk-container-id-20 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
433
  " /* fitted */\n",
434
  " background-color: var(--sklearn-color-fitted-level-2);\n",
435
  "}\n",
436
  "\n",
437
- "#sk-container-id-20 div.sk-label label.sk-toggleable__label,\n",
438
- "#sk-container-id-20 div.sk-label label {\n",
439
  " /* The background is the default theme color */\n",
440
  " color: var(--sklearn-color-text-on-default-background);\n",
441
  "}\n",
442
  "\n",
443
  "/* On hover, darken the color of the background */\n",
444
- "#sk-container-id-20 div.sk-label:hover label.sk-toggleable__label {\n",
445
  " color: var(--sklearn-color-text);\n",
446
  " background-color: var(--sklearn-color-unfitted-level-2);\n",
447
  "}\n",
448
  "\n",
449
  "/* Label box, darken color on hover, fitted */\n",
450
- "#sk-container-id-20 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
451
  " color: var(--sklearn-color-text);\n",
452
  " background-color: var(--sklearn-color-fitted-level-2);\n",
453
  "}\n",
454
  "\n",
455
  "/* Estimator label */\n",
456
  "\n",
457
- "#sk-container-id-20 div.sk-label label {\n",
458
  " font-family: monospace;\n",
459
  " font-weight: bold;\n",
460
  " display: inline-block;\n",
461
  " line-height: 1.2em;\n",
462
  "}\n",
463
  "\n",
464
- "#sk-container-id-20 div.sk-label-container {\n",
465
  " text-align: center;\n",
466
  "}\n",
467
  "\n",
468
  "/* Estimator-specific */\n",
469
- "#sk-container-id-20 div.sk-estimator {\n",
470
  " font-family: monospace;\n",
471
  " border: 1px dotted var(--sklearn-color-border-box);\n",
472
  " border-radius: 0.25em;\n",
@@ -476,18 +474,18 @@
476
  " background-color: var(--sklearn-color-unfitted-level-0);\n",
477
  "}\n",
478
  "\n",
479
- "#sk-container-id-20 div.sk-estimator.fitted {\n",
480
  " /* fitted */\n",
481
  " background-color: var(--sklearn-color-fitted-level-0);\n",
482
  "}\n",
483
  "\n",
484
  "/* on hover */\n",
485
- "#sk-container-id-20 div.sk-estimator:hover {\n",
486
  " /* unfitted */\n",
487
  " background-color: var(--sklearn-color-unfitted-level-2);\n",
488
  "}\n",
489
  "\n",
490
- "#sk-container-id-20 div.sk-estimator.fitted:hover {\n",
491
  " /* fitted */\n",
492
  " background-color: var(--sklearn-color-fitted-level-2);\n",
493
  "}\n",
@@ -574,7 +572,7 @@
574
  "\n",
575
  "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
576
  "\n",
577
- "#sk-container-id-20 a.estimator_doc_link {\n",
578
  " float: right;\n",
579
  " font-size: 1rem;\n",
580
  " line-height: 1em;\n",
@@ -589,44 +587,43 @@
589
  " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
590
  "}\n",
591
  "\n",
592
- "#sk-container-id-20 a.estimator_doc_link.fitted {\n",
593
  " /* fitted */\n",
594
  " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
595
  " color: var(--sklearn-color-fitted-level-1);\n",
596
  "}\n",
597
  "\n",
598
  "/* On hover */\n",
599
- "#sk-container-id-20 a.estimator_doc_link:hover {\n",
600
  " /* unfitted */\n",
601
  " background-color: var(--sklearn-color-unfitted-level-3);\n",
602
  " color: var(--sklearn-color-background);\n",
603
  " text-decoration: none;\n",
604
  "}\n",
605
  "\n",
606
- "#sk-container-id-20 a.estimator_doc_link.fitted:hover {\n",
607
  " /* fitted */\n",
608
  " background-color: var(--sklearn-color-fitted-level-3);\n",
609
  "}\n",
610
- "</style><div id=\"sk-container-id-20\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-20\" type=\"checkbox\" checked><label for=\"sk-estimator-id-20\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(random_state=42)</pre></div> </div></div></div></div>"
611
  ],
612
  "text/plain": [
613
  "DecisionTreeClassifier(random_state=42)"
614
  ]
615
  },
616
- "execution_count": 304,
617
  "metadata": {},
618
  "output_type": "execute_result"
619
  }
620
  ],
621
  "source": [
622
- "# Train Decision Tree model\n",
623
  "model = DecisionTreeClassifier(random_state=42)\n",
624
  "model.fit(X_train, y_train)"
625
  ]
626
  },
627
  {
628
  "cell_type": "code",
629
- "execution_count": 305,
630
  "metadata": {},
631
  "outputs": [],
632
  "source": [
@@ -644,16 +641,16 @@
644
  },
645
  {
646
  "cell_type": "code",
647
- "execution_count": 306,
648
  "metadata": {},
649
  "outputs": [
650
  {
651
  "name": "stdout",
652
  "output_type": "stream",
653
  "text": [
654
- "\n",
655
  "Classification Report:\n",
656
- " precision recall f1-score support\n",
657
  "\n",
658
  " 0 0.91 0.95 0.93 139\n",
659
  " 1 0.84 0.78 0.81 125\n",
@@ -664,22 +661,41 @@
664
  " accuracy 0.80 293\n",
665
  " macro avg 0.44 0.42 0.42 293\n",
666
  "weighted avg 0.81 0.80 0.80 293\n",
667
- "\n",
668
- "\n",
669
- "F1 Score: 0.802114678972584\n"
670
  ]
 
 
 
 
 
 
 
 
 
 
671
  }
672
  ],
673
  "source": [
674
- "# Model evaluation\n",
675
- "print(\"\\nClassification Report:\")\n",
676
- "print(classification_report(y_test, y_pred))\n",
677
- "print(\"\\nF1 Score:\", f1_score(y_test, y_pred, average='weighted'))"
 
 
 
 
 
 
 
 
 
 
 
678
  ]
679
  },
680
  {
681
  "cell_type": "code",
682
- "execution_count": null,
683
  "metadata": {},
684
  "outputs": [
685
  {
@@ -699,7 +715,6 @@
699
  "y_test_labels = [reverse_mapping[val] for val in y_test]\n",
700
  "y_pred_labels = [reverse_mapping[val] for val in y_pred]\n",
701
  "\n",
702
- "# Plot actual vs predicted values\n",
703
  "plt.figure(figsize=(8, 6))\n",
704
  "sns.scatterplot(x=range(len(y_test)), y=y_test_labels, label='Actual', color='blue')\n",
705
  "sns.scatterplot(x=range(len(y_pred)), y=y_pred_labels, label='Predicted', color='red')\n",
@@ -708,12 +723,13 @@
708
  "plt.ylabel(\"Weather Condition\")\n",
709
  "plt.title(\"Actual vs Predicted Weather Conditions\")\n",
710
  "plt.legend()\n",
 
711
  "plt.show()\n"
712
  ]
713
  },
714
  {
715
  "cell_type": "code",
716
- "execution_count": 308,
717
  "metadata": {},
718
  "outputs": [
719
  {
@@ -729,13 +745,6 @@
729
  "joblib.dump(model, \"weather_model.pkl\")\n",
730
  "print(\"Model saved successfully!\")"
731
  ]
732
- },
733
- {
734
- "cell_type": "code",
735
- "execution_count": null,
736
- "metadata": {},
737
- "outputs": [],
738
- "source": []
739
  }
740
  ],
741
  "metadata": {
 
13
  },
14
  {
15
  "cell_type": "code",
16
+ "execution_count": 61,
17
  "metadata": {},
18
  "outputs": [],
19
  "source": [
 
23
  "import seaborn as sns\n",
24
  "from sklearn.model_selection import train_test_split\n",
25
  "from sklearn.tree import DecisionTreeClassifier\n",
26
+ "from sklearn.metrics import classification_report, f1_score, accuracy_score\n",
27
  "\n",
28
  "import joblib\n"
29
  ]
 
38
  },
39
  {
40
  "cell_type": "code",
41
+ "execution_count": 62,
42
  "metadata": {},
43
  "outputs": [],
44
  "source": [
 
48
  },
49
  {
50
  "cell_type": "code",
51
+ "execution_count": 63,
52
  "metadata": {},
53
  "outputs": [
54
  {
 
77
  },
78
  {
79
  "cell_type": "code",
80
+ "execution_count": 64,
81
  "metadata": {},
82
  "outputs": [],
83
  "source": [
 
93
  },
94
  {
95
  "cell_type": "code",
96
+ "execution_count": 65,
97
  "metadata": {},
98
  "outputs": [],
99
  "source": [
 
102
  },
103
  {
104
  "cell_type": "code",
105
+ "execution_count": 66,
106
  "metadata": {},
107
  "outputs": [
108
  {
 
133
  },
134
  {
135
  "cell_type": "code",
136
+ "execution_count": 67,
137
  "metadata": {},
138
  "outputs": [],
139
  "source": [
 
140
  "weather_mapping = {\"rain\": 0, \"sun\": 1, \"fog\": 2, \"drizzle\": 3, \"snow\": 4}\n",
141
  "\n",
 
142
  "df[\"weather\"] = df[\"weather\"].map(weather_mapping)"
143
  ]
144
  },
145
  {
146
  "cell_type": "code",
147
+ "execution_count": 68,
148
  "metadata": {},
149
  "outputs": [
150
  {
 
162
  "plt.figure(figsize=(8, 6))\n",
163
  "sns.heatmap(df.corr(), annot=True, cmap=\"coolwarm\", fmt=\".2f\")\n",
164
  "plt.title(\"Correlation Matrix\")\n",
165
+ "plt.savefig(\"correlation_matrix.png\")\n",
166
+ "plt.show()"
167
  ]
168
  },
169
  {
 
176
  },
177
  {
178
  "cell_type": "code",
179
+ "execution_count": 69,
180
  "metadata": {},
181
  "outputs": [],
182
  "source": [
 
186
  },
187
  {
188
  "cell_type": "code",
189
+ "execution_count": 70,
190
  "metadata": {},
191
  "outputs": [],
192
  "source": [
 
193
  "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n"
194
  ]
195
  },
196
  {
197
  "cell_type": "code",
198
+ "execution_count": 71,
199
  "metadata": {},
200
  "outputs": [
201
  {
202
  "data": {
203
  "text/html": [
204
+ "<style>#sk-container-id-5 {\n",
205
  " /* Definition of color scheme common for light and dark mode */\n",
206
  " --sklearn-color-text: black;\n",
207
  " --sklearn-color-line: gray;\n",
 
231
  " }\n",
232
  "}\n",
233
  "\n",
234
+ "#sk-container-id-5 {\n",
235
  " color: var(--sklearn-color-text);\n",
236
  "}\n",
237
  "\n",
238
+ "#sk-container-id-5 pre {\n",
239
  " padding: 0;\n",
240
  "}\n",
241
  "\n",
242
+ "#sk-container-id-5 input.sk-hidden--visually {\n",
243
  " border: 0;\n",
244
  " clip: rect(1px 1px 1px 1px);\n",
245
  " clip: rect(1px, 1px, 1px, 1px);\n",
 
251
  " width: 1px;\n",
252
  "}\n",
253
  "\n",
254
+ "#sk-container-id-5 div.sk-dashed-wrapped {\n",
255
  " border: 1px dashed var(--sklearn-color-line);\n",
256
  " margin: 0 0.4em 0.5em 0.4em;\n",
257
  " box-sizing: border-box;\n",
 
259
  " background-color: var(--sklearn-color-background);\n",
260
  "}\n",
261
  "\n",
262
+ "#sk-container-id-5 div.sk-container {\n",
263
  " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
264
  " but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
265
  " so we also need the `!important` here to be able to override the\n",
 
269
  " position: relative;\n",
270
  "}\n",
271
  "\n",
272
+ "#sk-container-id-5 div.sk-text-repr-fallback {\n",
273
  " display: none;\n",
274
  "}\n",
275
  "\n",
 
285
  "\n",
286
  "/* Parallel-specific style estimator block */\n",
287
  "\n",
288
+ "#sk-container-id-5 div.sk-parallel-item::after {\n",
289
  " content: \"\";\n",
290
  " width: 100%;\n",
291
  " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
292
  " flex-grow: 1;\n",
293
  "}\n",
294
  "\n",
295
+ "#sk-container-id-5 div.sk-parallel {\n",
296
  " display: flex;\n",
297
  " align-items: stretch;\n",
298
  " justify-content: center;\n",
 
300
  " position: relative;\n",
301
  "}\n",
302
  "\n",
303
+ "#sk-container-id-5 div.sk-parallel-item {\n",
304
  " display: flex;\n",
305
  " flex-direction: column;\n",
306
  "}\n",
307
  "\n",
308
+ "#sk-container-id-5 div.sk-parallel-item:first-child::after {\n",
309
  " align-self: flex-end;\n",
310
  " width: 50%;\n",
311
  "}\n",
312
  "\n",
313
+ "#sk-container-id-5 div.sk-parallel-item:last-child::after {\n",
314
  " align-self: flex-start;\n",
315
  " width: 50%;\n",
316
  "}\n",
317
  "\n",
318
+ "#sk-container-id-5 div.sk-parallel-item:only-child::after {\n",
319
  " width: 0;\n",
320
  "}\n",
321
  "\n",
322
  "/* Serial-specific style estimator block */\n",
323
  "\n",
324
+ "#sk-container-id-5 div.sk-serial {\n",
325
  " display: flex;\n",
326
  " flex-direction: column;\n",
327
  " align-items: center;\n",
 
339
  "\n",
340
  "/* Pipeline and ColumnTransformer style (default) */\n",
341
  "\n",
342
+ "#sk-container-id-5 div.sk-toggleable {\n",
343
  " /* Default theme specific background. It is overwritten whether we have a\n",
344
  " specific estimator or a Pipeline/ColumnTransformer */\n",
345
  " background-color: var(--sklearn-color-background);\n",
346
  "}\n",
347
  "\n",
348
  "/* Toggleable label */\n",
349
+ "#sk-container-id-5 label.sk-toggleable__label {\n",
350
  " cursor: pointer;\n",
351
  " display: block;\n",
352
  " width: 100%;\n",
 
356
  " text-align: center;\n",
357
  "}\n",
358
  "\n",
359
+ "#sk-container-id-5 label.sk-toggleable__label-arrow:before {\n",
360
  " /* Arrow on the left of the label */\n",
361
  " content: \"▸\";\n",
362
  " float: left;\n",
 
364
  " color: var(--sklearn-color-icon);\n",
365
  "}\n",
366
  "\n",
367
+ "#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {\n",
368
  " color: var(--sklearn-color-text);\n",
369
  "}\n",
370
  "\n",
371
  "/* Toggleable content - dropdown */\n",
372
  "\n",
373
+ "#sk-container-id-5 div.sk-toggleable__content {\n",
374
  " max-height: 0;\n",
375
  " max-width: 0;\n",
376
  " overflow: hidden;\n",
 
379
  " background-color: var(--sklearn-color-unfitted-level-0);\n",
380
  "}\n",
381
  "\n",
382
+ "#sk-container-id-5 div.sk-toggleable__content.fitted {\n",
383
  " /* fitted */\n",
384
  " background-color: var(--sklearn-color-fitted-level-0);\n",
385
  "}\n",
386
  "\n",
387
+ "#sk-container-id-5 div.sk-toggleable__content pre {\n",
388
  " margin: 0.2em;\n",
389
  " border-radius: 0.25em;\n",
390
  " color: var(--sklearn-color-text);\n",
 
392
  " background-color: var(--sklearn-color-unfitted-level-0);\n",
393
  "}\n",
394
  "\n",
395
+ "#sk-container-id-5 div.sk-toggleable__content.fitted pre {\n",
396
  " /* unfitted */\n",
397
  " background-color: var(--sklearn-color-fitted-level-0);\n",
398
  "}\n",
399
  "\n",
400
+ "#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
401
  " /* Expand drop-down */\n",
402
  " max-height: 200px;\n",
403
  " max-width: 100%;\n",
404
  " overflow: auto;\n",
405
  "}\n",
406
  "\n",
407
+ "#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
408
  " content: \"▾\";\n",
409
  "}\n",
410
  "\n",
411
  "/* Pipeline/ColumnTransformer-specific style */\n",
412
  "\n",
413
+ "#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
414
  " color: var(--sklearn-color-text);\n",
415
  " background-color: var(--sklearn-color-unfitted-level-2);\n",
416
  "}\n",
417
  "\n",
418
+ "#sk-container-id-5 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
419
  " background-color: var(--sklearn-color-fitted-level-2);\n",
420
  "}\n",
421
  "\n",
422
  "/* Estimator-specific style */\n",
423
  "\n",
424
  "/* Colorize estimator box */\n",
425
+ "#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
426
  " /* unfitted */\n",
427
  " background-color: var(--sklearn-color-unfitted-level-2);\n",
428
  "}\n",
429
  "\n",
430
+ "#sk-container-id-5 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
431
  " /* fitted */\n",
432
  " background-color: var(--sklearn-color-fitted-level-2);\n",
433
  "}\n",
434
  "\n",
435
+ "#sk-container-id-5 div.sk-label label.sk-toggleable__label,\n",
436
+ "#sk-container-id-5 div.sk-label label {\n",
437
  " /* The background is the default theme color */\n",
438
  " color: var(--sklearn-color-text-on-default-background);\n",
439
  "}\n",
440
  "\n",
441
  "/* On hover, darken the color of the background */\n",
442
+ "#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {\n",
443
  " color: var(--sklearn-color-text);\n",
444
  " background-color: var(--sklearn-color-unfitted-level-2);\n",
445
  "}\n",
446
  "\n",
447
  "/* Label box, darken color on hover, fitted */\n",
448
+ "#sk-container-id-5 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
449
  " color: var(--sklearn-color-text);\n",
450
  " background-color: var(--sklearn-color-fitted-level-2);\n",
451
  "}\n",
452
  "\n",
453
  "/* Estimator label */\n",
454
  "\n",
455
+ "#sk-container-id-5 div.sk-label label {\n",
456
  " font-family: monospace;\n",
457
  " font-weight: bold;\n",
458
  " display: inline-block;\n",
459
  " line-height: 1.2em;\n",
460
  "}\n",
461
  "\n",
462
+ "#sk-container-id-5 div.sk-label-container {\n",
463
  " text-align: center;\n",
464
  "}\n",
465
  "\n",
466
  "/* Estimator-specific */\n",
467
+ "#sk-container-id-5 div.sk-estimator {\n",
468
  " font-family: monospace;\n",
469
  " border: 1px dotted var(--sklearn-color-border-box);\n",
470
  " border-radius: 0.25em;\n",
 
474
  " background-color: var(--sklearn-color-unfitted-level-0);\n",
475
  "}\n",
476
  "\n",
477
+ "#sk-container-id-5 div.sk-estimator.fitted {\n",
478
  " /* fitted */\n",
479
  " background-color: var(--sklearn-color-fitted-level-0);\n",
480
  "}\n",
481
  "\n",
482
  "/* on hover */\n",
483
+ "#sk-container-id-5 div.sk-estimator:hover {\n",
484
  " /* unfitted */\n",
485
  " background-color: var(--sklearn-color-unfitted-level-2);\n",
486
  "}\n",
487
  "\n",
488
+ "#sk-container-id-5 div.sk-estimator.fitted:hover {\n",
489
  " /* fitted */\n",
490
  " background-color: var(--sklearn-color-fitted-level-2);\n",
491
  "}\n",
 
572
  "\n",
573
  "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
574
  "\n",
575
+ "#sk-container-id-5 a.estimator_doc_link {\n",
576
  " float: right;\n",
577
  " font-size: 1rem;\n",
578
  " line-height: 1em;\n",
 
587
  " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
588
  "}\n",
589
  "\n",
590
+ "#sk-container-id-5 a.estimator_doc_link.fitted {\n",
591
  " /* fitted */\n",
592
  " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
593
  " color: var(--sklearn-color-fitted-level-1);\n",
594
  "}\n",
595
  "\n",
596
  "/* On hover */\n",
597
+ "#sk-container-id-5 a.estimator_doc_link:hover {\n",
598
  " /* unfitted */\n",
599
  " background-color: var(--sklearn-color-unfitted-level-3);\n",
600
  " color: var(--sklearn-color-background);\n",
601
  " text-decoration: none;\n",
602
  "}\n",
603
  "\n",
604
+ "#sk-container-id-5 a.estimator_doc_link.fitted:hover {\n",
605
  " /* fitted */\n",
606
  " background-color: var(--sklearn-color-fitted-level-3);\n",
607
  "}\n",
608
+ "</style><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" checked><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(random_state=42)</pre></div> </div></div></div></div>"
609
  ],
610
  "text/plain": [
611
  "DecisionTreeClassifier(random_state=42)"
612
  ]
613
  },
614
+ "execution_count": 71,
615
  "metadata": {},
616
  "output_type": "execute_result"
617
  }
618
  ],
619
  "source": [
 
620
  "model = DecisionTreeClassifier(random_state=42)\n",
621
  "model.fit(X_train, y_train)"
622
  ]
623
  },
624
  {
625
  "cell_type": "code",
626
+ "execution_count": 72,
627
  "metadata": {},
628
  "outputs": [],
629
  "source": [
 
641
  },
642
  {
643
  "cell_type": "code",
644
+ "execution_count": 73,
645
  "metadata": {},
646
  "outputs": [
647
  {
648
  "name": "stdout",
649
  "output_type": "stream",
650
  "text": [
651
+ "Accuracy: 0.7986\n",
652
  "Classification Report:\n",
653
+ " precision recall f1-score support\n",
654
  "\n",
655
  " 0 0.91 0.95 0.93 139\n",
656
  " 1 0.84 0.78 0.81 125\n",
 
661
  " accuracy 0.80 293\n",
662
  " macro avg 0.44 0.42 0.42 293\n",
663
  "weighted avg 0.81 0.80 0.80 293\n",
664
+ "\n"
 
 
665
  ]
666
+ },
667
+ {
668
+ "data": {
669
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHiCAYAAAB4GX3vAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB2sElEQVR4nO3deVyU5d4/8M+wDQjDiKyKiIgidMKFUotiUUYUMZUUlzoGB89PLaPMsHPyVOrjKaOTqalppo+W9ZzQ3NDH9UlwORiYppJbFrvhAiq4MWzX7w8P93Ec0BkYGPD+vF+veSnXfc213N+Zmy/3qhBCCBARERGRbFiYewBERERE1LKYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGZMmgLm5uVAoFFAoFPj1119N2TQZ6dq1a4iPj4eTkxPUajXGjRuHy5cvN6qtrl27SnG9/zV48GCdut999x369u0LW1tbuLq6IiEhAaWlpXptHjx4EAMHDoSTkxNcXFwQGRmJzMxMvXpCCKxYsQK9evWCnZ0d3NzcMGLECNy8ebNRcyEiIiLAypSN7dy5E87OzgCAXbt24dVXXzVl82SEmJgYHD16FG+//Tasra2RnJyMqKgoZGVlwdLS0qi2Fi1apJdw5eXl4d1339VJANPS0hAbG4tnnnkGCxYsQFFRERYuXIhTp07h8OHDsLC4+/fG8ePHodFo0Lt3b/z9739HVVUVli9fjoiICPz444/w9/eX2pw1axY+/PBDxMbGIjExETdv3sShQ4dw584dODg4NGENERERyZgwoeHDh4sxY8aI0aNHi2HDhpmyaTLCnj17BACxdu1aqWz79u0CgEhJSTFJH3PnzhUKhUIUFBRIZYMGDRKenp5Cq9VKZatXrxYARGpqqlT22muvCaVSKcrKyqSys2fPCgBi3rx5UtmZM2eEpaWlmDVrlknGTERERHeZ7BCwVqtFWloaIiIiEBERgbS0NFRUVNRb98CBA4iMjIRarYZarUZ4eDj27NljdL21a9dCoVAgLy9P531du3ZFfHy8XnsKhQJz5szBli1bEBgYCFtbW/j6+mLHjh0AgKtXryIpKQm9evWCSqWCo6MjNBoNMjIyjJ7HnTt34OjoiP/3//6f3vtWr14NhUKBEydO1NtuU23btg1KpRLjxo2TyqKiouDs7IzU1FST9PH111/j2WefhZeXl1SWnZ2N0NBQ2NjYSGWjRo0CAGkdA8ClS5dga2sLR0dHqczNzU2vj3/+85+wtrbG22+/DQA87EtERGQiJksA9+/fj1u3bkkJ4J07d7B//369etu2bcOgQYNQUFCAt956Cx9//DE8PT2xcuXKRtUzVlZWFv70pz9h2LBhWLRoETQajZRA5uTkYPXq1QgLC8PChQsxe/ZsFBUVISIiAmfPnjVqfHZ2dhg1ahQ2b96M6upqnfdu2LABjz32GHr37q03vrpz65oiOzsbfn5+sLW1lcosLCwQGBiI7OzsJrUNAJmZmTh//jxeeOEFnfKKigqdPoG76wEAzpw5I5WFhYWhrKwMSUlJyMnJwdmzZ5GYmAhXV1edxD0zMxOBgYFITU2Fm5sbVCoVvLy88M9//rPJcyAiIpI1U+1KnD59uvDy8pJ+7ty5s3j99dd16lRXV4suXboIPz8/cePGDZ1lv//+u9H11qxZIwCI3NxcnTre3t4iLi5Ob4wAhIWFhTh27JjeuIQQory8XJSXl+ssy8/PFwqFQsycOdPo8e3cuVMAELt27ZLKSktLhZWVlc6hzvvH2NSw+Pv7C41GI4QQIiIiQvTq1UtotVoxduxY4ebm1qS2hRBi2rRpwtraWpSUlOiU9+nTRwQFBemU7du3TwAQjz32mFRWVVUlpkyZIiwtLaX59uzZU/z6668673388cdF165dhUqlEh999JFISUkRoaGhQqFQiKNHjzZ5HkRERHJlsj2AO3fuxKBBg6SfBw0ahJ07d+rUOXr0KAoKCpCYmKh3An/Hjh2NrtcYgwcPRt++fXXK6i6KUKlUUKlUAIDq6mqUlpaiXbt2cHFxQW5urtHj02g0cHNzQ0pKilRWt0dw/Pjx9Y6vZ8+e6NmzZ5PmqNVqpcOweXl5KCoqQlVVFZRKZYOH5Q1VVVWFlJQUREZGShf81Jk0aRKOHTuGOXPmICcnB/v378fUqVPRvn17aLVaqZ6VlRX8/Pwwfvx4fPvtt1izZg0UCgVGjhypc8Xw7du3kZeXhw8//BAzZ87E2LFj8b//+79wcHDAP/7xjybNg4iISM5MkgDm5ubi3Llz6NWrF4qKilBUVIRevXrhl19+QU5Ojk49AAgICHhoe4bUa4x7rzC9X21tLRYvXowePXrA1tYWLi4ucHV1xZUrV3QSJ0PHZ2VlhdjYWGzZsgVVVVUA7h7+7devH7p3717ve86ePat3uNlYSqUSlZWVAO5ecZuTkwN7e3totVq9Q7TG2rlzJ0pKSvQO/wLAlClT8NJLL2Hu3Lnw9fXFwIEDER0djd69e6Ndu3ZSvfnz52Px4sX47//+b4wbNw7x8fHYs2cPzp8/jwULFkj16pLY559/XipzcHBAcHAwTp482aR5EBERyZlJEsC6E/zffPNNeHl5wcvLC0lJSQCgtxewJdTU1DS4rH379g0uS05OxvTp0zFgwAB888032Lt3L/bu3QsXFxcIIRo1lhdeeAHXrl3D3r17cfXqVXz//feYMGFCo9oylIeHBy5dugTgbsKkVqsBAJcvX4aHh0eT2l63bh3s7e0xcuRIvWXW1tb48ssvUVRUhAMHDiAvLw+ffPIJ8vPz0blzZ6neypUr9S4W8fLyQkBAgM4FN66urjr/1unQoUOj72lIREREJkoAd+7ciR49emDbtm06rx49eugkgD4+PgCA06dPP7A9Q+vVJRC3b9+WympraxudHKSkpCA0NBRff/01xo0bB41Gg7CwMFy/fr1R4wOA4OBgdO3aFSkpKdi8eTNqa2sxduzYRo3PUIGBgfjll1909lrW1tYiOzsbgYGBjW63rKwM27dvx4gRI2Bvb99gPU9PT4SEhKBLly7IyclBXl4e+vfvLy2/cOFCvUl6TU0Nbt26Jf382GOPAQAuXryoU+/KlSvo1KlTo+dBREQkd01OAOtu/6LRaDB8+HCdl0ajQVpamnT+1xNPPAEvLy8sXrwYN27c0Gnn3qTN0Hqenp4A7p6TVyc1NVU6/GksS0tLWFtb65StWrVK7ypeQ8dXZ8KECdi6dSu+/vprhISESOOuj7+//wMPUxti+PDh0Gq1Ouce7ty5E6WlpXjuueca3e+GDRtQUVFR7+FfAPXuJX3vvfdgaWmps9fTx8cH+/bt07mty2+//YazZ8/qJKhDhw4FAPzP//yPVFZaWop//etfePLJJx84ViIiImpYk58Esn//fty+fRvPPvus3rKQkBAsX74c+/fvR2RkJCwtLbFs2TLExMTgySefRFxcHNzc3HDo0CHcunULGzZsAACD6z311FNwcXHBjBkzUFhYiNu3byMlJUXv4gRDjRgxAnPmzMHUqVMRFBSEn376CVu3boWLi4tOPUPHV2fChAmYP38+0tPTsXz58geO4dy5c40a+70GDx6MkJAQJCYm4vfff4e1tTU+/PBD9OnTB6NHj250v+vWrYOzszOGDBlS7/L8/HzExcVhxIgRcHBwwObNm7F7927MmjVL58KWpKQkTJ48Gc8++ywSEhJQUVGBpUuXwtraGjNmzJDqjRgxAk888QRmzZqFy5cvo0uXLvjiiy9QU1ODv/71r0auFSIiIpI09TLi6dOnCwAiPz9fb1lRUZEAIKZPn65Tnp6eLjQajVCpVEKlUonQ0FCdW6UYU+/w4cOiT58+ws7OTgwYMEAcPXr0gbeBmT17doNz0Wq1YubMmaJTp07Czs5OhIWFiRMnTghfX18RHR3dqPHVefzxx4WlpaW4fPlyg/3XjdEEYRGlpaVi4sSJQq1WC5VKJWJjY0VxcXGj+83LyxMKhUJMmTKlwTpXr14VUVFRwtnZWSiVShEYGChWrFghamtr9epu2rRJPPXUU8LR0VHY29sLjUYjMjMz9epdvnxZvPTSS6JDhw5CqVSKp556SqSlpT148kRERPRACiEaeXUDGeWJJ55Ahw4dsHfvXnMPhYiIiGTOZPcBpIadOHECx44dw4svvmjuoRARERGBewCb0c8//4wff/wRCxcuxMWLF6X78RERERGZE/cANqPvvvsOCQkJqKysxObNm5n8ERERUavAPYBEREREMsM9gEREREQywwSQiIiISGZMkgDm5eVBoVDU+3JwcJDqVVVVYd68eYiMjISjoyMUCgXS09Ob1PcPP/yAIUOGwNHREQ4ODnj88cfxxhtv6D2+TW6uXbuG+Ph4ODk5Qa1WY9y4cU16fu7BgwcxcOBAODk5wcXFBZGRkcjMzGxUv0eOHEFCQgK6d++Odu3awc/PDzNnztR7qkpzfF6IiIjIROcA5uXlwcfHBxMmTMCwYcN0lllbW2PcuHEAgOvXr8PJyQk+Pj7o2LEjMjIykJaWhvDw8Eb1e+TIEYSEhKBr166YNGkSOnTogBMnTuB//ud/kJ6ejscff7ypU2uzwsPDcfToUbz99tuwtrZGcnIyvL29kZWVBUtLS6PaOn78OAYMGIDevXsjLi4OVVVVWL58OS5cuIAff/xR5xFyhvQ7fvx4ZGRkYPz48fDz88OZM2ewbNky/OEPf0BmZiasrO4+oMbUnxciIiL6N1PcTTo3N1cAEP/4xz8eWK+6uloUFBQIIYTYsGGDANCkpzqMGjVKuLq6imvXrumUl5WVifLy8ka329bt2bNHABBr166VyrZv3y4AiJSUFKPbe+2114RSqRRlZWVS2dmzZwUAMW/ePKP7/eGHH0RVVZVOH4sWLRIAxMaNG6UyU39eiIiI6K4WPQfQ0tISXl5eJmvv9OnTePzxx9G+fXudckdHR6hUKr36Bw4cQGRkJNRqNdRqNcLDw7Fnzx69NocNGwaVSgWVSoXo6GicPXu23v4VCgXmzJmDLVu2IDAwELa2tvD19cWOHTukOleuXMHkyZPh4eEBW1tbBAUF6SxvDtu2bYNSqZT2vAJAVFQUnJ2dkZqaanR7ly5dgq2tLRwdHaUyNze3Rvc7YMAAaS9fHY1GA0D3mcSm/rwQERHRXSZNAG/fvo2SkhKdV0VFhSm70NGxY0ccO3YMeXl5D627bds2DBo0CAUFBXjrrbfw8ccfw9PTEytXrpTqXL58GWFhYfjxxx8xa9YszJo1C1lZWQgLC0NJSUm97WZlZeFPf/oThg0bhkWLFkGj0UjjKS8vR0hICDZu3IipU6fik08+gZOTE0aMGNHguWx15042RXZ2Nvz8/GBrayuVWVhYIDAwENnZ2Ua3FxYWhrKyMiQlJSEnJwdnz55FYmIiXF1dER8fb5J+r1y5AuBuTImIiKiZmWI3Yt0h4PpeCxcurPc9pjik99133wkAol27diI2NlasWrVKlJaW6tWrrq4WXbp0EX5+fuLGjRs6y37//Xfp/7NnzxYAREZGhlR28OBBAUDMnTtXr10AwsLCQhw7dkyvPyGEeOedd4S1tbXIzs6WltXU1IjAwEARHh5e75zq1ltT+Pv7C41GI4QQIiIiQvTq1UtotVoxduxY4ebmZnR7VVVVYsqUKcLS0lIaX8+ePcWvv/5qsn7Hjh0rHBwcRElJSb3LeQiYiIjIdEy6B3Dy5MnYu3evzmv06NGm7ELH6NGjsXPnTjz55JPYuHEj/vznP6Njx46YNWsWampqpHpHjx5FQUEBEhMTda5KBnT3OKWnp6Nbt254+umnpbJnn30WPj4+De6xGzx4MPr27atTVnexw6ZNm9CvXz94eHhIe0SvXr2K4OBgZGRk6IyxTs+ePdGzZ0+j18W9tFotbGxsANy9QKeoqAhVVVVQKpWN2iNrZWUFPz8/jB8/Ht9++y3WrFkDhUKBkSNHorS0tMn9rl+/HuvXr8f7778PZ2dno8dHRERExrF6eBXD9ejRQzqXq6UMHToUQ4cOxZUrV7B37158+umnmD9/Pjw9PTFt2jQAQG5uLgAgICDggW0VFxejS5cueuVdunTBhQsX6n3PvVfA3u+3336DVquFq6trvcvLy8vh5OSkU9bQ+YbGUCqVqKysBHD3Ct6amhrY29tDq9XqHJ411Pz587FixQqcP39eSvAiIiLQvXt3LFiwAB988EGj+z158iQmTZqEMWPGIDExsTHTJSIiIiOZNAE0J1dXV7zwwgsYPXo0unXrhvXr10sJYHO6/wKUeykUCgwZMgRJSUn1Lr9/b6SpeHh44NKlS3p9XL58GR4eHka3t3LlSoSGhkrJHwB4eXkhICAAGRkZje63uLgYw4cPR0BAAL766qsmn/tIREREhnlkEsA6SqUSfn5+KC4ulsp8fHwA3L3CNyIiosH3duzYEQUFBXrl+fn5UhvG6NatG+7cudPie0UDAwOxcuVKVFRUSHveamtrkZ2djaFDhxrd3oULF+o9XF1TU4Nbt241qt+bN28iOjoa1tbW2L59O+zs7IweFxERETVOm34U3MGDB/USk5KSEpw4cQLdunWTyp544gl4eXlh8eLFek+buPcpFeHh4cjJycHhw4d1+sjLy2vUzYdjYmJw8OBBnb1kdQoLC+t9j7+//wMPKxti+PDh0Gq1SElJkcp27tyJ0tJSPPfcc0b36+Pjg3379uHmzZtS2W+//YazZ88iMDDQ6H6rq6sxZswYFBYWYteuXfXeUoaIiIiaj0mfBPKPf/yjwcOddZYuXYrr16/j1KlT+Pbbb5GQkAAfHx+0b98er776qlH9Dh06FOfPn8f48ePh6+uLS5cuYfXq1cjLy8Pu3bt19vZt27YNMTEx8PX1RVxcHNzc3HDo0CHcunULGzZsAHA3GfzDH/4ACwsLTJ8+HQCwcOFCKBQKnDp1Ci4uLjr9KxQKzJ49G3PmzKl3fOXl5ejfvz8KCgowZcoUBAQEoKioCN9//z0cHR2xc+dOvffUHQZtSliEEAgLC8Px48elJ3J8+OGH8PLywpEjR/Tuwfewfr/44gtMnjwZvXv3RkJCAioqKrB06VKUlJQgKytLeuKKof2+/vrr+PTTT5GYmIj+/fvr9OXr66tzEY4pPy9ERET0b6a4lNjQJ4EIIYS3t3e9t4vx9vY2ut//+7//ExMmTBA+Pj7C1tZWdOzYUURFRencxuVe6enpQqPRCJVKJVQqlQgNDRW7du3SqXPq1CkxdOhQYW9vL+zt7cXQoUPF6dOn620PgJg9e/YDx1hSUiKmTZsmOnfuLGxsbISXl5eIjY0Ve/fubbBNU4SltLRUTJw4UajVaqFSqURsbKwoLi5usP7D+t20aZN46qmnhKOjo7C3txcajUZkZmY2qt+wsLAGbxsUFxenU9eUnxciIiK6yyR7AImIiIio7WjT5wASERERkfGYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplp0QTwj3/8IxQKhfRKT09vye6NMmfOHCgUiofWu3DhAoYPHw61Wg2FQoH4+PgmtWcurX18REREZDomTQB3796NgQMHwtHREe3bt8ezzz6LrVu3SstfeeUVrFu3DrNmzTJlt2Y1Y8YM/PDDD/iv//ovrFu3DlOmTDH3kCRbtmzBokWLzD2MRuvatav0x4K1tTW6d++OP//5z7hw4YK5h9YobT0eRET06FAIIYQpGlq7di0SEhLwxBNP4KWXXoKVlRV2794NCwsLbNq0Sadueno6Bg4ciLS0NISHh5uie5Orrq5GdXU1bG1tH1jP3d0dEyZMeOgvdkPbM6X4+Hikp6cjLy/voXXNMb6H6dq1K5ycnPDmm2+iqqoKJ06cwIoVK9ChQwdkZ2fD2dnZ3EM0ijHxICIiak5Wpmjk0qVLSExMxNNPP439+/fDyupusy+//DKKiopM0UWLs7KykubxIFeuXEH79u1N1p65tNbxeXp64o9//KP0c/fu3ZGYmIgvv/wSM2bMMOPIiIiI2i6THAL++uuvcfPmTbzzzjt6SUTnzp2Nbu/q1atISkpCr169oFKp4OjoCI1Gg4yMDL26Z86cwciRI+Hm5gZ7e3s8/vjjmDNnTqPrde/eXec8xfqsXbtWWi6EwNy5c6Wf7z8H0JD26hw4cACRkZFQq9VQq9UIDw/Hnj17jF4vdX19+eWXyM/P1+l/7dq1jRrf6dOnMWzYMKhUKqhUKkRHR+Ps2bP1rpesrCzExMRApVLB19cXq1evfuC8jTFw4EAAwC+//KJTfuXKFUyePBkeHh6wtbVFUFAQduzYoVOn7jzHjIwM9O7dG7a2tnjiiSdw6NChRs23jkKhwJw5c7BlyxYEBgbC1tYWvr6+Uv/GxIOIiKglmGSXz4EDB6BQKBAWFmaK5pCTk4PVq1fjj3/8I1577TWUlZXhiy++QEREBH766Sf4+/sDACorKxEVFYXKykrMmDEDHTp0wLlz55CamqqT3BlaDwAWLFiAGzduYNOmTdi8eXO94wsNDcW6desAABMnTkRMTAyef/55AICvr6/R7QHAtm3bEBMTg+7du+Ott96Cm5sb0tPTsXLlSkRGRhq1XurGtnLlSpw5cwYLFy6U+gkODjZ6fJcvX0ZYWBgUCoV0/uYnn3yCsLAwnDp1Ci4uLjr1X3rpJURERCA5ORlr1qzBn//8Z/Tt2xdBQUENzt9Qdef/3Xv4t7y8HCEhIbhy5QoSExPh5uaGjRs3YsSIEfi///s/vdMMnn/+ebzwwguIj4/H8uXLERUVhZMnT8LHx6dR8wWArKwsLF68GJMnT4aPjw9++ukn6VCvMfGoU5eMm+gMDSIiIl3CBAIDA4Wrq6vB9dPS0gQAkZaWVu/y8vJyUV5erlOWn58vFAqFmDlzplR2/PhxAUB88cUXOnWrqqp0fja03r1mz54tDFk9AMTs2bMfWu9B7VVXV4suXboIPz8/cePGDZ1lv//+u/R/Q9dLnbi4OOHt7f3QsT1sfHXLMjIypLKDBw8KAGLu3LlS2Zo1awQAkZSUJJUVFBQIhUKhU89Q3t7eIjIyUly5ckVcvHhRpKWliT/84Q/C0tJSZGdnS/XeeecdYW1trVNWU1MjAgMDRXh4uN483nvvPaksNzdXWFhYiMTERKPnWweAsLCwEMeOHdMpr66u1vnZmHgAMOjzR0RE1BgmOQR869Ytk148UHfYDbh7cUJpaSnatWsHFxcX5ObmSvXs7e0BAP/6179QWVkpld9/GNrQeuZy9OhRFBQUIDExEQ4ODjrLOnbsKP3f0PViaunp6ejWrRuefvppqezZZ5+Fj49PvbfyiYmJkf7v5eUFFxeXRp8LumfPHri6usLDwwMDBw6Eg4MDdu3ahccff1yqs2nTJvTr1w8eHh4oKSlBSUkJrl69iuDgYGRkZKCmpkanzQkTJkj/79q1K/r374/9+/c3er4AMHjwYPTt21enzNLSslFzBoCePXuiZ8+ejX4/ERHRg5gkAbS3t0dFRYUpmgIA1NbWYvHixejRowdsbW3h4uICV1dXXLlyRaef7t27Y/LkyVi7di1cXV0xbNgwLFiwANeuXdNpz9B65lKXvAUEBDywnqHrxdSKi4vRpUsXvfIuXbrUe0sWDw8PnZ/btWunk3gbY8CAAdi7dy9SU1MxduxY5OTk6B2C/e2335CRkQFXV1ed1+eff47KykqUl5fr1Pfy8tL5uXPnzjrzMHa+AKTD76Zy9uzZBs85JCIiaiqTJIDe3t4oKSnB7du3TdEckpOTMX36dAwYMADffPMN9u7di71798LFxUXvnKjPP/8cR48exV/+8hfcvHkTSUlJePrpp/USIkPrtWbGrBdzsrAw3e0lXVxcoNFo8Nxzz+Gf//wnfHx88NJLL6G2tlaqo1AoMGTIEGl93P+6f69qfWxsbJo0TkOuBCciImotTHIMNCQkBNu3b8f+/fsRFRX10Pp1v2yrq6vrXZ6SkoLQ0FB8/fXXUllVVRWuX79eb/2goCAEBQVh1qxZ+OSTT/Dmm2/i+++/R3R0dKPqtbS6iw9Onz6NiIiIBusZu15M9WSPjh07oqCgQK88Pz9fGntLsLCwwOzZsxEdHY0NGzZg3LhxAIBu3brhzp070Gg0BrVTWFios8euqKhIZ69gc82XT1ohIqLWwiS7av74xz+iXbt2+Pvf/66X1NV37lfdrWF+/fXXetuztLSEtbW1TtmqVav02i4vL9crq/sFfe/5fYbWM5cnnngCXl5eWLx4MW7cuKGz7PLly9L/DV0vdVQqFUpKShpcbqjw8HDk5OTg8OHDUtnBgweRl5fX4jfyjoqKQo8ePZCcnCyVxcTE4ODBg/XeJqiwsFCv7J///Kf0/7y8PGRlZelcwd5c8zUmHv7+/iY/rExERFTHJNlPp06dsHDhQkyZMgXBwcHSk0Dq7mF3/5NAunTpgv79+2PevHmora2Fo6MjnnzySekX3ogRIzBnzhxMnToVQUFB+Omnn7B161a9c7/27duHxMRExMbGomfPnigtLcWSJUvQpUsXndtrGFrv5MmTOHnypPR/ANLeNgcHB4waNcqo9WJoe5aWlli2bBliYmLw5JNPIi4uDm5ubjh06BBu3bqFDRs2GLVe6gQHB2PJkiWYPHkyRo0aBRsbGwQGBsLT09Oo8b3yyitYtmwZRo0ahenTpwMAFi5cCDc3N7zyyitGrZOmUigUmDZtGqZPn449e/YgMjISb731Fr777jtoNBpMmTIFAQEBKCoqwvfffw9HR0fs3LlTp40VK1bg5s2b8PLywmeffQalUonExERpeXPN92HxuNe5c+ca3Q8REdFDmfKS4u3bt4uQkBBhb28v1Gq1CA4OFps2baq37q+//irCwsKEUqkUAMTChQulZVqtVsycOVN06tRJ2NnZibCwMHHixAnh6+sroqOjpXo5OTkiPj5edO3aVSiVSuHh4SFiY2PFuXPndPoytF7d7T/qezV0+w484DYwxraXnp4uNBqNUKlUQqVSidDQULFr1y6j10udmpoa8eabbwp3d3ehUCgEALFmzZpGje/UqVNi6NChwt7eXtjb24uhQ4eK06dP69Spuw1Mbm6uTrm3t7eIi4urdx09iLe3d73zKisrEw4ODiIiIkIqKykpEdOmTROdO3cWNjY2wsvLS8TGxoq9e/fqzXf//v3i8ccfF0qlUvTt21ekp6fr9WHIfOs86DNwr4fF4/42Tfz1JCIikpjsWcBErd2cOXMwd+7cVnXBDBERkTmY7nJNIiIiImoTmAASERERyQwTQCIiIiKZ4TmARERERDLDPYBEREREMsMEkIiIiEhmmAASPcCcOXNM+gg3U7dHzeePf/wjFAqF9EpPT29SveZ04cIFDB8+HGq1GgqFAvHx8S0+BiJqW5gAEhHV45VXXsG6deswa9Ysk9RrTjNmzMAPP/yA//qv/8K6deswZcoUaVlVVRXmzZuHyMhIODo6mi1JJXnbsmULFi1aZO5h0D14EQjRA1RXV6O6uhq2tratsj1qfunp6Rg4cCDS0tIe+CxoQ+s1B3d3d0yYMKHeX7DXr1+Hk5MTfHx80LFjR2RkZJhljCRv8fHxSE9PR15enrmHQv/GPYBED2BlZWXSZM3U7REBwJUrV9C+fft6l6lUKhQUFCAnJwdvvPFGyw6MiFotJoDU4urOg8vIyEDv3r1ha2uLJ554AocOHaq3vkKhwJw5c7BlyxYEBgbC1tYWvr6+2LFjh1TnypUrmDx5Mjw8PGBra4ugoCCd5fc6cOAAIiMjoVaroVarER4ejj179ujU6d69u855XQ05c+YMRo4cCTc3N9jb2+Pxxx/HnDlz9OoZ2t7p06cxbNgwqFQqqFQqREdH4+zZszp11q5dC4VCgaysLMTExEClUsHX1xerV69usN3WrKXje/XqVSQlJaFXr15QqVRwdHSERqNBRkZGs8/VlOo+BwqFAkIIzJ07V/r53nMALS0t4eXlZdK+Df3cA4Z93wz53Ncx9efFHAxZf3XxvX+PWdeuXXXia+j21JjtrinjUfeZ/PLLL5Gfn6+zHVy7dq3R645Mx8rcAyD5ev755/HCCy8gPj4ey5cvR1RUFE6ePAkfHx+9ullZWVi8eDEmT54MHx8f/PTTT9KGsby8HCEhIbhy5QoSExPh5uaGjRs3YsSIEfi///s/nUNd27ZtQ0xMDLp374633noLbm5uSE9Px8qVKxEZGSnVW7BgAW7cuIFNmzZh8+bN9Y6/srISUVFRqKysxIwZM9ChQwecO3cOqampehtzQ9q7fPkywsLCoFAopPPJPvnkE4SFheHUqVNwcXHRqf/SSy8hIiICycnJWLNmDf785z+jb9++CAoKetiqb3VaMr45OTlYvXo1/vjHP+K1115DWVkZvvjiC0REROCnn36Cv7+/GdaA8UJDQ7Fu3ToAwMSJExETE4Pnn38eAODr69ts/RrzuTckHsZ+7gHTfV7MwZj1ZwxDt6cPq2fqeNR9RleuXIkzZ85g4cKF0vuCg4MbPV8yAUHUwmbPni0AiPfee08qy83NFRYWFiIxMVGvPgBhYWEhjh07plNeXV0thBDinXfeEdbW1iI7O1taVlNTIwIDA0V4eLhO/S5dugg/Pz9x48YNnbZ+//33B461PsePHxcAxBdffKFTXlVVVW/9h7VXtywjI0MqO3jwoAAg5s6dK5WtWbNGABBJSUlSWUFBgVAoFDr12oqWjm95ebkoLy/XWZ6fny8UCoWYOXOm3vjS0tIEAJGWlvbAeRharzkAELNnz35ovQ0bNjR5jIZ+7g2Nh6Gf+zqm+ryYi6Hrr+57npubq1Pu7e0t4uLipJ8N3Z4aW89U8agTFxcnvL299d5P5sNDwGQ2EyZMkP7ftWtX9O/fH/v376+37uDBg9G3b1+dMktLSwDApk2b0K9fP3h4eKCkpAQlJSW4evUqgoODkZGRgZqaGgDA0aNHUVBQgMTERDg4OOi01bFjR6PHb29vDwD417/+hcrKSqncyqpxO9bT09PRrVs3PP3001LZs88+Cx8fn3qv2oyJiZH+7+XlBRcXFxQVFTWqb3NryfjWHdYC7l6UU1painbt2sHFxQW5ubnNOc1HgqGfe0PjYeznHjDN58VcTL3dqGPo9vRh9UwdD2q9eAiYzOb+85I6d+6MtLS0eus+6LDcb7/9Bq1WC1dX13qXl5eXw8nJSfrlHhAQ0MgR6+revTsmT56MlStXYtOmTXjmmWcQERGBhIQEODk5Gd1ecXExunTpolfepUsXXLhwQa/cw8ND5+d27drp/EJpS1oyvrW1tViyZAmWLl2K3NxcnYSgoqKiEaN/dNTU1ODKlSs6Za6urjq/zA393BsaD2M/94BpPi/mYurtRh1Dt6cPq2fqeFDrxQSQWhUbG5t6yxu6whG4e5LxkCFDkJSUVO/y+/c+mNLnn3+OKVOmYNeuXdi1axeSkpLwxRdf4Pjx481+ta+FxaOzA78l45ucnIxZs2bhxRdfxN///nc4OzsDuLtnRMj8rliFhYV654zl5uaia9euOmXm/NwDrXd7YKimrD9j9mA2tD1tbL2GPCge1HoxASSzKSws1PnLsaioqFFXK3br1g137tyBRqN5YL26X2ynT59GRESE0f00JCgoCEFBQZg1axY++eQTvPnmm/j+++8RHR1tVDsdO3ZEQUGBXnl+fn69F8bIhanjm5KSgtDQUHz99ddSWVVVFa5fv15v/bpfjtXV1Q/s39B6rZmHhwf27t2rV1afh33uDY2HqT/3hn5ezO1h66/u83T79m3pPbW1tbh8+XK97Rm6PX1YvebaDvEJSK3Po7MLgdqcf/7zn9L/8/LykJWVhbCwMKPbiYmJwcGDB+u9jUdhYaH0/yeeeAJeXl5YvHgxbty4oVOvoY3qg5SXl+v9sq/bQDbmfJ7w8HDk5OTg8OHDUtnBgweRl5dn9isXzcnU8bW0tIS1tbXO8lWrVjWYuHXu3BkA8Ouvvz5wnIbWa81sbW2h0Wh0XvfvkTL0c29oPEz9uTf082Iuhq4/T09PAHfPpayTmpra4Gkehm5PH1avubZDKpUKJSUlbfoPpEcN9wCS2axYsQI3b96El5cXPvvsMyiVSiQmJhrdzltvvYXvvvsOGo0GU6ZMQUBAAIqKivD999/D0dERO3fuBHD3F/+yZcsQExODJ598EnFxcXBzc8OhQ4dw69YtbNiwAQBw8uRJnDx5Uvo/AGlvkYODA0aNGgUA2LdvHxITExEbG4uePXuitLQUS5YsQZcuXXRub2Boe6+88gqWLVuGUaNGYfr06QCAhQsXws3NDa+88orR6+VRYer4jhgxAnPmzMHUqVMRFBSEn376CVu3bq339hbA3XOf+vfvj3nz5qG2thaOjo548skn9c57MrSeOSxduhTXr1/HqVOnANy9NcehQ4fQvn17vPrqq0a1Zejn3tB4mPpzb+jnxVwMXX9PPfUUXFxcMGPGDBQWFuL27dtISUmRTlm4n6Hb04fVa67tUHBwMJYsWYLJkydj1KhRsLGxQWBgoJTokhmY+zJkkp+62wzs379fPP7440KpVIq+ffuK9PT0euvDgFtclJSUiGnTponOnTsLGxsb4eXlJWJjY8XevXv16qanpwuNRiNUKpVQqVQiNDRU7Nq1S2989b3uvY1BTk6OiI+PF127dhVKpVJ4eHiI2NhYce7cuXrn+7D2hBDi1KlTYujQocLe3l7Y29uLoUOHitOnT+vUMfT2EG1FS8dXq9WKmTNnik6dOgk7OzsRFhYmTpw4IXx9fUV0dHS9/f/6668iLCxMKJVKAUAsXLiwSfVM7WHr0Nvb26DPnyEM/dzXeVg8hDDsc2/oXIUw7vPS0oxZf4cPHxZ9+vQRdnZ2YsCAAeLo0aMN3gbmYdtTY7a7po6HEHdvxfPmm28Kd3d3oVAoBACxZs2ah76Pmg+fBUwtbs6cOZg7d67sT7gnImoqQ7en3O7S/XgOIBEREZHMMAEkIiIikhkmgEREREQyw3MAiYiIiGSGewCJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECKHPXrl1DfHw8nJycoFarMW7cOFy+fNncw2ozTL3+vvvuO/Tt2xe2trZwdXVFQkICSktLdepUVVVh3rx5iIyMhKOjIxQKBdLT05s4k0eDOeKxdu1aKBQKvVd4eHgTZ9P2mSMeu3fvRnR0NDw9PWFrawtfX18kJibq1aP6Gbp9MWY9GxI3ankKIYQw9yDIfMLDw3H06FG8/fbbsLa2RnJyMry9vZGVlQVLS0tzD6/VM+X6S0tLw6BBg/DMM89gwoQJKCoqwsKFC9G7d28cPnwYFhZ3/167fv06nJyc4OPjg44dOyIjIwNpaWlMOGCeeKxduxZ/+tOfsHDhQri4uEjvd3d3x+DBg006v7bGHPH46KOPkJGRgf79+8Pd3R2FhYVYtmwZXF1dcezYMdja2jbHVB8Zhm5fDF3PhsaNzECQbO3Zs0cAEGvXrpXKtm/fLgCIlJQUM46sbTD1+hs0aJDw9PQUWq1WKlu9erUAIFJTU6Wy6upqUVBQIIQQYsOGDQKASEtLa/xEHhHmiseaNWsEAJGbm9uk8T9qzBWP+qSmpgoAYsOGDUb3KzdN2b7Ut56bEjdqXky9ZWzbtm1QKpUYN26cVBYVFQVnZ2ekpqaacWRtg6nXX3Z2NkJDQ2FjYyOVjRo1CgCwY8cOqczS0hJeXl6NH/gjylzxqCOEQHl5OQQPqgAwfzzu1bFjRwDg6S0GaMr2pb713JS4UfNiAihj2dnZ8PPz0zkkYmFhgcDAQGRnZ5txZG2DqddfRUWF3uEpOzs7AMCZM2eaNlgZMHc8evfuDbVaDbVajZdffhm3b982us9HibnjUVZWhkuXLuHQoUN49dVXoVAoEBwcbHS/9GAPW8/crrVeVuYeAJnPxYsX0blzZwCARqPBlStXcOTIEbi5ueH06dNmHl3rZ+r15+vrixMnTuiU/fDDDwCAK1euNH3AjzhzxcPe3h6TJ09GaGgorK2tsWPHDqxYsQK5ubnYtWtXE2bUtpn7+zFkyBBkZmYCAJycnPDZZ5+hT58+RvdLD/aw9cztWuvFBFDGtFqttFs+Ly8P165dQ1VVFZRKJSoqKsw8utbP1Otv0qRJSExMxJw5c/DSSy+hsLAQU6dORfv27aHVak09/EeOueIRGxuL2NhY6eexY8fCxcUFCxYswIEDBxAaGtr0ybVB5v5+LFmyBCUlJThx4gS2bt2KTp06NXlOpO9h65nbtVbM3Cchkvn4+/sLjUYjhBDixo0b4vr160IIIcaOHSvc3NzMObQ2wdTrr7KyUrz00ksCgAAgFAqFeOONN0RYWJgIDAys9z28COQ/WkM86vz6668CgPiv//ov4yfyiGhN8Th06JCwsLAQBw4cMH4iMmbs9qW+9dyUuFHz4jmAMubh4YFLly4BABwcHKBWqwHcPYHXw8PDnENrE0y9/qytrfHll1+iqKgIBw4cQF5eHj755BPk5+dLh9KoYa0pHnV7Qa5du2Z0v4+K1hSPZ555Bu7u7li1apXxEyGD1beeuV1rvZgAylhgYCB++eUXncMxtbW1yM7ORmBgoBlH1jY01/rz9PRESEgIunTpgpycHOTl5aF///6mGPIjrTXFo7CwEADg6ura6H7butYUDwCorKyUElJqPg2tZ27XWh8mgDI2fPhwaLVapKSkSGU7d+5EaWkpnnvuOTOOrG1ozPrz9/eHv79/vctEPbcPee+992BpaYkJEyaYZtCPMHPFo6SkRK/ep59+CgCyvhG0ueKRm5urV2/Pnj0oLS1tsG0ynqHrmdu11otPApExIQTCwsJw/Phx6U79H374Iby8vHDkyBFYWfEaoQdpzPpTKBTSe++Xl5eHuLg4jBgxAg4ODti8eTN2796NWbNm4f3339epu3TpUly/fh2nTp3Ct99+i4SEBPj4+KB9+/Z49dVXm2fCrZy54hEQEICgoCD07dsXdnZ22Lt3L7Zu3YqJEyfiq6++ar4Jt3LmioePjw969OiBIUOGQK1W4+eff8bKlSthZ2eHo0ePomvXrs0250eFIdsXQ9ezMds1amFmOfOQWo3S0lIxceJEoVarhUqlErGxsaK4uNjcw2ozjF1/+PeJ0PW5evWqiIqKEs7OzkKpVIrAwECxYsUKUVtbq1fX29tbauvel7e3t6mm1iaZIx5//etfhb+/v1CpVMLa2lr4+fmJ+fPni+rqapPOrS0yRzw++ugjERwcLFxdXYWNjY3w8fER8fHxIj8/36Rze5QZsn0xdD0bs12jlsU9gEREREQyw3MAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQIoY1VVVZg3bx4iIyPh6OgIhUKB9PR0cw+rTbl27Rri4+Ph5OQEtVqNcePG4fLly41u7+DBgxg4cCCcnJzg4uKCyMhIZGZmPvA9SUlJUCgUsn0CyL1MGY+uXbtCoVDU+7r/EW+NiZscmOP7we1a0xi6/o4cOYKEhAR0794d7dq1g5+fH2bOnIkbN27o1Fu7dm2936Hw8PCWmRA1iM/6krFbt27hvffeg4+PDwIDA5GRkWHuIbU5MTExOHr0qPSoq+TkZERFRSErKwuWlpZGtXX8+HFoNBr07t0bf//731FVVYXly5cjIiICP/74Y73PMc3JycHKlStNNZ02z5TxWLRoEW7evKlTlpeXh3fffVcnAWxM3OTCHN8PbteaxtD1t2DBAmRkZGD8+PHw8/PDmTNnsGTJEuzbtw+ZmZl6j/pbuHAhXFxcpJ/d3d2bdR5kAHM/ioTMp7q6WhQUFAghhNiwYYMAINLS0sw7qDZkz549AoBYu3atVLZ9+3YBQKSkpBjd3muvvSaUSqUoKyuTys6ePSsAiHnz5tX7ntGjR4vXXntNABDTpk0zfhKPEFPHoz5z584VCoVC+t4I0bi4yYG5vh/crjWNoevvhx9+EFVVVTplixYtEgDExo0bpbI1a9YIACI3N7c5h02NwEPAMmZpaQkvLy9zD6PN2rZtG5RKJcaNGyeVRUVFwdnZGampqUa3d+nSJdja2sLR0VEqc3Nza7D+oUOHsHv3bvztb38zuq9HkanjUZ+vv/4azz77rM73xti4yYW5vh/crjWNoetvwIABenv5NBoNAODcuXN69YUQKC8vh+DTZ1sNJoBEjZSdnQ0/Pz/Y2tpKZRYWFggMDER2drbR7YWFhaGsrAxJSUnIycnB2bNnkZiYCFdXV8THx+vUFUJgxowZeOONN5hs/Jup43G/zMxMnD9/Hi+88IJOuTFxkxNzfj/IPK5cuQIA6Nixo96y3r17Q61WQ61W4+WXX8bt27dbenh0H54DSNRIFy9eROfOnQHc/cv3ypUrOHLkCNzc3HD69Gmj2/t//+//4cSJE1i0aBEWLFgAAOjZsycOHz4s9VPnm2++QU5ODpKSkpo+kUeEqeNxv3Xr1sHa2hqxsbE65cbETU7M+f0g81i+fDkcHBzw3HPPSWX29vaYPHkyQkNDYW1tjR07dmDFihXIzc3Frl27zDha4h5AokbSarWwsbEBcPfigKKiIlRVVUGpVKKiosLo9qysrODn54fx48fj22+/xZo1a6BQKDBy5EiUlpZK9e7cuYNZs2bh7bff1jkcJnemjse9qqqqkJKSgsjISDg7O+ssMzRucmOu7weZx/r167F+/Xq8//77Ot+R2NhYfP7553jxxRcxduxYrF27Fm+++SZ2796NAwcOmHHExD2ARI2kVCpRWVkJ4O4VijU1NbC3t4dWq9U57GWo+fPnY8WKFTh//rz0izMiIgLdu3fHggUL8MEHHwC4e/WdEALTpk0z3WQeAaaOx7127tyJkpISvcO/gOFxkxtzfT+o5Z08eRKTJk3CmDFjkJiY+ND6L7/8MhYsWID9+/cjNDS0BUZI9WECSNRIHh4euHTpEgDAwcFBKr98+TI8PDyMbm/lypUIDQ2VfrkBgJeXFwICAqRbMZSVlSE5ORl/+ctfUFJSovP+W7duoaioCO7u7rC2tm7MlNo0U8fjXuvWrYO9vT1Gjhypt8yQuMmROb4f1PKKi4sxfPhwBAQE4KuvvoJCoXjoezp16gTg7n0iyXx4CJiokQIDA/HLL7/oHM6qra1FdnY2AgMDjW7vwoULqKmp0SuvqanBrVu3ANzdYN68eRPvvvsuvLy8pBdw94arXl5eOHHiRCNn1LaZOh51ysrKsH37dowYMQL29vZ6yw2JmxyZ4/tBLevmzZuIjo6GtbU1tm/fDjs7O4PeV1hYCABwdXVtzuHRQzABJGqk4cOHQ6vVIiUlRSrbuXMnSktLdU6Cvpe/v3+DNwb28fHBvn37dG4+/Ntvv+Hs2bPSL0x3d3ds27ZN7wUA0dHR2LZtG3r06GGqKbYppo5HnQ0bNqCioqLew7+AYXGTI3N8P6jlVFdXY8yYMSgsLMSuXbsavBvB/UcqAODTTz8FAL0n6lDLUgjelEfWli5diuvXr+PUqVP49ttvkZCQAB8fH7Rv356PFnsIIQTCwsJw/Phx6UkHH374Iby8vHDkyBG9e2QBkA6P1Pe1++KLLzB58mT07t0bCQkJqKiowNKlS1FSUoKsrCw8/vjjDY5FoVBg2rRpWLp0qekm2MaYOh51wsLCcOrUKRQXF9d7aL0pcXuUmfP7we1a0xiy/l5//XV8+umnSExMRP/+/XXe7+vri6effhoAEBAQgKCgIPTt2xd2dnbYu3cvtm7diokTJ+Krr75q8bnRPcxz/2lqLby9vQUAvZe3t7e5h9YmlJaWiokTJwq1Wi1UKpWIjY0VxcXFDdavW78N2bRpk3jqqaeEo6OjsLe3FxqNRmRmZj50HOCTQIQQpo9HXl6eUCgUYsqUKQ/st7Fxe9SZ6/vB7VrTGLL+wsLC6q0DQMTFxUn1/vrXvwp/f3+hUqmEtbW18PPzE/PnzxfV1dUtPzHSwT2ARERERDLDcwCJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAihjR44cQUJCArp374527drBz88PM2fOxI0bN8w9tDbj2rVriI+Ph5OTE9RqNcaNG4fLly83qq2qqirMmzcPkZGRcHR0hEKhQHp6ul49xq1hpoyHoevZ0LjJkTm+H2vXroVCodB7hYeHN20ypKOxn/ukpCQoFAo+kaUV0H8WD8nGggULkJGRgfHjx8PPzw9nzpzBkiVLsG/fPmRmZtb7qCbSFRMTg6NHj0qPukpOTkZUVBSysrJgaWlpVFu3bt3Ce++9Bx8fHwQGBiIjI6Peeoxbw0wZD0PXs6FxkyNzfD/qLFy4EC4uLtLP7u7ujZoD1a8xn/ucnBysXLmyBUZHBjH3o0jIfH744QdRVVWlU7Zo0SIBQGzcuNFMo2o79uzZIwCItWvXSmXbt28XAERKSorR7VVXV4uCggIhhBAbNmwQAERaWppePcatfqaOh6Hr2dC4yY25vh9r1qwRAERubm5jh04GaMznfvTo0eK1117joytbCR4ClrEBAwbo7S3SaDQAgHPnzpljSG3Ktm3boFQqMW7cOKksKioKzs7OSE1NNbo9S0tLeHl5PbQe41Y/U8fD0PVsaNzkxlzfjzpCCJSXl0PwaafNwth4HDp0CLt378bf/va3ZhwVGYMJIOm4cuUKAKBjx45mHknrl52dDT8/P9ja2kplFhYWCAwMRHZ2douOhXFrmXhwPRvO3N+P3r17Q61WQ61W4+WXX8bt27ebvU+qnxACM2bMwBtvvAE3NzdzD4f+jQkg6Vi+fDkcHBzw3HPPmXsord7Fixel84o0Gg169+6NyspKuLm54eLFiy06FsatZeLB9Ww4c30/7O3tMXnyZCxfvhwpKSl4/vnnsWLFCjz//PPN1ic92DfffIOcnBwkJSWZeyh0D/meLU561q9fj/Xr12Px4sVwdnY293BaPa1WCxsbGwBAXl4erl27hqqqKiiVSlRUVLTYOBi3u5o7HlzPxjHX9yM2NhaxsbHSz2PHjoWLiwsWLFiAAwcOIDQ0tNn6Jn137tzBrFmz8Pbbb8PR0dHcw6F7cA8gAQBOnjyJSZMmYcyYMUhMTDT3cNoEpVKJyspKAMDx48eRk5MDe3t7aLVancNezYlx+4/mjAfXs/Faw/ejzssvvwwA2L9/f4v2S3evphdCYNq0aeYeCt2HewAJxcXFGD58OAICAvDVV19BoVCYe0htgoeHBy5dugQAcHBwkMovX74MDw+PZu+fcdPVXPHgem4cc38/7tWpUycAd+9LSC2nrKwMycnJ+Mtf/oKSkhKdZbdu3UJRURHc3d1hbW1tphHKG/cAytzNmzcRHR0Na2trbN++HXZ2duYeUpsRGBiIX375RedwVm1tLbKzsxEYGNisfTNu+pojHlzPjWfO78f9CgsLAQCurq4t2q/cXbt2DTdv3sS7774LLy8v6QXcvWG3l5cXTpw4YeZRyhcTQBmrrq7GmDFjUFhYiF27dvHqLCMNHz4cWq0WKSkpUtnOnTtRWlra4EUC/v7+8Pf3b1K/jFv9TB0PruemMdf34/49TQDw6aefAgAGDx7cpLbJOO7u7ti2bZveCwCio6Oxbds29OjRw8yjlC+F4E2SZOv111/Hp59+isTERPTv319nma+vL55++mkzjaxtEEIgLCwMx48fl5508OGHH8LLywtHjhyp94kcdYcPG/raLV26FNevX8epU6fw7bffIiEhAT4+Pmjfvr306CTGrX6mjocx69mQuMmNub4fAQEBCAoKQt++fWFnZ4e9e/di69atmDhxIr766qvmm7AMNfZzr1AoMG3aNCxdurQFR0t6zHP/aWoNwsLCBIB6X3FxceYeXptQWloqJk6cKNRqtVCpVCI2NlYUFxc3WL9u/TbE29u73nh4e3tLdRi3hpkyHsasZ0PiJkfm+H789a9/Ff7+/kKlUglra2vh5+cn5s+fL6qrq005NRKN/9yDTwJpFbgHkIiIiEhmeA4gERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTABlbPfu3YiOjoanpydsbW3h6+uLxMRElJaWmntobca1a9cQHx8PJycnqNVqjBs3DpcvX25UW4bGg3FrmCnjUVVVhXnz5iEyMhKOjo5QKBRIT0/Xq9e1a1coFIp6X3J/9Jgp43HkyBEkJCSge/fuaNeuHfz8/DBz5kzcuHGjUfWoaQz9fjAerRdvBC1jH330ETIyMtC/f3+4u7ujsLAQy5Ytg6urK44dOwZbW1tzD7HVCw8Px9GjR6VHXSUnJ8Pb2xtZWVmwtLQ0qi1D48G4NcyU8bh+/TqcnJzg4+ODjh07IiMjA2lpaQgPD9ept2XLFty8eVOnLC8vD++++y6Sk5Px1ltvNXVabZYp4zF+/HhkZGRg/Pjx8PPzw5kzZ7Bs2TL84Q9/QGZmpvRoOUPrUdMY+v1gPFox8z6IhFqb1NRUAUBs2LDB3ENp9fbs2SMAiLVr10pl27dvFwBESkqKSfowNB6Mm+njUV1dLQoKCoQQQmzYsEEAEGlpaQa9d+7cuUKhUEjvlyNTx+OHH34QVVVVOmWLFi0SAMTGjRuNrkdNY+j3g/FovXgImHR07NgRABp9mEZOtm3bBqVSiXHjxkllUVFRcHZ2Rmpqqkn6MDQejJvp42FpaQkvL69GjeXrr7/Gs88+2+j3PwpMHY8BAwbo7S3SaDQAgHPnzhldj5rG0O8H49F6cd8roaysDBUVFTh//jySkpKgUCgQHBxs7mG1etnZ2fDz89M55GphYYHAwEBkZ2c3ul1D48G46WqueBgrMzMT58+fx4wZM1qsz9aoJeJx5coVAP/5A6ip9ahlMB6tAxNAwpAhQ5CZmQkAcHJywmeffYY+ffqYd1BtwMWLF9G5c2cAd/+ivXLlCo4cOQI3NzecPn260e0aGg/GTVdzxcNY69atg7W1NWJjY1usz9aoJeKxfPlyODg44LnnnjNJPWoZjEfrwASQsGTJEpSUlODEiRPYunUrOnXqZO4htQlarRY2NjYA7p70f+3aNVRVVUGpVKKioqLR7RoaD8ZNV3PFwxhVVVVISUlBZGQknJ2dW6TP1qq547F+/XqsX78eixcvfuC6NrQetQzGo/VgAkjo168fgLvn54SEhCA0NBTp6ekICQkx88haN6VSicrKSgDA8ePHUVNTA3t7e2i12iZdiWtoPBg3Xc0VD2Ps3LkTJSUleOGFF1qkv9asOeNx8uRJTJo0CWPGjEFiYmKT61HLYDxaF14EQjqeeeYZuLu7Y9WqVeYeSqvn4eGBS5cuAQAcHBygVqsB3L0Qw8PDwyR9GBoPxq1l4vEw69atg729PUaOHNki/bVmzRWP4uJiDB8+HAEBAfjqq6+gUCiaVI9aBuPR+jABJD2VlZXShpsaFhgYiF9++UXncFZtbS2ys7MRGBhosn4MjYfc49ZS8WhIWVkZtm/fjhEjRsDe3r7Z+2vtmiMeN2/eRHR0NKytrbF9+3bY2dk1qR61DMajdWICKGO5ubl6ZXv27EFpaSn8/f3NMKK2Zfjw4dBqtUhJSZHKdu7cidLS0gZPbvb3929w3RoaD8atfqaOh7E2bNiAiooKHv79N1PHo7q6GmPGjEFhYSF27doFNze3JtWjlsF4tF58EoiM+fj4oEePHhgyZAjUajV+/vlnrFy5EnZ2djh69Ci6du1q7iG2akIIhIWF4fjx49KTDj788EN4eXnhyJEj9d7hvu6wR31fO0PjwbjVz9TxAIClS5fi+vXrOHXqFL799lskJCTAx8cH7du3x6uvvqpTNywsDKdOnUJxcTGsra1NP8E2xtTxeP311/Hpp58iMTER/fv311nm6+uLp59+2qh61HSGfD8Yj1bMfPegJnP76KOPRHBwsHB1dRU2NjbCx8dHxMfHi/z8fHMPrc0oLS0VEydOFGq1WqhUKhEbGyuKi4sbrA9ANPS1MzQejFvDTBkPIYTw9vaW6tz78vb21qmXl5cnFAqFmDJliqmm8kgwZTzCwsLqjQUAERcXZ3Q9ajpDvh+MR+vFPYBEREREMsNzAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSJKkpCQoFAq9JxxQw65du4b4+Hg4OTlBrVZj3LhxuHz5crO3Z+p+HxWMR+vCeNDu3bsRHR0NT09P2NrawtfXF4mJiSgtLTX30GSPN4ImAEBOTg769OmDGzduYNq0aVi6dKm5h9QmhIeH4+jRo9KjrpKTk+Ht7Y2srCxYWlo2W3um7vdRwXi0LowHffTRR8jIyED//v3h7u6OwsJCLFu2DK6urjh27BhsbW3NPUT5Mu+DSKi1GD16tHjttdcEADFt2jRzD6dN2LNnjwAg1q5dK5Vt375dABApKSnN1p6p+31UMB6tC+NBDUlNTRUAxIYNG8w9FFljAkji4MGDwsHBQVy6dIkJoBESExOFUqkUd+7ckcpqamqEs7OzePHFF5utPVP3+6hgPFoXxoMacuTIEQFALFu2zNxDkTWrltzbSK2PEAIzZszAG2+8ATc3N3MPp03Jzs6Gn5+fziEMCwsLBAYGIjs7u9naM3W/jwrGo3VhPOheZWVlqKiowPnz56XzzYODg809LFnjRSAy98033yAnJwdJSUnmHkqbc/HiRbi7uwMANBoNevfujcrKSri5ueHixYvN1p6p+31UMB6tC+NB9xoyZAg8PDwQEhKCX375BZ999hn69Olj7mHJGvcAytidO3cwa9YsvP3223B0dDT3cNocrVYLGxsbAEBeXh6uXbuGqqoqKJVKVFRUNFt7pu73UcF4tC6MB91ryZIlKCkpwYkTJ7B161Z06tTJ3EOSPSaAMrZgwQIIITBt2jRzD6VNUiqVqKysBAAcP34cNTU1sLe3h1arbdSVbYa2Z+p+HxWMR+vCeNC9+vXrBwCIiopCSEgIQkNDkZ6ejpCQEDOPTL6YAMpUWVkZkpOT8Ze//AUlJSU6y27duoWioiK4u7vD2traTCNs/Tw8PHDp0iUAgIODg1R++fJleHh4NFt7pu73UcF4tC6MBzXkmWeegbu7O1atWsUE0Ix4DqBMXbt2DTdv3sS7774LLy8v6QUAa9euhZeXF06cOGHmUbZugYGB+OWXX3QOK9XW1iI7OxuBgYHN1p6p+31UMB6tC+NBD1JZWSkl6mQeTABlyt3dHdu2bdN7AUB0dDS2bduGHj16mHmUrdvw4cOh1WqRkpIile3cuROlpaV47rnn6n2Pv78//P39m9ReY/qVA8ajdWE8CAByc3P1yvbs2YPS0tIGY00tg08CIR0KhYJPAjGQEAJhYWE4fvy49MSBDz/8EF5eXjhy5AisrPTPsFAoFNJ7G9teY/qVA8ajdWE8CAB8fHzQo0cPDBkyBGq1Gj///DNWrlwJOzs7HD16FF27djX3EOWr5W89SK0ZeCNoo5SWloqJEycKtVotVCqViI2NFcXFxQ3WByAe9LUztD1j+5ULxqN1YTzoo48+EsHBwcLV1VXY2NgIHx8fER8fL/Lz8809NNnjHkAiIiIimeE5gEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiJqFteuXUN8fDycnJygVqsxbtw4XL58udHtHTx4EAMHDoSTkxNcXFwQGRmJzMzMZu9XTo4cOYKEhAR0794d7dq1g5+fH2bOnIkbN27o1f3uu+/Qt29f2NrawtXVFQkJCSgtLdWps3v3bkRHR8PT0xO2trbw9fVFYmKiXj1qeQohhDD3IIiI6NETHh6Oo0eP4u2334a1tTWSk5Ph7e2NrKwsWFpaGtXW8ePHMWDAAPTu3RtxcXGoqqrC8uXLceHCBfz444/w9/dvln7lZvz48cjIyMD48ePh5+eHM2fOYNmyZfjDH/6AzMxMWFlZAQDS0tIwaNAgPPPMM5gwYQKKioqwcOFC9O7dG4cPH4aFxd39Sx999BEyMjLQv39/uLu7o7CwEMuWLYOrqyuOHTsGW1tbc05X3gQREZGJ7dmzRwAQa9eulcq2b98uAIiUlBSj23vttdeEUqkUZWVlUtnZs2cFADFv3rxm61dufvjhB1FVVaVTtmjRIgFAbNy4USobNGiQ8PT0FFqtVipbvXq1ACBSU1Mf2EdqaqoAIDZs2GDawZNRZHEI+OrVq0hKSkKvXr2gUqng6OgIjUaDjIyMeusfOHAAkZGRUKvVUKvVCA8Px549e4yut3btWigUCuTl5em8r2vXroiPj9drT6FQYM6cOdiyZQsCAwOl3eU7duww+Tzu3LkDR0dH/L//9//03rd69WooFAqcOHGi3naJiB5m27ZtUCqVGDdunFQWFRUFZ2dnpKamGt3epUuXYGtrC0dHR6nMzc2t2fuVmwEDBkh7+epoNBoAwLlz56Sy7OxshIaGwsbGRiobNWoUAEi/sxrSsWNHAOBheTOTRQKYk5OD1atXIywsDAsXLsTs2bNRVFSEiIgInD17Vqfutm3bMGjQIBQUFOCtt97Cxx9/DE9PT6xcubJR9YyVlZWFP/3pTxg2bBgWLVoEjUYjJZCmnIednR1GjRqFzZs3o7q6Wue9GzZswGOPPYbevXs3aS5EJF/Z2dnw8/PTOcRnYWGBwMBAZGdnG91eWFgYysrKkJSUhJycHJw9exaJiYlwdXXV+YPa1P0ScOXKFQD/SdwAoKKiQu/wrZ2dHQDgzJkzem2UlZXh0qVLOHToEF599VUoFAoEBwc346jpocy9C7IllJeXi/Lycp2y/Px8oVAoxMyZM6Wy6upq0aVLF+Hn5ydu3LihU//33383ut6aNWsEAJGbm6tTx9vbW8TFxemNE4CwsLAQx44d0ymvrq5ulnns3LlTABC7du2SykpLS4WVlZXOIRUiImP5+/sLjUYjhBAiIiJC9OrVS2i1WjF27Fjh5uZmdHtVVVViypQpwtLSUgAQAETPnj3Fr7/+2qz9khBjx44VDg4OoqSkRCrr06ePCAoK0qm3b98+AUA89thjem0MGDBAipuTk5NYvnx5s4+bHkwWewBVKhVUKhUAoLq6GqWlpWjXrh1cXFyQm5sr1Tt69CgKCgqQmJgIBwcHnTbu/cvH0HqNMXjwYPTt21enrO6kZVPPQ6PRwM3NDSkpKVJZ3R7B8ePHN2keRCRvWq1WOjyYl5eHoqIiVFVVQalUoqKiwuj2rKys4Ofnh/Hjx+Pbb7/FmjVroFAoMHLkSJ0rSk3dr9ytX78e69evx/vvvw9nZ2epfNKkSTh27BjmzJmDnJwc7N+/H1OnTkX79u2h1Wr12lmyZAl27NiB+fPno2fPnujUqVNLToPqYfXwKm1fbW0tlixZgqVLlyI3Nxc1NTXSsns3CHVJVEBAwAPbM7ReY9x7Jdv9TD0PKysrxMbG4n/+53/w+eefw9raGhs2bEC/fv3QvXv3Js6EiORMqVSisrISwN0reGtqamBvbw+tVtuoKz/nz5+PFStW4Pz581KCFxERge7du2PBggX44IMPmqVfOTt58iQmTZqEMWPGIDExUWfZlClTcOTIEcydOxdz586FQqHA9OnTcezYMVy9elWvrX79+gG4ez5mSEgIQkNDkZ6ejpCQkBaZC+mTxR7A5ORkTJ8+HQMGDMA333yDvXv3Yu/evXBxcYEww11w7k3c7te+ffsGlzXHPF544QVcu3YNe/fuxdWrV/H9999jwoQJjWqLiKiOh4cHLl26BABwcHCAWq0GcPfEfw8PD6PbW7lypd5FB15eXggICNC5EM7U/cpVcXExhg8fjoCAAHz11VdQKBQ6y62trfHll1+iqKgIBw4cQF5eHj755BPk5+ejc+fOD2z7mWeegbu7O1atWtWcU6CHkMUewJSUFISGhuLrr7+WyqqqqnD9+nWdej4+PgCA06dPIyIiosH2DK1Xt6G6ffu2VFZbW9voK59MPQ8ACA4ORteuXZGSkoLi4mLU1tZi7NixjRofEVGdwMBArFy5UudigdraWmRnZ2Po0KFGt3fhwoV6/3iuqanBrVu3mq1fObp58yaio6NhbW2N7du3Sxd31MfT0xOenp4A7l6omJeXh7i4uIf2UVlZKSXqZB6y2ANoaWkJa2trnbJVq1bpXf36xBNPwMvLC4sXL9a76/m9SZuh9eq+FEePHpXKUlNTpcMT5p5HnQkTJmDr1q34+uuvERISIo2biKixhg8fDq1Wq3OO8c6dO1FaWornnnuu3vf4+/s3eBqMj48P9u3bh5s3b0plv/32G86ePYvAwMAm9Uv/UV1djTFjxqCwsBC7du2q91Y7AOo96vTee+/B0tJS5yjSveen19mzZw9KS0sfeMoTNT9Z7AEcMWIE5syZg6lTpyIoKAg//fQTtm7dChcXF516lpaWWLZsGWJiYvDkk08iLi4Obm5uOHToEG7duoUNGzYYVe+pp56Ci4sLZsyYgcLCQty+fRspKSk6J9Kacx51JkyYgPnz5yM9PR3Lly9v1NiIiO41ePBghISEIDExEb///jusra3x4Ycfok+fPhg9enS977n3PnP3S0pKwuTJk/Hss88iISEBFRUVWLp0KaytrTFjxowm9Uv/8eabb2L37t1ITExEZmamzqP2fH198fTTTwMA8vPzERcXhxEjRsDBwQGbN2/G7t27MWvWLPTs2VN6z6BBg9CjRw8MGTIEarUaP//8M1auXIkOHTpg+vTpLT09upeZr0JuEVqtVsycOVN06tRJ2NnZibCwMHHixAnh6+sroqOj9eqnp6cLjUYjVCqVUKlUIjQ0VOdWKcbUO3z4sOjTp4+ws7MTAwYMEEePHn3gbWBmz57d4vMQQojHH39cWFpaisuXLzfYPxGRMUpLS8XEiROFWq0WKpVKxMbGiuLi4gbr49+3CWnIpk2bxFNPPSUcHR2Fvb290Gg0IjMzs8n90n+EhYVJcbj/de/vratXr4qoqCjh7OwslEqlCAwMFCtWrBC1tbU67X300UciODhYuLq6ChsbG+Hj4yPi4+NFfn5+C8+M7sdnAROAu4eNO3TogL1795p7KERERNTMZHEOID3YiRMncOzYMbz44ovmHgoRERG1AO4BlLGff/4ZP/74IxYuXIiLFy8iJycH9vb25h4WERERNTPuAZSx7777DgkJCaisrMTmzZuZ/BEREckE9wASERERyQz3ABIRERHJDBNAIiIiIplhAkhEREQkM0wAiZrg2rVriI+Ph5OTE9RqNcaNG9foZz3fLykpCQqFAq+++qpJ6smBOeJx5MgRJCQkoHv37mjXrh38/Pwwc+ZMvccwyhHj0fYYs/6+++479O3bF7a2tnB1dUVCQgJKS0t16uzevRvR0dHw9PSEra0tfH19kZiYqFePWp4sHgVH1FxiYmJw9OhRvP3227C2tkZycjKioqKQlZUFS0vLRrebk5ODlStXmqyeXJgjHgsWLEBGRgbGjx8PPz8/nDlzBkuWLMG+ffuQmZkJKyv5bmYZj7bH0PWXlpaG2NhYPPPMM1iwYAGKioqwcOFCnDp1CocPH4aFxd39SydOnIC1tTWmTZsGd3d3FBYWYtmyZfj+++9x7Ngx2NramnO68mbOx5AQtWV79uwRAMTatWulsu3btwsAIiUlpUltjx49Wrz22msCgJg2bVqT68mBueLxww8/iKqqKp2yRYsWCQBi48aNTeq3LWM82iZD19+gQYOEp6en0Gq1Utnq1asFAJGamvrAPlJTUwUAsWHDBtMOnozSZg8B5+XlQaFQYNasWXBxccFjjz2GjIwM9OnTB87Ozli+fLlU9+rVq0hKSkKvXr2gUqng6OgIjUaDjIyMets+cOAAIiMjoVaroVarER4ejj179ujVUygUmDNnDrZs2YLAwEBp9/aOHTukOqdPn8awYcOgUqmgUqkQHR2Ns2fPNmrOhsyjvLwctra2eOedd/Te/84778DGxgbXr1+Xyvbv3y/twu/duzcOHz4szYsebNu2bVAqlRg3bpxUFhUVBWdnZ6Smpja63UOHDmH37t3429/+ZpJ6cmGueAwYMEBvr5JGowEAnDt3rtH9tnWMR9tk6PrLzs5GaGgobGxspLJRo0YBgM7vwPp07NgRAEx2OgA1TptNAOvs3bsXf/vb35CXl4dBgwZh5MiReOaZZ5CUlISqqioAdw8XrF69GmFhYVi4cCFmz56NoqIiRERE6CVj27Ztw6BBg1BQUIC33noLH3/8MTw9PRs83JCVlYU//elPGDZsGBYtWgSNRoO8vDwAdz/cYWFh+PHHHzFr1izMmjULWVlZCAsLQ0lJidFzNWQedUnhli1b9N6/efNmREREoH379gCA/Px8DBs2DDdv3sQHH3yAIUOGIDY21uhxyVV2djb8/Px0DmFYWFggMDAQ2dnZjWpTCIEZM2bgjTfegJubW5PryYk543G/K1euAPjPLzo5YjweHfWtv4qKCr3Dt3Z2dgCAM2fO6LVRVlaGS5cu4dChQ3j11VehUCgQHBzcjKOmhzLvDsjGy83NFQDEN998I4QQYsiQIaJHjx5CiLu7sAGIM2fOCCGEKC8vF+Xl5Trvz8/PFwqFQsycOVMqq66uFl26dBF+fn7ixo0bOvV///13vTEAEBYWFuLYsWM65dXV1UIIIWbPni0AiIyMDGnZwYMHBQAxd+5co+ds6Dz++7//WwAQ58+fl8p++eUXAUB88cUXUtn06dOFlZWVKCgokMrmzp0rAIjZs2cbPT658ff3FxqNRgghREREhOjVq5fQarVi7Nixws3NrVFtrlu3Tjg7O4uysjIhhGjw0K6h9eTEnPG439ixY4WDg4MoKSlpVL+PAsbj0VHf+uvTp48ICgrSqbdv3z4BQDz22GN6bQwYMEAAEACEk5OTWL58ebOPmx6sze8BrPsr0NnZWfp/hw4dANy9Ag2AdPgVAKqrq1FaWop27drBxcUFubm5UltHjx5FQUEBEhMT4eDgoNNPQ385Dh48GH379tUpqzu5OT09Hd26dcPTTz8tLXv22Wfh4+OD9PR0o+dq6DxGjhwJKysrbN68WSrbvHkzLC0tpV30wN29p6GhofDy8pLK7j1cQw+m1Wqlwx95eXkoKipCVVUVlEolKioqjG7vzp07mDVrFt5++204Ojo2uZ7cmCse91u/fj3Wr1+P999/H87Ozkb3+6hgPB4NDa2/SZMm4dixY5gzZw5ycnKwf/9+TJ06Fe3bt4dWq9VrZ8mSJdixYwfmz5+Pnj17olOnTi05DapHm08A685VsLa21vk/AFRWVgIAamtrsXjxYvTo0QO2trZwcXGBq6srrly5orMhqkuiAgICDO7f39+/wWXFxcXo0qWLXnmXLl1w4cIFg/uoY+g8OnTogPDwcL0EMCQkBC4uLlJZYWGh3vjuTQbpwZRKpfQZO378OHJycmBvbw+tVtuoK9sWLFgAIQSmTZtmknpyY6543OvkyZOYNGkSxowZg8TERKP7fJQwHm3fg9bflClT8NJLL2Hu3Lnw9fXFwIEDER0djd69e6Ndu3Z6bfXr1w9RUVH461//io8//hgxMTE4ePBgS02F6tHmE8AHEf9+zHFycjKmT5+OAQMG4JtvvsHevXuxd+9euLi4SHUaq+58upZgzDyef/55ZGZm4uLFiyguLkZmZiZGjx790D5qa2uba/iPHA8PD1y6dAkA4ODgALVaDeDuuZ8eHh5GtVVWVobk5GRMmTIFJSUlKCoqQlFREQDg1q1b0t4TQ+vJkTnica/i4mIMHz4cAQEB+Oqrr6BQKEwwq7aL8WjbHrb+rK2t8eWXX6KoqAgHDhxAXl4ePvnkE+Tn56Nz584PbPuZZ56Bu7s7Vq1a1ZxToIcx4+HnJqk7BzAtLU0IIURcXJwICwurd1nv3r1FaGiozvsrKyuFlZWViI6OlsoyMzMFAPHpp58aNAY85Fy5sLAw0a1bN73yrl27ioEDBxrUx70MnYcQQhQXFwsLCwuxYsUKsXz5cqFQKERRUZFOnT/84Q9i0KBBOmVnzpzhOYAGSkxMFEqlUty5c0cqq6mpEc7OzuLFF180qq26z+yDXkeOHDG4nhyZIx51bty4Ifr27Su6desmLl26ZLI5tWWMR9vV2PX322+/Gfz7w9nZWQwZMqQJo6SmeqT3ANaxtLSUDgvXWbVqFaqrq3XKnnjiCXh5eWHx4sV6dz1vzOXq4eHhyMnJweHDh6WygwcPIi8vD+Hh4Ua3Z+g8gLt/fQcHB2PLli3YsmULnnrqKXh6eurUGTx4MA4cOICCggKp7NtvvzV6XHI1fPhwaLVapKSkSGU7d+5EaWkpnnvuuXrf4+/vX+9pA+7u7ti2bZveCwCio6Oxbds29OjRw+B6cmSOeAB3z8cdM2YMCgsLsWvXLl6V/W+MR9tk6PoT9Rw9e++992BpaYkJEyZIZfeen15nz549KC0tfeApVNT8ZHFL9BEjRmDOnDmYOnUqgoKC8NNPP2Hr1q0658MBdxOsZcuWISYmBk8++STi4uLg5uaGQ4cO4datW9iwYYNR/b7yyitYtmwZRo0ahenTpwMAFi5cCDc3N7zyyivNNo86o0ePxl/+8hcAwAcffKC3fPr06Vi5ciUGDRqEV155BRcvXsTGjRuNHpdcDR48GCEhIUhMTMTvv/8Oa2trfPjhh+jTp0+Dh9sbug+ZnZ0dhg8fXu+yrl276iwztJ7cmCseb775Jnbv3o3ExERkZmYiMzNTWubr66tzEZicMB5tk6HrLz8/H3FxcRgxYgQcHBywefNm7N69G7NmzULPnj2l9wwaNAg9evTAkCFDoFar8fPPP2PlypXo0KGD9HuRzMTcuyAby5hDwFqtVsycOVN06tRJ2NnZibCwMHHixAnh6+urd+hUCCHS09OFRqMRKpVKqFQqERoaKnbt2qVXDwbs6j516pQYOnSosLe3F/b29mLo0KHi9OnTjZqzsfPIz8+XDo/k5OTU22ZaWpro3bu3UCqVom/fviIrK0sAEPPmzWvUGOWmtLRUTJw4UajVaqFSqURsbKwoLi5usH5dPAwFA29zYWi9R5054hEWFtbgYcm4uLjGTuWRwHi0PYauv6tXr4qoqCjh7OwslEqlCAwMFCtWrBC1tbU67X300UciODhYuLq6ChsbG+Hj4yPi4+NFfn5+C8+M7qcQoolXQdAj5eLFi+jYsSM+++wzvPzyy+YeDhERETUDWZwDSA27ffu2zs//+7//C+Du44CIiIjo0SSLcwCpYd7e3hg7diwCAwNRUFAgPc4uKCjI3EMjIiKiZsJDwDI3adIk7Nu3D7///jvUajViYmLwj3/8g0+YICIieoQxASQiIiKSGZ4DSERERCQzTACJiIiIZKbVJ4Bz5sxp8jMc165dC4VCgby8PNMMqokUCgXmzJlj7mEQERGRTLX6BNActmzZgkWLFpl7GNQGXLt2DfHx8XBycoJarca4ceMa9djAOgcPHsTAgQPh5OQEFxcXREZG6tyJHwCqqqowb948REZGwtHREQqFAunp6U2cyaPBHPFojn4fFYxH23PkyBEkJCSge/fuaNeuHfz8/DBz5ky9x6MCwHfffYe+ffvC1tYWrq6uSEhIQGlpqU6d3bt3Izo6Gp6enrC1tYWvry8SExP16pEZmPMu1IaoqqrSeZh4Y6xZs0YAELm5uQbVj4uLE97e3k3q80Fg4MOyqfULCwsTDg4O4v333xcfffSRcHZ2FkFBQaK6utrotn766SdhY2Mj+vXrJ5YuXSoWLlwo/Pz8hL29vThz5oxU79q1awKA8PHxEcHBwTpPvZE7c8TD1P0+ShiPtmfcuHHCy8tLzJw5U3zxxRdixowZQqlUiqCgIFFVVSXV27dvnwAgnnnmGbF06VLx17/+VSiVStG/f39RU1Mj1UtOThYjR44U77//vli1apWYPXu2cHFxEQEBAU3+3U5N0+oTQFNgAkjNYc+ePQKAWLt2rVS2fft2AUCkpKQY3d5rr70mlEqlKCsrk8rOnj2r92i+6upqUVBQIIQQYsOGDUwA/81c8TB1v48KxqNt+uGHH3QSPSGEWLRokQAgNm7cKJUNGjRIeHp6Cq1WK5WtXr1aABCpqakP7CM1NVUAEBs2bDDt4MkoTT4E7OnpiWnTpjW4/PXXX4eHh4f085UrVzB58mR4eHjA1tYWQUFB2LFjh977unfvDoVCIb0asn//fmkXdO/evXH48OEGz7G7fPkyYmJioFKp4Ovri9WrV+ssr+vryy+/RH5+vk7/a9eu1alr6DzS0tIQFBQEW1tb9OrVC4cOHWpwLg9z9epVJCUloVevXlCpVHB0dIRGo0FGRoZUp7y8HLa2tnjnnXf03v/OO+/AxsYG169fl8qMWX+ka9u2bVAqlRg3bpxUFhUVBWdnZ6Smphrd3qVLl2Bra6tzD0Y3Nze9epaWlvDy8mrcoB9h5oqHqft9VDAebdOAAQNgZaX7jAiNRgMAOHfunFSWnZ2N0NBQ2NjYSGWjRo0CgHp/F96rY8eOAMDD8mbW5ASwf//+OHbsWIPLjx49iv79+wO4m5yEhIRg48aNmDp1Kj755BM4OTlhxIgReucwLViwAOvWrUNMTEyDbefn52PYsGG4efMmPvjgAwwZMgSxsbEN1n/ppZfQqVMnJCcno0OHDvjzn/+sM/Z169Zh3bp1CAkJgYuLi/TzunXrEBoaKtUzdB5nzpzBsGHDUFFRgQ8//BAREREYPXp0g+N7mJycHKxevRphYWFYuHAhZs+ejaKiIkRERODs2bMAICWFW7Zs0Xv/5s2bERERgfbt2zdq/ZGu7Oxs+Pn5wdbWViqzsLBAYGAgsrOzjW4vLCwMZWVlSEpKQk5ODs6ePYvExES4uroiPj7ehCN/NJkrHqbu91HBeDw6rly5AuA/iRsAVFRU6KxjALCzswNw93ff/crKynDp0iUcOnQIr776KhQKBYKDg5tx1PRQTd2FOH/+fNGuXTvp3Irr16+L69evCyGEqKmpEQ4ODuLvf/+7EEKId955R1hbW4vs7Gzp/TU1NSIwMFCEh4fX2/7s2bNFQ8OcPn26sLKykg6HCSHE3Llz9Q6x1h0CTkpKksoKCgqEQqEQc+fO1Wv3YYeADZ1HfHy8sLGxEcXFxVLZrFmzGn0IuLy8XJSXl+uU5efnC4VCIWbOnCmV/fd//7cAIM6fPy+V/fLLLwKA+OKLL6QyQ9cf1c/f319oNBohhBARERGiV69eQqvVirFjxwo3Nzej26uqqhJTpkwRlpaWAoAAIHr27Cl+/fXXBt/DQ8D/Ya54mLrfRwXj8egYO3ascHBwECUlJVJZnz59RFBQkE69uvMCH3vsMb02BgwYIMXNyclJLF++vNnHTQ9mkj2At2/flvZAaTQaDB48GADwyy+/4ObNm9IewE2bNqFfv37w8PBASUkJSkpKcPXqVQQHByMjIwM1NTVG9b13716EhobqHA67d7f//e7dm+jl5QUXFxcUFRUZ1acx80hPT0doaKjOIfAXX3zR6P7qqFQqqFQqAEB1dTVKS0vRrl07uLi4IDc3V6o3cuRIWFlZYfPmzVLZ5s2bYWlpKe2iB4xff6RLq9VKhz/y8vJQVFSEqqoqKJVKVFRUGN2elZUV/Pz8MH78eHz77bdYs2YNFAoFRo4cySvmDGCueJi630cF4/FoWL9+PdavX4/3338fzs7OUvmkSZNw7NgxzJkzBzk5Odi/fz+mTp2K9u3bQ6vV6rWzZMkS7NixA/Pnz0fPnj3RqVOnlpwG1cPq4VUerF+/frCwsMCxY8fg5eUl7fotLy/HsWPHoFAo0K9fPwDAb7/9Bq1WC1dX13rbKi8vh5OTk8F9FxYWSm3XedC5UfcmYgDQrl07VFZWGtxfHUPn8fvvvyM8PFxnWZcuXYzur05tbS2WLFmCpUuXIjc3VydhvnfD1qFDB4SHh2Pz5s2YOXMmgLsJYN2h7TrGrj/SpVQqpc/P8ePHUVNTA3t7e2i1Wr1DI4aYP38+VqxYgfPnz0u/wCIiItC9e3csWLAAH3zwgUnH/6gxVzxM3e+jgvFo+06ePIlJkyZhzJgxSExM1Fk2ZcoUHDlyBHPnzsXcuXOhUCgwffp0HDt2DFevXtVrq+53TVRUFEJCQhAaGor09HSEhIS0yFxIX5MTQJVKBX9/fxw7dgwdOnTAU089BSEEDhw4gGPHjsHPz08650yhUGDIkCFISkqqty0HB4emDge1tbUNLrOwMM1tDw2dh6k3NsnJyZg1axZefPFF/P3vf5f+GpswYQLEfY90fv755/Hqq6/i4sWLEEIgMzMTn3766UP7eND6I10eHh64dOkSAN3P7uXLl/X+2DDEypUr9U6q9vLyQkBAgM6FPlQ/c8XD1P0+KhiPtq24uBjDhw9HQEAAvvrqK72LMa2trfHll1/igw8+QE5ODry9vdGlSxf4+PggICDggW0/88wzcHd3x6pVq5gAmlGTE0DgPxeCWFlZISIiAsDdw5/Hjh2TDv8CQLdu3XDnzh3piqKm8vLyQkFBgU5ZYw7p3u9hTx4xdB5dunTRG8/94zVGSkoKQkND8fXXX0tlVVVVOlf11omJicGrr76KrVu3Ssnh/RfUNNf6k4vAwECsXLlS52To2tpaZGdnY+jQoUa3d+HChXpPg6ipqcGtW7eaPN5HnbniYep+HxWMR9t18+ZNREdHw9raGtu3b5cu7qiPp6cnPD09Ady9UDEvLw9xcXEP7aOyslJK1Mk8TLJLbMCAATh+/DjS0tIQEREBjUaDffv24aeffsKAAQOkejExMTh48GC9ezMKCwuN7nfw4ME4cOCAThLz7bffNm4S91CpVCgpKUF1dXW9yw2dR0REBA4cOICLFy9KZd98802jx2VpaQlra2udslWrVtU7Tg8PDwQHB2PLli3YsmULnnrqKelLWqe51p9cDB8+HFqtFikpKVLZzp07UVpaiueee67e9/j7+8Pf37/eZT4+Pti3bx9u3rwplf322284e/YsAgMDTTv4R5C54tGYfuWA8WibqqurMWbMGBQWFmLXrl313moHgN5RJwB47733YGlpiQkTJkhl956fXmfPnj0oLS1tMNbUQkxxJcnRo0cFANG+fXtRXV0tampqhJOTkwAgsrKypHplZWWiZ8+ews7OTkyfPl18/vnn4t133xXBwcFi6NChUr0TJ06IdevWiXXr1omYmBgBQPp58+bNUr28vDzRrl074evrKxYsWCBmzpwpunXr1uBVwPffCNrb21vExcXpzeef//ynACD+9Kc/ia1bt4qdO3eKoqIio+eRk5Mj7OzsREBAgFi0aJGYPn26cHd3b/RVtnPmzBEAxJQpU8Tnn38upk6dKjp27ChcXFxEdHS0Xv2FCxcKGxsbYWNjIz7++GO95YauP6pfbW2tCAkJESqVSnzwwQfiH//4h3B2dhZ9+vTRu5FqHfz7Krj6rFy5UgAQvXv3FosXLxbJycnCy8tL2NnZ6VxxLoQQS5YsEfPmzRPjx48XAERCQoKYN2+eWLJkicnn2VaYKx6N6VcOGI+26bXXXhMARGJiovR7t+6VkZEh1cvNzRWhoaHi448/FitWrBBDhgwRAMSsWbN02uvatasYPHiw+Pjjj8UXX3whXn/9dWFnZyc6dOhg8MMZqHmYJAGsqqoSdnZ2YsSIEVJZTEyMUCqVOncJF0KIkpISMW3aNNG5c2dhY2MjvLy8RGxsrNi7d69Up+7WL/W97r89S1pamujdu7dQKpWib9++IisrS+/O8MYmgDU1NeLNN98U7u7uQqFQCABizZo1Rs+jbnx9+vQRSqVS9OrVS/zrX/9qdIKl1WrFzJkzRadOnYSdnZ0ICwsTJ06cEL6+vvUmgPn5+dJ6y8nJqbdNQ9YfNay0tFRMnDhRqNVqoVKpRGxsrM5tf+73oF9wQgixadMm8dRTTwlHR0dhb28vNBqNyMzM1Kvn7e1t0PdDbswVD2P7lQvGo+0JCwtr8Pfvvb8vr169KqKiooSzs7NQKpUiMDBQrFixQtTW1uq099FHH4ng4GDh6uoqbGxshI+Pj4iPjxf5+fktPDO6n0KIevbjtmEXL15Ex44d8dlnn+Hll18293DaHK4/IiKiR59pLos1o9u3b+v8/L//+78AoHPuITWM64+IiEh+THIVsDl5e3tj7NixCAwMREFBARYtWgSNRoOgoCBzD61N4PojIiKSnzZ/CHjSpEnYt28ffv/9d6jVasTExOAf//iHzgPDqWFcf0RERPLT5hNAIiIiIjJOmz8HkIiIiIiMwwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDP/H1qEzQA4xzGwAAAAAElFTkSuQmCC",
670
+ "text/plain": [
671
+ "<Figure size 800x600 with 1 Axes>"
672
+ ]
673
+ },
674
+ "metadata": {},
675
+ "output_type": "display_data"
676
  }
677
  ],
678
  "source": [
679
+ "accuracy = accuracy_score(y_test, y_pred)\n",
680
+ "f1 = f1_score(y_test, y_pred, average=\"weighted\")\n",
681
+ "report = classification_report(y_test, y_pred)\n",
682
+ "\n",
683
+ "print(f\"Accuracy: {accuracy:.4f}\")\n",
684
+ "print(\"Classification Report:\\n\", classification_report(y_test, y_pred))\n",
685
+ "\n",
686
+ "text_output = f\"Accuracy: {accuracy:.4f}\\nF1 Score: {f1:.4f}\\n\\nClassification Report:\\n{report}\"\n",
687
+ "\n",
688
+ "plt.figure(figsize=(8, 6))\n",
689
+ "plt.text(0.01, 0.99, text_output, fontsize=12, ha='left', va='top', family=\"monospace\")\n",
690
+ "plt.axis(\"off\")\n",
691
+ "\n",
692
+ "plt.savefig(\"classification_report.png\", bbox_inches=\"tight\", dpi=300)\n",
693
+ "plt.show()"
694
  ]
695
  },
696
  {
697
  "cell_type": "code",
698
+ "execution_count": 74,
699
  "metadata": {},
700
  "outputs": [
701
  {
 
715
  "y_test_labels = [reverse_mapping[val] for val in y_test]\n",
716
  "y_pred_labels = [reverse_mapping[val] for val in y_pred]\n",
717
  "\n",
 
718
  "plt.figure(figsize=(8, 6))\n",
719
  "sns.scatterplot(x=range(len(y_test)), y=y_test_labels, label='Actual', color='blue')\n",
720
  "sns.scatterplot(x=range(len(y_pred)), y=y_pred_labels, label='Predicted', color='red')\n",
 
723
  "plt.ylabel(\"Weather Condition\")\n",
724
  "plt.title(\"Actual vs Predicted Weather Conditions\")\n",
725
  "plt.legend()\n",
726
+ "plt.savefig(\"weather_predictions.png\")\n",
727
  "plt.show()\n"
728
  ]
729
  },
730
  {
731
  "cell_type": "code",
732
+ "execution_count": 75,
733
  "metadata": {},
734
  "outputs": [
735
  {
 
745
  "joblib.dump(model, \"weather_model.pkl\")\n",
746
  "print(\"Model saved successfully!\")"
747
  ]
 
 
 
 
 
 
 
748
  }
749
  ],
750
  "metadata": {
weather_predictions.png ADDED