Spaces:
Sleeping
Sleeping
version 2
Browse files- .gitignore +1 -0
- __pycache__/main_agent.cpython-313.pyc +0 -0
- __pycache__/prompts_lib.cpython-313.pyc +0 -0
- __pycache__/tools.cpython-313.pyc +0 -0
- app.py +101 -52
- app_.py +205 -0
- main_agent.py +14 -5
- requirements.txt +0 -0
- test.ipynb +63 -57
- test_app.ipynb +157 -0
- test_app2.ipynb +47 -0
- tools.py +63 -3
- tools_test.ipynb +142 -43
.gitignore
CHANGED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
cca530fc-4052-43b2-b130-b30968d8aa44.png
|
__pycache__/main_agent.cpython-313.pyc
CHANGED
|
Binary files a/__pycache__/main_agent.cpython-313.pyc and b/__pycache__/main_agent.cpython-313.pyc differ
|
|
|
__pycache__/prompts_lib.cpython-313.pyc
CHANGED
|
Binary files a/__pycache__/prompts_lib.cpython-313.pyc and b/__pycache__/prompts_lib.cpython-313.pyc differ
|
|
|
__pycache__/tools.cpython-313.pyc
CHANGED
|
Binary files a/__pycache__/tools.cpython-313.pyc and b/__pycache__/tools.cpython-313.pyc differ
|
|
|
app.py
CHANGED
|
@@ -1,44 +1,41 @@
|
|
|
|
|
| 1 |
import os
|
|
|
|
|
|
|
|
|
|
| 2 |
import gradio as gr
|
| 3 |
-
import requests
|
| 4 |
-
import inspect
|
| 5 |
import pandas as pd
|
|
|
|
| 6 |
|
| 7 |
-
import
|
| 8 |
-
import main_agent
|
| 9 |
|
| 10 |
# (Keep Constants as is)
|
| 11 |
# --- Constants ---
|
| 12 |
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
|
| 13 |
|
|
|
|
| 14 |
# --- Basic Agent Definition ---
|
| 15 |
# ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
|
| 16 |
-
class BasicAgent:
|
| 17 |
-
def __init__(self):
|
| 18 |
-
pass
|
| 19 |
-
def __call__(self, question: str) -> str:
|
| 20 |
-
print(f"Agent received question (first 50 chars): {question[:50]}...")
|
| 21 |
-
|
| 22 |
-
message = prompts_lib.system_prompt2 + question
|
| 23 |
|
| 24 |
-
response = main_agent.agent.invoke({'messages': message})
|
| 25 |
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
return answer
|
| 31 |
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
Fetches all questions, runs the BasicAgent on them, submits all answers,
|
| 35 |
-
and displays the results.
|
| 36 |
"""
|
| 37 |
# --- Determine HF Space Runtime URL and Repo URL ---
|
| 38 |
space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
|
|
|
|
| 39 |
|
| 40 |
if profile:
|
| 41 |
-
username= f"{profile.username}"
|
| 42 |
print(f"User logged in: {username}")
|
| 43 |
else:
|
| 44 |
print("User not logged in.")
|
|
@@ -47,14 +44,15 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
|
|
| 47 |
api_url = DEFAULT_API_URL
|
| 48 |
questions_url = f"{api_url}/questions"
|
| 49 |
submit_url = f"{api_url}/submit"
|
|
|
|
| 50 |
|
| 51 |
# 1. Instantiate Agent ( modify this part to create your agent)
|
| 52 |
try:
|
| 53 |
-
agent =
|
| 54 |
except Exception as e:
|
| 55 |
print(f"Error instantiating agent: {e}")
|
| 56 |
return f"Error initializing agent: {e}", None
|
| 57 |
-
# In the case of an app running as a hugging Face space, this link points toward your codebase (
|
| 58 |
agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
|
| 59 |
print(agent_code)
|
| 60 |
|
|
@@ -65,16 +63,16 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
|
|
| 65 |
response.raise_for_status()
|
| 66 |
questions_data = response.json()
|
| 67 |
if not questions_data:
|
| 68 |
-
|
| 69 |
-
|
| 70 |
print(f"Fetched {len(questions_data)} questions.")
|
| 71 |
except requests.exceptions.RequestException as e:
|
| 72 |
print(f"Error fetching questions: {e}")
|
| 73 |
return f"Error fetching questions: {e}", None
|
| 74 |
except requests.exceptions.JSONDecodeError as e:
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
except Exception as e:
|
| 79 |
print(f"An unexpected error occurred fetching questions: {e}")
|
| 80 |
return f"An unexpected error occurred fetching questions: {e}", None
|
|
@@ -90,19 +88,70 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
|
|
| 90 |
print(f"Skipping item with missing task_id or question: {item}")
|
| 91 |
continue
|
| 92 |
try:
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
except Exception as e:
|
| 97 |
-
|
| 98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
|
| 100 |
if not answers_payload:
|
| 101 |
print("Agent did not produce any answers to submit.")
|
| 102 |
return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
|
| 103 |
|
| 104 |
-
# 4. Prepare Submission
|
| 105 |
-
submission_data = {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 106 |
status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
|
| 107 |
print(status_update)
|
| 108 |
|
|
@@ -157,14 +206,12 @@ with gr.Blocks() as demo:
|
|
| 157 |
"""
|
| 158 |
**Instructions:**
|
| 159 |
|
| 160 |
-
1.
|
| 161 |
-
2.
|
| 162 |
-
3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
|
| 163 |
|
| 164 |
---
|
| 165 |
**Disclaimers:**
|
| 166 |
-
Once clicking on the "submit button, it can take quite some time (
|
| 167 |
-
This space provides a basic setup and is intentionally sub-optimal to encourage you to develop your own, more robust solution. For instance for the delay process of the submit button, a solution could be to cache the answers and submit in a seperate action or even to answer the questions in async.
|
| 168 |
"""
|
| 169 |
)
|
| 170 |
|
|
@@ -172,20 +219,18 @@ with gr.Blocks() as demo:
|
|
| 172 |
|
| 173 |
run_button = gr.Button("Run Evaluation & Submit All Answers")
|
| 174 |
|
| 175 |
-
status_output = gr.Textbox(
|
| 176 |
-
|
|
|
|
| 177 |
results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
|
| 178 |
|
| 179 |
-
run_button.click(
|
| 180 |
-
fn=run_and_submit_all,
|
| 181 |
-
outputs=[status_output, results_table]
|
| 182 |
-
)
|
| 183 |
|
| 184 |
if __name__ == "__main__":
|
| 185 |
-
print("\n" + "-"*30 + " App Starting " + "-"*30)
|
| 186 |
# Check for SPACE_HOST and SPACE_ID at startup for information
|
| 187 |
space_host_startup = os.getenv("SPACE_HOST")
|
| 188 |
-
space_id_startup = os.getenv("SPACE_ID")
|
| 189 |
|
| 190 |
if space_host_startup:
|
| 191 |
print(f"✅ SPACE_HOST found: {space_host_startup}")
|
|
@@ -193,14 +238,18 @@ if __name__ == "__main__":
|
|
| 193 |
else:
|
| 194 |
print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
|
| 195 |
|
| 196 |
-
if space_id_startup:
|
| 197 |
print(f"✅ SPACE_ID found: {space_id_startup}")
|
| 198 |
print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
|
| 199 |
-
print(
|
|
|
|
|
|
|
| 200 |
else:
|
| 201 |
-
print(
|
|
|
|
|
|
|
| 202 |
|
| 203 |
-
print("-"*(60 + len(" App Starting ")) + "\n")
|
| 204 |
|
| 205 |
print("Launching Gradio Interface for Basic Agent Evaluation...")
|
| 206 |
demo.launch(debug=True, share=False)
|
|
|
|
| 1 |
+
import inspect
|
| 2 |
import os
|
| 3 |
+
import tempfile
|
| 4 |
+
from typing import Any, Optional, Tuple
|
| 5 |
+
|
| 6 |
import gradio as gr
|
|
|
|
|
|
|
| 7 |
import pandas as pd
|
| 8 |
+
import requests
|
| 9 |
|
| 10 |
+
from main_agent import Agent
|
|
|
|
| 11 |
|
| 12 |
# (Keep Constants as is)
|
| 13 |
# --- Constants ---
|
| 14 |
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
|
| 15 |
|
| 16 |
+
|
| 17 |
# --- Basic Agent Definition ---
|
| 18 |
# ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
|
|
|
|
| 20 |
|
| 21 |
+
def run_and_submit_all(
|
| 22 |
+
profile: Optional[gr.OAuthProfile],
|
| 23 |
+
) -> Tuple[str, Optional[pd.DataFrame]]:
|
| 24 |
+
"""
|
| 25 |
+
Fetches all questions, runs the Agent on them, submits all answers, and displays the results.
|
| 26 |
|
| 27 |
+
Args:
|
| 28 |
+
profile (Optional[gr.OAuthProfile]): The OAuth profile of the user.
|
|
|
|
| 29 |
|
| 30 |
+
Returns:
|
| 31 |
+
Tuple[str, Optional[pd.DataFrame]]: Status message and DataFrame of results.
|
|
|
|
|
|
|
| 32 |
"""
|
| 33 |
# --- Determine HF Space Runtime URL and Repo URL ---
|
| 34 |
space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
|
| 35 |
+
|
| 36 |
|
| 37 |
if profile:
|
| 38 |
+
username = f"{profile.username}"
|
| 39 |
print(f"User logged in: {username}")
|
| 40 |
else:
|
| 41 |
print("User not logged in.")
|
|
|
|
| 44 |
api_url = DEFAULT_API_URL
|
| 45 |
questions_url = f"{api_url}/questions"
|
| 46 |
submit_url = f"{api_url}/submit"
|
| 47 |
+
files_url = f"{api_url}/files"
|
| 48 |
|
| 49 |
# 1. Instantiate Agent ( modify this part to create your agent)
|
| 50 |
try:
|
| 51 |
+
agent = Agent()
|
| 52 |
except Exception as e:
|
| 53 |
print(f"Error instantiating agent: {e}")
|
| 54 |
return f"Error initializing agent: {e}", None
|
| 55 |
+
# In the case of an app running as a hugging Face space, this link points toward your codebase (usefull for others so please keep it public)
|
| 56 |
agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
|
| 57 |
print(agent_code)
|
| 58 |
|
|
|
|
| 63 |
response.raise_for_status()
|
| 64 |
questions_data = response.json()
|
| 65 |
if not questions_data:
|
| 66 |
+
print("Fetched questions list is empty.")
|
| 67 |
+
return "Fetched questions list is empty or invalid format.", None
|
| 68 |
print(f"Fetched {len(questions_data)} questions.")
|
| 69 |
except requests.exceptions.RequestException as e:
|
| 70 |
print(f"Error fetching questions: {e}")
|
| 71 |
return f"Error fetching questions: {e}", None
|
| 72 |
except requests.exceptions.JSONDecodeError as e:
|
| 73 |
+
print(f"Error decoding JSON response from questions endpoint: {e}")
|
| 74 |
+
print(f"Response text: {response.text[:500]}")
|
| 75 |
+
return f"Error decoding server response for questions: {e}", None
|
| 76 |
except Exception as e:
|
| 77 |
print(f"An unexpected error occurred fetching questions: {e}")
|
| 78 |
return f"An unexpected error occurred fetching questions: {e}", None
|
|
|
|
| 88 |
print(f"Skipping item with missing task_id or question: {item}")
|
| 89 |
continue
|
| 90 |
try:
|
| 91 |
+
file_path: Optional[str] = None
|
| 92 |
+
try:
|
| 93 |
+
file_response = requests.get(f"{files_url}/{task_id}", timeout=15)
|
| 94 |
+
if file_response.status_code == 200 and file_response.content:
|
| 95 |
+
# Get filename from Content-Disposition header or URL
|
| 96 |
+
filename = None
|
| 97 |
+
content_disposition = file_response.headers.get(
|
| 98 |
+
"Content-Disposition"
|
| 99 |
+
)
|
| 100 |
+
if content_disposition and "filename=" in content_disposition:
|
| 101 |
+
filename = content_disposition.split("filename=")[-1].strip('"')
|
| 102 |
+
else:
|
| 103 |
+
# Try to get filename from URL
|
| 104 |
+
url = file_response.url
|
| 105 |
+
filename = url.split("/")[-1]
|
| 106 |
+
if not filename or filename == str(task_id):
|
| 107 |
+
filename = f"file_{task_id}"
|
| 108 |
+
|
| 109 |
+
# Create temp directory and save file with original name
|
| 110 |
+
temp_dir = tempfile.mkdtemp()
|
| 111 |
+
file_path = os.path.join(temp_dir, filename)
|
| 112 |
+
with open(file_path, "wb") as f:
|
| 113 |
+
f.write(file_response.content)
|
| 114 |
+
print(f"Downloaded file for task {task_id} to {file_path}")
|
| 115 |
+
else:
|
| 116 |
+
print(f"No file for task {task_id} or file is empty.")
|
| 117 |
+
except Exception as e:
|
| 118 |
+
print(f"Error downloading file for task {task_id}: {e}")
|
| 119 |
+
file_path = None
|
| 120 |
+
|
| 121 |
+
submitted_answer = agent.builder.invoke(
|
| 122 |
+
input={'messages': question_text,
|
| 123 |
+
'file_path': file_path}
|
| 124 |
+
)
|
| 125 |
+
answers_payload.append(
|
| 126 |
+
{"task_id": task_id, "submitted_answer": submitted_answer}
|
| 127 |
+
)
|
| 128 |
+
results_log.append(
|
| 129 |
+
{
|
| 130 |
+
"Task ID": task_id,
|
| 131 |
+
"Question": question_text,
|
| 132 |
+
"Submitted Answer": submitted_answer,
|
| 133 |
+
}
|
| 134 |
+
)
|
| 135 |
except Exception as e:
|
| 136 |
+
print(f"Error running agent on task {task_id}: {e}")
|
| 137 |
+
results_log.append(
|
| 138 |
+
{
|
| 139 |
+
"Task ID": task_id,
|
| 140 |
+
"Question": question_text,
|
| 141 |
+
"Submitted Answer": f"AGENT ERROR: {e}",
|
| 142 |
+
}
|
| 143 |
+
)
|
| 144 |
|
| 145 |
if not answers_payload:
|
| 146 |
print("Agent did not produce any answers to submit.")
|
| 147 |
return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
|
| 148 |
|
| 149 |
+
# 4. Prepare Submission
|
| 150 |
+
submission_data = {
|
| 151 |
+
"username": username.strip(),
|
| 152 |
+
"agent_code": agent_code,
|
| 153 |
+
"answers": answers_payload,
|
| 154 |
+
}
|
| 155 |
status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
|
| 156 |
print(status_update)
|
| 157 |
|
|
|
|
| 206 |
"""
|
| 207 |
**Instructions:**
|
| 208 |
|
| 209 |
+
1. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
|
| 210 |
+
2. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
|
|
|
|
| 211 |
|
| 212 |
---
|
| 213 |
**Disclaimers:**
|
| 214 |
+
Once clicking on the "submit button, it can take quite some time (this is the time for the agent to go through all the questions).
|
|
|
|
| 215 |
"""
|
| 216 |
)
|
| 217 |
|
|
|
|
| 219 |
|
| 220 |
run_button = gr.Button("Run Evaluation & Submit All Answers")
|
| 221 |
|
| 222 |
+
status_output = gr.Textbox(
|
| 223 |
+
label="Run Status / Submission Result", lines=5, interactive=False
|
| 224 |
+
)
|
| 225 |
results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
|
| 226 |
|
| 227 |
+
run_button.click(fn=run_and_submit_all, outputs=[status_output, results_table])
|
|
|
|
|
|
|
|
|
|
| 228 |
|
| 229 |
if __name__ == "__main__":
|
| 230 |
+
print("\n" + "-" * 30 + " App Starting " + "-" * 30)
|
| 231 |
# Check for SPACE_HOST and SPACE_ID at startup for information
|
| 232 |
space_host_startup = os.getenv("SPACE_HOST")
|
| 233 |
+
space_id_startup = os.getenv("SPACE_ID")
|
| 234 |
|
| 235 |
if space_host_startup:
|
| 236 |
print(f"✅ SPACE_HOST found: {space_host_startup}")
|
|
|
|
| 238 |
else:
|
| 239 |
print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
|
| 240 |
|
| 241 |
+
if space_id_startup: # Print repo URLs if SPACE_ID is found
|
| 242 |
print(f"✅ SPACE_ID found: {space_id_startup}")
|
| 243 |
print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
|
| 244 |
+
print(
|
| 245 |
+
f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main"
|
| 246 |
+
)
|
| 247 |
else:
|
| 248 |
+
print(
|
| 249 |
+
"ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined."
|
| 250 |
+
)
|
| 251 |
|
| 252 |
+
print("-" * (60 + len(" App Starting ")) + "\n")
|
| 253 |
|
| 254 |
print("Launching Gradio Interface for Basic Agent Evaluation...")
|
| 255 |
demo.launch(debug=True, share=False)
|
app_.py
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import requests
|
| 4 |
+
import inspect
|
| 5 |
+
import pandas as pd
|
| 6 |
+
|
| 7 |
+
import prompts_lib
|
| 8 |
+
import main_agent
|
| 9 |
+
|
| 10 |
+
# (Keep Constants as is)
|
| 11 |
+
# --- Constants ---
|
| 12 |
+
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
|
| 13 |
+
|
| 14 |
+
# --- Basic Agent Definition ---
|
| 15 |
+
# ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
|
| 16 |
+
class BasicAgent:
|
| 17 |
+
def __init__(self):
|
| 18 |
+
pass
|
| 19 |
+
def __call__(self, question: str) -> str:
|
| 20 |
+
print(f"Agent received question (first 50 chars): {question[:50]}...")
|
| 21 |
+
|
| 22 |
+
response = main_agent.agent.invoke({'messages': question})
|
| 23 |
+
|
| 24 |
+
answer = response.get('messages')[-1].content
|
| 25 |
+
|
| 26 |
+
# fixed_answer = "This is a default answer."
|
| 27 |
+
print(f"Agent returning answer: {answer}")
|
| 28 |
+
return answer
|
| 29 |
+
|
| 30 |
+
def run_and_submit_all( profile: gr.OAuthProfile | None):
|
| 31 |
+
"""
|
| 32 |
+
Fetches all questions, runs the BasicAgent on them, submits all answers,
|
| 33 |
+
and displays the results.
|
| 34 |
+
"""
|
| 35 |
+
# --- Determine HF Space Runtime URL and Repo URL ---
|
| 36 |
+
space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
|
| 37 |
+
|
| 38 |
+
if profile:
|
| 39 |
+
username= f"{profile.username}"
|
| 40 |
+
print(f"User logged in: {username}")
|
| 41 |
+
else:
|
| 42 |
+
print("User not logged in.")
|
| 43 |
+
return "Please Login to Hugging Face with the button.", None
|
| 44 |
+
|
| 45 |
+
api_url = DEFAULT_API_URL
|
| 46 |
+
questions_url = f"{api_url}/questions"
|
| 47 |
+
file_url = f"{api_url}/file_name"
|
| 48 |
+
submit_url = f"{api_url}/submit"
|
| 49 |
+
|
| 50 |
+
# 1. Instantiate Agent ( modify this part to create your agent)
|
| 51 |
+
try:
|
| 52 |
+
agent = BasicAgent()
|
| 53 |
+
except Exception as e:
|
| 54 |
+
print(f"Error instantiating agent: {e}")
|
| 55 |
+
return f"Error initializing agent: {e}", None
|
| 56 |
+
# In the case of an app running as a hugging Face space, this link points toward your codebase ( usefull for others so please keep it public)
|
| 57 |
+
agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
|
| 58 |
+
print(agent_code)
|
| 59 |
+
|
| 60 |
+
# 2. Fetch Questions
|
| 61 |
+
print(f"Fetching questions from: {questions_url}")
|
| 62 |
+
try:
|
| 63 |
+
response = requests.get(questions_url, timeout=15)
|
| 64 |
+
response.raise_for_status()
|
| 65 |
+
questions_data = response.json()
|
| 66 |
+
if not questions_data:
|
| 67 |
+
print("Fetched questions list is empty.")
|
| 68 |
+
return "Fetched questions list is empty or invalid format.", None
|
| 69 |
+
print(f"Fetched {len(questions_data)} questions.")
|
| 70 |
+
except requests.exceptions.RequestException as e:
|
| 71 |
+
print(f"Error fetching questions: {e}")
|
| 72 |
+
return f"Error fetching questions: {e}", None
|
| 73 |
+
except requests.exceptions.JSONDecodeError as e:
|
| 74 |
+
print(f"Error decoding JSON response from questions endpoint: {e}")
|
| 75 |
+
print(f"Response text: {response.text[:500]}")
|
| 76 |
+
return f"Error decoding server response for questions: {e}", None
|
| 77 |
+
except Exception as e:
|
| 78 |
+
print(f"An unexpected error occurred fetching questions: {e}")
|
| 79 |
+
return f"An unexpected error occurred fetching questions: {e}", None
|
| 80 |
+
|
| 81 |
+
# 3. Run your Agent
|
| 82 |
+
results_log = []
|
| 83 |
+
answers_payload = []
|
| 84 |
+
print(f"Running agent on {len(questions_data)} questions...")
|
| 85 |
+
for item in questions_data:
|
| 86 |
+
task_id = item.get("task_id")
|
| 87 |
+
question_text = item.get("question")
|
| 88 |
+
if not task_id or question_text is None:
|
| 89 |
+
print(f"Skipping item with missing task_id or question: {item}")
|
| 90 |
+
continue
|
| 91 |
+
try:
|
| 92 |
+
submitted_answer = agent(question_text)
|
| 93 |
+
answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
|
| 94 |
+
results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
|
| 95 |
+
except Exception as e:
|
| 96 |
+
print(f"Error running agent on task {task_id}: {e}")
|
| 97 |
+
results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
|
| 98 |
+
|
| 99 |
+
if not answers_payload:
|
| 100 |
+
print("Agent did not produce any answers to submit.")
|
| 101 |
+
return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
|
| 102 |
+
|
| 103 |
+
# 4. Prepare Submission
|
| 104 |
+
submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
|
| 105 |
+
status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
|
| 106 |
+
print(status_update)
|
| 107 |
+
|
| 108 |
+
# 5. Submit
|
| 109 |
+
print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
|
| 110 |
+
try:
|
| 111 |
+
response = requests.post(submit_url, json=submission_data, timeout=60)
|
| 112 |
+
response.raise_for_status()
|
| 113 |
+
result_data = response.json()
|
| 114 |
+
final_status = (
|
| 115 |
+
f"Submission Successful!\n"
|
| 116 |
+
f"User: {result_data.get('username')}\n"
|
| 117 |
+
f"Overall Score: {result_data.get('score', 'N/A')}% "
|
| 118 |
+
f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
|
| 119 |
+
f"Message: {result_data.get('message', 'No message received.')}"
|
| 120 |
+
)
|
| 121 |
+
print("Submission successful.")
|
| 122 |
+
results_df = pd.DataFrame(results_log)
|
| 123 |
+
return final_status, results_df
|
| 124 |
+
except requests.exceptions.HTTPError as e:
|
| 125 |
+
error_detail = f"Server responded with status {e.response.status_code}."
|
| 126 |
+
try:
|
| 127 |
+
error_json = e.response.json()
|
| 128 |
+
error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
|
| 129 |
+
except requests.exceptions.JSONDecodeError:
|
| 130 |
+
error_detail += f" Response: {e.response.text[:500]}"
|
| 131 |
+
status_message = f"Submission Failed: {error_detail}"
|
| 132 |
+
print(status_message)
|
| 133 |
+
results_df = pd.DataFrame(results_log)
|
| 134 |
+
return status_message, results_df
|
| 135 |
+
except requests.exceptions.Timeout:
|
| 136 |
+
status_message = "Submission Failed: The request timed out."
|
| 137 |
+
print(status_message)
|
| 138 |
+
results_df = pd.DataFrame(results_log)
|
| 139 |
+
return status_message, results_df
|
| 140 |
+
except requests.exceptions.RequestException as e:
|
| 141 |
+
status_message = f"Submission Failed: Network error - {e}"
|
| 142 |
+
print(status_message)
|
| 143 |
+
results_df = pd.DataFrame(results_log)
|
| 144 |
+
return status_message, results_df
|
| 145 |
+
except Exception as e:
|
| 146 |
+
status_message = f"An unexpected error occurred during submission: {e}"
|
| 147 |
+
print(status_message)
|
| 148 |
+
results_df = pd.DataFrame(results_log)
|
| 149 |
+
return status_message, results_df
|
| 150 |
+
|
| 151 |
+
|
| 152 |
+
# --- Build Gradio Interface using Blocks ---
|
| 153 |
+
with gr.Blocks() as demo:
|
| 154 |
+
gr.Markdown("# Basic Agent Evaluation Runner")
|
| 155 |
+
gr.Markdown(
|
| 156 |
+
"""
|
| 157 |
+
**Instructions:**
|
| 158 |
+
|
| 159 |
+
1. Please clone this space, then modify the code to define your agent's logic, the tools, the necessary packages, etc ...
|
| 160 |
+
2. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
|
| 161 |
+
3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
|
| 162 |
+
|
| 163 |
+
---
|
| 164 |
+
**Disclaimers:**
|
| 165 |
+
Once clicking on the "submit button, it can take quite some time ( this is the time for the agent to go through all the questions).
|
| 166 |
+
This space provides a basic setup and is intentionally sub-optimal to encourage you to develop your own, more robust solution. For instance for the delay process of the submit button, a solution could be to cache the answers and submit in a seperate action or even to answer the questions in async.
|
| 167 |
+
"""
|
| 168 |
+
)
|
| 169 |
+
|
| 170 |
+
gr.LoginButton()
|
| 171 |
+
|
| 172 |
+
run_button = gr.Button("Run Evaluation & Submit All Answers")
|
| 173 |
+
|
| 174 |
+
status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
|
| 175 |
+
# Removed max_rows=10 from DataFrame constructor
|
| 176 |
+
results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
|
| 177 |
+
|
| 178 |
+
run_button.click(
|
| 179 |
+
fn=run_and_submit_all,
|
| 180 |
+
outputs=[status_output, results_table]
|
| 181 |
+
)
|
| 182 |
+
|
| 183 |
+
if __name__ == "__main__":
|
| 184 |
+
print("\n" + "-"*30 + " App Starting " + "-"*30)
|
| 185 |
+
# Check for SPACE_HOST and SPACE_ID at startup for information
|
| 186 |
+
space_host_startup = os.getenv("SPACE_HOST")
|
| 187 |
+
space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
|
| 188 |
+
|
| 189 |
+
if space_host_startup:
|
| 190 |
+
print(f"✅ SPACE_HOST found: {space_host_startup}")
|
| 191 |
+
print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
|
| 192 |
+
else:
|
| 193 |
+
print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
|
| 194 |
+
|
| 195 |
+
if space_id_startup: # Print repo URLs if SPACE_ID is found
|
| 196 |
+
print(f"✅ SPACE_ID found: {space_id_startup}")
|
| 197 |
+
print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
|
| 198 |
+
print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
|
| 199 |
+
else:
|
| 200 |
+
print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
|
| 201 |
+
|
| 202 |
+
print("-"*(60 + len(" App Starting ")) + "\n")
|
| 203 |
+
|
| 204 |
+
print("Launching Gradio Interface for Basic Agent Evaluation...")
|
| 205 |
+
demo.launch(debug=True, share=False)
|
main_agent.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
| 1 |
# imports
|
| 2 |
-
from typing import TypedDict, Annotated
|
| 3 |
from langgraph.graph.message import add_messages
|
| 4 |
from langchain_core.messages import AnyMessage, SystemMessage
|
| 5 |
from langchain_openai import AzureChatOpenAI
|
| 6 |
from langgraph.graph import START, StateGraph
|
| 7 |
-
from tools import duckduck_tool, wiki_RAG_tool
|
| 8 |
from langgraph.prebuilt import ToolNode, tools_condition
|
| 9 |
|
| 10 |
import prompts_lib as my_prompts
|
|
@@ -18,6 +18,7 @@ load_dotenv() # take environment variables
|
|
| 18 |
# define state
|
| 19 |
class State(TypedDict):
|
| 20 |
messages: Annotated[list[AnyMessage], add_messages]
|
|
|
|
| 21 |
|
| 22 |
# create llm interface
|
| 23 |
llm = AzureChatOpenAI(
|
|
@@ -29,7 +30,7 @@ llm = AzureChatOpenAI(
|
|
| 29 |
)
|
| 30 |
|
| 31 |
# bild tools
|
| 32 |
-
tools = [duckduck_tool, wiki_RAG_tool]
|
| 33 |
chat_w_tools = llm.bind_tools(tools)
|
| 34 |
|
| 35 |
# load system prompt
|
|
@@ -38,8 +39,12 @@ system_message = SystemMessage(content=system_prompt)
|
|
| 38 |
|
| 39 |
# define nodes
|
| 40 |
def assistant(state: State):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
return {
|
| 42 |
-
"messages": [chat_w_tools.invoke([system_message] + state["messages"])]
|
| 43 |
}
|
| 44 |
|
| 45 |
|
|
@@ -56,4 +61,8 @@ builder.add_conditional_edges("assistant", tools_condition,
|
|
| 56 |
{"tools": "tools", "__end__": "__end__"})
|
| 57 |
builder.add_edge("tools", "assistant")
|
| 58 |
# compile gtaph
|
| 59 |
-
agent = builder.compile()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
# imports
|
| 2 |
+
from typing import TypedDict, Annotated, Optional
|
| 3 |
from langgraph.graph.message import add_messages
|
| 4 |
from langchain_core.messages import AnyMessage, SystemMessage
|
| 5 |
from langchain_openai import AzureChatOpenAI
|
| 6 |
from langgraph.graph import START, StateGraph
|
| 7 |
+
from tools import duckduck_tool, wiki_RAG_tool, image_analyser_tool
|
| 8 |
from langgraph.prebuilt import ToolNode, tools_condition
|
| 9 |
|
| 10 |
import prompts_lib as my_prompts
|
|
|
|
| 18 |
# define state
|
| 19 |
class State(TypedDict):
|
| 20 |
messages: Annotated[list[AnyMessage], add_messages]
|
| 21 |
+
file_path: Optional[str]
|
| 22 |
|
| 23 |
# create llm interface
|
| 24 |
llm = AzureChatOpenAI(
|
|
|
|
| 30 |
)
|
| 31 |
|
| 32 |
# bild tools
|
| 33 |
+
tools = [duckduck_tool, wiki_RAG_tool, image_analyser_tool]
|
| 34 |
chat_w_tools = llm.bind_tools(tools)
|
| 35 |
|
| 36 |
# load system prompt
|
|
|
|
| 39 |
|
| 40 |
# define nodes
|
| 41 |
def assistant(state: State):
|
| 42 |
+
|
| 43 |
+
file_path = state.get("file_path", None)
|
| 44 |
+
if file_path:
|
| 45 |
+
state["messages"].append(SystemMessage(content=f"File path provided: {file_path}"))
|
| 46 |
return {
|
| 47 |
+
"messages": [chat_w_tools.invoke([system_message] + state["messages"])],
|
| 48 |
}
|
| 49 |
|
| 50 |
|
|
|
|
| 61 |
{"tools": "tools", "__end__": "__end__"})
|
| 62 |
builder.add_edge("tools", "assistant")
|
| 63 |
# compile gtaph
|
| 64 |
+
# agent = builder.compile()
|
| 65 |
+
|
| 66 |
+
class Agent:
|
| 67 |
+
def __init__(self):
|
| 68 |
+
self.builder = builder.compile()
|
requirements.txt
CHANGED
|
Binary files a/requirements.txt and b/requirements.txt differ
|
|
|
test.ipynb
CHANGED
|
@@ -103,7 +103,7 @@
|
|
| 103 |
},
|
| 104 |
{
|
| 105 |
"cell_type": "code",
|
| 106 |
-
"execution_count":
|
| 107 |
"id": "02c87f0c",
|
| 108 |
"metadata": {},
|
| 109 |
"outputs": [
|
|
@@ -113,7 +113,7 @@
|
|
| 113 |
"text": [
|
| 114 |
"Agent received question (first 50 chars): \n",
|
| 115 |
"How many studio albums were published by Mercedes...\n",
|
| 116 |
-
"Agent returning answer:
|
| 117 |
]
|
| 118 |
}
|
| 119 |
],
|
|
@@ -152,7 +152,7 @@
|
|
| 152 |
},
|
| 153 |
{
|
| 154 |
"cell_type": "code",
|
| 155 |
-
"execution_count":
|
| 156 |
"id": "069db350",
|
| 157 |
"metadata": {},
|
| 158 |
"outputs": [
|
|
@@ -178,6 +178,20 @@
|
|
| 178 |
"land inequality. During the 1970s she was a part of two films by the\n",
|
| 179 |
"director Leopoldo Torre Nilsson: El Santo de la Espada in 1970 and Güemes,\n",
|
| 180 |
"la tierra en armas in 1971, in which she portrayed Juana Azurduy de\n",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 181 |
"Padilla, the guerrilla military leader who fought for The double album was\n",
|
| 182 |
"a commercial success, being certified platinum by the CAPIF selling more\n",
|
| 183 |
"than 200,000 copies in Argentina, Cantora 1 was also certified platinum\n",
|
|
@@ -187,60 +201,52 @@
|
|
| 187 |
"only appearances on both charts. At documentary film titled Mercedes Sosa,\n",
|
| 188 |
"Cantora un viaje íntimo was released on 2009, it was directed by Rodrigo\n",
|
| 189 |
"Vila and features the recording process of the album as well as testimonies\n",
|
| 190 |
-
"from the different guest artists that appeared on the project.
|
| 191 |
-
"
|
| 192 |
-
"
|
| 193 |
-
"
|
| 194 |
-
"
|
| 195 |
-
"
|
| 196 |
-
"
|
| 197 |
-
"
|
| 198 |
-
"
|
| 199 |
-
"
|
| 200 |
-
"
|
| 201 |
-
"
|
| 202 |
-
"
|
| 203 |
-
"
|
| 204 |
-
"
|
| 205 |
-
"
|
| 206 |
-
"of
|
| 207 |
-
"
|
| 208 |
-
"
|
| 209 |
-
"one
|
| 210 |
-
"
|
| 211 |
-
"
|
| 212 |
-
"
|
| 213 |
-
"
|
| 214 |
-
"
|
| 215 |
-
"
|
| 216 |
-
"
|
| 217 |
-
"
|
| 218 |
-
"
|
| 219 |
-
"of the album
|
| 220 |
-
"
|
| 221 |
-
"
|
| 222 |
-
"
|
| 223 |
-
"
|
| 224 |
-
"
|
| 225 |
-
"
|
| 226 |
-
"
|
| 227 |
-
"
|
| 228 |
-
"
|
| 229 |
-
"
|
| 230 |
-
"
|
| 231 |
-
"
|
| 232 |
-
"
|
| 233 |
-
"
|
| 234 |
-
"
|
| 235 |
-
"
|
| 236 |
-
"in Tucuman under the name Gladys Osorio. In 1950, at age fifteen, she won a\n",
|
| 237 |
-
"singing competition organized by a local radio station and was given a\n",
|
| 238 |
-
"contract to perform for two months. She recorded her first album, La Voz de\n",
|
| 239 |
-
"la Zafra, in 1959. A performance at the 1965 Cosquín National Folklore\n",
|
| 240 |
-
"Festival—where she was introduced and brought to the stage while sitting in\n",
|
| 241 |
-
"the audience by fellow folk singer Jorge Cafrune— brought her to the\n",
|
| 242 |
-
"attention of the Argentine public. Sosa and her first husband, Manuel\n",
|
| 243 |
-
"<class 'langchain_core.messages.ai.AIMessage'>: Three\n"
|
| 244 |
]
|
| 245 |
}
|
| 246 |
],
|
|
|
|
| 103 |
},
|
| 104 |
{
|
| 105 |
"cell_type": "code",
|
| 106 |
+
"execution_count": 34,
|
| 107 |
"id": "02c87f0c",
|
| 108 |
"metadata": {},
|
| 109 |
"outputs": [
|
|
|
|
| 113 |
"text": [
|
| 114 |
"Agent received question (first 50 chars): \n",
|
| 115 |
"How many studio albums were published by Mercedes...\n",
|
| 116 |
+
"Agent returning answer: Cantora 1, Cantora 2.\n"
|
| 117 |
]
|
| 118 |
}
|
| 119 |
],
|
|
|
|
| 152 |
},
|
| 153 |
{
|
| 154 |
"cell_type": "code",
|
| 155 |
+
"execution_count": 35,
|
| 156 |
"id": "069db350",
|
| 157 |
"metadata": {},
|
| 158 |
"outputs": [
|
|
|
|
| 178 |
"land inequality. During the 1970s she was a part of two films by the\n",
|
| 179 |
"director Leopoldo Torre Nilsson: El Santo de la Espada in 1970 and Güemes,\n",
|
| 180 |
"la tierra en armas in 1971, in which she portrayed Juana Azurduy de\n",
|
| 181 |
+
"Padilla, the guerrilla military leader who fought for In the early 1970s,\n",
|
| 182 |
+
"Sosa released two concept albums in collaboration with composer Ariel\n",
|
| 183 |
+
"Ramírez and lyricist Félix Luna: Cantata Sudamericana and Mujeres\n",
|
| 184 |
+
"Argentinas (Argentine Women). She also recorded a tribute to Chilean\n",
|
| 185 |
+
"musician Violeta Parra in 1971, including what was to become one of Sosa's\n",
|
| 186 |
+
"signature songs, Gracias a la vida. She further popularized of songs\n",
|
| 187 |
+
"written by Milton Nascimento of Brazil and Pablo Milanés and Silvio\n",
|
| 188 |
+
"Rodríguez both from Cuba. Throughout the decade, she released albums such\n",
|
| 189 |
+
"as Hasta la Victoria in 1972 and Traigo un Pueblo en mi Voz in 1973. They\n",
|
| 190 |
+
"featured songs like \"Cuando tenga la tierra\", written by Ariel Petrocelli\n",
|
| 191 |
+
"and Daniel Toro, which tackles political and social issues like wealth and\n",
|
| 192 |
+
"land inequality. During the 1970s she was a part of two films by the\n",
|
| 193 |
+
"director Leopoldo Torre Nilsson: El Santo de la Espada in 1970 and Güemes,\n",
|
| 194 |
+
"la tierra en armas in 1971, in which she portrayed Juana Azurduy de\n",
|
| 195 |
"Padilla, the guerrilla military leader who fought for The double album was\n",
|
| 196 |
"a commercial success, being certified platinum by the CAPIF selling more\n",
|
| 197 |
"than 200,000 copies in Argentina, Cantora 1 was also certified platinum\n",
|
|
|
|
| 201 |
"only appearances on both charts. At documentary film titled Mercedes Sosa,\n",
|
| 202 |
"Cantora un viaje íntimo was released on 2009, it was directed by Rodrigo\n",
|
| 203 |
"Vila and features the recording process of the album as well as testimonies\n",
|
| 204 |
+
"from the different guest artists that appeared on the project. The double\n",
|
| 205 |
+
"album was a commercial success, being certified platinum by the CAPIF\n",
|
| 206 |
+
"selling more than 200,000 copies in Argentina, Cantora 1 was also certified\n",
|
| 207 |
+
"platinum selling 40,000 copies while Cantora 2 was certified gold selling\n",
|
| 208 |
+
"20,000 copies. The album also peaked at numbers 22 and 8 at the Top Latin\n",
|
| 209 |
+
"Albums and Latin Pop Albums charts in United States, respectively, being\n",
|
| 210 |
+
"Sosa's only appearances on both charts. At documentary film titled Mercedes\n",
|
| 211 |
+
"Sosa, Cantora un viaje íntimo was released on 2009, it was directed by\n",
|
| 212 |
+
"Rodrigo Vila and features the recording process of the album as well as\n",
|
| 213 |
+
"testimonies from the different guest artists that appeared on the project.\n",
|
| 214 |
+
"Haydée Mercedes Sosa (9 July 1935 – 4 October 2009) was an Argentine singer\n",
|
| 215 |
+
"who was popular throughout Latin America and many countries outside the\n",
|
| 216 |
+
"region. With her roots in Argentine folk music, Sosa became one of the\n",
|
| 217 |
+
"preeminent exponents of El nuevo cancionero. She gave voice to songs\n",
|
| 218 |
+
"written by many Latin American songwriters. Her music made people hail her\n",
|
| 219 |
+
"as the \"voice of the voiceless ones\". She was often called \"the conscience\n",
|
| 220 |
+
"of Latin America\". Haydée Mercedes Sosa (9 July 1935 – 4 October 2009) was\n",
|
| 221 |
+
"an Argentine singer who was popular throughout Latin America and many\n",
|
| 222 |
+
"countries outside the region. With her roots in Argentine folk music, Sosa\n",
|
| 223 |
+
"became one of the preeminent exponents of El nuevo cancionero. She gave\n",
|
| 224 |
+
"voice to songs written by many Latin American songwriters. Her music made\n",
|
| 225 |
+
"people hail her as the \"voice of the voiceless ones\". She was often called\n",
|
| 226 |
+
"\"the conscience of Latin America\". Cantora, un Viaje Íntimo (English:\n",
|
| 227 |
+
"Cantora, An Intimate Journey) is a double album by Argentine singer\n",
|
| 228 |
+
"Mercedes Sosa, released on 2009 through Sony Music Argentina. The album\n",
|
| 229 |
+
"features Cantora 1 and Cantora 2, the project is Sosa's final album before\n",
|
| 230 |
+
"her death on October 4, 2009. At the 10th Annual Latin Grammy Awards,\n",
|
| 231 |
+
"Cantora 1 was nominated for Album of the Year and won Best Folk Album and\n",
|
| 232 |
+
"Best Recording Package, the latter award went to Alejandro Ros, the art\n",
|
| 233 |
+
"director of the album. Additionally, Sosa won two out of five nominations\n",
|
| 234 |
+
"for the albums at the Gardel Awards 2010, the double album was nominated\n",
|
| 235 |
+
"for Album of the Year and Production of the Year and won Best DVD while\n",
|
| 236 |
+
"both Cantora 1 and Cantora 2 were nominated for Best Female Folk Album,\n",
|
| 237 |
+
"with the former winning the category. Cantora, un Viaje Íntimo (English:\n",
|
| 238 |
+
"Cantora, An Intimate Journey) is a double album by Argentine singer\n",
|
| 239 |
+
"Mercedes Sosa, released on 2009 through Sony Music Argentina. The album\n",
|
| 240 |
+
"features Cantora 1 and Cantora 2, the project is Sosa's final album before\n",
|
| 241 |
+
"her death on October 4, 2009. At the 10th Annual Latin Grammy Awards,\n",
|
| 242 |
+
"Cantora 1 was nominated for Album of the Year and won Best Folk Album and\n",
|
| 243 |
+
"Best Recording Package, the latter award went to Alejandro Ros, the art\n",
|
| 244 |
+
"director of the album. Additionally, Sosa won two out of five nominations\n",
|
| 245 |
+
"for the albums at the Gardel Awards 2010, the double album was nominated\n",
|
| 246 |
+
"for Album of the Year and Production of the Year and won Best DVD while\n",
|
| 247 |
+
"both Cantora 1 and Cantora 2 were nominated for Best Female Folk Album,\n",
|
| 248 |
+
"with the former winning the category.\n",
|
| 249 |
+
"<class 'langchain_core.messages.ai.AIMessage'>: Cantora 1, Cantora 2.\n"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 250 |
]
|
| 251 |
}
|
| 252 |
],
|
test_app.ipynb
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "d3e1ddaa",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [],
|
| 9 |
+
"source": [
|
| 10 |
+
"import requests"
|
| 11 |
+
]
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"cell_type": "code",
|
| 15 |
+
"execution_count": 2,
|
| 16 |
+
"id": "4f03dfb6",
|
| 17 |
+
"metadata": {},
|
| 18 |
+
"outputs": [],
|
| 19 |
+
"source": [
|
| 20 |
+
"DEFAULT_API_URL = \"https://agents-course-unit4-scoring.hf.space\"\n",
|
| 21 |
+
"\n",
|
| 22 |
+
"api_url = DEFAULT_API_URL\n",
|
| 23 |
+
"\n",
|
| 24 |
+
"questions_url = f\"{api_url}/questions\"\n",
|
| 25 |
+
"\n",
|
| 26 |
+
"\n",
|
| 27 |
+
"response = requests.get(questions_url, timeout=15)\n",
|
| 28 |
+
"response.raise_for_status()\n",
|
| 29 |
+
"questions_data = response.json()"
|
| 30 |
+
]
|
| 31 |
+
},
|
| 32 |
+
{
|
| 33 |
+
"cell_type": "code",
|
| 34 |
+
"execution_count": 30,
|
| 35 |
+
"id": "c086d928",
|
| 36 |
+
"metadata": {},
|
| 37 |
+
"outputs": [],
|
| 38 |
+
"source": [
|
| 39 |
+
"for i, item in enumerate(questions_data):\n",
|
| 40 |
+
" task_id = item.get(\"task_id\")\n",
|
| 41 |
+
" question_text = item.get(\"question\")\n",
|
| 42 |
+
"\n",
|
| 43 |
+
" if i==13:\n",
|
| 44 |
+
" break\n",
|
| 45 |
+
"\n"
|
| 46 |
+
]
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"cell_type": "code",
|
| 50 |
+
"execution_count": 32,
|
| 51 |
+
"id": "f2be8564",
|
| 52 |
+
"metadata": {},
|
| 53 |
+
"outputs": [
|
| 54 |
+
{
|
| 55 |
+
"data": {
|
| 56 |
+
"text/plain": [
|
| 57 |
+
"{'task_id': '1f975693-876d-457b-a649-393859e79bf3',\n",
|
| 58 |
+
" 'question': \"Hi, I was out sick from my classes on Friday, so I'm trying to figure out what I need to study for my Calculus mid-term next week. My friend from class sent me an audio recording of Professor Willowbrook giving out the recommended reading for the test, but my headphones are broken :(\\n\\nCould you please listen to the recording for me and tell me the page numbers I'm supposed to go over? I've attached a file called Homework.mp3 that has the recording. Please provide just the page numbers as a comma-delimited list. And please provide the list in ascending order.\",\n",
|
| 59 |
+
" 'Level': '1',\n",
|
| 60 |
+
" 'file_name': '1f975693-876d-457b-a649-393859e79bf3.mp3'}"
|
| 61 |
+
]
|
| 62 |
+
},
|
| 63 |
+
"execution_count": 32,
|
| 64 |
+
"metadata": {},
|
| 65 |
+
"output_type": "execute_result"
|
| 66 |
+
}
|
| 67 |
+
],
|
| 68 |
+
"source": [
|
| 69 |
+
"item"
|
| 70 |
+
]
|
| 71 |
+
},
|
| 72 |
+
{
|
| 73 |
+
"cell_type": "code",
|
| 74 |
+
"execution_count": 31,
|
| 75 |
+
"id": "3951626a",
|
| 76 |
+
"metadata": {},
|
| 77 |
+
"outputs": [
|
| 78 |
+
{
|
| 79 |
+
"data": {
|
| 80 |
+
"text/plain": [
|
| 81 |
+
"\"Hi, I was out sick from my classes on Friday, so I'm trying to figure out what I need to study for my Calculus mid-term next week. My friend from class sent me an audio recording of Professor Willowbrook giving out the recommended reading for the test, but my headphones are broken :(\\n\\nCould you please listen to the recording for me and tell me the page numbers I'm supposed to go over? I've attached a file called Homework.mp3 that has the recording. Please provide just the page numbers as a comma-delimited list. And please provide the list in ascending order.\""
|
| 82 |
+
]
|
| 83 |
+
},
|
| 84 |
+
"execution_count": 31,
|
| 85 |
+
"metadata": {},
|
| 86 |
+
"output_type": "execute_result"
|
| 87 |
+
}
|
| 88 |
+
],
|
| 89 |
+
"source": [
|
| 90 |
+
"question_text"
|
| 91 |
+
]
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"cell_type": "code",
|
| 95 |
+
"execution_count": 33,
|
| 96 |
+
"id": "442a3761",
|
| 97 |
+
"metadata": {},
|
| 98 |
+
"outputs": [],
|
| 99 |
+
"source": [
|
| 100 |
+
"import base64\n",
|
| 101 |
+
"image_path = 'cca530fc-4052-43b2-b130-b30968d8aa44.png'\n",
|
| 102 |
+
"with open(image_path, \"rb\") as image_file:\n",
|
| 103 |
+
" image_data = base64.b64encode(image_file.read()).decode(\"utf-8\")"
|
| 104 |
+
]
|
| 105 |
+
},
|
| 106 |
+
{
|
| 107 |
+
"cell_type": "code",
|
| 108 |
+
"execution_count": 34,
|
| 109 |
+
"id": "c8620c63",
|
| 110 |
+
"metadata": {},
|
| 111 |
+
"outputs": [
|
| 112 |
+
{
|
| 113 |
+
"data": {
|
| 114 |
+
"text/plain": [
|
| 115 |
+
"'iVBORw0KGgoAAAANSUhEUgAAAwcAAAMHCAIAAADjOrwYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAA65NJREFUeNrs3Xd4HNXZNvBn2vZd9S5ZltxkGRsbg8HG2HQDDh0ChJAAIaSQBN6QfB+EvGmk8L7JF0J6AgRCTEKI6d0Um+aKG5a7ZElWWbXV9p3Zaef7Y4xYS7Ik2yor6/5dXFzyltnVs6M59545cw43b84sAgAAAJjweJQAAAAAAKkIAAAA4BCx17/PWDjvhhsvr66exvMITL098NRPUYQB3HP991EE7D/Yf7D/YP/B/jMuMMbC7XL91q6uxmjPjXyvSPSzX/yfk06agUgEAAAAJzCO4zILXfMunpRb7u0/Fd1w4+UoEwAAAEwcFfNy+09F1dXTUB0AAACYODIKnP2nIpw4AwAAgAmF47j+UxEAAADAhIVUBAAAAEDU98p8SFtd9YqhD5hweS6rTBJtSLoAAABIRSe0jtqkGmcDPEAQOU+eKNpQKgAAAKSiCaC8vLy0tLTv7evWrSNiqA8AAABS0USxePHiz3/+84wdFoA0Tbv22msNU0N9AAAARj4V6aG921a92bjLMeWu2+ZmonBjyDRNwzBSb0m9qhAAAABGJhXpenvbxzv3bt0SajJMIiIHagYAAAATMRU1rXr8o41ERLwokG6gYKNFDve+3oyZgzyFMZaMGXT4yTWbSxAk9CQBAAAcfyoiEhzTTp523qKp8pvP/X0vCjZa9r0bGzQG9WIa1LAx0evGghn2oplO1BMAAOC4U1HFJd+psH6qR7EAAABgAqciGDsOh+N//ud/ysrKUm+02fqZj0iSpKeeeqrXjd/85jdbWlpQRgAAAKSiE4HdbpckKfUWxphp9j61put6r4cRLkwDAABAKjrB9Jqa6JgfAwAAAAPDmlkAAAAASEUAAAAASEUAAAAASEXjBgYMAQAAjBqMtk5fhmG8/vrrGRkZqTcuXLiwpKSk74NffvllRVFSb4nH46ghAAAAUtGJQNO0F154odeNCxcu7PfBq1ev3r9/P4oGAACAVHSi8RVKlDItka6yeFDPyc7pt6OIiMrLy/fv3y85OFfmYZ+pwyegmAAAAEhF41jFAnfqP7vqk/FuvbS09EiPt6bAtrn5ijPcqB4AAMCIpqKKK679Eep1/OSwngiZSsRIJgxDZaZOREQc8QKJNs7uFkQHb3NzNief2uuTCOpENGnSpCNttry8nIjkkGkaxH/SPaQpZjJmKlFDjZta0jQ00hSTGBERxxMvck6fYHPxDi/v8AmSA0PvAQAAqQhGHmMUbE6271WSsU8vK0tdlOOTy830T+/lKatUKprpFO1cImj0RJ8BUpFpsERQc2dLsS6tfZ8S6zJ6PazXK8Y6D70cL1DWJKlopkuUOMJKIQAAgFQEI5KHTAo2Jztqk0rEJCKe58vKyqqrqydPnuz1ep1OJxGZphmNRqPRaCAQaG5urqurCwaDzKTug1p3k2b38MmoSURTp0490qvk5OSUlZU1NTU1bZMNNaGrrCcGzZw5s6CgoLCwMDs72+l0OhwOIkomk4qitLa21tbW7t69W1XVQL0W9kcyCqXCKqfkQDICAACkIhhWusoObolH2nQiysjImDdv3rXXXjtlyhQrCVn6fWJbW9u6devefffdrq6uWCxGRDabbYC+IiJauHBhU1NTMmZKkpST45s1a9ZZZ501b948m8028Ju0LnZ74403AoFAoEGNtGsVC9yuTBGdRgAAgFQEwyMe1Ju2JJSoSURXXXXVZZddVlhYyBjTdZ0xNvAMjYWFhVdeeeWll17a1dVVV1f3yiuvFBcXC8JAF5SdeeaZzz///Pnnn3/WWWeVlpb6fL7U82UDkCTpmmuuueiiizZv3vyHP/xBkZXaD+KFM+35Ux34EAEAAKkIhiESNW5KqAkzOzv7jjvuWLx4MWPMNE1d14/i4xHFwsLCwsLChQsXWj1GAygtLf3Tn/6Ul5d3bG/Y4/EsXbp0zpw5Dz744LZt21prFCLKn+JAjxEAAEwQuOxoROgqa9qSUBNmbm7uL37xCysSaZp2VJHosM+J530+38CPkSTpmCNRj6ysrO9973vLly8norbdye7mJD5NAABAKoJjxEw6uCWuRM38/Pyf/exnkydPNgxD07TxsqiZw+H4whe+cNppp5kGa94uy2EDnykAACAVwbHoqk9aw6v/67/+a/LkyT0DicbRr+B0Om+55ZacnBxTp9ZdMj5TAABAKoKjxhgFGpMcx91www2nnHKKdeJsPP4iOTk51157rSRJsU492qXhkwUAAKQiODrBZlWJmBkZGcuWLSOicXTirBen0zl16tTJkyczkxo/ShDDZwsAAEhFMGSmwVp3yER0zjnnFBYWmqY5TiORJTc39+qrr5YkSVdYNIDuIgAAQCqCIZPDhq4yURQ/+9nPchx3pBkaxwtRFPPz86dPn05E8QDGXAMAwAkO8xUNJ2u1sqqqquzsbMaYYRxFkujq6mpqalIUJScnZ/LkyYNOSD10zc3NTU1NDocjOzu7rKyM54cahe12O8/zVVVVO3fujLZrhTMwqSMAACAVwRBTUcggorlz5xLREKcmUhTl3XffXbVqVV1dXWrf0kknnbR06dJ58+bl5+cfwzuRZXnPnj1r1qxZt26doig9t2dkZCxduvTiiy8uKSkZdCPW1NjFxcU8zyfjJj5fAABAKoKhUqIGx3GlpaVENJQRRbIs/+AHP9i/f3/fc201NTU1NTVut/uqq6668sorRfEoPqn6+vpf//rXzc3NfTurwuHwiy+++Oabb95zzz3z5s0bytaysrI4jtOTpq4y0YaJrgEAAKkIhkBXTI7jcnNzhzjIesWKFXv37hUkLn+KPbNYcvhEXiBNMeWwkQgaweZkPBZfsWLF/v37v/SlLxUUFAy6QVVVX3311aeeeiqRSPAiZU+y+QpEV5Zoc/FEpClmtENv36/IUfmRRx751a9+5XQ6B9o5RFEQBLfbbXUaxbq0zGIbPmUAADhRYbT1cNKSJsdx1pCgQYNRMpl84403iKOiakfxLKcrS+QFIiLJwfsKpMIqx8zzM/Kn2xmx9evX//a3vx3KKbnnnnvub3/7W0JOODOEWRdlTDrFlVlisyKRteXsSbYpC928wDU1Nb366quDbpAxJkmSx+MhImuZWwAAAKQiGAqOiGw221CuPtuyZYuqqhxHWWVH7IAprnaWnOQkoqOaHduVIUxZ5BbE/s922VxCbqWNiN56662Bt6nruvWLDNylBAAAgFQEx8Xv9xORzckfKb5Y7O6j/owEGyfaB3qWO0cgolgspqrqUDZ4VKOaAAAAkIqAeIEjoiEu8eF2u4lIS5qmMdozPSZjh3qAJEka4GGGYVidSZ2dnUSEodYAAIBUBEMlOTnTNNvb24fy4EWLFtntdtOgWJc+mm9SU8y2PQoRnXrqqQPPXSTLMmMsGo1aOc+Zgb0FAACQimBo7G6eMdbS0jKUmRK9Xu/pp59OjPy7ldF8k511iqmT1+v9whe+MPAjQ6EQEQWDQcYYx5MrS8JHDAAASEUwJO4skYi2bt06xMdfffXVbrdbDhkH1scMbeTPozHqblI7alUiuu666xyOgeaqlmXZGmrd2trKGHP4BA4n0AAAAKkIhpqKckQi2r59e2dnJzeEEFFRUXHfffdJkhRp0/275ZF+e5EOrXmbTIwWL1586aWXDhSfGOvu7rZ+3r59O2PMl48B1wAAgFQEQ+bKEmwunjH20EMPDXERtFmzZn3+858noq4DavPHCTZiUwJF2rSDmxOmwebOnXvXXXcNHNoikYgsy0S0d+/e2tpaIvIiFQEAAFIRHEU1Ba5kjoOIdu7cWVdXN5SncBx35ZVX3nzzzTzPdx1QO+sUNgJn0pSocXBrQldZbm7u//2//3fgpWdVVbUuOtM07ZVXXjEMw+7lPbkYVAQAAEhFcDQyCmzefEmW5ccff3yI3UVEdOmll1544YVE5N+ldNQO8+DrRFCv/TCmJ1lFRcUvfvELa0aAI9E0rbW11fp527Ztra2tvEhTFnrwyQIAAFIRHCWOCqbbOJ527Njxj3/8YyiTXBORJElf//rXzz//fI7j/TvlcJtGw9RjpCfNpm2yrhzqJRp4MbVkMtnY2GgtLdLW1vbss8+appk9yWZzYj8BAACkIjh6nlwpf5qdiF5//fWampqhP/HLX/7y/PnzibiGjfFIh3b870STzf3vxeSw4fP5fvjDHxYXFw/04JReIlmWn3zyyWQyaffwhVUOwtVnAACAVATHpmC6w1cgJhKJ+++/f+/evUN8ltPpvPfee2fPns1Mat4ut9QkGrfE2/cf9Qm1ZMys3xhr3BKv3xRPxs3s7Oz77ruvvLx8oKckk01NTdYpP0VRVq5c2dLSIti4itPdog07CQAAIBXBMZdV4CYvcNs9XDKZ/PWvf51IJIb4RFEU77rrLp/PpybMzlo1eFCLB4yjfXU1YYZb9eBBLdFtcBz3pS99aebMmQM8XtO0lpYW62QfY2zlypXWlEulc5wOj4BPEwAAJghcbj2Sweg0T/2GuN/vv/POO7/3ve9VVFQM5Yl5eXm/+tWvnn/+eZvNJgiC0+m02WwlJSWCMHhAOeOMM3w+XzKZTCQSiqKoqlpQUHDmmWcO8JRkMtna2mpFIk3TVq1atX37do6nompHVqkNnyMAACAVwTBwZgjTz/bueiPc3t7+m9/85te//vVQkg0RFRYWfvWrXz2GVywvLx/4TFkvmqY1NTVZPzPGVq1a9fbbbxNH+VNt+VMd+AQBAGBCwRm0EU6dNq78NDcvUH19/d133z3EhWNHh6qqLS0tPfHoxRdfXLNmDXFUMM1ePMuFzw4AAJCKYJhlFEqVizyCjTtw4MADDzwQiUTS4V0lk8mDBw9aF+EbhvHOO++89957JjOzSqWiaic+NQAAQCqCEeHJESfNc3I81dXV/fCHP+xZYmysaJrm9/utnw3DePHFF998803GWF6lrXy+G58XAAAgFcEIyiiyVZzhFu1cXV3dQw89FAwGx+qdpPYSmaa5bt26Dz/8kJGZW2ErPgm9RAAAgFQEI8+XJ006xUlEW7du/c1vfqOq6ui/B2uqRvbJWmvvvffeCy+8YE1gXTIbkQgAAJCKYHRw5CuwTT7dxYvc1q1bH3vsMavDZtQkk8nm5uae1dn27Nnz5ptvGqaRVSqVzHZxPGawBgAApCIYRZmFtsKZdiJ65ZVXVq9ePWqvq2laaiQKBAKPPPKILMuuLKFsnovHZI0AADDhYb6iUcdR/hRHMmp2N2r//Oc/TznllJycnH4fqOt6LBaTZVnTNFmWicj6PxGZpskYU1XVNE23+9D4aKfTSUQOh0OSJEEQPB6P0+nkeZ6Iksmk3+/vOXFGRM8//7xpmg6vUHGamxfQSwQAAIBUNEYKqxyRNi0QCPzwhz/8+c9/rqpqQ0OD3+/v7OxsamqyftC0YVgg1u12FxYWOhyO8vLyvLy83NzcjIyM+vr6nTt3cjyVnuyQnOgvBAAAQCoaw7rb+JwKW9vu5MGDB2+//fYhLpTm9XolSer3Lk3TVFVNJpO9bo/H43V1dUS0c+dO6xabzWat7yE5OYcXZ84AAACQisYIMykW0Ft2JJSIad2iqmphYaHT6ZQkKS8vr6CgoKSkxG635+TkeL3ezMxMh8PhdDpFcfAPizHWswJaKBQKh8NdXV2BQKC7u7upqSmZTMqy3N3dbV3+psbZrjcjBTMc2WU2yYEeIwAAQCqC0dXwUSzSpjOTiGjhwoXnnXdeYWFhbm6utQqsNQzomHEc53a7rZFGRUVFve7VNE1RlO7u7ng8vnHjxueee05RFP8uJVCvlp/qcmdjZwAAAKQiGBXMZAe3JsKtuiAIZy4584YbbqisrDy6LaQMlz5SKhrgXkmSJEnyer1EVF1dff311z/zzDMvvfRSMBhs/Cheucjj8OCEGgAAIBXByAv5tWCzxvP8XXfddd555wmC0CvxpIYeXddFUew1odHRpiKe503TTD31ltoX5XA4brzxxiVLltx7772dnZ316+Mzz/fhYwIAgAkLo0lGiaGy1hqZGJ177rlnn302x3GGYei6rut6MplMJpOqqmopGGPW/1MN+iq9Hm8YhrWdHtZr6Z8wDKO0tPTOO+8URTEZM0MtKj4pAABAKoKRFenQNJk5nc6vfe1rVlKxQknPtIqjGtE+oeu6qqpz5sw599xziSjYjFQEAABIRTDCEiGDiE4//fQjXVo/tubPn8/zvBI18UkBAABSEYwsNWESUXV1dXq+PWsuAE1GKgIAAKQiGGF6kvE8n52dnZ5vz+12C4JgGmSoDB8WAAAgFcFIpiLV5Hne4XCk59uz2+3W9Wuaiu4iAABAKoIJTBTFQ+vIxgxUAwAAkIpgJJnE87zdbk/Pd9dr8iQAAACkIhixUJTeJ6YEQRh4XmwAAIATHua2Hs1gZO7bt0+W5TR8b4yxXvNoAwAAIBXBSNF1/eGHH0YdAAAAkIomdqFtnGngFBUAAABS0YQ34xwvigAAAJDOMNoaAAAAAKkIAAAAAKkIAAAAAKkIAAAAAKkIAAAAAKkIAAAAAKkIAAAAAKkIAAAAYDCHzeL4wFM/RUUGcM/130cRBoD9B/sP9h/sP9h/sP+MR2/++QbrB/QVAQAAACAVAQAAACAVAQAAACAVAQAAACAVAQAAACAVAQAAACAVAQAAACAVAQAAAAxGHMJjHJOqlp47/aRch0PgiYiMZFdD/RtvbWsIoX4AAABwohi8r6j6zC/dMPfUAtehSEREgj13StV11ywoRfkAAADghDF4X5HH5iBTCbR+sLl+59aIY860ZUumTnbzYs7k8y7c/fdVUdQQAAAAJkYq0mJ7Nu57ZXWL9a/Yx1uejLvuuKY0k/jcnBKiPaghAAAATIxUtHXTK71uqevqUkozHeRw+1BAAAAAOEEcyzVomZmZDiIiJR5GAQEAAGDipqKp5xfmEhHpbQ17UUAAAACYoKmo9JwLlk9xEBGF/O+uQ/0AAADgRCEexWO9M65ccsV0r0hESvCDtz5sRvkAAABg4qWiktM/f9r5JdZ4osBbL7+5oQ7FAwAAgAmXikrOv23R6TkCEemhpuf//eHeECoHAAAAEy4VeefesMCKRLGWPc+s2IYTZwAAADAhU9HCBedNshORcnDbX/61R0HJxpBpMlVVk0mtvb0rEokTkc/nLijItdslm83G89xELxAjw2DMoGTM0FVGRKKNs3sETiBB4IjDHgQAAMeVihbPyHEQEcVrdyqF1ZMPu0+X2/a1IyeNBk3TP/5474cfbm1qamtr69I0vecuSRILC3PLygrPOmv+vHkzJ2gcMinSrgabNSVqJmMGMz+9i+PJ7hEcXj67zOYrlLAvAQDAsaaiyTke6+J990kXn3FSrzuV9hf2tdegiCPKNJnf3/HYY8/V1NQSkSiKGRkZLpdLkiQi0jQtkUg0NbU1NbWtW7f9zDPnXXPNhQUFORw3YTpGGCkxo3m7HOvSrfpkZ+X0qk8gEFAiRqhFyyqzFVY57C4e/UYAAHD0qcjuEFCkMfXOO+uffPIVWVaIaMmSJVdeeWVubq4kSamtvt/vf+GFFzZu3PjBB1u2b99z223XnH76nAlSn66GZOtOxdTZUOoTbFIj7VrZXGdmsQ27FgAAHGUq2vvvhzCB9RgxDPO5595auXIVEVVXV99yyy1z5swxDEPXU0+fSS6XKzc3d/bs2Rs3blyxYkVDQ8ODDz5x881XXHjhmSf2SCPGqH2v0rZHOdr6NGxMlM5huRV29BgBAMDRpCIYOzt27HvuubeI6JJLLvnqV79qt9t7Nfm9LFiwoKqq6ne/+92GDRtWrHipsDB37tyqE7g+0Q6tfa9ybPVpqVFsbt5XgGFGAADwKR4lSE8HDjQ/9NAKwzAvvPDC22+/fdAm3+Lz+W699dbZs2fruvHQQysOHDhhp1FIhIyGTQnG6Njqw0zWsCmRCBnY0wAAAKko3T399OuyrFRVVd19991Op3MoTb4lNzf3S1/6UnFxsSwrr7zy7olaH/9u2dTZ8dTH1FlnLa6gBAAApKL01t4e2LWrzmaz3XrrrUQ09CafiCRJ8ng8F1xwgSAIW7fujsUSJ159knEz3qUff33CbZqhMuxvAACAVJS+/v7351VVq6ioqK6utlr9o3q6zWarrq72+XyJhPLCC++cePVp+ThhGnT89TF1atsnY38DAACkojQViyV27NhPRJ/73OckSTJNk7Gj68/w+XyiKJ5xxhlE9NZb61RVO5HqY6gs2qkPV30CDappoLsIAACQitKS399pmqYkSfPnzyciTTvqTMPzvCAIixYt4nle0/TOzu4TqT5KzCBGw1UfZnJqwsReBwAASEXpKBSKmiYrLCyUJGnow2V6MU3T5XJlZmaaphkMRk+k+uhJxhgNV30YY5qCviIAAEAqSs9WX9eJyOPxENHRnhvqYT3RZrMxRvH4CTXg2jQYccNWH2JkaOgrAgAApKK0ZBhmT8ttmsfSYCeTydSAdaJhhPoAAABS0YTgcjmIKBQKHfMWEolET/PPcZSZ6T2hdlmJIzZs9SGOJDv+CgAAAKkoLWVnZ/A85/f74/H4MTzdNM1IJEJE3d3d0WiU47iMjBMqFdmcPMfRcNWHiEQ7lkMDAACkorRUUpLP8zwRvfHGG8fw9EQiYV2W9e677xKRz+fJy8s+kepj9/DWqq7DUh/RztncAvY6AABAKkpHkiRdcMEiInrppZcU5eiWpDAMw+/3M8YSicSWLVuI6PLLzxWEE+pT5gUut8I2XPXJn2bn0FUEAABIRWnr2msv9HhcHR0dmzZtGvqzTNP0+/3Wz7t27ZJlOTc3a+nSU0+8+hRWOQWJjr8+kpPLmWTH/gYAAEhF6cvpdCxYMNswjBUrVnR1dQ3lKYqi1NXVybJMRB0dHa+99hpjbOHCk51Ox4lXH0HiMottx1+frFKbIKGnCAAAkIrS27XXLiMiv9//k5/8JBwOD/zgQCDQ3Nxs/RyNRh9//PFQKJSZ6Vu+fMmJWp/CmY7jrI/k4PKmoKMIAACQitJeVpbvBz/4ms/nbmhoeOCBBxobG/s+RlXVUCjU0NDQ3d1tTUvY0NDw+OOPt7e3Z2X57r33tsxM34laH8nBT13sEW3csdVHcvCVC92SA/s/AAAgFY0H06aVn3xyFRHt3Lnz/vvvT70QnTHW3d0dDoc1TXO73ZmZmZmZmZIkPfHEEw0NDUR00knTiovzT+z6uLNFb4F4bPXx5AkOr4h9DAAAUqFhSFObNtWsXLmqsbGV5/lFixZdf/31bre7516O47Kze19vn5ube9ddd/3rX/+qra19//3NBw/6b7jhkrlzq07I+oT9mn+3rETMY6tPsEmTw5HiWU5fgYSdDQAAkIrSVCyWeOaZN1977X0i8vl8t9xyy7Jly4ayNgXHcXPmzPF6vatWrXr//fcbG1sfeOCRiy8+65prLnS7nSdMfQyV+ffIXQfU46yPHJEPrIvnVtqKZjox5hoAAJCK0s7mzTtXrHjZ7+8koqVLl950001lZWVDX65LkqTc3Nxly5bNmjXr+eefr6+vf+2192tq9l9//cXz5886AeoT9qutO5VkzByu+nQdUGNdRtFMe0aRDbsfAABSEaSLt99e/+ijz5gmy8vLu+GGG5YvX27dflQrw7vd7u7u7tLS0m984xtr1659++23m5raHnzwia9+9brFi08Z1/Xpakg2b5eJ0fDWJxQKNWxKlM2j7DIEIwAApCJID7FYwjTZrFmz7rvvvoyMDCLSdV0QhKNaGZ7neZ7nDcMgooULF86aNevRRx9taWkJhSLjvT6GyojRCNVHV0zsgQAASEWQLhwOOxF5PB63220YhtVyW/8fOlVVe57CcZzP57OGIefmZo33+vAiN3L1sblwPSYAwESHliCNlJYWiKLQ2Nh4tC19KmtB+B6maba3t0uSlJOTOe5To5fneG4k6sMLnM2JNWIBAJCKIG3k52e73c62trbXXnvtGJ7OGGtra4vFYqk3vvHGG+Fw2Ot1FRTkjvf62N2CINFI1EeQyObB3wIAwESHM2hpJC8ve+nS0158cfXDDz/88MMP97r37rvvLi4uHuDpNTU1jz32WL93LVky3+dzj/f62Fx89iSpY7867PXJmmQTbbg4HwBgosP34/Ry+eXn5udn971dEASfb5DlO46UCSorS6+66oIToz4F0539DgA6nvq4MoXCGQ7sewAAgL6i9OJ2O7/1rc83Nfl7bgmFos8//47d7rDZBrlu3G632+12jqMrrzwvtWeorKzIZjtBZnAWJK78VJcS+XRckZY0O/apbrd7iPXRjGTBdEdqz5DDJ/ACOooAAACpKP1MnTpp6tRJPf+sq2t6+uk3srNzysrKgsGgqqpHTAyC4Ha7o9HI3LlV5eXFJ2xwzBbd2Z/ut4mg0bYn6Xa7h1ifYCjpK5CcGRhbDQAAveEMWrrbsWMfYyw/P9/lchUWFkqSNECr7/F4NE0/cKB54tQn0qERo6HXh5mUCOnYrwAAAKlo/Fm3bjsRTZkyRRRFu91eVlZ2pIZfkiRr6Mz69dsnTn3CrdrR1ifUomG/AgAApKJx5sCB5sbGViI65ZRDi3UIglBUVHSkMTSzZ88mou3b9wYCoYlQn0RIl8PG0dYn2qFrMmayBgAApKJxZfXqDUQ0adKkOXPm9Nxot9tLS0v77RGpqqryer1E9Oab6yZCfQIN6rHVp6texd4FAABIReNGPC5v2bKb5/nrr7++112CIBQXF/fbI3L22WcT0fr12xUleWLXx9BYpF0/tvqEWlQTg4sAAACpaFwwTbZixUuBQKioqGj+/Pl9H2Cz2YqLi+12e6/b586dm5WV1dbW9dJLa0yTnbAFYtRSI2uyeWz1ScbN9v0yMexoAACAVJT2Nm3asXr1RiK67rrrXC5Xv4+RJKm0tNTj8aTemJGRsXjxYiJ68cU1NTX7TtT6hPxqd6N6PPXprFWjnRh2DQAASEVp3uSHIitXriKixYsXL1u2jOOOOMcgz/P5+flOp7PnFo7jzj777JkzZ2qa9o9/vBSPyydefTSFte1JHmd9TIO11CiGhv4iAABAKkpX4XDs+9//XVNTm9vt/vKXvzzo4wVBKCkpcbsPW+bsiiuucDgcTU1t9933UDgcO6EiUdLc925EiRjHXx8lYuxbE9WSuB4NAACQitIyEv3lL08HAqGsrKz777+/sLDQNE3THKTZ5jiuoKAg9URSbm7u9ddf7/F42tq6fv/7f54wwUhLmk1bZU1hw1WfZNw8uDmBYAQAAEhF6SUUitx330NbtuxijN19992zZs0a+nOtq65STxXNnj37sssuI6IdO/bdd99DoVBk3Ecihe1bE420acRoGOsT7dD3rYlqCk6lAQAgFUEaME22YcPHP/vZX7u6gllZWT/96U9PO+20Q1FAG+qIYI7jSktLCwoKeP7Qxzp//vzbbrvN4/F0dQV/9rO/btjw8Xi9Ko1RqFWtWxvTZDYS9dFkVrc2FmpVcVUaAABSEYwlRUk+/PB/HnzwiaamNo/H88ADDxxDk9/D5/OVlZUJwqHVT2fOnPnFL37RGmP04INPrFz5RjI5ziYwNHR2cFuiYWNCiRgjVx8lYjRsTPj3KKaBZAQAgFQEY6GmZv999/3Wugh/2bJlDz/88OTJk627GGODjpjpl81mq6ioKCoqskbSVFZWfvvb366uriaiZ59966c//UtTU9t4qU+0U9v3btS6CH8U6tO+V6n9MCZHMMMjAMBEJKIEY2jdum0PPbSCiLKzs2+++eZly5b13MUYU9Vj79ThOM7j8Xg8nmQyGQwGbTbbbbfdtnr16jVr1uzf3/jd7/7q3nu/fPLJM9K8PsFmtfGjxCjXJ9od3ftOrHKh21cgYRcFAJhQ0Fc0Zmpqah9+eCURzZs378EHH7zwwgt77tI07RjODfXLbrcXFhaWlZWVlZVdddVV99xzT0lJCRH9/vf/bG5O6x6jaKfevF0eq/oc3JxQIgb2UgAApCIYca2tHb/61WOJhDJjxox77rmnsLDQmorQNE1d103TZGw4R7fwPG+323NycmbPnv3Tn/500qRJ0Wj8hz/8Q2dnd3rWR4ma9RtihsbGqj66yva/H1MTuGIfAACpCEbYc8+9pSjJioqKX/7yl5mZmdaNpmlqmmYYI9tFkZOT88tf/rKoqCgel//znzfSsz5te2VTp7Gtj6Ex/24Z+yoAAFIRjKDNm3e+//4WIrr11lut5UutUTLDdVZoUE6n87rrriOi997bvGfPgXSrT9ivhpq1dKhPsEmLdWGtNAAApCIYGZqm/ec/q4jo9NNPX7BggXWjqqrDe0poUOeee+7UqVOJaMWKl0f5pQdmGofWOEuT+rTuTGISIwAApCIYEZ2dwY6OgMPhuPXWW3ua/DF5J3fccYcgCB0dgY6ONBpdpCZYMm6kT33UuJHE6CIAAKQiGAnbtu1NJJTJkycXFRUxxpLJ5Fh11ZSUlJSWlkYi8bq6pvSpT7RDM3VKn/roKksEMX0RAABSEYyAdeu2EdGMGTPsdvuoDZTpl91unzJlChGtX789feoTbFbTrT6hVgwtAgBAKoLhpmn6/v2NRDR79uxhv7z8aHEcZ03ovHNnraalRXeIabBE0Ei3+sQ6dSwDAgCAVATDrLGx1fphxowZuj72QaSyspKI4nE5EAilQ316Jk5Mq/oYGtMUpCIAAKQiGFZW+JAkKSsrKx2u/LLmcSaijo5AOtRHlc30rE8yhnmuAQCQimCYU1GYiAoKCo5tWdNh53Q63W43EclyMh3ejyaz9KwPzqABAEwEWB12VFn9H4qibNq0KU3ekrWSBuozLuoDAABIRSearq6u+++/H3VAfQAAAKloQvN6XSjCAAQb+mYAAACpaAJYvnzJ8uVLUIcjyZ/qyJ/qQB0AAGBMYLQ1AAAAAFIRAAAAAFIRAAAAAFIRAAAAAFIRAAAAAFIRAAAAAFIRAAAAAFIRAAAAwGAOm8Xxnuu/j4oM4IGnfooiDAD7D/Yf7D/Yf7D/YP8Z19BXBAAAAIBUBAAAAIBUBAAAAIBUBAAAAIBUBAAAAIBUBAAAAIBUBAAwJLpu6LqBOhwJMxkzGeoAJyQRJQAAIKJQKLJ+/cebNu2Q5SRjLDc3a9GiuQsXzkVlLJrCQi1q2K+aOjFGkovLKrFlldpQGZhgqchU2vd9uKp2a7scM4iI9xTknXvO/FPK3ageAJwI4nH5/fc3P/vsm5FIvOfG+vqWTZtqXn753euuu+ikk6bzPDdh62NorPug2r5X0dVPu4jkMEX8emddsmimw5sn0QQrj6pqNpt0PFvQdUMUBfz1jcNU1PjO4zs2poSkWHv7i0+9vvWsc760KBsFBIBx79FHn1m3bjtjjOO4z3zmM9OnT4/FYps2bdq2bVtdXdP//M+jN998xQUXLJqw9WnaFg+16sSob30SQaNuXbx0jjO3wj4RSvHOO+veemvtzp37NU3z+bzz5lXfdNMVxcX5Q82Xhrl69bqXX15dV3fQMEy323neeQsvvPCsysoy/BmOn1RElFl89aUnzy72EOl6e+0LT+3YoZhN72/fdfo51Qi6ADB+aZr+yCPPrF27TZKka6+99rOf/awkSYZhENHy5csbGxv/8pe/1NTUPPHEiz6f5/TT50y0+jCTDm6Lh1r0gevTskMWbVxmyQl7Nk1VteeeW/Xkky92dAR6buzuDjc0NL/00juLF8+/5ZZrZsyoGGALum688srqf//7lQMHmlK2EHr88WeffPLFJUsW3HjjpVVVU3geg33H2BA+gPJLvnLm7GKPFaLEgqqrLyoQiYi6GxpQPwAY170gTW1r127lOO6uu+76whe+wPO81eQfOviVl992221TpkzRNP2RR1YmEspEq48cMULN2qD1YSY1bZcN7cQcgq0oyXvv/dWDDz7W0RHgeb4gL2/2rOqTT5pVVlLsdDp1XV+zZsMXv/jd1avXH2kLhmH+7Gd/+MUv/nzgQBPP8/l5uXNnn3RS9cz83FxJknRNf/vttV/72g9ravbhT3I8pKI+D8n1FRER8SKGagPAuLZq1VpN00899dSzzz5b07S+D5Ak6aabbvL5fPG4vGPHhGu0ug4ozKSh1MfQWLRDOyGL8KtfPbp+/VZREGbNnLns/PPnnnyy1+PhOC4nO3v6lMrJk8o4jnRd/5//+cuuXbX9buF///evr732HhFNqZh8/jnnnHrKfLvdIQpCcVHhzOnTKiaXi6KYSMjf+tb969dvw19l2qei3mIH2pqIiHKmlaN+ADBuGYa5du1WIjr77LM5jmOs/64Or9dbVVVlmmz//oMTqj6MUahFG2J9iFEieAJOZ/Dii2+9/PI7pslmVlVNnzbNNM329rZEImHdy3FcZkZGRflkURCCwci3vvXTSCTWawtr12554YW3OI47efbs2SfN1jSttbUlmTzU78jzvNfjmVRSIoliIiH/8Y9PqqqKv81xk4qMaNvHH654J0rEV5x7UgXKBzC+aApLhPSwX+v5LxHSNWWCzj3T3t6lqhoRVVdX67re72OsJio7O5uI6uomVipKxgzToKHXJx7UT7AK6Lrx0kuriahy8uSpU6YkEomurs6+DxMEvqykxDTNeDze6zxaNBr/2c/+RETFhYWTy8s1TQuFgr2eznEcz3OFBQWmae7f3/Dmm2txpBpDQzsJVv/q/3zUcxmamFNw2QW4Mh9g/GjamogHdS3BDL3/ACSInOTi3Fli2TzXxClLz1SN4hGGA8TjcdM0I5HI9u3bicjhsE+o3aanb2iI9eHFE+3q/EgkunfvAUkUy8vLGWOBQCB1WNVhHQw87/N44rL89tvrLr/8/J7bd++uDYXCkiguOO00wzBaWpqP9FqSKLpdrngi8fvfP3HRRUsEAcOu0zkVHX4kCbS/+tJG/aqFC4odKCDAWDftqimHjUTQUCKHjtdF1U6b67BDauCgSuywI7jT6SQiWZZN0yQiQ2dGhClRtVcqUhOmf5ds/ezwCa4swZkhiLYT5HidnZ1h/dDa2pqRkdH3Ad3d3fF4/Le//W0wGHS5HDfddOmE2rUkBzf0+ggSV3LSiRapN23aoaqax+32eT2Kouh6/wOnNFUjIpfLFQyHa2r2pt514ECTYZh5BblEFAx2HyF9MtNkRJTh88UTiWAwEgqFc3KycHBL41RUccn/rbiEiAwl1N6w8dWdawNdr/5jNd22bEEO4izA6H+JN1kiaES79Gi7JodN0zisB8jm5otmOnv+qcQMKxJ973vfmzZtmtfr9Xq9qqpaw0RkWe7s7Ny/f/9DDz1EjJSY4fB8OuFGoDEZbO5pCTQi4gXOmcF7CyRvrujKErjxPLehx+OqrCw7cKDpww8/rKqq4rjDfhdd1zVNW79+fSgU8nhc99775aFPS3OCNA823pUpJELGoPURbNyUhR6H90RrD6xzpk6Xk+P4I2UaWVasPyWbJDHGEgklFIpkZvqse7u6gkTkcrpM0+wZjdSLoiStLiinw2EYhiiKbW1dSEVj5eh2YsGRWVx14W2nLXIQUWzV+40oIMBo0xTzwIZ47Qextt1KvNuwIlFubu4pp5wyefJkIgo2HfaNVgkf6kNasGBBcXGx1+tNJpM9I2edTuekSZOWLFnS68EWa1OTJ08+5ZRTCgsLeZ43DRbvNtp2K7UfxA5siGuKOa6LuXz5EiL68MMP+7ZY0Wg0Eom89tprjLHLLjtnypSJOM9e3lT7UOqTP9XuyjoBZ6/rGTodi8WSyWTfB+i6oShDmq+BMdbv2TdN14e4BRilLwPH8qRJ08o3rN1Lelc4RJSJIgKMXiSSzX3vRTWZEdGcOXPOOOOMmTNnFhcXW2fE9u/ff/fdd6sJU5VNm/PQdx5rlYacnBzrMf1e4SJJUk5OTiAQSF3SQZVNNWES0be+9a1Zs2YxxiKRyP79+zdv3rx58+bGxsZou77v3ej0JV7JOV47CaqqKrKyfIFA4J577vnud787adIk63bDMNrb2x955BHGWGlpwfnnL5yY+5snRxQd3MD1sXv5E3Vi66lTy4kokZBlWe73AQn507Co6prdbrfbbU7np4NLCgvziCipqqFQqP8txBMpGevQcPWeriYYJ6mo9UAzEZGYmzHMkcg0maqqyaTW3t5lLUjk87kLCnLtdslms03kdYgAPvnGScwkURR//OMfn3rqqdaNPd9ip02b5nK5EomEHNZtzkMTDSdCOhFZ7Vm/33cPfdmZNCkQCCRCOtGhFk4O60TkcrlmzZplxSmHwzF16lSHw3HmmWfu3bv3r3/9KzOJjdsr2DRNe/nld4PBiDXQqqCgQBRFq2UKh8MNDQ2tra02m/T973/F5ZqIgyhNg3XUJnWFDVAfXqApi9yCdGIenJcuXfDgg3/TVDUcDgmC0Hf/MfRPu3+s5DRnTpXd/ukc38XF+TzPd3R25GRl9W3CgsHDolI4FhUEISPDV1JScCIevMgwGDMoGTOsb1+ijbN7BE4gQeDSZx29QVNRaO3bq5TKcxaV5TlEIl1vb9q4evv7cSKSFswrH8bDk/7xx3s//HBrU1NbW1uXpukp32LFwsLcsrLCs86aP2/eTLSLMJFxPPECpyb1nm/tvS6Znjp16scff6zGWUr3EiOikpKSgedBKSkp2bp1q/XgQ99948zaIGOs7wx+xcXFRMQLHDc++4k0Tfvd7/65ceMOIrr00ktvu+02QRCsYhqGEYlEVq1apev6GWec7PN5JmYkavwoHvbrA9cns0SSHCfs8NLs7Mzp0yt3765t7+wsLizsda+eEok0TYtEY4IgLF26IPUxc+fOzMnJ7OzsbmhsnFw+KXVBj+Thf49JVQ0GQ6Io3nnnF060OGRSpF0NNmtK1EzGDGYedkCzewSHl88us/kKpXR4t0PoK0ru2vTRrk0fHX4jX3HWkgvLh+NvwTSZ39/x2GPP1dTUEpEoihkZGS6XS5Ika1dLJBJNTW1NTW3r1m0/88x511xzYUFBTq9xfwATBC9wvMARkd/vz8/Pt5qo1AfMnDnz448/ToSMT/qWmLUOQ0lJCRuwV6ekpISIDI1Zi6QSkbWR6upqxljPc3uilXVGoOf9jC+RSPyRR1Zu3LjDZrPdeuutV155pWEYPfkyFApt3ry5traW57nLLz83tSULh2N/+9uzt9xyxYl9jkNPmk3bEmG/PnB9iKP8afbUo7GeZE3b46VzXCdGVBIEftmys3bvru3o7HLY7FlZmam/bM+K97ph+Ds6GGMZGZ4lS05L3YLL5fzmN7/w05/+IRqPBUOh7Kysni1YV671bKGjq4sxVlk56cILzzqR+oeUmNG8XY516Vb7np2V06t9DwQCSsQItWhZZbbCKofdxY9tv9GgqSizetYlHbvXNsZDiklEoiCVlZcuOvfkaTnDlOreeWf9k0++IssKES1ZsuTKK6/Mzc2VJCm1an6//4UXXti4ceMHH2zZvn3PbbddMwGXaQSwvlpZfTNdXV1HCjccx8mfpCJTPzRHUUXFINOuWg8wdGbqzDohIocMjuNKSkpSO4p6msbW1tbU9zO+/PWvT3/00U6bzfbNb37zvPPOS23ydV3v6OhYu3YtEc2fP6u8vCj1ie+//9HGjTu6uoLf//5XUoePnGAObk1E2vRB6+MrFJ0Zh51X6j6YDLfqaiI+9UzPiXFa7aqrLty9u/aNN95v9vsjsVhpSbHY51RaU3MzcZzb7frVr+7Nz8/pde+FFy7etm3Xs8+uam71q5pWVND77FhClju6ujRNs9ls3/jG53vC1gmgqyHZulMxdTaU9j3YpEbatbK5zszisVxmePC+oszyBVeULxiJ1zYM87nn3lq5cpX1ffSWW26ZM2dO6p8fEUmS5HK5cnNzZ8+evXHjxhUrVjQ0NDz44BM333zFhReeiZFGMCH7isjqK+rbUURExcXFPM8rMSMZN3mB9KRp6sRxXG5u7sBbzs3N5TjO1ElNmKKdTIOUmCHwQlHRYbGgZ9ipdVESL9D46iuKRuMPP7zyo492Op3Ou+666+yzz+51zOns7AwGgy0tLZIkXXvtstSOotbWjqeeep0xVlfX9JOf/Onb3/5iXl72idZLpLKmrYlImz5ofXiBK5rpTO07UaKGf7di5enaD6IVp3t6zZuVRr+mbtTXN3V0BCKRmCiKPp978uTS3NzsvnMn2mzSd7/7ZU3T16zZEAqHo7FYYX5+Xm6O1TzxAm8aptPlVJTk+eefedJJ0/t9uc9+9pJnn13FGHM5nIf1pDDW0uZPJGSe50tKCr/zndvOPHN+v1tQVa22tjEQCIXDUafT7vN5KivLsrMz0/a0CWPUvldp26McbfvesDFROoflVtjHqsdoLBd43bFj33PPvUVEl1xyyVe/+lW73d6rZL0sWLCgqqrqd7/73YYNG1aseKmwMHfu3Co0kzDRiDaeyIjH49RnUJHVV2QtbL53ddQ6YBoaczqdDscgHRsOh8PhcMiyXPtB3DqoESOe560za5+2fJ9cRWylonE3o+NTT71mjSX6r//6ryVLlvQ65jDG4vH47t27E4lERUVJfv6nocc02VNPvabrel5eXiQSqa9vefDBJ37+87tOsL3Lv0sO+7Wh1MeZIRwWehj5dyvMJKs+cjhZvzE+42xvOvaEHWz97/9+sLGxVVVVa/pEURScTsfFFy/59re/1PfxHo/rxz++c8OGbT/60W9jsUTq+Dy3yxWNxlwOZzQaG2BBmJqa/VbA8vm8fXsHbDbb6afPvffer1gXrPW1ffvuBx74S2trh67rhmFab9jjcZ9//sI77rgpPfssox1a+17l2Nr3lhrF5uZ9BWMzzGjMjmgHDjQ/9NAKwzAvvPDC22+/fdCSWXw+36233jp79mxdNx56aMWBA81oI2HCpSIH19NX1Jfb7S4vLyfr3Jl2aFCRx+PpewVNL4IgeDweK0UZGrM6vcvLy91ud8o3bL1ngFEgEOh5M+OjF0Q3/vOfN95+ez0Rff3rX1+6dKlpmqnHHNM0m5qaNE175513iGju3KrUJT5CoUhNzX5Jkr7xjW9873vfc7vdBw40//Snfw4GIyfGfsVM5t8tBxrUIdbHWyAKKUt8aIoZ7dBS6yOHjNoPYmk1o5Vpmo8//uyNN3577976ZFL1+Xz5eXk52VmiIEaj8aeffu2aa76xeXNN3ydKkrh48anWzIrOlC8YgiAIguBwODiO27evfteu2n5fd8OGbUTk83pTu3Z6uiFFUfjCF64sKsrv2/Ejy8rDD//7zjt/Wl/frGl6ZkZGfl5eVmamwAuhUGTlyje+/vUf1dam3cyBiZDRsCnBGB1b+85M1rAp0TM4cqL0FT399OuyrFRVVd19991ENJSSWXJzc7/0pS/97//+b2tr6yuvvPvNb96IZhImFMnFEVFj4xEPhT//+c/7DqwetK/I5XL9/ve/73Vjr8N0OBzu+bmzs7PnzYwLW7bsev75tzmOu+GGGy6//HKrjTy8BZKTyeT+/fuj0SjHcb3mKHruubcSCWXy5MkzZ850OBzf+9737r///pqa2n/848VvfONzqSfaxqlwm9a+LznE+hBHveYoaturmDpNmlySWp9Yl9KyQy4/1ZUOJ3oYY3/728pHHnmaiLIzM+efcorb7W5vb5flBBEFurv97R3NzW133PGjP/7xx6ecMqvX0zVN73vCmuM4h9NhGAbP88lk8s9//udvf/uDvlHs44/3chyX4TtshH7PCBDDMPtt/hhj//jH83/720oiys/NPWXePLvd7vf7VTVJRKFI5GBT8+7dtZ///N0rVvw/a2qlNOHfLZs6O872vbNWKT91DNZbHZu/5Pb2wK5dddbVDUdVMiKSJMnj8VxwwQWCIGzdujsWS6CZhImVimw8pZzJ6svhcDj7GLRZ4jiu77N6ZanU6Y4OpaJxcgZt7976v/zlacMwzznnnJtuusmaa6BXq29dVbd3714imj69PCcns+euSCT+3nubiei8886zajJ79uyvf/3rRLRhw8dPPPGidSJm/IoFtKatMjEaYn3cWYItZepOXWXBJrXf+oRbtZYdMqVBedav32ZFolkzZ565aJHNZjt4sFH+ZBrG7Kyswvw8l9NJRA899HdF6T2zl67rVkEk22Fndqxe2PzcXCLaunVXIBDs9cS33lrb3t7F87zDbu/7RyeJIhH1fTkieuGFt6xINHPG9IVnnEFEjY0NViQiokyfr6J8krXNn/3sT+mzLyXjZrxLP/72PdymGeoY7Ddjc0T7+9+fV1WtoqKiurqa+hsxOjCbzVZdXe3z+RIJ5YUX3kEzCROKYOOIqLu7e+jHmmFhGEZPKuqZwch6M+ne5McSjzzyTDwuFxcX33nnnda4q15NfiKRSCQSpmm2tLQQ0YIFc3r1MyWTqtfrvfjii3tuPPvss6+77joi7u23N3z88d7xu0fpqtm8TTY0NvT6ZBQflgwibZppUL/14Xmhu1GLdGhj/muuWPECEZWWFE+fNo2IWlqaU39HjuOcDkdWRobA83v3Hnj66Vf7pCLjk0FIh51jEXjebrd73G5RFA3D7LUnGIb55z//k4h8Xo914VUPMeWffVNRIiH/+9+vEtHUKZVVM6oMw2hr633S3OvxZGVmEtHu3bWvvLImTXanlo8TpkHH376bOrXtkydEKorFEjt27Ceiz33uc5IkmabJjnJyXJ/PJ4riGWecQURvvbVOVTUCmDh9RZ8M5Uk9nzUKVFXtOcBFo9Febyad/ec/bzQ3t2dnZ//kJz9xOByMsV5NvmmaVteXaZp+v99mk6qqJqc+YM+eeiJavHixzXbYNcOf+9znzjnnHE3T/vSnf7e1dY3TPcq/W1Fi5tDrwwvkzjksGcS6tAHqYxrs4JZEMmaM4e/Y1OTfvn03x3FTKipN02xvb+v1AGvhelEUMzMyiOgf/3i+16ynmqYdqYG32W0cx9lskmmaH364JfWu/fsb2tu7iChvwItA+45O27+/sbGx2eGwT6mo1HW9tbWl3ye63S6ru+jvf382dVbJsWKoLNqpD1f7HmhQey19fWKmIr+/0zRNSZLmz59v7WpH/aZ5XhCERYsW8TyvaXpnZzdaSpg47B7RumY1GAyO5uvG4/GeA9yhRZ04snvENC/X+vXb33jjQ47jrrzyyrKyMive9TpSJ5NJ60DU1tYmy7LH48rNPWzF8traRo7jZs+e3WvjHMd94QtfyMvLC4ejf/nL0+PxG1qoRQ3UqzzHD70+go23Hb7yXTxoDFwfPckObk2MfgvX4/33N+m64bDbs7Oz4/F4v/O8W1nQ43YTUTQa3769d6+P1Vdk73MiTBQEQRA8Lrdpmhs3bk9NJ7t27TdN5nQ4rHNzvYrT8/++7eCqVe+bJsvw+lwuVzQa6ZVTU2VlZBiGEQiEWls7xnx3UmIGMRqu9p2ZnLUU4wmeikKhqGmywsJCSZKO+RSAaZoulyszM9M0zWAwipYSJg7RxtmcHBE1NDSM5uumdk1ZUzjanJyY3mfQdN149tm3iOicc865+uqr6Qj9+aFQyMoB69atI6L8/Gyv150SB+WWlg6Hw9HvTJiZmZl333233W7ft69h8+ad42tfYiZr25s82vrYnJxoT5nPWjWTUXPQ+iS6Deua/zGxZ88B+mT0T1dXZz+lSOkhs051tbV1Ht5XpDN2xBba43E77HZN0zo6AmvWrO+5/b33NjHGMjL6mQld4Hn65Eq0aDTe617ryrLsrKxPv4Qcgc1m43le1/V4fOxH2epJxhgNV/vOGNOUCdBXZFXKugaYHevCktYTbTYbY5QOuwLAaHJlCUS0ffv2UWo7Gevs7Ez9tlpbW9vzNtLZCy+8c/Cg3+PxXH/99dao2L7fuQ3DiMVi1g9btmwhonnzZqZeU7Z5807GmMvlysnJ6fdVpk6dunTpUsMwH354ZTp8Xx+69n2KEjGOtj6+Qil18H6k7dAqwgPXhzFq2pZQomNzlsdaW9M0zUik/5kUUlcls347SRJ71cE0Te4Ily1wHOdyudxuN2PsySdftF4uHI5u27abiNxO18Bv70hrFJqm2d0dONKzDNO0lg3hOI4xGnihw9FhGoy4YWvfiZGhTYC+ImsSql7Z/Kj0DPkc5dGmAGkis9RGHL333nsDXIk2rC2KlvptNRqN7tq1izjKLLWlc5UOHvRbU+d/5jOfsRbTNU2z7zGnpw8sFotZ7UpV1WF9Hu+99xERnXTSSUea3UCSpMsuuywvLy+RUJ555s1jbgxGmRwx2vYkj6E+7pxeq3yoQ6yPqVP7XmVMrkcrLS0kolA0MpToYD2m19od1gyKA8z7JYpCUX6+aZrt7V1dXUEievbZVdYwaq+3/wWGHZ9MwJhIJPt9w9FEfIC/8Xgs3pPYRFHIyEiDOTMZjff2fQxSkcvloMG6BAdmTaprlY/jKDPTSwATiTdXcvoERVHuu+8+azbFkRMKhVLnRgqHww8//HAymXT6BG+ulM5VWrNmE2Ns2rRpN95445GOs4wxqyOEiDo6OojIZpMqK8tSGkitrq6ZiE477bQjvZA1qcGll14qiuLWrbvHy7yO3Y1JIjra+vACubOk1L4Ba7a9IdYn3KaNybyO559/JhHFYvGOzkE680LhMBF5PK4ZMyp69Tb1fKXvl81m4zhOksRQKLpjx95EQn711TVEVNxn4bPUylhX5geDvRvESy89T5LErs6uWDzeX+eCEY/HrdOdXd3dRJSdnVFUlD/mOxUvccSGrX0njiT7aKeUMUhF2dkZPM/5/f54fx/2oHq6QLu7u63J1tIiIAOMIkHiKs5wczzt37//gQceCAQCffsnGGO6rieTyUQiEYvFIpFIKBTy+/379+/fu3fvli1btmzZsnfv3v379/v9/lAoFIlEYrFYIpFIJpPWHNamaba1tVkXH1kbTCQSf/vb31paWjieKs5wp/Pyn5qmr169geO4Sy+91Lowqt/LYXRdT10K3vqOnnrqpKMjoGkax3GzZs0a4OUyMjJmzJiRm5ubSCgPP7zy2L4ljybTYIFG9Rjq4/AKqesBq3GTmTT0+pg6HdyWGP3utBkzKubNq2aMdXR09vvqdpudiDRdi8bjRHTZZee7XM5eQcQ0TUk84uUFPM+73C67zW6a5quvrmlt7QgGwxzH5eXlDvr2+uatKVMm5eVlq5oW6Ar0+rtOyHIkErWG9muaFgyFBEG45JKz7fax77u1OXmOo+Fq34kodQTb6BiD60dKSvJ5njcM84033vjMZz5zDEHSGtb+7rvvEpHP5znxFmgEGMrRp2yu8+AWee/evXfdddfpp59+wQUX2O32gwcPdnV1tba2RqPRWCwmy3IikVAUJZlMyrJ8pNaa53mn02m32x0Oh8vlcjqdHo/HZrPl5uY6HI6cnByO4zZu3FhTU2MdqsrmOntdhZRu/v3v12Q56fF4Fi1adKSOEDr8nFF3dzcR5eUddvVZOBwzTdPtdh9p0ExPP4EoildfffUf/vCHrVt3Hzzonzy5JJ3r498tmzp5PO6jrY90+IKvWtJkjHncnqHXJ9quKxHTmTHag9Iuv/z8rVt3haOR9s7O/Lw8/vABQjzPOZ1OM246HPZEQn7mmddPOaV68eJTU3O2aZoCP9DbdtjtGT6frChbtux64YW3YrGE2zXQiCL7JxMZWGfcPs2aqvr//t+j7e1d1tzZKe9BSyQ+/SvWdL3F7xcEYcaMys9//vJ02K/sHp44IkbD0r6Lds7mHu39ZAxSkSRJF1yw6NVX33vppZfOP//8QRci6JXWreWfEomENe7v8svP7bvKMcBEkD3JbnPzzduVcCS8atWqVatW9X0Mx3GSJFkXu1oTgfA8nzqU2Gr2dF3XNM3qVdI07Yhf5Tly+ITSkx2enLQ+dxYOx9as2UREX/ziF71er/UNu99fKvV2awBNr1QUiyWIOOuS9YG5XK7Kysrp06fv27dv/frt6ZyKtKTZfVA7tvrYDl/jxdCIO/r6BFtUZ4ZzlH/riy5asnlzzauvrmnv6NRULT8v1zrn9WmmcdiJI0EQOlhXQpZ/8Yu//PGPReXlJUNPRUSU4fO1+P2qqv7nP68Rkds9yGonkk2i+GGRVNeN3/zm8ddff4/juML8PGv+JDp0NjPe87OSTLa2tXEc5/N5v/a1z9lsafEnyQtcboWts04dlvY9f5p99JeKGZu5Rq699sL33vuoo6Nj06ZNZ5111tD71npWxNy1a5csy7m5WUuXnorWESYsT440dbEYaVNbdyp6khGR0+ksLy8vLCwsKCgoKSnJzc11u93WbMWqqiqKMkAqss4RWGOr29vb29vbW1paeibRFu1c8SyHr9Ampv181o2NLYqSzMnJueiii3oOuIM+y+q6Lyo6bN3yQCBsmqbP5xv06Q6HI5FIzJ49e9++fR99tPP66y9J2/ooYcPU6djqY/ccFgs02WSMHW19In69uHoMfvHvfvfLdrtt5crXA8FgKBKx22y5uTnZmZmpnT2SKBqGoSSTgUDw9tu///vf/3DatMlWKtJ1w2EfpJkXJTEnOysUPjS2LCd7oFMZHMdZw7dDoU/Hov3mN4+9/PJqjqPCgvyCvLzUDiTrh4MtLcw0VU0TRTE7O+PnP//O3Lkz02fvKqxydh9Uj799l5xcziT76L//sUlFTqdjwYLZ77yzYcWKFTNnzszNHfy0q6IoTU1N1s8dHR2vvfYaY2zhwpOdTgcBTGCijfMV2tr3JQ2V/vd//3fGjBkDPz4ej0ciEVVVB7gYx7oiqUdTU9NDDz0kSNy4iEREtGPHfl03Zs6caY2YGeLlMMFgkOM4p9N+eBSIElF+/uDjWK2FIKZMmSIIQnNze3Nzm3UZURqKdGjMZMdQH+JIELle3U7HUB8laigRw+Eb7ZMjNpv0ne/cNmlS8csvv1NbezAhy51dXVkZGandOYIgZGT4DNPs6OoKh6P//d+/+fnP766sLLMuth9075dE0evxhiNRxpjH7bbbBhnrY710z4KeTz75wjPPvMEYy8/LzTv8pGQyqRJRJBq1vtvk5mbPnVt9++3XpdW6sEQkSFxmsS3QqB5n+55Vah+TkYtjdu7p2muXEZHf7//JT34y6MIFgUCgubnZ+jkajT7++OOhUCgz07d8+RI0igDMZNYqVAOP7bC43e6ioqKysrL8/PwhrvTudrvtdrtpEBsna6Bu3bqbiKzZdQ+VaAjDexVF4TjyeA4bCNLdbV2R5Bn06dbUf/n5+W63m4hWrVqbtvWJthvHVh8rhR/eV8SOrT6d9cpY/fqf/ewlf/3rz/74xx97PC5ZVpRksm+Ay83JsUJJQ0Pz3Xf/vK2ts98FXPvl83qsQdm5uYP/PVrB1Ipc//rXS3/+878YYznZ2UUFBal/npFI1OrPiycSHMctX37Of/7zu1/84jvpFokOdRfNdBxn+y45uLwp9jF582OWirKyfD/4wdd8PndDQ8MDDzyQeulvD1VVQ6FQQ0NDd3e39Ufb0NDw+OOPt7e3Z2X57r33tsxMHwFMeKZBhspsNtsAk6n0/svn+YyMjPLy8uzswS9WsNlsTqfT0ExmjoNqdHR0Nze3E1HPAhQDTHwiCEJP0axrWn0+z+FRQCWijE/Gdgz8pd9ijV/+6KOd6bAuVV/JuGFNpXgs9SESD79S2tTZsdUn7NfHcHdyOOyzZ8+YPr2CiJpbWvv7A+HycnMmlZaIouj3d9577//buXMfEQmiyA021EUURZfLJYqi2zn42ClJOHTG5p//fPHPf/6XpunZWVklRYWpr6LruhWJNE2LxeMej+fyyy/IyPCm7ZhaycFPXewRbdyxte+Sg69c6JYcY/PbjWVNp00rP/nkKiLauXPn/fffn3ohH2Osu7s7HA5rmuZ2uzMzMzMzMyVJeuKJJ6xVDk46aVpxcT4BwKG+IuZ2u222o7s0VxTFnJycQYfKiqLocDhMncZwHauh27Jll9W/VVpaeqjlHtp18oZhWGt8pt5oLbPYa7XzIwVNqyWzFraU5WSvC4vSRLhNO+b6EMdx/GGZQE0Yx1YfUz/03LEiCPx//dctHMfFE4l+Z0rkeT47K6u4sIDjuN27a5966pUhbpnjuNzsbLvdLopHMUblt799IplUvR5PWUlxr05c69wZEQUjYUEQcnMze82llIbc2aK3QDy29t2TJzi8Y7bA4pi98KZNNStXrmpsbOV5ftGiRddff73VrdqzV/X9Cpubm3vXXXf961//qq2tff/9zQcP+m+44ZK5c6vQKMIEJ4cNIjrao3DK92ZHYWFhW1vbAO2ZtWU5bDi86b7KR319CxGdfPLJVhs88Lkhqy/EMIz29nbrll6TvqjqoeUshv4GvF6vy+XSNDU9FyOy9pZjrQ/jD9/FrEB1DPWRlYSuMfuYlmLatMnV1VN37twfikQKj3C1VGZGhslYS6vfKtQQTzp7PO5ivoAbwgVUqZNjZfh8ZSXFvZ6lG4Y1BNAwzVAoLIriddct73WeN+2St1/z75aViHls7XuwSZPDkeJZTl/BGFxYNwapKBZLPPPMm6+99j4R+Xy+W265ZdmyZUOZ25vjuDlz5ni93lWrVr3//vuNja0PPPDIxRefdc01F7rdTgKYsKkoYljf/o+2ryi1oRIEobW1td82UhRFp9NpvVBWepeCMdbS0k5EPZMKDnx1lRX4VFW11hngOM7hOKyltg5NR9XqE1FmZmZbmz8dF65mlIyyY64PUe/R1uzoU5FVn4Q/oStj3/X4mc+cs3Pn/kgkWpCX12+I4Xk+JytLVdXOrgBjjBvyleLuodWkZ4Mup7OstEQ8/CS4aZo9y3pEYzEiKizMu+665Wn7B2iozL9H7jqgHmf7LkfkA+viuZW2opnOUR5zPdqpaPPmnStWvOz3dxLR0qVLb7rpprKysqEvdyJJUm5u7rJly2bNmvX888/X19e/9tr7NTX7r7/+4vnzZ6F1hInJWkLBmmvxmDficrmys7P7XT+E53lrHPeYrNVwVHTdsAauFnyyzMKg44idTqc1UdMnEfCwZskaVzSUM0SpL+Tz+VpbW9NwoUbGyDTM46lPr6uwrHFFx1afdBimdvrpcyVJTMhydzCUk511pAa7sKDAbrM3t7YOfxssSVaEmjypTOwzLlBVtZ7zm/FEXJKk5cvPTuMuIrV1p5KMmcPVvncdUGNdRtFMe0bR6E3bPaqp6O231z/66DOmyfLy8m644Ybly5cP8c/ysADudnd3d5eWln7jG99Yu3bt22+/3dTU9uCDT3z1q9ctXnwKGkiYiH1FQYOICguP9zrw7OzsUCjUb+eBdXmt9UJpHRA13RrjnPnJJDSDDpqxfmvr2M0Y27hxR+pJDWtdhaEMY0+dBto6zyLLSrrVxzQYMe6Y60PEhVtVXuBSNkjHXB9DH/u+ouLi/IsuWvLSS+/429uzMjOOdIKM57isrMykmrRJw3xORxJFl9M5eVJZ32RpMibL8qEdW9cTCdnhsJ9xxrz0/NPrakg2b5eJ0fC276FQqGFTomweZZeNUjAa1VQUiyVMk82aNeu+++6zrlnQdV0QhKNaM8iag846cC9cuHDWrFmPPvpoS0tL6ixYABOK9eUsLy/v+DdVUFDQ2t8XYmsGZOuFxpEhHlt6JiHUdeMPf/jXsb1W3/mf+i6EPt7rw0x2cIs8XPUxtLTYne666+a33lqrKMmELHtShr/0DUZFBQUjsYJbZcXkvr1EjLHUEcodXV08zxcW5s2ePSM99yVDZcRohNp3fRR7qUc1FVkn7D0ej9vtNgzD+s2HMqdqrz+tnqdwHOfz+axhXLm5aT7gAWBEqAnDOlAXFRUd/9ZcLpfdbk/2mcHF6itijNSEYXMJJ1gNMzIyiouLTzrppEFjwQD6LofpctlRnwHqI0hpcWG52+2aN6967dot4Uh0gFREn0wuMPzNcH89bbph6Jre0+rJsiyK4re/fWvaXo3Pi9zIte821+j91qOaikpLC0RRaGxsNAzj2C6WoU9mnU/9rtPe3i5JUk5OJhpImIDMT87aH/8ZNOtI5PF4+qaino4oU0/raoiiYA0MssbBWCtNDkqSpDPOOOP0008foCyDbiSR6H3Fmd2edqmI48la8T4d6sOnTbpeunTB2rVbOru6SorSYjpyXddj0VjPP6PxuGmaM2ZUnHnm/LT903N4eY7nRqJ95wXO5hy9fWVUU2d+frbb7Wxra3vttdeO4emMsba2tk8H/RER0RtvvBEOh71eV0FBLgFMPMm4abVbmZnD88UgIyOj7xAHl8tl3Wi9XNoShEOpqKOj46hOdnAcxx/ZoK1+r+OSNSFk6viktElFhyYcGvP6EBGXNqno/PMXWde6d3R2pcP76RlOdKhcsajNZjvrrNM4Ln3X27G7BUGikWjfBYlsnhO0rygvL3vp0tNefHH1ww8//PDDD/e69+677y4uLh7g6TU1NY899li/dy1ZMt/nc6OBhImYimIGEVVWVg5jsLDZbH17EbKysjo6OpIxg0hK22oIAm/N09E6ApcLDaDXoBlVVQWBT8NVGjmOBInSoT4cT4KYLieD3G7X5z9/xZ///M/uUCg3J3uIkxKNVCRSlNRZ0a1/Ohz2885blM4HIpuLz54kdexXh719z5o0qssvjvZnf/nl5+bnZ/d7IB70zPSRalpZWXrVVRegdYSJSdcYDdNQ69QA1PdbqTVuyXq5dFZWVkREe/fuHbVXNAyjV89/OBzmeb7XQrNpwuHl06E+HEd8OnWlXXbZubm52WoyGU+M5dybmqYrKZcuMsa6AgEiuuCCxZWVZWn+p1cw3dnvAKDjad9dmULhjFH9djHae6Xb7fzWtz7f1OTvuSUUij7//Dt2u2PQCejsdrvdbuc4uvLK81J7hsrKinpN0g8wcRhJRkNbtPwovi3xPMdxvc6wWMHLern0TkWFRFRfX59MJkfnjEMymUztWuvs7FQUxeNx5eVlp2F9rJXqx7w+go2zu9No2H5Ghu+kk6atWbOhKxDwDmGx25FgMqYkD5vNQdN1VVOdTsett16T/sciQeLKT3UpkU87urSk2bFPHcoEs1b7rhnJgumO1J4hh09InQniBExFRDR16qSpUyf1/LOurunpp9/Izs4pKysLBoN9r95MzZtutzsajcydW1VeXozmEIAxpiXNAb5pHRubzda3vbQuBtGS5lHN8Dv65s6dQUSKojQ2Nk6ePHkUXrHXYim7d+8mIpfLkZ7LMnjzxXSojyCSKKXRXiQI/OWXn79mzYZINCbLypic/YzH4r3mPAxHIhzHV1dPKywcHwNn3dmiO/vTXJEIGm17km63e4jtezCU9BVIzoyxjMtjf1p3x459jLH8/HyXy1VYWDjAHKmCIHg8Hk3TDxxoRnMIQEREnJ5kHMdlZQ3nzBTWNbG9biwsLOQ4Tk+y3tMbp5nMTF9eXhYR1dXVjcLLdXd3p15+bJrm+vXriWju3CqeT8dC2ZyC5OTGvD6+Aind9qOFC+eVlBQyxgLB7tF/dVlWekUi0zSjsRjP8wsXzjvmxXzGVqRDI0ZDb9+ZSYnQGF/mOvapaN267UQ0ZcoUURTtdntZWdmRCidJkvWFeP367WgMAYiIGDN0Zn3NGubvfH02aLPZBEEwdEYs3U+izZo1lYh27tw58uVn1uVUPYLBYFdXFxEtW3Zm2tbHmyeNeX1yK9Nx0NU3vvF5IorF4kc19+Dx0zRNUXrPhB4Mhw3DcDjsV1554Tg9PoVbtaNt30Mt2ti+5zFORQcONDc2thLRKaec0hMYi4qKjpSLZ8+eTUTbt+8NBEJoEAGIOF0xbTabtXrrMHI6nb0mHbHb7aIo6oqZ5n1FRDRv3kye50Z6QLFpmk1NTb1OCjQ2NpqmWVSUV1JSkLb18RVKxNEY1sfu4R3edJwLtKqqMicnS0kmE7I8ai+qaVo8nugbKBOyLAjCNddclJnpHY/HpkRIl8PG0bbv0Q5dk8dy+o8xTkWrV28gokmTJs2ZMyf14FtaWtpvoqyqqrJWHnjzzXVoDwEYY4ZGoig6HMM/DKJXKjrUV6QRS/u+ooqKUofD3tTUNKINfygU6jvd5d69exljM2dWpnN9XJmCIHJjWB9PjpielSkqyp89ezoRtfj9oxSJdD0Wi/f9mzIMQ5Zln89z2WXnjdOjU6BBPbb2vatenaCpKB6Xt2zZzfP89ddf3+suQRCKi4v7TZRnn302Ea1fv11RkgQwscWDunWgsY4mw6vX1MwOh8M6llkvms7y8rJOOaWaiB588MEBBngej1gsFgqFet0YDAZ37NhBRGecMSed62Nz8d4CYQzrk1mSvlcNf+lL1xKRLCuj0F2k6XrfhVAsXcGgJEnTp1cUFeXROGRoLNKuH1v7HmpRx3AO/TFLRabJVqx4KRAIFRUVzZ/fzyzmNputuLi475T5c+fOzcrKamvreumlNabJCGAC05Om9cficg3/5U69vs85HA6r98h60XTGcdx1110kSWJbW9tIjJ6Jx+NtbW291nhijD333HPJZDInJ3PmzClpXqLiahfH05jUR3Jyntz0TUXTpk1eunQBEXV2BUY2EmlaLBpj/bViqqZZMzxddNGScTnOmlFLjazJ5rG178m42b5fpjFq3scsFW3atGP16o1EdN111x3pgC5JUmlpqefwqSMyMjIWL15MRC++uKamZh/aRZjI4gGDiLKzR2Q23l6pSBAEa41Y60XTXF5e9sKFJ5um+dxzzw3vlqPRaHt7e99THm1tbXV1dTzP3Xnn59NwrY/ezZKLzyyRRr8+RGzyqW6OT+viXHzxUkHgEyM5nWO/Y4l6xOIxjuNKSgqWLz9nPB6XQn61u1E9nva9s1aNdo7NsOux2TdDocjKlauIaPHixcuWLRtg7hOe5/Pz81NHknIcd/bZZ8+cOVPTtH/846V4XCaACZuKug0iGqFZZ/omLesQZr1o+jv77AWCwG/btu3tt98elrFQpmmGQqG+vSBEZBjGyy+/rChKdfWUqVPLx0V9ssttHEejXB9PrpQ6n016mjOnyuv1JFV1JJZFM01TlpV+xxJ9mixjcbvdft11n7EW9RtfNIW17UkeZ/tuGqylRjHGYib9MUhF4XDs+9//XVNTm9vt/vKXvzzo4wVBKCkp6XWd8BVXXOFwOJqa2u6776FwOIbWESYmaxG0wsIRWei774jIsrKynhdNf1VVlYsXzyeif/zjH70mEjy2xqy1tbWzs7Pfe9955x1r5PJ1112cntMU9eXNkTJLxVGuT1G1I+0vYaTs7Izzz19IRG0dHcawXqJvMhaLx/tehH/YH3UyaRiG3W479dSTxl8kSpr73o0oEeP423clYuxbE9VG/Xz9aKeicDj2l788HQiEsrKy7r///sLCQtM0B50ZguO4goKC1I643Nzc66+/3uPxtLV1/f73/0QwggmImWSNSZw0adJIbL/vlzwrfpk6MXMc1Ifnudtvv7aioqS7u/vxxx8/0rDWoR24wi0tLfIRht/W19d/8MEHPM9dffUF06aVj5sdiKNJp3icGcLo1IeIFcywp39HkeWOO25yu12maR5PWVLphpFIyOFQ2NAH+VLR2t5ORHPmzKioKBtfRyQtaTZtlTWFDVf7noybBzcnRjkYjWoqCoUi99330JYtuxhjd99996xZs4b+XGvUempX2+zZsy+77DIi2rFj3333PRQKRdBMwoSiyocOr6WlpSOx/V5X5lNKp1TPS6c5QeBvuukyIlq3bt2jjz7aa+7gITVmul5XV9fR0XGk7/eBQOCxxx6LxWLl5cWXXnr2+NqFOI5KZjtHpz7ODCF/mmO8VMbpdJxxxlwiCoeHoWWJxeLRSLTvPAV9KcmkpmmCIHzta58TBH4c7UuawvatiUbaNGI0jO17tEPftyaqKaN3Km2UYrtpsk2bdqxcuaqrK5iVlXX33Xefdtpph0qpaUP+A+ZKS0sjkUhnZ6cVP+fPn+9yuZ566qmuruDPfvbXa6658LTTZo+X7muA4z0MyaaVXXJycvq5V9NisZg1YlSW5UQi0TOOIfU7fc+RiOM4l8tl/dPlcnk8nr5n0DwejyiKuq5rsplWS3sOoLp6ym23Xf33v7+wZs0an893ww032O12WZZ1XY/FYrquW825LMtWfVKLE41Ge4KCVRme5+12u7XaJcdxXV1df//73+Px+KRJRXfeeZPDYR93e5EnVyw92dmyQx7R+jh8QvlpbkEcTwfnZcvOevvttaFIpMgoFAWh30RIRLpuMGYSkWmavU63aZpmMpZMJgVeEA7fgiT23/gmEglRFOfNq545c+q4qRSjkF9t25PUZDYS7XssFqtbGyussmcW2Ubh9OtopCJFSf797y9YV5x5PJ4HHnigZ3Do0EvWw+fzORyO5uZma0DfzJkzv/jFLz766KNNTW0PPvjEVVedf/nl59rt43LJGICjYuiMiIqKipqamg4ePNjW1tba2nrw4MFoNNrV1XX889DYbDabzWad9S8pKSkoKCgoKPB4PKFQyHrpdO9LUzVN0+NxOT8/u6Qkv6Gh9dlnn33xxRdtNtuwXF7kcrms7YiisGDB7HhcjkTikiTYbLZx8S3fNBgzSVdNm4t3eAU5rI9QfTieyygSDc3UVY7jiBfTeXHhTy1YMEcQeMMwurq6fD5fIp5Iqqqma0lV1TT9GPrV+iVJkigKDrtD4HkiCkUigiCcf/6Z4+go1LJDtq44G7n2XYkoDRsTBTPMgul2XhjZvWfEU1FNzf7HHnu+paWdiJYtW3bzzTdnZ2cfypeMHdtaMzabraKiIh6Ph8PhRCJRWVn57W9/+/nnn9+1a9ezz761Y8f+22+/tqyskABO1DyksbBftaaObW1tveOOOwZ9ijUH45HmPlFVte9KTKqqqqpqDZLdsmVL6l0d+5KGyjKKbIKUju3bjh37163b1tDQGg5Hw+GonjKSQ9f7ac94npck6UgzYcZiMcZY39MfPdFB142VK1etXLlKksTc3KyCgpxZs6acddb8zExfeu4/0U4t2KwqYVNLMj3JUqfMGYn6MJO17022701yPNlcvN0tuHOF7DKb5EjT7Kjrxkcf7fjgg49EUTQMta2js62jc9BnCULvDqFef0393q5pmqZpsqz0bISIXnjhLVlWPvOZc9N8rY9op9b8sZyMmqPTvrfvVaKdWtlcp9M3gtFlZFPRunXbHnpoBRFlZ2fffPPNy5Yt+7TLjbHj+S7LcZzH4/F4PMlkMhgM2my22267bfXq1WvWrNm/v/G73/3Vvfd++eSTZ6D5hBMyD7XtSaoJs+e7Zn5+vsPhcDqdOTk5JSUl1sWu+fn5WVlZdrvdbrf3XdTsCI2BLstyMpm0/qw6OjpkWe7o6GhpaQkEArIsK4oSDAYVRYl3G/Fu2eZKFlbZ0ycbaZpeX9/89NNv1NTst26x2+2ZmVnWCZ3MzEzrUpesrKzCwsKTTz7ZOlHocrmG2HehKEoymVQUxe/379u3r7W11eFwJBKJtra2WCymKEoikejsDPr9ndu27XnqqdeWLTvzkkuW5ORkpknfiGkwOWT49yixTr2nPjnZ3tGsTzQajcS0SLvWtkvJrbTnTbHbnHz6XJVmGGZNzb7f/e6JnTv3WSecOY4TRdFuswmC4HQ6JUnyut0ut0vgeYfDKUmSy+UaIAz1HyaiUSKKRiNElEjIsXg8qarWn56qqrph7NtXv29f/V/+8tQXvnDFpZeeW1iYjtNbB5vVxo8So9y+R7uje9+JVS50+wpGaiLQEUxFNTW1Dz+8kojmzZt31113FRQUpKbj4VpKyW63WwPdNU276qqrzjjjjD/+8Y8tLS2///0/f/jDr5WWoscITqhIVL8+Hg8a1pf7Sy+9dMmSJV6vNzs72+FwWCM5jutwIIper9fqEigpKUm9yzrMKYrS3d0djUbfe++9l156SU2YTduU7kat4gz3mAcjXTdWrHhp9eqNqqoJgjBv3rxzzz23oqLC5/NZrf7RNl399rc5HI6MjIyCgoK5c+f2+sYvy7Isy4FAYOfOnc8991wgEHj11fc3bqz52teumzVr7MeIMJO17pS7G1XToDSpT2ddMtSqTjrF5c1Ll6mu//jHFStXvmH1e+VkZ5VPKvf5fD2p6PhLZLH+xHr1vVn9bVYqam9vr29sSCbVv/1t5csvr/7JT+46+eSqNOsl0pu3y2PVvh/cnJi62OPwjcjQRm7enE8Hir+95l/Dtd3W1o7vfe8hRUnOmDHjJz/5SWZm5qEvK6ZpmmbfOb6GUSAQ+OEPf3jw4EG32/nAA/+Vl5c9XFt+4KmfomEewD3Xfx9FGLn9xzRY3YexeLfhcDguuOCCm266KSMjYwx/nXA4/I9//OPNN99UFMWdLUw503Oc5/uPZ/8xTfbPf7786qvv8bwwf/78z372s7NmzTqqjDjwcfxo46aqqq+99tpzzz3n9/tdLsd3vnNLdfWUsdx/GLXsTHTWqaIgplt9eJEqznB7j3sNkOM8/ui68de/PvXEE88RUVFhYXVVlc83lidAGWP1DQ21dXXxRCI7O/N3v/vBlCmTxvD4k0qJmvvejZg6jWH7LkjcjHO8NtewnYR98887R7av6Lnn3lKUZEVFxS9/+cuetU6sxDfSO1NOTs4vf/nLu+66y+/3/+c/b3z96zegPYYTQEtNIh40XC7Xj370o9mzZx9piQ9d183hm3fOZrOpqtrvaKSMjIyvf/3rZ5111o9+9KN4MNFSkyg72T1Wxdm0accrr7zHGLvoogvvuOOOXqcLUwtiHbh5nu9VpaNt9UVRtLaT+pieh9lstssvv/zMM8+86667Ojs7n3jihR/96I4xvEIt5Fc761RidOGF6Vif1h3K1LPEsb1CbcuWmieffIGIZs+aVVlR0ffvSz98JVfTNK1TYMfaXeRT1aTD4Uz9g+pV0sqKioL8/A/Wru3uDn3rW/evXPk7pzMtpjZo2yubOo15++7fLZfPH/5jzogMdtu8eef7728holtvvdUqmdX9Pgolszidzuuuu46I3ntv8549B9Cgwngnh41AvUaMbrrppjlz5jDGDMMwDCPZh2EYbPgkk0nr/31fxXqhOXPm3HTTTcQoUK/J4TGbxGjVqg8ZY4sWLfrmN7/JcZz+Cevdaimst923SoN+ce/F2lTqllVVPXQGRNd1XTcMIzs7+yc/+YnP5zt40P/RRzvHcP/pOpAkRmlbHzlihP3aGNZH141f/OLPhmHm5+VOLi9XVTUcDnd1dfn9fr/fX19/oL7+QFPTwe7uQM9/oVDQOA6hUDCRSKRu0HqV+voD1ou2tbWFQyFBEM5YcJrdZgsEgi+/vDodjkVhvxpq1tKhfQ82abGu4X/R4U9Fmqb95z+riOj0009fsGCBdaOqqsN1onGIzj333KlTpxLRihUvj/JLAwz/d/1WlYimTJmyfPnynnZluK4NPqZW5BBVVZcvXz5lypSeNzn6IpHYvn2Ndrv9mmuu0TTNanEto/9megKrruuappWUlJxyyimmyZ58cswORFrSjHcb6VwfYtRak6CxO05//PEev7+TiIoLC5uaDvr9rd3dgWg0oiiyooz2UpvWi8pyojvY7fe3dnd35+RkE9H69dvG/EBkGofWOEuT9r11Z3LYd5vhT0WdncGOjoDD4bj11lt7SjYmn98dd9whCEJHR6CjoxvNKozzviKTiKzVpNOQ9casNzn61q//WNN0n89nLdOWbq688koiCgYjVrs7BpG6RWMmpXl99CQpsTFbR2bHjr1E5HG70/Pvy+1ycRy3f3/DmL8TNcGScSN92nc1biQTw7zbDH8q2rZtbyKhTJ48uaioqKcHfkyqVlJSUlpaGonE6+qa0KzCuKYmTEEQKioq0vPtVVRUCIKgJsamVduxYx8RzZkzp2eIQ7oVx5r3ua2ta0zeQLRTGxf1ScbH7AzsgQNNROR0pOmCJDZJ4nm+oyPQ1RUc23cS7dBMndKnfddVlggOc5f58Keideu2EdGMGTPsdvuonWjsl91utzr216/fjmYVxjVdMQVB8Hg86fn2PB6PIAi6MjapqLb2IPWZSiCt5OXlEVEoFB2TV08EjXFRn7Haf4goHk9Qyuo36YYXBGuc+q5dtWP7ToLNarq176HWYX4bw5yKNE3fv7+RiGbPnm2a5tgO6OE4rrq6moh27qzVNJ0Axi3TYDzPO9L1u6zD4eB53jTG5u89FpN7Wtb0ZE34q6pj04qYGo2L+phjt+KwLCfp6OcXGDUCzxNxNHanq3qOQlbCTqv2PdapD++RZ5hTUWNjq/XDjBkzxnAoaI/KykoiisflQCCElhXGcSoyD626kJ5vT5IknufNsfiq3/OFZ2xnlxmY1QkRiyXGYM/5pMFI//oY2pi1somEzHGcKKb7gsfd3eExfHUlYqRh+25oTFPSOBVZ4UOSpKysrHS48qun07ijI4CWFcYxRkR0pDmKxtyhN8bGsjrDNe/wSOi5gHlMvlJbr4v6DPitwxwXh4ExuWywhyqb6dm+J2PDWZZhT0VhIiooKEiTnczpdFor+1gdpABwghmr01LH0OqPTXtvMNQHhoUms/Rs34d3Jx/mua2t/KgoyqZNm9Lkg0zbU8UAR/s1cdeuXW1tbWn43rq7u8f2WywR7d69O21nJvP7/WP+HlCfQRuveDyRtiVKhzc2Qdr3EVnxo6ur6/7770czBjCMksnkgw8+iDocyZNPPokioD7Ho62jA0VA+z78qcjrdWG/ARhegg1dnkc4hImC1+se24uEh/xWxTF4VY5EGzcuzqPx/Jjt5JmZvsxMb/qXyOsd47k5JsKBaJj/SpcvX7J8+RIcqQGG1+xLMlCEftnttj/+8b9RhyM2YyI36yLsPIN46CHsQoPLn+rIn+o44X9NHp80AAAAAFIRAAAAAFIRAAAAAFIRAAAAAFIRAAAAAFIRAAAAAFIRAAAAAFIRAAAAwCAOm8Xxgad+iooM4J7rv48iDAD7D/Yf7D/Yf7D/YP8Zj9788w3WD+grAgAAAEAqAgAAAEAqAgAAAEAqAgAAAEAqAgAAAEAqAgAAAEAqAgAAAEAqAgAAABiMeNTP8J7++WXnl4hEau3qZ/+9ESUEgHHI0M1kQhdtgs0hoBoAcIypaMqcU0tE1A0AxrG6rZ37NrWbBnP5bIuunGJ34aAGAERHfQat4PxzijNRNQAYpwzd3LGmteb91mRC15JGuFPe+EpDPKyiMgBwtKnIcc7c+TnobAaAcaujMXpgeyczWXFR4bw5szmOC7TENr5cr6sGigMAR5GKMudeNz9LpOTeg1HUDQDGpea9QcbYpLLS009bMHlyxZTJk0VRDHfKHz5bhx4jABhyKio5/5pppQIpB3e/HELZAGB8CrXLRFRYUGD90+fzVkwqEwQh2JbY/HqjqugoEQBS0aBKL507P0cgpf3t1/YoqBoAjEdKXE9EVCLKzMiwbnG5XW63u2LSJJ7nu/3xD/5Taz0AAJCKjsSx4Jyrq70iJWvXfbQthJoBwPjUVh9mjPEC73Z7Um/3eNxTJk+WRDESULa8cTDanVTiGmMoGMCEM/j1qFMWfH5JgYcotG/jvzdiRBEAjE+Mkb8uTESFefl973W7XeWTymoP1He1xN57ep8g8jab6M11ZBe5Cip8nkw7CgiAVESZVdd9prJAID1w4IXnWlAuABivgv54oCXOcVxlxeR+H+Bxu6dVVh5sbk4qqkaGQlqkW27ZF9zxbosn215Q7ssv92XkORxuCcUEmKCpaOGUqQ4iIjGn8ov/t/Lw+2xTz7n+vnNIObj1//1rLyoJAOlLjmkbX23QVSMnOys3N6/n9lg0lvowt9tVNX2aaZrRWCwaiyVkRZZlIop1J2PdnQe2dQkSN2Ve3vTTCgQRyyUBTLxUBAAw3gXbEltWHVRimtPpmDvnZI7jDt0eDPZ9MMdxgiBkZmRkZmQYhmGYZjwej0ZjSjIpK4qumns3tDfs6J5UlV1WnenLdaK8ABMoFb32ys9e63Pjxcvvm+PFOmgAMA50t8bXP9+oqqrT4Vh61hKnw0FEjLFAoCsaHWSkpCAIgiDYMjOzMjMVRVGUZCQWC0ciyYS2f0t7fU3njAWFFSfnihL6jQAmRioCABi/gm3xDS/Vq6qe4fXOP+UUKxIRUVubX1GObpIRh8Nhs9kkSXS7nAlZjsRimqrt/LC1rS5SfVZRTrEb1QZAKgIASFOxUHLds42qqmdmZJyxYIHT6SSieDze0dF+bBvked7tdttsNkmUPC53KBKJRKMBf2zts3UnLSkun5XDCxzKDoBUBACQdvZuaFdV1ef1nrlwoc1mI6J4PNbV1XWcm5UkSRRFRVEyyedyOgPBoKqqH69pCXckZ59dhFHYABMuFfU72AgAIH1EAkrr/hDHcdXVM61IpKrJrq4u0zSPf+McxzmdTlEUY7F4UX5+dzgUi8UbajqTijr33DK7C982AcYrfK0BgBPQ3g1thm46HI7C/ENLnvn9/tRIZJosHA5HItFjzkmSJGVk+IgoOyMzNyebiPy14c1vNDITs2IDIBUBAKSHRETtaIwS0fy5h67D7+7uTk0/3cHgzr176g82HWhsrG88qGnaMR5Aed7jcRORy+HMy8nhOK6jMbrlzSYtaeBTAEAqAgAYe+EuWddMl9OZl5dPRIZhxOOfztaoKMrB5hZDPxRcorFYi7/tmF9LkiSHw05ELqczLzeHiJp2d9du6cCnAIBUBAAw9lr2BpnJ8vMOzWEdj8d1Xbd+Nk2zsbm51+NN02DHsRisw+EQRZGInHaHz+clorqtXa21IXwQAEhFAABjydDN9oYoERUWHBpRFAh8et1ZQpZ7zVTEcZzL7eqZ8PoYcBzn9XqsLWT5Mlwul64aW99sioeS+DgAkIoAAMZM056gNawnNzeXiJLJwzJQIpEQRNHn83q9HlESMzN8kyeV5efkHv/rulyHVv/Izsyw22yaauzd2I6PA2B8wRWkAHDi0DXzYE2QiKZWVkiSRESqethIapfTeVJV1YgcTEWR53nTNAVe8Ho9yUD3wV3dhZW+4qmZ+FwAxgv0FQHAiSMRUcNdCV7gp0yZSkTEWCx22GJnHo9npA6mPG+32w5lL4fTumh/74Z2XTXxuQAgFQEAjCpmsl0fthq6mZeb47DbiYgR9YyzHgXWmGsi4jjO5/YIghDpkrtaYvhoAJCKAABG1cHd3W31ESKaUlHJ8zwRhULB40xFyaQ69HVkRVG0TtvRoa4jO2O0Z30bPhoApCIAgNGjq2bt5g5iVFZaUpBfQES6rodCoePc7NAjkUUQPj2oZmdkEFGoPdF2IIwPCACpCABgNJgm2/rWwWh30uFwVFfNJCJmmp2dxzuVoqIopmnK8lEEI54XUhKSYLPbiKixpvt45kMCAKQiAIChatrd3bIvREQnzZrpcrmIqK297Wi7eXrRdf2o8pBFFIXUf2Z6fRzHhToTGHMNgFQEADDilLi260M/EVVOLi8rKSOiSCRynJGIUs6dWUOUjo3dZhMEQY5q0W4FnxQAUhEAwAjSVXPDC43JhO50OadPm05EiUQ8GOw+zs0mErKmHRqm3XO9/ZAOqYdHKI7nbDaJiDCjIwBSEQDAyKr/uCvYGbNJ0qlz5zmdTk3TOjs7TfO4TlfJshwKh48UdAbWa+UQjjjrqrRuf9w0MLQIAKkIAGBkBNviu9f5idG0aVOt9T1aW1uOMxLpur7/QH1HV1dSPbSKWc/F9scmw+MlIk0xwp0yPjIApCIAgOEnx7TNrx80DZadlVk5uYIxFgh0HX8kamhqsjYSicUYYzzPHc/CsUTEcZwoiUQUw2KxAEhFAADDj9HeDW2xUNLpcJx15mJRFLu7A5FI5Dgj0f4D9bFYnDgijpRk0jDN4+wosjjtDiKKdKGvCACpCABguDXt6T64K0hE06dN5Xk+kYgffyRqaGpKJpOCyM89t8yb5TANU1VVQRCOajuGYfS90VoJRIlp+OAAkIoAAIaTKut71reZhlkxaVJlRaVhGO3t7YOFFXOAk2vJpFpX3xCLxQWRP+XCSeWzsh1uiYh0Qz/aVNQvgeeJSIkjFQGkOxElAIDxJRJQEhHN5XLOnDlT07T29kEWGlOUpCzLHMcJguByOVODDmOsrbMj2B1SNc3uFE9bPjmnxG0azNBNIrJLtp4FX4eo374i6yo2VTHw2QEgFQEADKe2A2HGmM/rs9vtgUCXpg3UB8MYk2XZ+kHX9UgkarPZHA67aZpJVfW3t8fjCY7jMvKcJ59Tml3sJiItqcfDSSLyeDxH+97675HiiOM4VdHx2QEgFQEADCfrVJTH7Wpvb0skEoM8+JMpqg3TVFU1nkgQkWEahm7ohmEtTzbj9IIp8/Ik+6E+pKbdwaSsO+x2p9NxtO9N1/sbVySIHEdY9AMAqQgAYLgPWzaBiLpDIe8Q+nJ0XTcZC0cicTlhHB5ZnF5bdpGrcm5uTvGn2wm2J/asbydGWVmZxzCoqN+OK9M0sTgsAFIRAMDwK6zwNewIxKIxTdMGHvfDGNN1o6OrK5k8NFdQdrHbm223u6ScYndemZfjD5uNmpls65tNhm6IkliQl3e0b6znVXoRBIHjOBPDigCQigAAhld2kdudYYuH1YaDTeVlpQNMKRSLxaPxmBVWqs4oTD1N1s+Dg8mNr9RHuhRREKaUlx/tu2KMKcpA8zQe32SQADAacGU+AIwzNqc44/RCXuBi8XhtfUMsFut3jLOmaaqqhiIR4mjqKXlVZxQeMRIxiofVD5+tjXQpPM9PnzrF6XQe7bvSdf1IF/9rusYYIw5n0QDSHfqKAGD8mVSdLdmE7e+0KIlkbX2Dy+V0u91ZGRmulDSTSCQ6urpMw3T7HFPn5w+wtea9oY/XNKuKLtmkyWVlNpvtGN5SIjHI1NVOjw0fHABSEQDA8CuampFV6Nq93t92ICLLSiIhd3Z22R32DI/X7XYxkwUj4aSqCiJ/8nkl1qyMfZkGq9vaufODViJyupwVxxqJksnkALNEmobJGBNt6JsHQCoCABgZDo908rll009TOxpj9ds7IwElqSQ7lCR1ffIIjqadmp9f7u336YZubll1sLU2TEQ+r7e8rPTYZrJmjCWT6gAP0HSNiI6UzAAAqQgAYBjwPOfOsFfMsVfMzgl1yt2t8UBrTI5pakKXHEJhZcb0U/s/d5aU9c2vN3Y0RnmBz8vNKSos4I51OHQ8Hu93SuuUVKQTkTfbjs8LAKkIAGDkcZSZ78zMd1aenGsYJjMZx3OC2P9JK1XWP1hZG+1WOI4rLS7Kysg85kik67qmDTJptappROT0YlwRAFIRAMDoxqMjhaFDGUUxNr3WEA0ovMCXlRRnZWQez6vF44NMrq0buq7pRJRV6MKHA4BUBACQLgydvfuvvfGwynHc5EllPo/3eLYmy/IAg6wt1ukzjuO82Q7UHwCpCAAgXdS81xyPqLzAl5eVHmckUlV14GkbLdFYjIgKKr0D92ABAFIRAMAoYYwd2NZV/3GAiIoKCjK8vuPc2qDnzojINE1r1NGkmdn4CADSH767AMCEEOtO7l7nJ6L8nJzc7OPNKLFYbCgPM0zTNE3RxqcuQAsASEUAAGOGMdq1tk1XTY/HXVRUyB3fmmSapg18KX4PaxkQp9cmSDjYAiAVAQCkgaY93W0HwkRUmJfHHfcyraqqsqGtaRaKRogoK98jYlARAFIRAMCY01WzbksnYywrK8PjOd4zWaqqqqo2xAdbXUpZRQ7i8DkAIBUBAIy1WDAZCSi8wBfmFxz/1gZe3OOwR6qqoRtEVFiZgU8BYFzANWgAcIJr2d/NTOZyOW1SPyuRGYbBGCMiTTvUA6RqR+wKYoz1On3W7zYPpbFEnIiyCl1OD1ZAA0AqAgAYa4yxxo/DRJTh8xqGEY8nNE1LKHIsniAiVVWH5VVESeQ5nog8bhcRuRxOIrJOtJXhmnwApCIAgDGnq0btlk4r+rR1dra2tQ/6FF7geX6goQWGfqhv6bAX+mQptG5VJaJuCvECz0zGcRxHnKGbmMIRAKkIAGDM8lDDju59Gzp7eoNEXhDtdkmyCTzvcrt8bo8kig6nw+VyCYJARN6jnNdRVZPJZFJRFFVVNU2TZSUUjahJ1boaX0kmdaYT0fbVTXVbO2efXZxb6kE2AkAqAgAYVdHu5EevNUS6FMaY0+mYVFqal5vndDolUZRstoG7gobOZrPbbPa+WeqTVKTEorGDzU1t7R2xkLLhpfpJM7Pnnl+GTwcAqQgAYJTIUXXTqw2RLtlht1dWTK6sqJSkUR3sLIoiEdlsNp/XV1xcHAwGGxobG5uaGmoCckw9bXmFiBkdAZCKAABGmqGb295siXTJRHTmwoU+Xz8nxcLhUOo/Y7HYECeq7osjTrJJTqez55aMjMxej8nKysrMzMzwebfX7OxojLXuD02qxvhrAKQiAIARFmxLdLZEJFFccOqpLpdLUeSkkkzICSJSFGUkXlGXdVmWe/7Z3d19KDBxnN1u53nBYbfzglBcXCIryX21tfs2tpfOyOIFzOoIgFQEADCS/HVh02AZme54PBaPx8bwnTDGrByWSMStW2ySSESxULJlX6hsZhY+LIA0hNPbAHDiaNoTJKLUU1pp9B1UFH0+LxF1NEbwSQEgFQEAjKBERFVlnYg8Lld6vsMsXwYRBdsTpsHweQEgFQEAjJR4OGn94HA40vMdOhx2IjJ0U1cNfF4ASEUAACNFUw0isg3fjETDzu5wEBFjZJroKwJAKgIAGLlUpIyTDhhGOIMGgFQEAAAAgFQEAAAAkN4wXxEAnGjCkTS99J0xnDgDQCoCABgtqqrWNx5EHQAAqQgAJi6bQ7Q5x8ExTbJj6AIAUhEAwEgqmpJRNCUDdQCAY4avLAAAAABIRQAAAABIRQAAAABIRQAAAABIRQAAAABIRQAAAABIRQAAAABIRQAAAACDOWwWx3uu/z4qMoAHnvopijAA7D/Yf7D/YP/B/oP9Z1xDXxEAAAAAUhEAAAAAUhEAAAAAUhEAAAAAUhEAAAAAUhEAAAAAUhEAAAAAUhEAAADAYMShPGjvez96vr3Pre5LbrtkQc5xvLam6ZIkHs+7NwxTEBDsAAAAYJRSUSgQG86X3Lhxx4cfbj1woElVNY/HNXVq+eWXn1NcnD/0JLRx48dr1mxqamozDNPjcVVXV15yyZKiojx8nAAAADCiqeiQzIqvfn5m5qf/5kX30bySpulvvbXupZfWdHeHe24Mh2MtLR3vv//RqaeedPXVF5SXFw+wBV031qzZ+MYbHzY1taVsIdrS0r569cbZs6dfc82FFRUlPI/eIwAAABiRVBQNJ4mI7DaP2+04tpdRVe2hh/6xefMuIhJFcdGiRbNnz/Z4PI2Nje+++257e/vGjTs2btzxX//1hdNPn9PvFkyT/fWvT7/33mZrC7NmzVq0aJHT6Wxvb3/zzTe7urq2bt1dU7P/+9//yowZFfhcAQAAYCRSkZ7UiYgyvZ5jew1N0//0p6e2bNltt9uvuuqqSy65JD8/X1VVxtiZZ5752c9+dufOnY8//nhdXd0jj6x0u50nnTSt70YeeWTle+9tFkXxiiuuuPzyy/Py8lRVte66+uqrd+/e/be//a2uru7nP3/429/+4sknz8BHCwAAAEdlNE42ffDB5nXrtvM8f9ttt33xi1/Mz89PJpOMsUO5TBRPPvnkb33rWwUFBdFo4le/ejwel3tt4eOP977zzgZBEL75zW9++ctfTo1E1hZmz5591113lZeXJ5PqU0+9qmk6PloAAAAY7lTU3dlFRER7P/rR//znR//zzAO/f/3FTS3KEF/AMMzVqzcR0fLlyy+99FKO41IDTY+cnJyvfe1rmZmZyaS6YcPHqXclEsof//hvIlqyZMl5553HGOt3C1lZWdddd53b7W5oaF27dis+WgAAABjuVNSLqcSjW95Z+6vHPw4N5eHxuHzgQJPL5br44ouJyDpx1u8jvV7vggULGGPr129Pvb22tjESiTqdzjvvvFMUxX4jERFpmlZQUDB79mzG2JNPvmyaDJ8uAAAADN0QxhVlnvL5Sxc4HEREhhJqb1j70s6NIVNv3//KloobT/EO8uxdu2p13cjLyygtLWWMHSkSRSIRIpo6deqqVav27KlPvaupqd002bx585xOp6Zp/T6dMaYoChEtXrx4/fr1kUi8oyNQWJiLDxgAAACGaAh9Rbzo+OTKM8GRWVx1yVdOW+QgInP/zoODn0erqaklouzsbJvNdqRME4/HZVkmIp/PR0SqqgUCoZ57o9EYEeXl5Vnpp98tyLJspaKioiJBEIgoHk/g0wUAAIBhTUV9TZpWTkRESW2oo4scjiNe0m8YRmdnp/WzKB7qu7LZpN5vlOeP1NWk63pra6tpmj0bxOcKAAAAo5KKjsbkycVE1NraGov1P0N2d3d3Tx9SIBCwIpHDYet5gNvtJKL29vYjxZ3Ozs6etNTS0mL94PN58OkCAADAyKYipW5HIxGRmJuROeiDTzmlmue5WCzW0dHR7wNCoVDPzwcOHCCi6dPLJenTvqKysiKe5z7++GPrLFsvgUCgJ28xxj744AMiysz05uVl49MFAACA4UxFgY+ffuqj+nZZJyLSYq17Xv37ti0KEUkL5pUP/gIZGd7KyrJYLPb666/3vTd1pFEkElm3bh3HcfPmVac+pqqqwuVyxmKxX/7yl7p+2EREsix3d3enJqSdO3cS0U03XYaPFgAAAI7KEK5BM6ON9X9/vL5Xmqo4a8mF5UPoaRIE/swz59XWHnzhhRcqKiqWLl1qjYa29KSccDj82GOPRSIRr9e1cOHJqVtwOOxf+tJVf/zjUx999NEbb7xx4YUX9vQkWSOsLdFo9IUXXojH42VlhUdaNgQAAADgSAbPNZlFC2Z4Mx2HHigKUkVlxY1fufyLi4Z8huqCCxadddZ8IvrTn/700EMPBYPBlMRzaBT2ww8/3NTUZLfbvvvdW7OzM3ptYeHCuWeffZphGI8++uiKFSt6bu8ZabRv374///nPu3btIqIbb/yMKAr4aAEAAOCoDN5XJBTMvuKi2X1v13WjpaU9EAjFYglRFD0eZ2lpYVaWj+O43q8hCrfccqWm6Rs2fLxmzZp169bdeuut1qSOHMf5fL5IJJKVleX3+xcunDt9+uR+38Yllyx58811uq5XVlb23MgYM03zscces/JQZqbv9tuvmTu3qt8taJre1NQWDEai0bjdLnk8rkmTinw+T983DAAAAEhFQ9Xa2vmHP/yzubld13XDMK3o43DYzzpr/he/eHnfx7tcjjvuuGHJkvm///0/EwkldTBQVlZWLBY79dRTd+/effCg/0ivuHdvAxFlZGQsXrz408QmCIwxa2uzZ0+//fZrcnOz+n36nj0H/vznp7u7w7qumybjOI7nOZfLsXDh3Btv/IzdbsOuAAAAgFR0dBhjzzzz5gsvvKNpuiAIpaVleXl5hmG0tra2t7e/9tr7W7fu/spXPjtzZmWvJ0qSeMop1ZmZvkRCycj49ByZKIqiKBYXF9vt9vr65vr6loqKkr6v+/HHe4mo17AkjuM4jhMEQRD4K644t9/rzhQl+Z//rFq16kNN0202W2XllKysLFVVm5ubA4HAqlVrd+2qu/32a4/URwUAAABIRf1HomeffWvlylVEVFlZec8995SXlyeTSeveDRs2PPTQQ21tXT/+8R9/9KM7qqoqej1d03TGTCLyej9dKITn+ZycHFVVrZNo//zny/fd95VeTzRNc+/eBkEQ5s6de3jSkqxcZZqsZxbHXm/45ZfffeWVdzmOq66uvueeewoKCnre8KpVqx599NHm5vYf/OD3v/rVd0tLC7BDAAAATFhHN1/Rhg0f/+c/bxDRDTfc8Otf/3rSpEk9CYOIFixY8H/+z/+ZMmUKET366DOKkuwbbqxFWz2ew6ZY9Hg8DofjvPPOI6Lduw90dnb3fd1AIOR0OlMHFRGR1W9ks9kYY7Kc7PuGV6/eaGW4L37xi7/85S/z8vJS3/CFF17485//fPLkyUT05z//G3sDAAAAUtFQvfnmWiI6++yzb775ZofD0Wv5eo7jysvLr7vuOp/P19TU9tZb6/pLRSYRud3uXnd5vd558+ZlZWUZhnngQPPhz2L/+terRHTqqadmZx92jozneY7jbDYbEalq70XWFCX56qvvcRx31VVX3XDDDYIg9F2IbcqUKddff70oirW1B99/fzN2CAAAAKSiwbW3B/bsqRcE4eqrr2aM9bvUq6Zp2dnZZ511FhE999zbvR6jaYY1NDszM7PXEz0eD8/z06ZNY4xt3bon9a7GxlZrsdhrr72217OsddOsHqNYrPdysE1Nba2tHTk5OVdeeaVpmr0yXI+pU6eefvrp1hvWdayhBgAAgFQ0mI8+2mkYps/nmzp1qmmafRdqZYypqspx3OLFiyVJisflPXsaUh9gGIZ1Bs3n8/XNN5mZmVVVVUT08cd7U9NJXd1B02STJ08uKyvr9SwrD1n/7zXtNRG98sp7psmmTJmSl5fX76ijno2ce+65HMcFgxErfgEAAABS0UDq6g4S0UknncTzfN8IYqUiq3PIZrPl5eURUVdXMPUB1mhrURRTlznrkZ2dPX36dCLq7g5/9FFNahpjjJ122mn9viuXy2X1GPXtKwoGw0RUVVXFcdyRVpYlIk3TMjMzXS6XYRjxuIx9AgAAAKloEFb/jSiK/UYiItJ1vecuK4X0mmPaGleUeml9Ko7jCgsLTzrpJCJ68cU1mqYTUSAQ2rmzlojmzZvX77NsNpvdbieicDjW665oNJGa1Y7EWnTWZrMxRgM/EgAAAJCKiIgKC3OJaNu2bUeOTYcikaIo7e3tRNRrTkVrBkWra6dfPp/vyiuvJKL29q6OjgARvfvuR5qmu1wu6+RaX5IkHWmD06ZNIqIdO3YMcPqss7NT13VZloPBoCDwHo8L+wQAAABS0SDOPHMex3GRSKSurm6AhzHG3njjDSJyOu295mPUdcMwTJfLdaRFNhwOR2FhYUlJSSKhNDa2yrLywQdbiOiyyy47UvTxer3W+bhwONrrrnPPPV0Q+AMHDrS1tfV9omEY3d3dkUiEiF577TUi8nhc+fnZ2CcAAACQigZRXl5cVVVhGMarr77ad6i1lWlEUQwGg1u3biWi8847o9dKGoZhMMaOdAbNkpeXV1ZWxhhbs2ZTR0d3KBSx2+19rz7rIQiClYqscdypSksLc3Iyw+HwK6+80iu3xWKxxsbGQCBgmqbf71+3bp2Vovod8AQAAABIRb0tXXoaEb399tv//Oc/+45f5nk+Ly/P6XTm5+cT0apVa7ds2ZX6AF03TNMURXGABVkdDseCBQuIaOfO2tWrNyYSyvTp0wcOUtZM2cFgJPVGTdMfe+y5QCBks9nKy8tTI1FbW5vf77fefzQaffrpp03TrKgoufTSs7FDAAAAIBUNydlnn3b22acZhv70008/+uijfr+/1/Bkj8czbdq0r33ta5WVlaqqPfzwM62tHampiDHmdDoHfpV58+Y5HA7DMF9//QMiqq6u5vmB3qc1J2TqGHDDMJ944oUPPtjCcfx1111nzZptRaLm5uZYLEZEsizv27fvt7/97cGDB51Ox/XXXyJJInYIAAAApKKh+tKXrj7//IWMsZdffvm73/3ud7/7XWtQTg+n01lRUXHzzTdnZWWFQpEf/OD3jY2tn4QVwzAG6SsioqysrAsuuKDnn9ackAOwepKsK84sf//782vWbOJ5/nOf+9w111zT83KyLCuKomnaX/7yl9/+9rePPvpod3e3z+f+7ndvmT17GvYGAAAApKKjIEnirbdedfPNV1RWlsbjsQMHDrz11lu9zqZJklRdXf2d73ynqKgoFkv89rdPNje3E5GmDT6uiIh4nl+6dKnD4SCiqqqqSZMmDfBgjuOsOSF7ll176aXVb765zjDMSy+99IorrkhNYN3d3URUU1Ozb9++jo4Om02cP7/6+9//anX1lIG7owAAAACpqH8XXbT4Rz+647//+2sul6Ourq7vVWk2m23WrFlf+cpXiKilpf1//ueRQCBkrcw66Bk0IiotLS0sLCSiq6++etAHu1wuIrLmN3r11ff+/e/XGWOf+cxnbrnlltQr16LRqKIojLHt27cT0eLFp/zmN/d++9s3T5pUhP0AAAAAjr2DxGaTpk+fXFFRaprm448/3ndOIJ7n58yZ8+Mf/zgrK6uzM/jrX/+9traJPlnSdeCNO53OmTNnZmZmTp06dYipiDH2yivv/utfr+q6cc4559x4442p3T+GYXR2djLGotFobW2tJInnnLPA53MLArqIAAAA4PhSERHxPHfFFedyHFdTU1NfX9/3AaIozp0796tf/SrP83V1Ta+++h4RWVNRD4zjuIsuuqi0tDQjI2PQB1vn2ojoH/94SdP0+fPn33nnnb16pMLhsHWab9WqVbIsZ2X5KitL8fEDAADA8KQiIpo9e/qUKWVEtHbt2iPlm9NPP/073/mOdf08EdlstkH7ioiooqLipptuGmAi7B7WNWiWU0899a677uo1SMgwjFAoRESRSGTTpk1EtHz5UqfTgY8fAAAAhi0VEdGSJadyHLd27dojLazB8/yZZ5554403Wr1EQ58pcebMmUN5WE+30PTp07/97W/36l5ijLW2tlodRTU1Nbque72uZcvOxGcPAAAAw5yK5s2rEgS+paXlww8/PNJjOI67+OKLb7/9dkmSbDbb8P4OHo+HiGb8f/buOzyu6s4b+O/W6UV1JKu7yb1hbDC9hJoElpAX2IQNeTfZbMomefMmS8Imm31TNiQhm7JsCiG7IUAoofcaMAYb22DcsC3bsnqZXu7M3Du3vn9ceSzLsiwbSVb5fh4eHuvOaGZ0zplzv/fec89pbr711lvtfw+Wz+ftUd5E9P777xPRhReuQcUDAADA2KeiiorS8847g4juueceVVVHCEaXXnrpjTfeaN9IP4Y4jpszZ87Xvva1ioqKIQ8ZhhGLxez1ScLh8MGDB1mWWbVqESoeAAAAxj4VEdHf/d1HBUFIJpMHDhwY4WkMw1x//fVXXXXVmP8Z3/3ud6urh7nBPh6PF4Pac889p+t6eXlJc3MTKh4AAADGJRW5XM4lS+Zqmvb222+P/EyGYQYPjh4rwWDw2I2apkmSZP87Go0eOHCAYZhbbrmWZRlUPAAAAIxLKiKi1asXE9GLL744ZGW006ijo6M4AHzPnj2FQqGhoXrlyoWodQAAABjHVHTmmUtdLoeiKH/5y18mwx9mz9lY/PHdd98lojPOWDyaSQEAAAAAqejU+f2ea6+9hIg2bNhgL0p/GsmybE9QZNu1a1dPTw/DMOvWrUCVAwAAwPimIiK64ILVwaA/HA53dHScxj9J1/X+/v7ij4ZhbNiwgYgWL55bUxNClQMAAMC4pyKfz9vc3Kjr+lNPPXW6/h7LsuLxuK7rxS3xeLy/v5/j2L//+4+hvgEAAGAiUhHHsRdfvJaINm/efLpOFyWTyUwmM3jLtm3bcrlcQ8OssrIA6hsAAAAmIhUR0fLlzdXVFaZpvvjii4MHO0+MbDabSCQGb1EUxZ4s4Mwzl4qigPoGAACACUpFRHTjjVcS0fbt2xVFmci/RNO0/v7+IVFs69atkiTxPHfJJWehsgEAAGBCU9Hs2bXBoL+3t3fPnj0T9meoqtrd3T0kEhmGsXv3biK6+uoL/H4PKhsAAAAmNBVVVJTOm1dvmuZvf/vbibmIZllWJBIZPMLalsvl2tvb3W7nBResRk0DAADARKciIrr++stYlgmHwzt37pyASNTX1yfL8rEPPfHEE7qu19SEKipKUNMAAABwGlJRQ8OsM85YTERvvvnmuH56VVV7enpyudyxDyWTyR07dhDRRRetEQSMswYAAIDTkYqI6LzzzuA4dtu2beP30TVN6+npGfYsERFt376diCoqSs4/H5fPAAAA4PSlogULZns87mg0+uSTT475i5ummc1mOzo6jh1LVLRjxw6GYS68cA3Pc6hmAAAAOG2pyO/32IuOPfjgg8c7nXNqDMPo7e099ib8wbq6unp6ehwO8cwzl6COAQAA4HSmIiL66Ecvcrmcsizv2rVrTF5Q1/VUKtXV1SXL8giRyDTNRx55xDTNOXNqsfAZAAAAnP5UVFoaWLlygWmaYzLmOplMtre3R6NRTdNGfmZ/f39vby8R3XzzRzmORR0DAADAaPDj+urnnLNq48btmzZtSiaTJSVDb4/XdT2bzcqyrGmaruuaphWnwy7+Q1VVwzAMw7DDkCAIHMeJosjzvMfj4TiO44YOG9q1a5dpmosXz21srEEFAwAAwKRIRUuWzBUEvlAo3HfffRdeeGFXV1d7e3t/f39/f388Hj/hWZ/RcLvdfr+/pKQkFApVVFTU19fbN+SvXr0YtQsAAACnPxXpurFnz8F3393DsiwRvfzyyy+//PIJf8vr9R5vbiFN0zRNKxQKQ7bn8/l8Pt/f3793797B2998c5um6eecs7KsLIhqBgAAgNOQigzDbG3tvPfepw8e7LTHRHMc53A4SkpKPB5PeXl5RUVFeXl5aWlpSUmJ3+/3+Xwej8flcvH8qD5MLpfTNE2SpGw2m0qlEolEIpGIRqN9fX35fD6ZTEqSpKpqa2tXa2vXgw8+9zd/c+nFF69FNgIAAICJTkUPPPDsyy9vKhRUIlqyZMmHP/zh2tpah8MRDAa9Xq996uiD8Hg8RBQMDpNyNE1LJpPZbFZV1XfeeefZZ59NJBKPPfbK+vXvfPrT19rTbQMAAACMeyoyDPPhh1945pn1RLR27dqbbrpp4cKFE/nHCIJQWVlZWVlJRAsWLLjpppuefPLJJ598sr+//667Hvn2t8vq6qpQ5QAAADDuqailpe25595gWfbmm2/++Mc/frwRQoZhcBynqupYvS/LshzHWZY15EQUx3HXXXfdunXrbr311v7+/ttvv/s//uOfHQ4RtQ4AAADDJIqxeiFdN3796wc0TT/zzDOvu+46nueNwwpH03W9UChYY8cwDFVV7bHYRZqm2e9eUVHxb//2bz6fLx5PvfbaFlQ5AAAAjG8q2r+/PRZLMQzzuc99jmEYVVX1w07LH2aaZvEDzJo166qrriKi3bsPoMoBAABgfFPRgQMdRLR06dLy8vJJ+HeuXLlSEIRDh7pR5QAAADC+qainJ0xEixYtmpx/Z1lZmSAIiUQ6mUyj1gEAAGAcU1EyKRFRVdUkvcnL5/PZ8yF1dPSh1gEAAGAcU5FpGgzDuFyuyfl3Op1O+w61bDaPWgcAAIBxTEWyrDIMM8r5qU/D38myDMMQUSaTRa0DAADAOKYiyzKJyE4ek5Pb7UZ9AwAAwLinIgAAAIApbYwveB06dOh4U1qfdvk8RhQBAADAhKQi0zTvu+8+lCkAAADM6FTk83l8vikwcMfn86DWAQAAYBxT0W23/QNKEwAAAKYujLYGAAAAQCoCAAAAQCoCAAAAQCoCAAAAQCoCAAAAQCoCAAAAQCoCAAAAQCoCAAAAOJGjZnG8/cEfoERG8M0bv41CGAHaD9oP2g/aD9oP2s9U9PJvb7L/gXNFAAAAAEhFAAAAAEhFAAAAAEhFAAAAAEhFAAAAAEhFAAAAAEhFADBA1w3LslAOAABD8CgCgBkinZZefXXjX/+6KZvNsyxbXz/rkkvWnXfeapQMAMBJp6LQ/Esvnre4xuPlWCIiQ021t/zXI++jDAEmu2w2/9RTrzz44LORSLy4cc+egy+88MbSpc1f/OInly5t5jicOQYApKJRca4851OX1JVzgzZxYjDoQQECTAG33fazrVt3WpbFMExTQ73L5crlcolkKiNJu3a1fPnL3//yl//u+uuvQEEBAFLRidWf+Uk7Ehm5gzv3vLqlNZYqCZ0999IqDQUIMKnpunHHHXdv2bKDiBYtWDB/3rxYLJbNSsFAIBgIZHO5vv5wLp//1a/uKSsLXnTRWSgxAEAqGpFv7fkNIY7IkDY//uwrrfbGZHjT1vtRfACT3IED7c899zoRnXP22RXl5e3tbYMf9Xo85aWlFln5vHz77b9btWpxIOBDoQHAjHXikQTBhUtreCKKtbxzOBIBwBTx8MPPqapWXVVVXlbW19c7zIERz5cEgizLSlL23Xd3o8QAAKloJGeXhYiIct07wigugKlE141XX91IRDXV1el0ulAoDJuKeI5zOZ2maW3bhrsnAGBGO+EVtBVBFxGRku3xrv7El+obPSIRkVEIt7z/4NP7syhBgEkrHI6pqkZEgUAgmUwM+xxFUYiI4zgiam3tRKEBwEx2wnNF5XYMEoIXXDV3IBIREecILVr1xVtWOFGCAJOWJOWK0cc0zWOfoOs6ERmmmcvnicjhEFFoAIBUdGKcw0vS9tde+9mPH/zl8/vbFSIiPjT3Y2ejCAEmq1mzKu1/yHJ+2Cfk83nDMPojEcMw3G7XF7/4SRQaACAVjYLe/u4bz24JK0TZndvuf60vS0TElzfORxkCTFJ+v3fRorlE1Nc/zKhA0zQty8oriq7rfr/3d7/7/rx5jSg0AEAqGgU5/Jp05Ked6RQREXk9AZQhwOR13XWXEVEkFrMvlg1mGIYsK4lkkog++clrEIkAAE6Yig6mFPuJjvphHtUVBWUIMHmtXbsiFCo3DKO1vWPIPWiSlE1JEhE1NdVec82lKCsAgBPeg9a+P5mdU+0lT+MZNdTZM7D17LJyIiJKpSNj+WlM0zI009BNWVKlhEJEvlKn2+/gBJbjGYZhUGEAo6eq6l/+8nw4HGMYRhD4xsYmWZZTqSQRZbNZVdNUVXU4xF/96l8xeSMAwGhSEe3c9/6a0NoyNjh/zScu2/HkS1HnmsXXrqlwEpGRfH/DGE1iZBpWtFPq2JNI9ueUrGZZRx7ieNYTEP3lzvpFZZUN6LsBRhuJvve9/3rllbeIqKmhYemSJYoi5/M5IjJN0zDMjCSZpnnOOWeUlQVRXAAAo0pFFH7ltfbGv5kd4hyNK9d8ZWVxe+HgGxvfTH3gT2CZVjZV2P1Gb7g9Q0QMyzgdTkEQiEg3DMMwdF3PxJVMXOluSYUa/csurPEEHITTRgDHl0pJ//zPP965cx/LsosXLpgze46qquHwwEGMrht5Wc7LMsuy119/BcseuZKeTkt33HH3V796S1lZCYoRAJCKhtG65e57U5dfuWBJyO0kIjKy8ci7G7e9uUcag0/QtTe5e0OPqhhENKuqqrl5vkN05PO5XC5nHE5FhmH0R6IZSQq3ZzY8nF907qz6RaWoPIDj+c53/mPnzn1EtOaMM0KhUDKZSKfTxUez2WxGkojoggvWLF++cPAvPvDA06++uqmnJ3znnd91u10oSQBAKhpGeP+Lf9z/4ti+t2XR/i39ezf1E1FpaXDF0uWBQCCbzcZi0eL9MhzH2bPuzm5skKRsd1+vkle3vdSpa2bT0jKGxSkjgKNkMtlvfOP2HTv2sSy7etWqqqqqIZFIkrKGYRRUVRTF//2/r+e4IyeK9u9vu//+p03T3LPn4Oc//68//vE/V1VVoEgBYOZgT+N7d+1N7Hu730485559TiAQiETC0Wjk2FuIbT6fd/6cuX6fj4h2re+JdWO9EYCh/vCHh3fs2EdE55x11qzqalVVB0ciy7J0XVcKBdM0586tr6urLj5kmuY99zyuaZo9w3VLS9s3v/lTlCcAIBVNhHhvdserPZZFDfV1ixctJqJwuD+Xy438WxzHVodCDqfDMq0tz7anInlUIYBNVbX//M97H3roOSJauXx5eXm5LOd7e3sGPyeVShNRWpKI6OyzVzqdjuJD0Whi8+btRFRVWdlQW8swzL59h7785e/H40mULQAgFY2vA+9EDMPw+/2rVqzkeV6W5Xx+VBHH4RBnVYYEkdcKRuu2KKoQwPbWW+8+9NAzRLR86ZLGhgbTNJPJowKNvRCsqmm6rjMMc+WVFwx+9M9/fiqbzTtE0ef1lZQEG+vqiGjLlh2/+c0D1uCbQgEAkIrGViqSj3ZmWZZdvmSJ3VlHo6Od+IhlWUEQfF4fEfUeTOczKmoR4P33D9xxxx903Wisr29qbCKivr4+VT3q26FpGhHlZZmIVqxYWFtbVXwoGk089dRfiai8rIznOSIKBPz1tbVE9Nxzr99114O6bqCQAQCpaFwc2BoxdNPtcpWXl+u6Homc3KxHPM/53B6e5wzdbN8VRy3CDJdOSz/4wa/j8WQg4F+4YAHDMLlcTlWPmsnaNE072RQKBYZhLr/8vMGPbt68Q5YVlmUrysuKG0tLgtWhkGmaDzzwzPbte1HOAIBUNPa0ghFul4ho6eLFRCRJGcM4ucNQURSJyOfzEdGhHVFDN1GRMJP9/vcPdXR0u12utavPdDqdRBSLDb24LEkSEVmWVVBVh0Nsbp49+NE9ew4SUUlg6LqGocqKstJSRSl897u/bG3tRFEDAFLRGMsmC4ZucBxXVVVlGEYqlTq11/F7vERk6JYsaahImLHWr9/yyCMvmKY1b+5cj8dDRLFYzDSPOlRQVdU0LSIyTdOyLL/fO2tW5eAn2JMb+XzeY1+/srxMEIR4PPmrX92jKAUUOAAgFY0lJacRMT6Ph4gURf4gL2VPZSRnMbQIZihdN+6660EiqqupaWxoIKJcLitJmSFPk+WBZZwT6RQR1dSE/P4jASidlg4d6mJZ1uV0HvsWDodjdkMDy7LvvLPr5ZffRJkDAFLRmPbjqmGRJQiCZVn2Wf1TxjBEFmkFjAOFGeqeex5rbe0URXFBc7O9cMewJ1+Lp440TSeilSsXDV5r+fXXN5umybKsw+EY9l0cDtHjdhuG+atf/amzsxfFDgBIRWPPnlAOdQBwajo7e++++2Eiaqyr83q9RCRJ0pD7zohIkgbmO9V13b4N7eKLzx78hAcffIaIXC7ncbsJlq0sLxdFQZJyv/vdg0MuzwEAIBWdOsHJMcQohYJlWXYffbKKMxsZpklkOd0CKhJmoKef/qtlWaUlwcWLFxORaZqp1LAzLg7MNmTf1uBwiIOntFaUQn9/jIiCPv8I78UwFPD5iWjz5u328wEAkIrGgMsrEllSNptMJk7tFezO3bIsy7QYlnF6kYpgxlFV7fHHXyKiObPnHM438rAnX4tTMBqmSUSzZ9fZa3rYotGEfXBSVjbSister9ftcgmCkM3m77jjbpwuAgCkorHhLXGIDp6IOru7T+HXFUWxU1EynSYi0cW7fCIqEmaaP/3p8Ww273Q6QpUDd5PlcsPMDq/renHmC03XiaihoWbwEyKRuGma9o0LJ1RWUkJEGzdu27mzBVUAAEhFY4Dj2dqFJUTU09t3skechmHKsmJZZJpmLp8novqFJYOGjQLMCJKUe+SR54mosa5eEAQiMgwjmz3BvQv2maTq6oohqciyaNi7z4Z+cznWIYr2iOyNG7ehFgAAqWhsNK8JcTyr63oimRr9b1mWVVw+NpPNmqYpurj5a6pQizDT7N17MJvNOx2O+fPn21sSidFO8l5ZWT74x3RasixrNOeKXC4XEbldLiJ6993dqAUAQCoaG6KLr1tYQkTxRMK+VfiENE1PpdL2tYCCpmZzOSJqWFzGCyxqEWaazZt36rpRXlZmpxnDMAqFE8+vWFBVlmWDQd/gjeFwnIgEnh/lW7tdLoZh3n//QHt7NyoCAJCKxkbz2ipB5GVFOdTRccIVPxRFyWYH7i42TTOeSBqG4fTwc1ZWoAphBnrxxTeIqKK8vPilGOXtnAxDHo9r8JZ8XiYiURztLQv84bNKjzzyAioCAJCKxobLK5x1TaPDxcuy3N7ZJSvKsc/Rdb1QKGTSmeLMvIpaiCYSmqY5vcK66+Y4Pbj7DGacjo6eWCxJg+4ay2Qyo/lFOzn5fJ7BG6PRBBHZM0COkt/nI6L167ceOzcSAABS0SkKhtyl1V4ikrLZg22HBt9UbFmWLMuappmmKYiC0+lwOh2CwEfjcUVRiKiizucNOlF/MAO9994eImIYxnd4hqFMJn28J/M8z/NHxgwxDOP3H3UFLR5PEhHLcifxzfX7iUhRlEQijeoAgOmEP11v3Hco3fJ2OBXJMyxVVlQ01TcWCop1eGYVhmHsoZ1D1NfWhCMxWZa7W5JSXFm4rirU6Ectwoyye/cBIqqqGLh8XJzUdGT2bfkMwwx7sYznuJP6DCzLapqeTKarqnAVGwCQij4AVTEObA0feDdCRA5RXNjc3NTU1N/fV4xEIx6kBsikZCYlSblUJL/l6Y7ZK8rmrwkJDg51CTOBZVltbV1EVHr48tkoU1Fx9N6QVNTfH6WTvIJmpyhN02KxFGoEAJCKTl24LbNzfXcupRLRrKqqJUsWe9yefD4vy/IoX8HtdluW5XF5Ysm4WtAOvBuJduUWnh0KNeGkEUx/qqoVCioReT0Di97r+gnGWbtcruJSaAzDOJ2OMeg4eF6VNYwrAgCkolPXvju+49UuyyKP2z1//tzG+kb72Peklv7gOJaIBJ6vrgilJSktZVKR3OZn2lZdVl/bXIIahenNsix77lOe52l0Syzzg+66N03zjTe2Dn5U04xT/jCSlEONAABS0SnKpQuWRT6vd9mSxQzD9PT0+Hze4jreo8QwDMsypmkRUcDn87hdsUSyUCgU8jqqE6Y9VdWGTPE1mq+Py+VSCgUi0nXjO9/5OYoRAOD0pyK3T7RjTXGK6ni8cLIvYpqmHYkG/gCOZxiGiJweHtUJ054oCoJwpKmnUqnR/JbT6RB43ufxHO8J9joeIxvlhKsAAEhFo+ItcTAso2qaZVnMqa5eZg+qKLIsS9M0hmUcbsxdBDPOKFMREZWVlRXnNzrWaL6Px06f7fG4UQUAMJ1M6HxFnoBDdHKKosQTyVP5fcvK5/NDBngm02nDMJxu3leG6Ytg+hNFwR4urQxMfGqN8hcZhpjjO9mPYZgmy7KjnxEbAGBKmNgraH6xqsnf8X6iu7e3u7d3yKO11dUjL1GZzefjieHHZTcsKXO4cAUNZsBxDMu63S4ikuV8YbgZ4cdJccmdgVRkGDzPl5Tgxk8AmF597AS/35LzazwB8dR+13WcoQ+lVZ55qytRlzBDNDbWENEpnnA9JaZpGoY5ZAvDjGo0EgDAFDLR51cEB7f6qkYpfuQYV85qLZv7GYZhOXaUrzB/TWjwmSFfmZPjWdQlzBCLFs0jeiEcjeqGMTHvaFlkTwdQjESmaYqiUFoaQHUAAFLRB1IScpeEjgzSTPbn927qc4ii3+fL52Xj+B09wzAsx5iGGWrw+ctdqDyYmVavXmL/IxaLTsw7Fm8aHfjOZtJE5PG4S0uDqA4AmE5O/ymWWHeWLBIFnuM4j8fNHf+MEcMwAi8aupWKyKg5mLEqK8uqqyuIKJ3JTMDb6YYx5FjFniHpwgvXchzO0QIAUtGYatsZIyKHw8EwDMdxPp/veGOuGYbhWJaIeg+mUHMwk61bt4qIYvHEeL+RZVFWGjrOWlU1IrrssnNREQCAVDSWEr25fEYlooDfX4w+Ho/7eMHI5XISUbQjp2Q1VB7MWKtXL+U49tgJhMZcoaAMWbZZUVXLshobaxctmouKAACkorHUsTtJRKJD8Hm9xY0cx/l83mEX8fa6PfbRatuuGCoPZqzFi+e53S6lUEgmU+P3LoqiyLJyTE4qENGaNctQCwCAVDSWVEUPd6QYlhbMmzfkIYZhvF7PsGeMKsrKiKj3QEpXTdQfzExlZSWLF88nomg8Pk5vIcvysZFI0/VcPk9EZ5yxBLUAAEhFY8ayrD1v9Sk53eP2BAPBY5/AcZzX6zn2jJEgCizHSolC6/bIkHP7ADMEx7H/5//cIoqCrCjZ3NgvXK8oBUUZ5vJcWsqYpllZWXbWWStQCwCAVDRm+lrTHe8niGh2Y6MoDj+vI8uyPp93yBkjgeOD/gAR7d8SiXVnUYUwMzU01Fx00VmWZY35dI75vCzLw9zmqel6Pi+zLPuDH/wfh0NEFQAAUtEYHYnmtH2b+i3Tqq+tnTN7jiRJx/18LOvxuIecMfJ5PC6n09DNXa/3KDkMu4YZ6rrrLmdZNplKjeHNaIVC4XiDuNOZjGVZZ5651L54BwCAVDQGVMXY9HhbJq4IgrBo4ULjmNlQhuA4zu/3DTk2LQkGWYbJxJVNj7epioGKhBlo6dL511xzKRFFotEhqyafGlmW8/nhJwPLZLP2iKJPfeo6TFMEAEhFYxaJ3nupMx3LO53OdWvXulwuXdd1XR/5txiGcbuPul1f4PlQZSXDMulY/r2XOhGMYCZ+e1n2//7fv589u17VtK6eXntyxVNTKBSSydSwY4mISNU0SZI4jv30pz+2atVilDwAIBWNASWnvf7nlr5DaSJasXRpaWkpEUnSaOfn9ft9oigUfxQFoTQYJKK+Q+nX/9yCS2kwA/E89+1vf4GIpGw2cqoLgKRS6eOdIiIiTdP6IxHdMBYunHvLLR9DmQPAdO5UJ+ZtLMvqa03v29Sfz6hOp3P1ypUVFRVEpKrqCIOKjuXxeFhWLhRU++4ze/qiRCqVz6gbH2tdcHZV9ZwAwzCoV5g5Fi2ae9ttn//FL/4YT6Q4lq8KVRa/dIpy5NZ6XTcsOuqeTcu0VF2zTKugqo6j73gQeL4YiSLxuGVZ8+c3fetb/4hB1gCAVPRB6Zq5+42ejvcTlmkJgrB29Wr7LBERpVInffuMy+VyuVypVLoYjERBDEcimbiy9bmOBWur5qyq4AWMe4DpT1XVQkHTNK20NFBfP2vfvtb+SCQaj488UO9UugmeW7NmWT4vJ5MZUeQdDgfPcyh/AEAqOmnx3uzOv/akYzIR1dfWLlq40OUaWO5ekqRhbwAejUDAr2m6osiGYYqCUBUKJVMpWVH2burrPZBafVWjr9SB2oXpavv2vc899/qhQ12RSDyRSOn6kRg0QiQafAH6mIA10gVoXTfuu+/J++570uEQKypKZ80KnXXW8osvPruqqgJ1AQBIRaPVeyC15dl2InI5ncuWLplVPWvwYW7sVIdBEBHDMKIoiKJQKBR03WBZprK8XMrlUpl0Oia/+qe951w3p6LehwqG6cQwzL17D/7kJ3ft399ubxF4XuAFt9vDsazb7XY6HKqmiYLg9/nKysqIyOfzneRbGPl8XpblZDJZUFUiUjVN01RZKZiGoWpab2+ku7t/y5Ydv/nNnz/1qes+/OGLQqFyXLYGAKSiE4h1S++90kVElRXlq1asLJ4iIqK+vt4xuZGYiBwOh8NBpmlaluXxePx+bzgSk2V56/Mda65uKK9FMILpE4nuvPPep556NZfLE1Flefmc2bM9Hg/P84IgcBw3JtGE4zifz+fz+SorK4ekJdM0NU1TNa2np7uzq1spFO6+++Fnnnnt3//9a4sWzUMFAQBS0XFlk4W3n2rXVaO0JDg4EmmaFomExyoSFdnTPHIcJ4oBl8PZ1tGpyIV3nu86/4a5bj/Gh8KUp+vGvfc+8dBDz5JllZWWrli21O8PTOQH4DiO4zhBENxEwUBg3tx5XV1dBw8d6u+PfuUrP7jjjm8tX74A1QQASEXD2781rKuGz+s9d905xXmGYrFYLpc1zfFd1dXhcMybO+dg6yE5p+x7u3/VZfWoZpjqNmzY+vvfP2ia1vy5cxcuWHDs+oD5fH7wfEWKohQKyim/ndvt4Xm+ePKJ4ziv1zv4CaIozpkzp76+/s233kplMj/72d133fVDpxOD+QAAqegY/W3pzj0JIlq0aKEdiUzDiMVjuXFYxnL441qWrSgv7+zu7m5JNiwpLZvlRU3DlPb44y+bplU7a9bCBQs0VVUURSkolkVE1infsjCCY2cRi0Yj9j9cLjcR2ZftnA7HmjVr1m/YcPBg5/r1Wy6//DzUFAAgFR3FNKy9G/uJqG7WrFlV1USUy+UikfAE/2GlJcFwNFwoaPvfjp79N17CYFCYshKJ1LZt77Ms63G7OzraT++HkeX8kC0etyuRLPzXf92HVAQAU93Yz+uTS6v5jMrzfHNzsx2J4vHYafnbmhoaGZZJRnPZdAE1DVPXq69u0nWdZZnJOYlidShERJFIvLc3gsoCAKSio0S7JK1g+H0+t9ttGkYkEh7zOeVGSRQEhyCqsp4K51HTMHW9++5uInK73ccOJ5oMBGFgGqTOzl5UFgAgFR2lpyVJRD6fj+O42Gk6SzTwt7Gsx+Mmor7WNGoapq5Dh7qIyO10TdpP6PV4iCiVyqCyAACp6AjTsNIRhYiqKitisYkbXn08Pq+XiCIdkmlYqGyYohKJNBG5JvEdXvZJrGg0gcoCAKSiI9Ix2V58wOl05nLZ0/7nuZxOItIKhpzVUNkwFamqOubze42TQkFFfQEAUtERSlYjIpZjHA7HeM9LNBrFqZJyGHANU5M1Fc5ycixLRJaFM7IAgFQ0OBXlNDuLnPZrZzaeH5h6wNBMVDbAeB9+AABMaWM8X1HxWLG3r3+y5D6OMQ1LVw1UNkxpqqplJGlyfjalgHOxAIBUdByaqrd1dEyqv1NTca4Iprae/n4UAgDAFEtFooufhH+n6MQZfpiqAgGfruuT/3MWJy4CAEAqIiKavbx89vJyFCvAWHE4xKefvgvlAAAwAVgUAQAAAABSEQAAAABSEQAAAABSEQAAAABSEQAAAABSEQAAAABSEQAAAABSEQAAAMAJHDWL4zdv/DZKZAS3P/gDFMII0H7QftB+0H7QftB+pjScKwIAAABAKgIAAABAKgIAAABAKgIAAABAKgIAAABAKgIAAABAKgIAAABAKgIAAAA4EX7kh+Pb/3D3ga7jPuy56jNXrSlDKQIAAMDU98HOFTlcThQhAAAATAsnOFdUtvgTX5o3dKPW+9Ld27cZVHHmkqUeFCEAAADMhFREgtMjDNmU3dq6zSCi0ovWhVCAAAAAME2c/BW07o0bJSLyLmtehMtnAAAAMGNTkbKzZYtCRL6Lz69F6QEAAMCMTUWRbZsSOhE/e84yjCgCAACAmZuKWg++kSIifs2qOTzKDgAAAGZqKtL2bOtTiChYt3IOZn8EAACAGZuKjPa9h0wiqls6uwIFBwAAADM2Fenvd+4iIvIsbS5FuQEAAMCMTUXa/pYEEVHZrPlY4gMAAACmn1EPmu5uP0REFJxdHUSpnS6maRmaaeimLKlSQiEiX6nT7XdwAsvxDMMwM7x8dN2QZUXTtL6+aHt7DxE1NtZUV1e6XA6HQ2RZjIYDAPQ/2H+NRSrq6N9JRMTOb8B81qelPRlWtFPq2JNI9ueUrGZZRx7ieNYTEP3lzvpFZZUNvplZPqqqvfPOrmeeeW3PnoPRaNwwzOJDoijW1VXNmVN/1VUXnnXWCrQlAED/g/3XB0xFqc64QkTkq6vCN2BiWaaVTRV2v9Ebbs8QEcMyTodTEAQi0g3DMAxd1zNxJRNXultSoUb/sgtrPAEHzZjTRoZhdnX1/vznf9y8eTsRsSzrEEXBfVT5tLZ2trZ2vvTSm2vXrvjGNz5TUxPCeTUAQP+D/deppiIzGpeJiDylVZi8cYJ17U3u3tCjKgYRzaqqam6e7xAd+Xwul8sZh1uVYRj9kWhGksLtmQ0P5xedO6t+0UwZEv/886//8pd/lKS8XT4LmptFUTy2fMLRWDqT2bx5+z/8w21f+MLNH/7wRWhaAID+B/uvU0pF7LxrP/5v+AJMdMq2aP+W/r2b+omotDS4YunyQCCQzWZjsaiu6/ZzOI7jOI6IZjc2SFK2u69XyavbXurUNbNpaRnDTucjEsMw77nnsbvuepCIykpLli9dNkL5NDXUS1K2p68vkcj84Af/VSio1177IY7DSCMAQP+D/degvIPGPYlTdmLf2/12izn37HMCgUAkEo5GI8UmNYTP550/Z67f5yOiXet7Yt3Z6V0+L774xh/+8LBdPuecvW405TNvzhy7fH7+8//etm032hgAoP/B/gupaAqI92Z3vNpjWdRQX7d40WIiCof7c7ncyL/FcWx1KORwOizT2vJseyqSn67ls3Pnvn//998ahnkK5eN0OnXd+Na37mhpaUNLAwD0P9h/IRVNdgfeiRiG4ff7V61YyfO8LMv5/KiaiMMhzqoMCSKvFYzWbdHpWj733vuEruunVj7VlZUOh5DN5h944Gm0NABA/4P9F1LRpJaK5KOdWZZlly9ZQkSKokSjkdHWKMsKguDz+oio92A6n1GnX/m0tLRt3brrg5SP1+Mjotdf39zXF0V7AwD0P9h/IRVN4qC9NWLoptvlKi8v13U9Egmf1K/zPOdze3ieM3SzfVd8+pXPPfc8piiFD1I+Xrdb4HlFKTzxxMtobwCA/gf7L6SiSUorGOF2iYiWLl5MRJKUMQzjpF5BFEUi8vl8RHRoR9TQzelUPpKUe+utbWNVPo8++kKhoKLVAQD6H+y/kIomo2yyYOgGx3FVVVWGYaRSqVN7Hb/HS0SGbsmSNp3Kp6urT9e1D14+Po+HiBSlEA7H0OoAAP0P9l9IRZORktOImMPfGfmDvJQ9FYScnVbHIrFY0rJoTMqH53nLsqLRBFodAKD/wf4LqWgy0lXDIksQBMuyJEn6IC/FMEQWaQVjOpVPPi9b1piVj2WRJOXQ6gAA/Q/2X0hFk5plWceb8ApQPgCA/gflg1Q0/QlOjiFGKRQsy9K0U7mkWpwZwjBNIsvpFqZT+fj9XoYZo/IxTIahsrIgWh0AoP/B/gupaDJyeUUiS8pmk8lTvN5sj/m3LMsyLYZlnN5plYoqKkoZhsakfEzTZFm2rKwErQ4A0P9g/4VUNBl5Sxyigyeizu7uU/h1RVHsVpVMp4lIdPEunzidyqehYZbT6fjg5ZPKZIgoGPSHQuVodQCA/gf7L6SiyYjj2dqFJUTU09tnmic3VYNhmLKsWBaZppnL54mofmEJw0yr8hFF8SMfueSDl082lyOiK6+8YHqvXA0A6H+w/0Iqmtqa14Q4ntV1PZFMjf63LMsqLr+XyWZN0xRd3Pw1VdOvfD796Y85nY4PXj4lJf5Pf/pjaG8AgP4H+y+kokl8OOLi6xaWEFE8kdC0UQ3j1zQ9lUrb5x4LmmofiDQsLuOFaVjFgYDvyisvOOXyUTXNPhD58IcvdrmcaG8AgP4H+y+koskdt9dWCSIvK8qhjo4TzpiuKEo2m7X/bZpmPJE0DMPp4eesrJiu5fP3f3+9wyGcWvnEEgld18vKSm666cNoaQCA/gf7L6Siyc7lFc66ptHh4mVZbu/skhXl2Ofoul4oFDLpjCwPPKqohWgioWma0yusu26O0yNM1/IpLy/91a/+taTEf1LlU1BVu3wqKkr/8z//tbQ0iJYGAOh/sP9CKpoCgiF3abWXiKRs9mDbocEzYlmWJcuypmmmaQqi4HQ6nE6HIPDReFxRFCKqqPN5g9P82tCCBXMWLJhrl09rW9tJlc+ZZy6tra1CGwMA9D/Yfw3Go3FPTn2H0i1vh1ORPMNSZUVFU31joaBYlmU/yjCMy+U69rfqa2vCkZgsy90tSSmuLFxXFWr0T8vy2bDhnbvvfqilpY1lmcqKisb6hlGWT38kKsvyCy9saG3t/PznP3HWWSvQ2AAA/Q/2X0hFk5SqGAe2hg+8GyEihygubG5uamrq7+8rNqmR4rk/QCYlMylJyqUi+S1Pd8xeUTZ/TUhwcNOmfNJp6U9/euL++588hfIJ+P2WaaWldDqTbWlp+/rXb7/hhqs//emPeb1uNDwAQP+D/RdS0eQSbsvsXN+dS6lENKuqasmSxR63J5/Py/JoFx92u92WZXlcnlgyrha0A+9Gol25hWeHQk3T4aTRxo3bfv7z/+7q6v+A5eNyuhOphKKo99//5NatO//xH29at24Vmh8AoP+Z4fsvjCuaRNp3x99+6lAupXrc7pUrlq1ds8bj9liWdVJTp9tzggk8X10RCgYCDMukIrnNz7R1tySnevk89dQr3/jG7V1d/R63e9WK5R+wfELllcFAgGXZ/fvbvvnNn7788ptogQCA/meG779wrmgSyaULlkU+r3fZksUMw/T09Ph8Xl3XT2qNPYZhWJYxTYuIAj6fx+2KJZKFQqGQn/LLO/f0hA3DHNvy8brd0USiUCjE42m0QABA/zPD919IRZOI2yfazaI4xWc8XjjZFzFN025SAxXM8QzDEJHTM+Xr2l4waGzLh+M4u3wqKrBGLACg/5np+y9cQZtEvCUOhmVUTRvNwLTjKRTUwT9alqVpGsMyDveUn7uooaGG57kxLx9d13meKykJoAUCAPqfGb7/QiqaRDwBh+jkFEWJJ07pGqpl5fN5VT2qVSXTacMwnG7eVzblpy+qqQn5fN6xLZ9UJqPremlpsKmpDi0QAND/zPD9F66gTSJuv1jV5O94P9Hd29vd2zvk0drqao4b6QbFbD4fTww/rq1hSZnDNeXruqqq4rzzVj/11KtjXj4f/eglJSV+tEAAQP8zw/dfOFc0uSw5v8YTEE/td10Ox7DbS6s881ZXTo/y+ad/+rtTnhP2eOWzaNG8m2++Fm0PAND/YP+Fc0WTi+DgVl/VKMWPrBojZ7WWzf0Mw7AcO8pXmL8mNDhZ+8qcHD9N4q/P5/n+97966FB3cUskEv+f/3nENM1Rlo/X6/70pz8WDB65ij97dq3DIaLtAQD6H+y/kIomnZKQuyR0ZKrTZH9+76Y+hyj6fb58Xh5h/WGGYViOMQ0z1ODzl7uma/ksXDh34cK5xR/37Dl4110PiqMrH45jNU1fu3bF3LkNaGkAgP4H+68hcAVtsot1Z8kiUeA5jvN43NzxEzfDMAIvGrqVisgzp3y2bXvfsqxRlg/PC4WC2tLShnYFAOh/sP9CKpp62nbGiMjhcDAMw3Gcz+c73pg1hmE4liWi3oOpmVM+jz76AhE5nc7Rl8/rr7+NdgUA6H+w/0IqmmISvbl8RiWigN9fbDoej/t4DcvlchJRtCOnZLWZUD67drX09UWJyO/zjaZ83C4XEW3atD0aTaB1AQD6H+y/kIqmko7dSSISHYLP6y1u5DjO5/Oy7DB153V7iMgwjLZdsZlQPo899hIROZ3iKMvH43YTka7rjz/+EloXAKD/wf4LqWjKUBU93JFiWFowb96QhxiG8Xo9wybuirIyIuo9kNJVc3qXTyaT3bJlJ8syzXNPunxefXVTPi+jjQEA+h/sv5CKpgDLsva81afkdI/bEwwEj30Cx3Fer+fYxC2IAsuxUqLQuj3yQWZen+RM0/z1r++Px5NutzsQCIy+fERR5Diuo6Pn4YefM00TLQ0A0P9g/4VUNNn1taY73k8Q0ezGRlEcfjYLlmV9Pu+QxC1wfNAfIKL9WyKx7ux0LZ833tj61FOvEtGcxqaTKh+e4+yL3P/934++++77aGkAgP4H+y+koklNyWn7NvVbplVfWztn9hxJko5bfyzr8biHJG6fx+NyOg3d3PV6j5KbhsOuE4nU73//kGma9bW1s2fPPoXycbtcqqr+4hf/k0ik0N4AAP0P9l9IRZOUqhibHm/LxBVBEBYtXGgYxggzXxERx3F+v2/I7KglwSDLMJm4sunxNlUxplP5pNPSF77w3dbWzg9SPsFAgGWY1tbOL3zhu+m0hFYHAOh/sP9CKpqMTeq9lzrTsbzT6Vy3dq3L5dJ1Xdf1kX+LYRi3+6jbHQWeD1VWMiyTjuXfe6lz2gSjdFr63vf+s729Z0zKh2XZ9vae733vPxGMAAD9D/ZfSEWTi5LTXv9zS9+hNBGtWLq0tLSUiCQpM8pf9/t9oigUfxQFoTQYJKK+Q+nX/9wyDS6lJRKpW27557fe2jZm5VMSJKK33tp2yy3/jEtpAID+B/svpKJJwbKs3oOpjY+15jOq0+k89+yzq6uriUhV1REuyh7L4/E4nQ6GYewfvW5PWWkJwzL5jLrxsdbeg6kpeleaaZqvv775n/7pe3190TEsH4/LXV5WyrJsX1/0n/7pe6+/vhl3pQEA+p+ZvP9CKjr9dM3c8dfurc912Ndi165eXVFRYT+USiVP9tVcLlcwGBjcsKoqKu1rtFuf69i/JaJrU+yLJ8vKT37y+9tu+5l9LX9sy8fjcocqKuxr/Lfd9rM//vExWVbQJgEA/c/M3H/xaPSnV7w3u/OvPemYTET1tbWLFi50uQaWC5YkSZZPcaavQMCvabqiyIZhioJQFQolUylZUfZu6us9kFp9VaOv1DElymfHjr0//endBw92jHf5pNLpvCzfddeDf/3rph/+8GsNDTVonAAzHPqfGbj/wrmi06n3QGrDwwfTMdnldK49c/UZq1YVm5SqqrFY9JRPqDIMI4qC3+93u12iKDpEobK8vLSkhOXYdEx+9U97o51TYHzfX/+66XOf+87Bgx0up/OsM88c1/KpKCsrLSnhOO7gwY4bbvjK1q070T4BZjL0PzNz/4VUdNrEuqX3XukiosqK8gvOO29W9aziQ319vX19vWPyLg6Hw+Nx+3w+v99XVVlZX1tjN9ytz3fEuid1MHrvvT0/+tFvi+VjX6iesPL5znd+/t57e9BKAWYm9D8zdv+FVHR6ZJOFt59q1wpGaUlw1YqVxYitaVpPT7eiKGM77I5lWY7jRFEI+gONdbVOh0OV9Xee77IXNJ6EOjt7v/712yUpN8HlE/D77fJJpaTbbvtZf38UbRVgpkH/M5P3X0hFp8f+rWFdNXxe77nrzik2qVgs1tvbo6rjm1QcDse8uXNcTqeSU/e93T85y+dPf3o8l8uf3vJJJtN33/0w2irATIP+Zybvv5CKToP+tnTnngQRLVq00J66yjSMSCQsSZmJuTOTY9mK8nIi6m5Jxnsn3VppGzdue+aZ14ho8aJFp7d8nn9+/c6d+9BiAWYO9D8zfP+FVDTRTMPau7GfiOpmzZpVVU1EuVyuo7Mjl8tN5McoLQk6HIJpWPvfjtJkmsNIVbXf/vYBu3yqq6pOY/m4XA7DMH/72wem6CRPAID+B/svpKLJLpdW8xmV5/nm5ma7ScXjsdPySZoaGhmWSUZz2XRh8pRPX1+kry8yGcqnoa6eZdlDhzq7u/vRbgFmAvQ/2H8hFU20aJekFQy/z+d2u+0TjyMvnjd+REFwCKIq66lwfvKUz9atuyQpN0nKRxSEVErat68V7RZgJkD/g/0XUtFE62lJEpHP5+M4LnaaUvZA3bOsx+Mmor7W9OQpn1deeYuI/H7/ZCgfr9dDRG+8sRXtFmAmQP+D/RdS0YQyDSsdUYioqrIiFotN8LXYY/m8XiKKdEimMSkuXWua/v77B4goVFE+GcrH6/EQ0dtvb9c0Ha0XYHpD/4P9F1LRREvHZF03iMjpdOZyp//mL5fTSURawZCz2mQon4MHO+zv/6QqH0nKRSJxtF6A6Q39D/ZfSEUTTclqRMRyjMPhmAzLI9v3VRJRbnIMuLa//BzHTrby6e2NoPUCTG/of7D/Qiqa8FaV0+y6PO3nHm08P7A8sKGZk+HzxGJJIuL5SVc++byM1gswvaH/wf6LiHh8EyZSceKJ3r7JcrMlyzGmYemqMTnKx5ps5cNxrGGYuRxSEcC075/R/2D/hVR0Omiq3tbRMck+kjl5PkyhoE228sG5IoAZAv3PDN9/IRVNNNE1GctcdHKT5JMEg75JWD5+vxdNF2DaQ/+D/RdS0YSavbx89vJylMPxXH/9FddffwXKAQDQ/2D/dVpgtDUAAAAAUhEAAAAAUhEAAAAAUhEAAAAAUhEAAAAAUhEAAAAAUhEAAAAAUhEAAADAiRw1i+PtD/4AJTKCb974bRTCCNB+0H7QftB+0H7Qfqail397k/0PnCsCAAAAQCoCAAAAQCoCAAAAQCoCAAAAQCoCAAAAQCoCAAAAOB4eRTBVPPLIC/m8PFJd8twVV1xQWhpAWQEAACAVTWcPPfRMV1f/CE9wuZxnnbUSqQgAAGA8U5Gv8aJVly+rLHdyRESkpsK9659/e3cY5TfhSoLBYDA4ZKOmad09PSgcAACAcU5FvhU3XXJ1vXPQFjEYarzm5rKqx599pRVFOLEa6+vmNzdrqjZ4Y2dnB1IRAADAuKeiRSvOsSOREn7xwdfeCfsaLzrrmjVlXs639tKzt7duiqEQJ1hWyvb0dKMcAAAAxtaJ70Fr8AeJiPT29157J0xEUvtrb+9LERGR01mFEgQAAIDp4cTnilKKQj7nsA8ZehYlOE5aWtqGbNE0feRfMU2zo6NnyNNKSvyVlWUoTwAAgDFIRZv27VhcuraMb1z5oXNT77y5k5b8zboVQSIywq3721GC4+Szn71NPXrw0AkVCuq3vnXHkI2f//zffupT16E8AQAAxiAVUc8rj7zHXb9sdVnZBVdefsGV9ka1+713H3oJN6EBwDSSz6hKTpOlIwckLp/g9Ahuv4jCAUAqstWubFhQZvcJpm4Qz7FEYlVT/YJgx/YUinD86obnr77icq/PN2R7LDp0hHtpadknbrpxyMbHHn9CVhQUI8AJ7VrfE+3K5tMFXTOH/zIKrDvgqKjzLr2gBsUFMKNT0bLzrllT4SXS4+0PPfJ2e4qci8765FWNoWDN5TecFfvd27gZanx1dXbK8lFTWhuGMeQ5kpSRWjJDNurHPA1gBlJlPdmfT0XyqmIUZJ2IFqyt8pY4Bj+ndXuUrKN+y+N2E1Eunx/4NmlmJiZn4vKQVJRNFvZt7icih4sXnVyw0l1S5RZdmB0XYNqmorXLQkEiouTbj7zdniIiUva8fV9t4CsrS/hg7QVn0/2bUIrjSdcNTTvBAKNhn2BZFkoPZibTsLJJpb9N6mtNpaOyaRz1XXB6hCXnzSr+mIkrdiS66ILzS0pKvF6vpmnhcDgRjxORaZqGYeTy+fbOLrIon1EHX01r3x3v3pcc/OIsxwQqXNVzglVNPm+Jk+UYVAfANEpF8+vKeCKiVHpz6shWZUs6tbKknPhgTSNRO4oRACYLWdK2vdwR685Z5lFhqDQYTEuSYRg9+5ODU5EqD9y22dTURESpVKrt0KHiQQXLsizLBgMBoi4iyktHpaKe/UkiKi8tZRlGLhSkbNY0rGR/Ptmf37uJKa/1rPpQg8snoFIApksqYrgRH3YKDpQhAEwW+Yz6xkP7lZxORKHKyvr6ulBlZTwWsy9D5/L5A62HZEmTJdXlGwg36ahMRC6nk4jkvNzZ2TnCedZ0RC6v8R6OX6o9Lnvt2jWhUEjX9Y729p6e3ngikc3lNF2PdmbXP9hy/g3zMVgbYLqkot54buVcJ1EwsDZI61MDW8vPLgvaXUSqBWUIAJMFyzEMyxLRJRdd2NDQQETJZLI4Ms/jdjMMY1lWOioXU1EmrhBReWmpLMt79+453iuXBALJdNp+8uA4xbJsKBQyDKNl375CoeB0Of0+n9/nk7LZRCrFsCwuogFMpT7kBI9Lb7YmdSKikrNuOHdJiIh85WvO/dhiH09ERnIfBhWNK1VVC4UCygFglBiWsVNIZWWlvSWZSAx+QsDnI6JcWi1uyaUKROT1eiLhE881Yj954N9plYhqZlUbhtF68KD9VTWNgbvY3C7X4ZSGVAQwZZxwtLXy2sYXqy69ut7BB2uvueXGa448Ujj4xsY3UyjCcWOa5rZt7w3ZGAgG7N52iFg8PmTJWNM0UYYw447zWPtUEaXTGZfLZVnWkPkpnC4nZTLJ/oGbyyzLMnSTiNweTzweH+GVfV5vMp02dNOyLIZhiMh+kYA/0N7ens1mD7+gOfgLyLLEIhUBTKNURCRtf+CV1EWrLl9WWe60RxkZ2Xjk3Y3b3twjoQDHNxWFY0OnJqqoKB/2yal0JpvLodBgpqcijmE5logKimKHnsLRqcg+qLAvfhGRrpq6ahBRJpOx78Y/HsEhEpGuGrpqCg6u+CIWWenUkcNDXR+YEcNOYyyHK2gA0ywVEZHU/tr6372G0ppA55135uCTPbFYcvfu/QLP8/zwVSbwPBGFQuWLFs0dvL2xsRaFCTMHx7MczxJRRsoQ0bGnf3iOZxhGSihSosCLrJLVVMUgIlE8wYBop8NBRKpiZJMFp1fQVVNKKAzDmLpO3JG7UoaM1C5+HgCYRqkIJtz3v//VwT8+++xru3a1OI7fcXs8nmQ6XVdX9cMffu2oQ2cWPTLMLKKTIyJ7hHXi6EFFRCSKA/fJr3+whWEYyyJdM0RBYJkTnNFhGUYUhIKsvfVYK8McST8cd9SNukMmDxOdHGoEAKkIhqfrRnt79969B7u7w9FovLc3UigMjPp0u11Op6O6uqKysiwUKm9qqm1srC324Fu37iIih9N5vFcWBJ6Idu8+YBim/W8iSiTS3d19ra2dkUg8Gk1EIolsNlfszQMBX1VVxaxZlYsWzV2wYI7X60YFwTRg31xmD/RRVXVol8fzLqczL8u6euRcLMOM6iIXwzBkkX3FbeC9nM7Bp28HTyivFArFDwMASEVwFMMw33vv/Z/+9O6Ojp5ju9ph50cRBP4jH7n4uusub2ys3b+/nQ5PqTIse0iEohS2b9+7YsXCjRu3PfLIC1u37hzlx3M6Hddff8Utt3wM2QimOqdXIKJ0OkNE2jGpiIjmz51zCi/LcdzC5vknOuzRi/+2xxXZHwYAkIqg2FEar7zy1v33P3XgQDsRsQzj83qDwWAwGBwYymBZ9kBpKSvpupHL5VRNKxQKmqY/9thLTzzxcmNjbXt7NxF5vZ7jViTPi6Koqup//McfUqlMMnlkWTSf1ysIvCiKPM8LHE+HD4s1TdMNXc7LUjarKIX77nvy2Wdfu+SSdZ/85DVVVRWoOJiiXF6BiPJHrx44MdRj5tFwIRUBIBVBUTKZ+cUv/ufFFzcQkcMhVpZXNM+f7/P5dF23LCsSCdtn+B2iQESO0lIiIqogIt0wpIwUTcRVVTt0qIuIWJZ1jDggtLKsrLuvr62tm2EYQRC8bndZWanX4xnN54zGYrFEMpWSHnnkhY0bt/34x/88e3Y9x2FMEkw99kTSBVWd4KUADdM0TWvYDwMASEVABw60f+c7v7BP8yxsbq6vq3O73YZhRCIRWZZNc6Q17XmOKykJBoIBXdNy+XwymXIe//KZzef3UV9fqKLc5/M5HY7j3a02rIry8rLS0lQ63dnd09sb+exn/+VrX/vfH/3oJahEmHIc7oGWrxx9T/54s0yzmMO0w5fSih8GAJCKZnok+uY3f9rTE3Y5ncuXLqmunmVZVjwez2TSo38RlmFEURRFsSQYHHJvy7FEQVi8YEFxqPXJYlm2tKTE6/F09/ZlJOnf//03iUT65puvxRkjmFrsyYTo8G1oE6Z454SdkIZ8GACYErDDGxfJZOY73/mFHYkuPP/86upZsiz39HSfVCQa2tcLJxigwDDMKUeiI9FKFBvr6ypKS4nov//7L6Mfrw0wSTg9gn3dKpVMTeT7Dj5usYdau/2i04NxRQBIRTObrhu/+MX/tLd325HI6XQqihKLRU94smeytAmWra6u8nm9qqp9+9v/0draiTqFqaVqdoCIevv7J+wdZUUZPIzJvkXf/hgAgFQ0oz322Iv28OrlS5fYkai/v2/wLbtTIhhVlJU5nc5sNn/nnfcaBpZUg6mkst7HsMyBgwdd7omYacIwTEU+agxTNpdjWKay3oe6AEAqmtF03Xj00ReJaGFzc3X1LCKKRiMTfC/MmPB4PQGvl2GYd97ZZc8pADBVlM7y+MuclmXt2LlLHW7KojFUKBQymSMTYRimGYnFiChQ7iqv9aIuAJCKZrTnn1/f0dHjcIj1dXWWZXV3d02ts0RFHMs6HA6e5zVN/8Y3bsfpIphCRCe35sNNHM/mZbm9s0vX9WEPTCzLMk3TME3DMHRd13Rd03VZVqRcrvifLCv2dl3XDcMwTNM8fK+ZZVl5Wc7n5cGRKJFMyorC8eyZVzfyIjpYgCkG96CNJV03fvOb+4modlaN2+1WFGWKRiKbw+koKynpj0Si0cTOnftWrlyEKoapwhMQV1/RsPmZtrws72nZX1le7vf5iCxdNzRdk7I5IrKnDdMNgyxLVdWRz+gy9gqyDMNzHMMwPM/ruu4ZdIUuk80qh0cXrb6iwRPATEUASEUz2/btexKJNMswTY2NRJRIJKbitbMjB9yCIPC8y+mUFWXLlh1IRTC1VM8NXHrLwq3Ptqejcn8k0h+JHO+ZHMtyHEeDVkOzF4s1B39/LaugqkQ0ePpqe1b6wQIVrjOvbvQGHSh/AKSime7gwQ4iKi0t9fl8uVyuUDiJSeQ0Xc/n8kTE85xndBNSj5KqaXJeJiKX2yXw/CgXwiQilmUZhnE6HLKibNv2PuoXphxv0HHu9XPjvbn3XuosyAMnbv0+nygIgsALomjPF89xHMMwqqoW5xwaNhUVF381DMMerpSWpOLjDhe/8rL6slkezFEEgFQER1JReVkZERWOWRFpWIZhpDNSOBIpHD0m1O/1+vy+gM8viqcy34lpmnlZTiSTiaOnbHGIYsDvLystcThOfCzLMIy9eAgRtbS06brB8+juYYoRHFxJlZsX2YJMc2Y3+Y5/yOEQRZ+XdMNQZMU0TcMwuKMPITjuSPt3u1xEFAwE7EOa3v5+wcGVViMSASAVwWGtrV1E5PV6DcPI5bKjiUQdXd2ZQYebRZlsNpPN9nOR0pJgdVUVO+oTPESkalpHZ1delo+9fldQ1UgsFk8k5s2ZfcIlRGyiIDAMoyiFrq7epqY61DJMOZZJhmEJPO8UT3wwwHOc1+uxLMswjGw2N/qL4IZumoZJhFQEgFQEREQUjcYZhnG7XPa9LSd+fiyekSS/33v55eddccX58+c3CQIvSbmWlkPvvrv7tdc2t7d3R2NxXderQyFRPPHgTcM0k8lkXzhiGIbb7Vq3buUll6xrbp49a1YlEXV29u3cue/hh5/bv7+tvbNr3pzZg499j6d4xW3fvkNIRTAVmYapqwbDcDTqgwt7PHUwGMjl8ie8t59jWUEQNNUwDQulDYBUBAPSaYmIWI4dZSrqj0QYhvnSlz750Y9eWtzo83lWr166evXSz3zmht/85v4///mpZCptGGZTQ/0JhwRFY7H+cIRhmAULZv/0p9+sqCgd/Gh9fXV9ffUZZyy54YYvK4VCOp0pLS0Z/V+XSkmoYpiKDN3UVdPlFFnmpG+V93jcHo87OYrFQ3TVNHRMYAEwtWE6jTHtfA2DiHhuVKfQJSlLRILAX3rpOcMfgHLsl7508ze+8Vk6fAvxKD/GwoVzfv3r/zckEhVVV1dcc82lRBSNx0/qr8tkkIpgSkqF8zQwTu4UX8HnG2mWaoZhWJYtvhEAIBUBEdFJ3YZvT2UUCpW73a4RnlZTEzrZj1FSEhj5Nc88cxkRabpmmKM6tLUHlqqqhiqGqUhVDCLieM7OLqeA57lAIDBSKmKY4hsBAFIREBG5XE4iGmXUsCWT6Vxuoo8v9+w5YHfmIw/itqfxJaK8LBNReXkpqhimouRYnMJhWcb+go/3GwEAUtE0UV5eQkQFZVT35Hu9HpZl83lly5adE/khE4nUI4+8QERBv3/kKwrm0at8zJvXiCqGqSgdlYnI7/2ga7U6nc7jnW3yeb3FNwIApCIYyA2WZcUTidE8WRCEkmDANM0777x38FJK4+2++57KZvOCIFRXneDaXC6XIyJV0yzLEgR+2bJmVDFMRdmEQkQOcQyW4HAPWuLjeG8EAEhFQETU3NxEROl0mmEYZhR3u5SVlgo839MT/t737pyA62imaT7xxMsPP/wsEYUqK0a+Lb+4BKZ9W/Ls2XWnNp8kwOlVyA8sDcvzY3DLLc9zHHfcr7ZlUSGvo8wBkIqAiGj58oVEFI5E0qnUCF3nkeNOl6upsYGI1q/f8vOf/3G8P9577+355S/v0XXD43aXl440SMiyrOLcknlFIaJzzjkD9QtTkZLTioHmg78awzCO4aY/dR3eWHw7AEAqmunmz2+sqQlZRIc6OgRhVKfr3S5XTXW1ZVnPPPPXO++8d/zu83rjja3f+c7PZVkJ+H1zZzeN/GRN1+1x1kqhYC9dYt+2BjDlZFMD4/xEcWwWsR/5Slzx7QAAqWimc7mcP/jB1ziO7Q+HR7kOGhFVlJfNqqpiGOa++5584IGnDWPsJ4Lr7Oz98Y/vSiTSHMfV1dSMPMha1TQpI1mmZREl02kiamqqXblyEeoXpiJDM4nI7/WO4WsOG7Dsr5X9dgCAVARERPPnNy1fvlDX9baOjtH/VkV5WVVlJRHdddeDDzzwtGWN5boB+/e3felL/y8eTzocjuZ5c0ceXaFqWi47sIKbqqqGYfh8njvu+BZqFqaofEYd89d0OMRjFw+x150dj7cDAKSiqYrj2L/9248IAp9MpeLxxCjzDcMwocqKgN9vGOZvfnP/Cy+8YZpjc8SZSKT/9V9/GYnEBZ6fO7tJFISRI5GUkUzTIiLDNCOxmGVZH/rQOfYyagBTkZzViGiUayGPtt9kWeY4a6rZbwcASEUwYN26VV/4wieIqKe/P5c/iTvLGupq/T6fYZg/+tFvN2x454N/kkwm+7nP/Ut7ezfHcU0N9cKJzhJlpYGzRKZpxhIJImpqqv385z9x6gslAJxWlmXZw58FYSzvoGTZYSZAtS+rKTltbM/1AsBEwuqw45A0Wfaaay7dsmXnpk3vHTzUNn/OnJHX3xj8i7MbG1rb2qVs9vbbf7d9+95MRopE4if7AXbs2Psv//If5eXBAwc6urr6RUFoqKsbeZ4VOxIVe/NYIqGqaklJ4Mc/vtXn86BOYcpiVFknIofDMbav63A65aOnGbMneFRlnQhHEQBIRTCI2+360Y++fsstt7a3d3d0dS2YP2/0p1vqa2v2tOxPJtMPPPD0qb17Npt/9dWNxR9nVVd5PCcRiVKZTEFViei73/2nuroq1CZMYZalq+My/NkhivJwk6/qqkmWRTi9CoBUBIM5nY7vf/+r3/jGj/v7o3v3H5jd2OAc3dGqIAjzZs+OJxMcxxMRyzCCwAuCMJqFLUsCQYHnNU03LYuIDEN3u9zB469qeWwkykiSlM2KovCVr9xy1lkrUI8wxUMRFfIax3GiMMZ93bHHOaIgcBxXyGuWhZNFAEhFcIx58xp/+ctv33LLrbKsHGrvWDjqM0Zut8vtrjmV41eH6HCcxBqu9vDq4o8ZSUpLEsMwN9987cc+djlqEKZ+KrJUxRB4fuSZ3E+x9xR4XRs6k7WqGJZl4SIawBSF0dbjq6Gh5mc/+5bL5VRVdd/+A6OfxGgCDL4Jn4hSmYwdif7u7/7ms5+9AXUH00A2WSAihmFGc6r1ZHEsN8KbAgBSEQxj1arFf/zjj0tK/AVVPdTeoeuTYpmkwTfhE5GUzUrZLM9zH/nIxZ///N+i1mB6yMQUImJYdjzOFbHsUSeEOI6z70yz3xQAkIpgeA0NNT/60TdEUSio6oFDbap2mmc0UTUtO/gsUTqdymSI6Prrr7ztts+jvmDaiPdmZ8ibAgBS0VSyYsXCu+76YUlJoFAo9Pb164ZxGiORvaCH/WNelqVcThD466677Itf/CRqCqaTZH+eiEr8/vF48WOnibe32G8KAEhFMJLm5qbvfOeLRJRKpzu7uotXryY4EhWnaiQiWVESqRQRXXPNpV/96qcFAaPvYVrJxBUa64mtR+D1eIpvCgBIRTAShmHWrVv1ox993eVyZiSpPxweq2U9TioSFW/CVwqFRCrFMHTFFed/+cufEkUBdQTTiaGb9jlRfnziPnOcEdyWaRk61ogFQCqCUbjwwrV/+7cfIaJILJZMpScyEkkZafBaBNF43DTN5ubZt976D4hEMP3I0sAAvpFXRD5l3DGpyO1yDXlrAJhacMVkojEM89nP3pDJZB999MVwNBrw+0bosnVdNy1LP2Z0tlJQGYbheY5hGF03hsxQxwuCfS9M8ZVN08xlc4OfYy9zNndug33uCvUC04+91gcRHW8CVU3XLcsyDt8WqqqaKAqqOkyg4bgjd7FxPM8wzAlWFZR1KnGgCgCQimBUPve5mzZseKe/P9re2dXUUG+Ypqpq+XyeiNKZDBGd1LKyI/McXgEt4PcTEUNkEcmKIori17/+maqqClQHTM9UpOhE5Ha57JsuNU1XFIWIkumxPEfrdrkcokhEHMcV45f91gCAVASj4nQ6brjhql/+8p5sLrd3/4FRTmLEc9zxTizpun68+9qKAcv+B8uy9nim6uoKLHMG05Khmz37U117k0SUl+U9+1pG/7sCzxumaV8Ly8uyaZpejyebyx3v+XlZzstDF0RrfS+mKkbN/CDHY5QCAFLRpLfmov97UchJFN754N3PT+xba5r+9tvb7777oZaWNnuLaRget5vlOIHnnQ6H3+dzuVwcz/Ec53K5eZ73er0n+y6pVIqI8vmcqmmaqiXT6UKhoBuGpqqFQsEeCNrR0XPDDV/5X//rqhtuuDoQ8OHLcLKCDedeuWxtvcdJRJR+88fPr0eZnHa6anTvT7Vs7h88qMghijzPcxzn9Xgcoujxehyiw+lyOhwOjuMcomP0M1+bpllQC4ZhFAoFRVYKaiGXzRVUNZvLGYah63pBVXVdj3ZJ0S5p76a+5rVVtfODvDiaOSQv/cyNa8uIlPCTv3xtN6oSJuH+C6kIxlihoP7wh79ev35LoaASUaiiYsGCBSzDuFwu7vjngU5lhx0MFv9fZFmWqqp2POrv7+/o6spm83/842Mvv/zmT35ya1NTHSroJNRcev2atWXFnR2L4eqT4Psl61uebkv05+1bz2Y3NtbX1/Mc53A4+DFaCo1lWZfTRURez9BjlYFUVCjohtHZ2XmovV2WtB1/7e7ak1jzkSaHC50tAFIRDD6K1Y2f/vT3L730JhHV19bOnTMnMOJq9mOOYRiHw+FwOIiotKRkQXNz66FDB1tbu7r6b731p3fe+d3KyjJU0yidvWB5GUdESs/79zyzK5ZCiZz275dmbn22Pd6bEwShvqF2/rx5rsN3hI2SaZr29WWGYQxz4Ho0z/G6ofPcibtKjuM4jit+v5rnz99/4EBnd3e8N7f12fazrpnNC7iaBoBUBIe9+urG5557nWXZxQsXzpk9m2GGrqqtaZokHVnB3rKsXO4Ulw7geWHIzHU+n08QhCFHvfPmzq2uqnpr06bOzt6vfOX7DzzwC1TT6DTW+JxERMrBbYhEk8Ou9d2xnizPcevWri0tLR3y/SoUCnbQGbzWjaqqxnGG9BXnsGAYxrKsIa/G8bwoisUf7WvcHDsQiWwul2vZ0qW1NTVvbdoU68nuWt+98tJ6VBMAUhEQEaVS0k9+cpdpWvV1NbOqq/P5nK7pqq5pqqrrujHWC4AYhlEoHDXBbjqdKh7R2pfqPG4PL/CCIKxcvnzz1q1tbd0vvPDGFVecj8oaBe/AYb+W24PCmASS4XzH7gQRLV60MBAIZLNZwzBUTS0UCoauj/l0qYZhqIVC8cfsoIMZlmU5nnc4HKIgchwXCAQWL1q4Y9fujt2JxqXlJSE3KgsAqQjo3Xd35XIyEZUGg+Fw/2n8JIZh2CGsMKhbr6ys6O3r37p1J1IRTEXRTomIfB4PQ9TZ2XEaP4lpmqaqaqpa3OJyOn0ej5TLRTslpCIApKJJrvaiC65eVlnu5IhMXZG2v/Hmi+9JY/8227fvJSK/b5Le6iUKAsMwe/YcHNS7Z1u3vfha1964rhPrDVVdc+3Z/OuP3tNCVDbvq59ZEZyxLebKq/9lWbEafWtvvXEtEcUP/fDuLehPjpJq2/J6yxsHpaxBxPFNc+de/qHFVZ7xGVqT6MsRkX98VoH9gBRF8fv9Ui5nf8jDLafxotWXLysf3PMYaDOD5SK7Nu54a0+mXzGJWKfHs+jiNR9dVIqCGcy78qwbz68LDbSiXOvO7Y+81oNioVTblg0Htx2yGw/xTtfCM1deva5mVPMVz/BUxIUu+0So9HAhsLwzsPqSdbm2F99MjfU79fdHicjn807OgnA5XSzDhMPxw5EotfHFOzdk9WJCCvfef8+ba0L4tsHokkDLW799ojdFRBwf9FA2p7e17PttS/dVn7l8Tdk4BKNcSrXD/aQ96ih+SCIi34qbLr26vjgGieWdgdWXXZLKoeEcFt5+z70H2o7kRFPJSdv2p5GKjtp/BS/6+2Uh75FW5Gtes+4zzo13Pz/Dg1Hbc797ZwsRERv0CEpOUxR514aNbZHVX7q26cTBaIanovJQINX6/kOv7Io5Zl/+kTNWl3HElSy/KPTm4+ExfqdIJM4wjEOcpIsAcBxHDJPPyz094ZqaUHjb/RuyOhEfavrUx1fUeXgyErsee+PRQ+iIiJ5/9ofP05KbrrumXiSSNv/42VdQJkMzyvuPPtGbImHRxev+15mVRERGZOO9G14KZ196bu+imxeP/bGBktdYlhUmayoSBIFlWSU/MIXSmtWX2JFIia9/7Z03dyad9QsuuXLpDD4BO6Q2W5968ECbQcT5zvvImguaS3nS9XDbS/txD9/R+6/6imzP/ode3nYwXDL3stVXryzzEhdavGD18z3vzPCiCc762EeWL51l9zS5A0+8fH+Llm3ZuzPetOaEN1rP8FamxzseemRXLEUUPvTiloh9c4rTWTL272QYJhGxx9x3Nkkw7MBNNvm8TNS1rStKRFR63Y2r6zw8ERFXuvTjq9ZhvTQYhejm1gNE1LDgo3YkIiKuct2aciLSe3vaxuOMiKmbRMRM2u8XwxQ/JNG5iyqcRES57c+8/ObOJBEpnfuefehAOy6h2e1n455tChF5Lvv0ZZc02+fyeT4076rzGlA4R++/2u+/b9vBMBElD7708qP780REXEnzTB8c2nDV5845HImIyDPvvPoqIqJcLDaK357h54pS4b1HSmlnOnVltZfI6RmHwQn5vDw1OqRoYl6lHtaJiGbXzj8qBtXPa9i8sYUARpRu6ywQEXXsuv3Hu47tyWWFyDPmRx26xXEsx03SwzyOYxmGMexUNL8qwBIRpRKbWwd3RtvDqQWNmDGM0m2dChHR7DnjcrF1Gon3bBm8l+/ukZT5bifxLs8MLxiWSEt1tO7fH4+lpP1hRclpyuh/e4anIkMfPLBaVhSicTodYprWZC4IhmGIGCLSdYMMsscTCSIG48MpfKsG2g/HB53Hzibt4LkZXj7MQAEYWgyNZYT2g/4HTvFsR8tT9+3elrPPzLJBj1A9y9vXmx1tMEKzA6LjXdobMsmLJmsoKRi1ucu+eu0cFMNxcayTaFBPHXJwKJQR+h84ESePHTpRbtcLu7flTCqr//ubzhgYARLf/oe7D3QhFU1GBbXA5ifj0AfDMK3iTHc+b4AoTtQR7qI5RxZHUw7txWhrOLFgRTlLcZNa2vcocxZN2Fg0y7Ky2RzHKZPy+2UUJ8umVNY+Jx0sO7eeXuk8/Jw5cxuDaDxEFKyu4SmuT3T7mYICZUudtOtwg/etrQ/wRERKtGMml0qkq8MkorpF8wYiERGl8tHRvwBS0cSxLKurp3cKfFBh/uJy/lBMV3oeenDXpz6+uIJjKde94S+7d6ES4cTYppWzvC3dWUo89uA7PvseRiIypK7NW9pDl5w3TuePTNPs7JkKdySHN/dKK4I+It8ZH71IeWP7mzuT3mWrrrmoBqHIbj91y+sqdrZFKfHY3euV685YNctLpGd7D77R6sKA68GcNQs+9Tfao6/ti1FoxUWrL6zhiYhS4bdm9IT7A2PR+va3R9eWVnBEqX2PPtODcUWT8Pgn6FMUZYp8WH7R6uvef/XhQ1q2Y99/3bFvYGNo3mXNB17CaGs4oYa1nzkvdeeGrB5u+8OdbYMfWXPt+LyjOJVWpI89vfedWWesDnK8J3TBlZdfcCURESnhg6nQXCQjIpq16hMfSt/9ciKbizx17/NPFbc3r74KhTNIKqWUz1/xufkrjmwypM2vbJrZ49Xqli57b8tOTQ+3/tcdbU6OFIPqmiurWiKjXVICqWiC/PGPP5lKH9e36OMf+seNWx7dmIgaJs85m5YvuPriOdGnD6AmYTSHa8F1l3+95v2XXmvdE7bv/mCDZf5Fyxeumzs+b3jV55ZMpfI59OJDRu7KZWvrPU4iIjUV7n3libfrrr9xLtqO3VpWXfL12QdefbrlvbCcNYiIDYYqzl9TjaIZrND5+iO9517R7PNyLJGRjUfefm39UTc2zsjGU3flRZ/gt7y0IxU1TF3wrbvqrMtC7X9oiYz2BZiVyxYXf/jQPy5GQxvBN2/89oz++xMbf/fqSymi5tX/dm3TMI/f/uAP0EjQfk4Z2g/aD9oP2s/pcsmFNw3EKpQFjFJHy8YUEdG8+koUBgAATENIRTBsAtpw7+ZdvdLAOmiGEt3z1m//0p0lImdo3XIPCggAAKYhjCuC4ZhSb+er93Yes9217sNrmjCrCgAATP9UZFnWpF1ICCZUxdLzZiX3RLviA0NlnR5HXfPcy9bNr/Dg9CIAAEyn8wCmOXwqSoflYJUbBQTkrVt3zifWoRwAAGC627PnyP3VRx34t72HdXkAAABgBnng/ieL/z7qXFGsQ3rv+c6mleWBkAuX0gAAAGC6Mk1zz54DD9z/5Nub3ituPGq+IgAAAIAZC0NnAQAAAJCKAAAAAJCKAAAAAAb7/wMABFG99RJsasYAAAAASUVORK5CYII='"
|
| 116 |
+
]
|
| 117 |
+
},
|
| 118 |
+
"execution_count": 34,
|
| 119 |
+
"metadata": {},
|
| 120 |
+
"output_type": "execute_result"
|
| 121 |
+
}
|
| 122 |
+
],
|
| 123 |
+
"source": [
|
| 124 |
+
"image_data"
|
| 125 |
+
]
|
| 126 |
+
},
|
| 127 |
+
{
|
| 128 |
+
"cell_type": "code",
|
| 129 |
+
"execution_count": null,
|
| 130 |
+
"id": "4f51cb6d",
|
| 131 |
+
"metadata": {},
|
| 132 |
+
"outputs": [],
|
| 133 |
+
"source": []
|
| 134 |
+
}
|
| 135 |
+
],
|
| 136 |
+
"metadata": {
|
| 137 |
+
"kernelspec": {
|
| 138 |
+
"display_name": ".venv (3.13.6)",
|
| 139 |
+
"language": "python",
|
| 140 |
+
"name": "python3"
|
| 141 |
+
},
|
| 142 |
+
"language_info": {
|
| 143 |
+
"codemirror_mode": {
|
| 144 |
+
"name": "ipython",
|
| 145 |
+
"version": 3
|
| 146 |
+
},
|
| 147 |
+
"file_extension": ".py",
|
| 148 |
+
"mimetype": "text/x-python",
|
| 149 |
+
"name": "python",
|
| 150 |
+
"nbconvert_exporter": "python",
|
| 151 |
+
"pygments_lexer": "ipython3",
|
| 152 |
+
"version": "3.13.6"
|
| 153 |
+
}
|
| 154 |
+
},
|
| 155 |
+
"nbformat": 4,
|
| 156 |
+
"nbformat_minor": 5
|
| 157 |
+
}
|
test_app2.ipynb
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": null,
|
| 6 |
+
"id": "8c3eda07",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [],
|
| 9 |
+
"source": [
|
| 10 |
+
"%load_ext autoreload\n",
|
| 11 |
+
"\n",
|
| 12 |
+
"%autoreload 2"
|
| 13 |
+
]
|
| 14 |
+
},
|
| 15 |
+
{
|
| 16 |
+
"cell_type": "code",
|
| 17 |
+
"execution_count": null,
|
| 18 |
+
"id": "31ef3bc0",
|
| 19 |
+
"metadata": {},
|
| 20 |
+
"outputs": [],
|
| 21 |
+
"source": []
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"cell_type": "code",
|
| 25 |
+
"execution_count": null,
|
| 26 |
+
"id": "ee202a8a",
|
| 27 |
+
"metadata": {},
|
| 28 |
+
"outputs": [],
|
| 29 |
+
"source": [
|
| 30 |
+
"submitted_answer = agent.builder.invoke(question_text, file_path)"
|
| 31 |
+
]
|
| 32 |
+
}
|
| 33 |
+
],
|
| 34 |
+
"metadata": {
|
| 35 |
+
"kernelspec": {
|
| 36 |
+
"display_name": ".venv (3.13.6)",
|
| 37 |
+
"language": "python",
|
| 38 |
+
"name": "python3"
|
| 39 |
+
},
|
| 40 |
+
"language_info": {
|
| 41 |
+
"name": "python",
|
| 42 |
+
"version": "3.13.6"
|
| 43 |
+
}
|
| 44 |
+
},
|
| 45 |
+
"nbformat": 4,
|
| 46 |
+
"nbformat_minor": 5
|
| 47 |
+
}
|
tools.py
CHANGED
|
@@ -4,8 +4,13 @@ from langchain_community.utilities import WikipediaAPIWrapper
|
|
| 4 |
from langchain_community.document_loaders import WikipediaLoader
|
| 5 |
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
| 6 |
from langchain_chroma import Chroma
|
| 7 |
-
from langchain_openai import AzureOpenAIEmbeddings
|
|
|
|
|
|
|
| 8 |
import os
|
|
|
|
|
|
|
|
|
|
| 9 |
from dotenv import load_dotenv
|
| 10 |
|
| 11 |
# load environment variables
|
|
@@ -33,7 +38,7 @@ embeddings = AzureOpenAIEmbeddings(
|
|
| 33 |
def wiki_RAG(query: str):
|
| 34 |
"""####"""
|
| 35 |
|
| 36 |
-
loader = WikipediaLoader(query=query, load_max_docs=
|
| 37 |
docs = loader.load()
|
| 38 |
|
| 39 |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)
|
|
@@ -53,4 +58,59 @@ wiki_RAG_tool = Tool(
|
|
| 53 |
name="wikipedia_search_RAG",
|
| 54 |
func=wiki_RAG,
|
| 55 |
description="Searches information in wikipedia."
|
| 56 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
from langchain_community.document_loaders import WikipediaLoader
|
| 5 |
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
| 6 |
from langchain_chroma import Chroma
|
| 7 |
+
from langchain_openai import AzureOpenAIEmbeddings, AzureChatOpenAI
|
| 8 |
+
from langchain_core.tools import tool
|
| 9 |
+
import base64
|
| 10 |
import os
|
| 11 |
+
from pydantic import BaseModel, Field
|
| 12 |
+
|
| 13 |
+
|
| 14 |
from dotenv import load_dotenv
|
| 15 |
|
| 16 |
# load environment variables
|
|
|
|
| 38 |
def wiki_RAG(query: str):
|
| 39 |
"""####"""
|
| 40 |
|
| 41 |
+
loader = WikipediaLoader(query=query, load_max_docs=5)
|
| 42 |
docs = loader.load()
|
| 43 |
|
| 44 |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)
|
|
|
|
| 58 |
name="wikipedia_search_RAG",
|
| 59 |
func=wiki_RAG,
|
| 60 |
description="Searches information in wikipedia."
|
| 61 |
+
)
|
| 62 |
+
|
| 63 |
+
|
| 64 |
+
# image analyser
|
| 65 |
+
|
| 66 |
+
# create llm interface
|
| 67 |
+
llm_img = AzureChatOpenAI(
|
| 68 |
+
deployment_name = os.environ.get("AZURE_OPENAI_DEPLOYMENT_NAME"),
|
| 69 |
+
openai_api_key = os.environ.get("AZURE_OPENAI_API_KEY"),
|
| 70 |
+
azure_endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT"),
|
| 71 |
+
openai_api_version = os.environ.get("OPENAI_API_VERSION"),
|
| 72 |
+
temperature=0
|
| 73 |
+
)
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
class ImageAnalyserInput(BaseModel):
|
| 80 |
+
image_path: str = Field(description="path to file")
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
@tool("image-analyser", args_schema=ImageAnalyserInput)
|
| 84 |
+
def image_analyser_tool(image_path: str) -> str:
|
| 85 |
+
"""Analyzes an image and returns a description."""
|
| 86 |
+
|
| 87 |
+
with open(image_path, "rb") as image_file:
|
| 88 |
+
image_data = base64.b64encode(image_file.read()).decode("utf-8")
|
| 89 |
+
|
| 90 |
+
message = {
|
| 91 |
+
"role": "user",
|
| 92 |
+
"content": [
|
| 93 |
+
{
|
| 94 |
+
"type": "text",
|
| 95 |
+
"text": "Describe this image",
|
| 96 |
+
},
|
| 97 |
+
{
|
| 98 |
+
"type": "image",
|
| 99 |
+
"source_type": "base64",
|
| 100 |
+
"data": image_data,
|
| 101 |
+
"mime_type": "image/jpeg",
|
| 102 |
+
},
|
| 103 |
+
],
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
response = llm_img.invoke([message])
|
| 107 |
+
return response.content
|
| 108 |
+
|
| 109 |
+
# image_analyser_tool = Tool(
|
| 110 |
+
# name="image analyser",
|
| 111 |
+
# func=image_analyser,
|
| 112 |
+
# description="Analises an image and returns a text description"
|
| 113 |
+
# )
|
| 114 |
+
|
| 115 |
+
|
| 116 |
+
|
tools_test.ipynb
CHANGED
|
@@ -28,7 +28,7 @@
|
|
| 28 |
},
|
| 29 |
{
|
| 30 |
"cell_type": "code",
|
| 31 |
-
"execution_count":
|
| 32 |
"id": "4ec297d7",
|
| 33 |
"metadata": {},
|
| 34 |
"outputs": [],
|
|
@@ -59,17 +59,20 @@
|
|
| 59 |
},
|
| 60 |
{
|
| 61 |
"cell_type": "code",
|
| 62 |
-
"execution_count":
|
| 63 |
"id": "3f538870",
|
| 64 |
"metadata": {},
|
| 65 |
"outputs": [],
|
| 66 |
"source": [
|
| 67 |
-
"
|
|
|
|
|
|
|
|
|
|
| 68 |
]
|
| 69 |
},
|
| 70 |
{
|
| 71 |
"cell_type": "code",
|
| 72 |
-
"execution_count":
|
| 73 |
"id": "ef465273",
|
| 74 |
"metadata": {},
|
| 75 |
"outputs": [
|
|
@@ -77,19 +80,31 @@
|
|
| 77 |
"name": "stdout",
|
| 78 |
"output_type": "stream",
|
| 79 |
"text": [
|
| 80 |
-
"Page:
|
| 81 |
-
"
|
| 82 |
-
"
|
| 83 |
-
"
|
| 84 |
-
"
|
| 85 |
-
"
|
| 86 |
-
"
|
| 87 |
-
"
|
| 88 |
-
"
|
| 89 |
-
"
|
| 90 |
-
"
|
| 91 |
-
"
|
| 92 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
]
|
| 94 |
}
|
| 95 |
],
|
|
@@ -99,27 +114,65 @@
|
|
| 99 |
},
|
| 100 |
{
|
| 101 |
"cell_type": "code",
|
| 102 |
-
"execution_count":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
"id": "a9768b29",
|
| 104 |
"metadata": {},
|
| 105 |
"outputs": [],
|
| 106 |
"source": [
|
| 107 |
-
"res = tools.wiki_RAG(
|
| 108 |
]
|
| 109 |
},
|
| 110 |
{
|
| 111 |
"cell_type": "code",
|
| 112 |
-
"execution_count":
|
| 113 |
"id": "d140be5f",
|
| 114 |
"metadata": {},
|
| 115 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 116 |
"source": [
|
| 117 |
-
"
|
| 118 |
]
|
| 119 |
},
|
| 120 |
{
|
| 121 |
"cell_type": "code",
|
| 122 |
-
"execution_count":
|
| 123 |
"id": "7f334a2f",
|
| 124 |
"metadata": {},
|
| 125 |
"outputs": [
|
|
@@ -127,42 +180,56 @@
|
|
| 127 |
"name": "stdout",
|
| 128 |
"output_type": "stream",
|
| 129 |
"text": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
"The chancellor of Germany, officially the federal chancellor of the Federal Republic of Germany, is the head of the federal government of Germany. The chancellor is the chief executive of the Federal Cabinet and heads the executive branch. The chancellor is elected by the Bundestag on the proposal of the federal president and without debate (Article 63 of the German Constitution). During a state of defence declared by the Bundestag the chancellor also assumes the position of commander-in-chief of the Bundeswehr.\n",
|
| 131 |
"Ten people (nine men and one woman) have served as chancellor of the Federal Republic of Germany, the first being Konrad Adenauer from 1949 to 1963. (Another 26 men had served as \"Reich chancellors\" of the previous German Empire from 1871 to 1945.) The current officeholder is Friedrich Merz of the Christian Democratic Union, sworn in on 6 May 2025.\n",
|
| 132 |
"\n",
|
| 133 |
"\n",
|
| 134 |
"== History of the office (pre-1949) ==\n",
|
| 135 |
-
"
|
| 136 |
-
"
|
| 137 |
-
"
|
| 138 |
-
"
|
| 139 |
-
"
|
|
|
|
|
|
|
| 140 |
]
|
| 141 |
}
|
| 142 |
],
|
| 143 |
"source": [
|
| 144 |
-
"print(
|
| 145 |
]
|
| 146 |
},
|
| 147 |
{
|
| 148 |
"cell_type": "code",
|
| 149 |
-
"execution_count":
|
| 150 |
"id": "a6933d2d",
|
| 151 |
"metadata": {},
|
| 152 |
"outputs": [
|
| 153 |
{
|
| 154 |
-
"
|
| 155 |
-
"
|
| 156 |
-
"
|
| 157 |
-
|
| 158 |
-
"
|
| 159 |
-
"
|
| 160 |
-
"
|
| 161 |
-
"
|
| 162 |
-
"1990, East Germany was dissolved as it merged with West Germany; Germany\n",
|
| 163 |
-
"was reunified. It retained the name of the Federal Republic of Germany.\n",
|
| 164 |
-
"Political parties: CDU (6) SPD (4) == Timeline == == See also ==\n",
|
| 165 |
-
"Leadership of East Germany List of chancellors of Germany by time in offi\n"
|
| 166 |
]
|
| 167 |
}
|
| 168 |
],
|
|
@@ -172,10 +239,42 @@
|
|
| 172 |
},
|
| 173 |
{
|
| 174 |
"cell_type": "code",
|
| 175 |
-
"execution_count":
|
| 176 |
"id": "08e04f44",
|
| 177 |
"metadata": {},
|
| 178 |
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 179 |
"source": []
|
| 180 |
}
|
| 181 |
],
|
|
|
|
| 28 |
},
|
| 29 |
{
|
| 30 |
"cell_type": "code",
|
| 31 |
+
"execution_count": 2,
|
| 32 |
"id": "4ec297d7",
|
| 33 |
"metadata": {},
|
| 34 |
"outputs": [],
|
|
|
|
| 59 |
},
|
| 60 |
{
|
| 61 |
"cell_type": "code",
|
| 62 |
+
"execution_count": 55,
|
| 63 |
"id": "3f538870",
|
| 64 |
"metadata": {},
|
| 65 |
"outputs": [],
|
| 66 |
"source": [
|
| 67 |
+
"# msg = '''How many studio album were published by mercedes sosa between 2000 and 2009 (included)?\n",
|
| 68 |
+
"# you can use the latest 2022 version of english wikipedia'''\n",
|
| 69 |
+
"\n",
|
| 70 |
+
"out = tools.wikipedia_tool.invoke(msg)"
|
| 71 |
]
|
| 72 |
},
|
| 73 |
{
|
| 74 |
"cell_type": "code",
|
| 75 |
+
"execution_count": 56,
|
| 76 |
"id": "ef465273",
|
| 77 |
"metadata": {},
|
| 78 |
"outputs": [
|
|
|
|
| 80 |
"name": "stdout",
|
| 81 |
"output_type": "stream",
|
| 82 |
"text": [
|
| 83 |
+
"Page: José José Summary: José Rómulo Sosa Ortiz (17 February 1948 – 28\n",
|
| 84 |
+
"September 2019), known professionally as José José, was a Mexican singer\n",
|
| 85 |
+
"and actor. Also known as \"El Príncipe de la Canción\" (The Prince of Song),\n",
|
| 86 |
+
"his performance and vocal style have influenced many Latin pop artists in a\n",
|
| 87 |
+
"career that spanned more than four decades. Due to his vocals and\n",
|
| 88 |
+
"popularity, José José was considered by Latin audiences and media as an\n",
|
| 89 |
+
"icon of Latin pop music and one of the most emblematic Latin singers of his\n",
|
| 90 |
+
"time. Born into a family of musicians, José began his musical career in his\n",
|
| 91 |
+
"early teens playing guitar and singing in serenade. He later joined a jazz\n",
|
| 92 |
+
"and bossa nova trio where he sang and played bass and double bass. José\n",
|
| 93 |
+
"José found success as a solo artist in the early 1970s. Demonstrating his\n",
|
| 94 |
+
"tenor vocal ability with a stunning performance of the song \"El Triste\" at\n",
|
| 95 |
+
"a Latin music festival held in Mexico City in 1970, he climbed the Latin\n",
|
| 96 |
+
"charts during that decade. Having achieved recognition as a balladeer, his\n",
|
| 97 |
+
"singing garnered universal critical acclaim from musical peers and media.\n",
|
| 98 |
+
"In the 1980s, after signing with Ariola Records, José rose to international\n",
|
| 99 |
+
"prominence as one of the most popular and talented Latin performers. His\n",
|
| 100 |
+
"1983 album Secretos has sold over four million units. With many\n",
|
| 101 |
+
"international hits, he received several Grammy nominations, sold more than\n",
|
| 102 |
+
"40 million albums and was once courted by music legend Frank Sinatra, who\n",
|
| 103 |
+
"wanted to win him for his own label. He sold out in venues such as Madison\n",
|
| 104 |
+
"Square Garden and Radio City Music Hall. His music reached non-Spanish-\n",
|
| 105 |
+
"speaking countries in Europe and Asia. He forged a career as an actor,\n",
|
| 106 |
+
"starring in movies such as Gavilán o Paloma (1985) and Perdóname Todo\n",
|
| 107 |
+
"(1995).\n"
|
| 108 |
]
|
| 109 |
}
|
| 110 |
],
|
|
|
|
| 114 |
},
|
| 115 |
{
|
| 116 |
"cell_type": "code",
|
| 117 |
+
"execution_count": 54,
|
| 118 |
+
"id": "a21740d8",
|
| 119 |
+
"metadata": {},
|
| 120 |
+
"outputs": [],
|
| 121 |
+
"source": [
|
| 122 |
+
"msg = 'studio album by Mercedes Sosa between 2000 and 2009'"
|
| 123 |
+
]
|
| 124 |
+
},
|
| 125 |
+
{
|
| 126 |
+
"cell_type": "code",
|
| 127 |
+
"execution_count": 51,
|
| 128 |
+
"id": "5ef4d0cd",
|
| 129 |
+
"metadata": {},
|
| 130 |
+
"outputs": [],
|
| 131 |
+
"source": [
|
| 132 |
+
"msg = \"barrak obama\""
|
| 133 |
+
]
|
| 134 |
+
},
|
| 135 |
+
{
|
| 136 |
+
"cell_type": "code",
|
| 137 |
+
"execution_count": 52,
|
| 138 |
"id": "a9768b29",
|
| 139 |
"metadata": {},
|
| 140 |
"outputs": [],
|
| 141 |
"source": [
|
| 142 |
+
"res = tools.wiki_RAG(msg)"
|
| 143 |
]
|
| 144 |
},
|
| 145 |
{
|
| 146 |
"cell_type": "code",
|
| 147 |
+
"execution_count": 53,
|
| 148 |
"id": "d140be5f",
|
| 149 |
"metadata": {},
|
| 150 |
+
"outputs": [
|
| 151 |
+
{
|
| 152 |
+
"data": {
|
| 153 |
+
"text/plain": [
|
| 154 |
+
"[Document(id='5616d47e-c781-4235-9399-1902a19e0027', metadata={'source': 'https://en.wikipedia.org/wiki/Barrak', 'summary': 'Barrak (Arabic: ��رّاك) or Al-Barrak (Arabic: البرّاك) is a surname. Notable people with the surname include:\\n\\nAbdul-Rahman al-Barrak (born c. 1933), senior Saudi cleric\\nAbdulrahman bin Abdullah Al Barrak (born 1956), Saudi academic\\nMusallam Al-Barrak, member of the Kuwaiti National Assembly\\nNagib Barrak (born 1940), Lebanese alpine skier\\nRony Barrak, Lebanese musician and darbouka player and composer\\nSaad Al Barrak, Kuwaiti businessman and investor', 'title': 'Barrak'}, page_content='Barrak (Arabic: برّاك) or Al-Barrak (Arabic: البرّاك) is a surname. Notable people with the surname include:\\n\\nAbdul-Rahman al-Barrak (born c. 1933), senior Saudi cleric\\nAbdulrahman bin Abdullah Al Barrak (born 1956), Saudi academic\\nMusallam Al-Barrak, member of the Kuwaiti National Assembly\\nNagib Barrak (born 1940), Lebanese alpine skier\\nRony Barrak, Lebanese musician and darbouka player and composer\\nSaad Al Barrak, Kuwaiti businessman and investor\\n\\n\\n== See also ==\\nAll pages with titles containing Barrak\\nBarack (disambiguation)\\nBarack Obama, U.S. president\\nBarak (disambiguation)\\nBaraq (disambiguation)\\nBarrack (disambiguation)\\nBarracks\\nB-R-K'),\n",
|
| 155 |
+
" Document(id='6b35b789-0c32-4f6d-b487-396aa2e028ab', metadata={'source': 'https://en.wikipedia.org/wiki/Barack_Obama', 'title': 'Barack Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\"}, page_content='Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.'),\n",
|
| 156 |
+
" Document(id='f8375b7f-1867-4ac5-8dcc-4f95cd389acd', metadata={'source': 'https://en.wikipedia.org/wiki/Barack_Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\", 'title': 'Barack Obama'}, page_content=\"Obama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging\"),\n",
|
| 157 |
+
" Document(id='f2bbc8b9-723c-4450-89cd-e69e8d24d053', metadata={'source': 'https://en.wikipedia.org/wiki/Barack_Obama', 'title': 'Barack Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\"}, page_content='though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.'),\n",
|
| 158 |
+
" Document(id='a5f095d9-c6b2-49ef-ab79-8fdc9172ad2a', metadata={'title': 'Barack Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\", 'source': 'https://en.wikipedia.org/wiki/Barack_Obama'}, page_content=\"Obama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Fat\"),\n",
|
| 159 |
+
" Document(id='466cc0f7-f6eb-49b2-af9a-c09874bd4d4a', metadata={'title': 'Barack Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\", 'source': 'https://en.wikipedia.org/wiki/Barack_Obama'}, page_content='Born in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.'),\n",
|
| 160 |
+
" Document(id='225bb748-c745-4784-a906-16fd37845ec9', metadata={'title': 'Barack Obama', 'source': 'https://en.wikipedia.org/wiki/Barack_Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\"}, page_content=\"Obama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country\"),\n",
|
| 161 |
+
" Document(id='5564d870-41f8-41d4-9594-9c1d39a568c6', metadata={'source': 'https://en.wikipedia.org/wiki/Barack_Obama', 'title': 'Barack Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\"}, page_content='use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.')]"
|
| 162 |
+
]
|
| 163 |
+
},
|
| 164 |
+
"execution_count": 53,
|
| 165 |
+
"metadata": {},
|
| 166 |
+
"output_type": "execute_result"
|
| 167 |
+
}
|
| 168 |
+
],
|
| 169 |
"source": [
|
| 170 |
+
"res"
|
| 171 |
]
|
| 172 |
},
|
| 173 |
{
|
| 174 |
"cell_type": "code",
|
| 175 |
+
"execution_count": 33,
|
| 176 |
"id": "7f334a2f",
|
| 177 |
"metadata": {},
|
| 178 |
"outputs": [
|
|
|
|
| 180 |
"name": "stdout",
|
| 181 |
"output_type": "stream",
|
| 182 |
"text": [
|
| 183 |
+
"Germany). The list below gives the chancellors of West Germany; the government of East Germany was\n",
|
| 184 |
+
"and the German Democratic Republic (known as East Germany). The list below gives the chancellors of\n",
|
| 185 |
+
"== Federal Republic of Germany (1949–present) ==\n",
|
| 186 |
+
"In 1949, two separate German states were established: the Federal Republic of Germany (known as West Germany) and the German Democratic Republic (known as East Germany). The list below gives the chancellors of West Germany; the government of East Germany was headed by the chairman of the Council of Ministers. In 1990, East Germany was dissolved as it merged with West Germany; Germany was reunified. It retained the name of the Federal Republic of Germany.\n",
|
| 187 |
+
"Political parties:\n",
|
| 188 |
+
" CDU (6)\n",
|
| 189 |
+
" SPD (4)\n",
|
| 190 |
+
"\n",
|
| 191 |
+
"\n",
|
| 192 |
+
"== Timeline ==\n",
|
| 193 |
+
"\n",
|
| 194 |
+
"\n",
|
| 195 |
+
"== See also ==\n",
|
| 196 |
+
"\n",
|
| 197 |
+
"Leadership of East Germany\n",
|
| 198 |
+
"List of chancellors of Germany by time in offi\n",
|
| 199 |
"The chancellor of Germany, officially the federal chancellor of the Federal Republic of Germany, is the head of the federal government of Germany. The chancellor is the chief executive of the Federal Cabinet and heads the executive branch. The chancellor is elected by the Bundestag on the proposal of the federal president and without debate (Article 63 of the German Constitution). During a state of defence declared by the Bundestag the chancellor also assumes the position of commander-in-chief of the Bundeswehr.\n",
|
| 200 |
"Ten people (nine men and one woman) have served as chancellor of the Federal Republic of Germany, the first being Konrad Adenauer from 1949 to 1963. (Another 26 men had served as \"Reich chancellors\" of the previous German Empire from 1871 to 1945.) The current officeholder is Friedrich Merz of the Christian Democratic Union, sworn in on 6 May 2025.\n",
|
| 201 |
"\n",
|
| 202 |
"\n",
|
| 203 |
"== History of the office (pre-1949) ==\n",
|
| 204 |
+
"Ten people (nine men and one woman) have served as chancellor of the Federal Republic of Germany,\n",
|
| 205 |
+
"to 1963. (Another 26 men had served as \"Reich chancellors\" of the previous German Empire from 1871\n",
|
| 206 |
+
"as chancellor of the Federal Republic of Germany, the first being Konrad Adenauer from 1949 to\n",
|
| 207 |
+
"== See also ==\n",
|
| 208 |
+
"\n",
|
| 209 |
+
"Leadership of East Germany\n",
|
| 210 |
+
"List of chancellors of Germany by time in offi\n"
|
| 211 |
]
|
| 212 |
}
|
| 213 |
],
|
| 214 |
"source": [
|
| 215 |
+
"print(res2)"
|
| 216 |
]
|
| 217 |
},
|
| 218 |
{
|
| 219 |
"cell_type": "code",
|
| 220 |
+
"execution_count": 34,
|
| 221 |
"id": "a6933d2d",
|
| 222 |
"metadata": {},
|
| 223 |
"outputs": [
|
| 224 |
{
|
| 225 |
+
"ename": "AttributeError",
|
| 226 |
+
"evalue": "'str' object has no attribute 'page_content'",
|
| 227 |
+
"output_type": "error",
|
| 228 |
+
"traceback": [
|
| 229 |
+
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
| 230 |
+
"\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)",
|
| 231 |
+
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[34]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m print_(\u001b[43mres2\u001b[49m\u001b[43m[\u001b[49m\u001b[32;43m2\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpage_content\u001b[49m)\n",
|
| 232 |
+
"\u001b[31mAttributeError\u001b[39m: 'str' object has no attribute 'page_content'"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 233 |
]
|
| 234 |
}
|
| 235 |
],
|
|
|
|
| 239 |
},
|
| 240 |
{
|
| 241 |
"cell_type": "code",
|
| 242 |
+
"execution_count": 6,
|
| 243 |
"id": "08e04f44",
|
| 244 |
"metadata": {},
|
| 245 |
"outputs": [],
|
| 246 |
+
"source": [
|
| 247 |
+
"path_img = 'cca530fc-4052-43b2-b130-b30968d8aa44.png'\n",
|
| 248 |
+
"res = tools.image_analyser(path_img)"
|
| 249 |
+
]
|
| 250 |
+
},
|
| 251 |
+
{
|
| 252 |
+
"cell_type": "code",
|
| 253 |
+
"execution_count": 7,
|
| 254 |
+
"id": "284e6c50",
|
| 255 |
+
"metadata": {},
|
| 256 |
+
"outputs": [
|
| 257 |
+
{
|
| 258 |
+
"data": {
|
| 259 |
+
"text/plain": [
|
| 260 |
+
"\"This image depicts a chess position on a standard 8x8 chessboard. The pieces are arranged as follows:\\n\\n### **White Pieces:**\\n- **King**: g1\\n- **Queen**: h5\\n- **Rooks**: e3\\n- **Bishops**: d3, c3\\n- **Pawns**: f2, g2, h3, a3\\n\\n### **Black Pieces:**\\n- **King**: g8\\n- **Queen**: b3\\n- **Rook**: d8\\n- **Bishop**: e6\\n- **Knight**: d5\\n- **Pawns**: f7, g7, h7, a7, b7, c7\\n\\nThe position appears to be mid-game, with both sides having developed their pieces. Black's queen is aggressively placed on b3, and White's queen is on h5, threatening the kingside.\""
|
| 261 |
+
]
|
| 262 |
+
},
|
| 263 |
+
"execution_count": 7,
|
| 264 |
+
"metadata": {},
|
| 265 |
+
"output_type": "execute_result"
|
| 266 |
+
}
|
| 267 |
+
],
|
| 268 |
+
"source": [
|
| 269 |
+
"res"
|
| 270 |
+
]
|
| 271 |
+
},
|
| 272 |
+
{
|
| 273 |
+
"cell_type": "code",
|
| 274 |
+
"execution_count": null,
|
| 275 |
+
"id": "14ae331c",
|
| 276 |
+
"metadata": {},
|
| 277 |
+
"outputs": [],
|
| 278 |
"source": []
|
| 279 |
}
|
| 280 |
],
|