From efcf7d150878e98722dbfcdb5a5984456f1ad497 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 28 May 2023 17:45:31 +0530 Subject: [PATCH 01/16] Extract prompts as LangChain Prompt Templates into a separate module Improves code modularity, cleanliness. Reduces bloat in GPT.py module --- pyproject.toml | 1 + src/khoj/processor/conversation/gpt.py | 151 ++++--------------- src/khoj/processor/conversation/prompts.py | 163 +++++++++++++++++++++ 3 files changed, 189 insertions(+), 126 deletions(-) create mode 100644 src/khoj/processor/conversation/prompts.py diff --git a/pyproject.toml b/pyproject.toml index 0406467e..ad476297 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,6 +53,7 @@ dependencies = [ "torch == 1.13.1", "uvicorn == 0.17.6", "aiohttp == 3.8.4", + "langchain >= 0.0.187", ] dynamic = ["version"] diff --git a/src/khoj/processor/conversation/gpt.py b/src/khoj/processor/conversation/gpt.py index c0ba1517..95edb9a0 100644 --- a/src/khoj/processor/conversation/gpt.py +++ b/src/khoj/processor/conversation/gpt.py @@ -5,10 +5,10 @@ from datetime import datetime # Internal Packages from khoj.utils.constants import empty_escape_sequences +from khoj.processor.conversation import prompts from khoj.processor.conversation.utils import ( chat_completion_with_backoff, completion_with_backoff, - message_to_prompt, generate_chatml_messages_with_context, ) @@ -20,17 +20,9 @@ def answer(text, user_query, model, api_key=None, temperature=0.5, max_tokens=50 """ Answer user query using provided text as reference with OpenAI's GPT """ - # Setup Prompt based on Summary Type - prompt = f""" -You are a friendly, helpful personal assistant. -Using the users notes below, answer their following question. If the answer is not contained within the notes, say "I don't know." + # Setup Prompt from arguments + prompt = prompts.answer.format(text=text, user_query=user_query) -Notes: -{text} - -Question: {user_query} - -Answer (in second person):""" # Get Response from GPT logger.debug(f"Prompt for GPT: {prompt}") response = completion_with_backoff( @@ -53,19 +45,9 @@ def summarize(text, summary_type, model, user_query=None, api_key=None, temperat """ # Setup Prompt based on Summary Type if summary_type == "chat": - prompt = f""" -You are an AI. Summarize the conversation below from your perspective: - -{text} - -Summarize the conversation from the AI's first-person perspective:""" + prompt = prompts.summarize_chat.format(text=text) elif summary_type == "notes": - prompt = f""" -Summarize the below notes about {user_query}: - -{text} - -Summarize the notes in second person perspective:""" + prompt = prompts.summarize_notes.format(text=text, user_query=user_query) # Get Response from GPT logger.debug(f"Prompt for GPT: {prompt}") @@ -102,63 +84,16 @@ def extract_questions(text, model="text-davinci-003", conversation_log={}, api_k current_new_year = today.replace(month=1, day=1) last_new_year = current_new_year.replace(year=today.year - 1) - prompt = f""" -You are Khoj, an extremely smart and helpful search assistant with the ability to retrieve information from the users notes. -- The user will provide their questions and answers to you for context. -- Add as much context from the previous questions and answers as required into your search queries. -- Break messages into multiple search queries when required to retrieve the relevant information. -- Add date filters to your search queries from questions and answers when required to retrieve the relevant information. - -What searches, if any, will you need to perform to answer the users question? -Provide search queries as a JSON list of strings -Current Date: {today.strftime("%A, %Y-%m-%d")} - -Q: How was my trip to Cambodia? - -["How was my trip to Cambodia?"] - -A: The trip was amazing. I went to the Angkor Wat temple and it was beautiful. - -Q: Who did i visit that temple with? - -["Who did I visit the Angkor Wat Temple in Cambodia with?"] - -A: You visited the Angkor Wat Temple in Cambodia with Pablo, Namita and Xi. - -Q: What national parks did I go to last year? - -["National park I visited in {last_new_year.strftime("%Y")} dt>=\\"{last_new_year.strftime("%Y-%m-%d")}\\" dt<\\"{current_new_year.strftime("%Y-%m-%d")}\\""] - -A: You visited the Grand Canyon and Yellowstone National Park in {last_new_year.strftime("%Y")}. - -Q: How are you feeling today? - -[] - -A: I'm feeling a little bored. Helping you will hopefully make me feel better! - -Q: How many tennis balls fit in the back of a 2002 Honda Civic? - -["What is the size of a tennis ball?", "What is the trunk size of a 2002 Honda Civic?"] - -A: 1085 tennis balls will fit in the trunk of a Honda Civic - -Q: Is Bob older than Tom? - -["When was Bob born?", "What is Tom's age?"] - -A: Yes, Bob is older than Tom. As Bob was born on 1984-01-01 and Tom is 30 years old. - -Q: What is their age difference? - -["What is Bob's age?", "What is Tom's age?"] - -A: Bob is {current_new_year.year - 1984 - 30} years older than Tom. As Bob is {current_new_year.year - 1984} years old and Tom is 30 years old. - -{chat_history} -Q: {text} - -""" + prompt = prompts.extract_questions.format( + current_date=today.strftime("%A, %Y-%m-%d"), + last_new_year=last_new_year.strftime("%Y"), + last_new_year_date=last_new_year.strftime("%Y-%m-%d"), + current_new_year_date=current_new_year.strftime("%Y-%m-%d"), + bob_tom_age_difference={current_new_year.year - 1984 - 30}, + bob_age={current_new_year.year - 1984}, + chat_history=chat_history, + text=text, + ) # Get Response from GPT response = completion_with_backoff( @@ -191,31 +126,8 @@ def extract_search_type(text, model, api_key=None, temperature=0.5, max_tokens=1 """ Extract search type from user query using OpenAI's GPT """ - # Initialize Variables - understand_primer = """ -Objective: Extract search type from user query and return information as JSON - -Allowed search types are listed below: - - search-type=["notes","ledger","image","music"] - -Some examples are given below for reference: -Q:What fiction book was I reading last week about AI starship? -A:{ "search-type": "notes" } -Q:Play some calm classical music? -A:{ "search-type": "music" } -Q:How much did I spend at Subway for dinner last time? -A:{ "search-type": "ledger" } -Q:What was that popular Sri lankan song that Alex had mentioned? -A:{ "search-type": "music" } -Q:Can you recommend a movie to watch from my notes? -A:{ "search-type": "notes" } -Q: When did I buy Groceries last? -A:{ "search-type": "ledger" } -Q:When did I go surfing last? -A:{ "search-type": "notes" }""" - - # Setup Prompt with Understand Primer - prompt = message_to_prompt(text, understand_primer, start_sequence="\nA:", restart_sequence="\nQ:") + # Setup Prompt to extract search type + prompt = prompts.search_type + f"{text}\nA:" if verbose > 1: print(f"Message -> Prompt: {text} -> {prompt}") @@ -241,36 +153,23 @@ def converse(references, user_query, conversation_log={}, model="gpt-3.5-turbo", Converse with user using OpenAI's ChatGPT """ # Initialize Variables + current_date = datetime.now().strftime("%Y-%m-%d") compiled_references = "\n\n".join({f"# {item}" for item in references}) - personality_primer = "You are Khoj, a friendly, smart and helpful personal assistant." - conversation_primers = { - "general": f""" -Using your general knowledge and our past conversations as context, answer the following question. -Current Date: {datetime.now().strftime("%Y-%m-%d")} - -Question: {user_query} -""".strip(), - "notes": f""" -Using the notes and our past conversations as context, answer the following question. -Current Date: {datetime.now().strftime("%Y-%m-%d")} - -Notes: -{compiled_references} - -Question: {user_query} -""".strip(), - } - # Get Conversation Primer appropriate to Conversation Type conversation_type = "general" if user_query.startswith("@general") or compiled_references.strip() == "" else "notes" logger.debug(f"Conversation Type: {conversation_type}") - conversation_primer = conversation_primers.get(conversation_type) + if conversation_type == "general": + conversation_primer = prompts.general_conversation.format(current_date=current_date, query=user_query) + else: + conversation_primer = prompts.notes_conversation.format( + current_date=current_date, query=user_query, references=compiled_references + ) # Setup Prompt with Primer or Conversation History messages = generate_chatml_messages_with_context( conversation_primer, - personality_primer, + prompts.personality.format(), conversation_log, model, ) diff --git a/src/khoj/processor/conversation/prompts.py b/src/khoj/processor/conversation/prompts.py new file mode 100644 index 00000000..e6dd4844 --- /dev/null +++ b/src/khoj/processor/conversation/prompts.py @@ -0,0 +1,163 @@ +# External Packages +from langchain.prompts import PromptTemplate + + +## Personality +## -- +personality = PromptTemplate.from_template("You are Khoj, a friendly, smart and helpful personal assistant.") + + +## General Conversation +## -- +general_conversation = PromptTemplate.from_template( + """ +Using your general knowledge and our past conversations as context, answer the following question. +Current Date: {current_date} + +Question: {query} +""".strip() +) + + +## Notes Conversation +## -- +notes_conversation = PromptTemplate.from_template( + """ +Using the notes and our past conversations as context, answer the following question. +Current Date: {current_date} + +Notes: +{references} + +Question: {query} +""".strip() +) + + +## Summarize Chat +## -- +summarize_chat = PromptTemplate.from_template( + """ +You are an AI. Summarize the conversation below from your perspective: + +{text} + +Summarize the conversation from the AI's first-person perspective:""" +) + + +## Summarize Notes +## -- +summarize_notes = PromptTemplate.from_template( + """ +Summarize the below notes about {user_query}: + +{text} + +Summarize the notes in second person perspective:""" +) + + +## Answer +## -- +answer = PromptTemplate.from_template( + """ +You are a friendly, helpful personal assistant. +Using the users notes below, answer their following question. If the answer is not contained within the notes, say "I don't know." + +Notes: +{text} + +Question: {user_query} + +Answer (in second person):""" +) + + +## Extract Questions +## -- +extract_questions = PromptTemplate.from_template( + """ +You are Khoj, an extremely smart and helpful search assistant with the ability to retrieve information from the users notes. +- The user will provide their questions and answers to you for context. +- Add as much context from the previous questions and answers as required into your search queries. +- Break messages into multiple search queries when required to retrieve the relevant information. +- Add date filters to your search queries from questions and answers when required to retrieve the relevant information. + +What searches, if any, will you need to perform to answer the users question? +Provide search queries as a JSON list of strings +Current Date: {current_date} + +Q: How was my trip to Cambodia? + +["How was my trip to Cambodia?"] + +A: The trip was amazing. I went to the Angkor Wat temple and it was beautiful. + +Q: Who did i visit that temple with? + +["Who did I visit the Angkor Wat Temple in Cambodia with?"] + +A: You visited the Angkor Wat Temple in Cambodia with Pablo, Namita and Xi. + +Q: What national parks did I go to last year? + +["National park I visited in {last_new_year} dt>=\\"{last_new_year_date}\\" dt<\\"{current_new_year_date}\\""] + +A: You visited the Grand Canyon and Yellowstone National Park in {last_new_year}. + +Q: How are you feeling today? + +[] + +A: I'm feeling a little bored. Helping you will hopefully make me feel better! + +Q: How many tennis balls fit in the back of a 2002 Honda Civic? + +["What is the size of a tennis ball?", "What is the trunk size of a 2002 Honda Civic?"] + +A: 1085 tennis balls will fit in the trunk of a Honda Civic + +Q: Is Bob older than Tom? + +["When was Bob born?", "What is Tom's age?"] + +A: Yes, Bob is older than Tom. As Bob was born on 1984-01-01 and Tom is 30 years old. + +Q: What is their age difference? + +["What is Bob's age?", "What is Tom's age?"] + +A: Bob is {bob_tom_age_difference} years older than Tom. As Bob is {bob_age} years old and Tom is 30 years old. + +{chat_history} +Q: {text} + +""" +) + + +## Extract Search Type +## -- +search_type = """ +Objective: Extract search type from user query and return information as JSON + +Allowed search types are listed below: + - search-type=["notes","ledger","image","music"] + +Some examples are given below for reference: +Q:What fiction book was I reading last week about AI starship? +A:{ "search-type": "notes" } +Q:Play some calm classical music? +A:{ "search-type": "music" } +Q:How much did I spend at Subway for dinner last time? +A:{ "search-type": "ledger" } +Q:What was that popular Sri lankan song that Alex had mentioned? +A:{ "search-type": "music" } +Q:Can you recommend a movie to watch from my notes? +A:{ "search-type": "notes" } +Q:When did I buy Groceries last? +A:{ "search-type": "ledger" } +Q:When did I go surfing last? +A:{ "search-type": "notes" } +Q:""" From 334be4e600706109529f6f19b6586ae376514fa2 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 28 May 2023 19:12:36 +0530 Subject: [PATCH 02/16] Use LangChain to call OpenAI for Khoj Chat - Use ChatModel and ChatOpenAI to call OpenAI chat model instead of using OpenAI package directly - This is being done as part of migration to rely on LangChain for creating agents and managing their state --- src/khoj/processor/conversation/gpt.py | 3 +-- src/khoj/processor/conversation/utils.py | 31 +++++++++++++----------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/khoj/processor/conversation/gpt.py b/src/khoj/processor/conversation/gpt.py index 95edb9a0..b9f14884 100644 --- a/src/khoj/processor/conversation/gpt.py +++ b/src/khoj/processor/conversation/gpt.py @@ -184,5 +184,4 @@ def converse(references, user_query, conversation_log={}, model="gpt-3.5-turbo", ) # Extract, Clean Message from GPT's Response - story = str(response["choices"][0]["message"]["content"]) - return story.strip(empty_escape_sequences) + return response.strip(empty_escape_sequences) diff --git a/src/khoj/processor/conversation/utils.py b/src/khoj/processor/conversation/utils.py index faf8e1ea..f5d86e00 100644 --- a/src/khoj/processor/conversation/utils.py +++ b/src/khoj/processor/conversation/utils.py @@ -4,6 +4,8 @@ import logging from datetime import datetime # External Packages +from langchain.chat_models import ChatOpenAI +from langchain.schema import ChatMessage import openai import tiktoken from tenacity import ( @@ -54,9 +56,15 @@ def completion_with_backoff(**kwargs): before_sleep=before_sleep_log(logger, logging.DEBUG), reraise=True, ) -def chat_completion_with_backoff(**kwargs): - openai.api_key = kwargs["api_key"] if kwargs.get("api_key") else os.getenv("OPENAI_API_KEY") - return openai.ChatCompletion.create(**kwargs, request_timeout=60) +def chat_completion_with_backoff(messages, model, temperature, **kwargs): + openai_api_key = kwargs["api_key"] if kwargs.get("api_key") else os.getenv("OPENAI_API_KEY") + chat = ChatOpenAI( + model_name=model, + temperature=temperature, + openai_api_key=openai_api_key, + request_timeout=60, + ) + return chat(messages).content def generate_chatml_messages_with_context( @@ -73,17 +81,17 @@ def generate_chatml_messages_with_context( rest_backnforths += reciprocal_conversation_to_chatml([user_msg, assistant_msg])[::-1] # Format user and system messages to chatml format - system_chatml_message = [message_to_chatml(system_message, "system")] - user_chatml_message = [message_to_chatml(user_message, "user")] + system_chatml_message = [ChatMessage(content=system_message, role="system")] + user_chatml_message = [ChatMessage(content=user_message, role="user")] - messages = user_chatml_message + rest_backnforths[:2] + system_chatml_message + rest_backnforths[2:] + messages = user_chatml_message + rest_backnforths + system_chatml_message # Truncate oldest messages from conversation history until under max supported prompt size by model encoder = tiktoken.encoding_for_model(model_name) - tokens = sum([len(encoder.encode(value)) for message in messages for value in message.values()]) + tokens = sum([len(encoder.encode(content)) for message in messages for content in message.content]) while tokens > max_prompt_size[model_name]: messages.pop() - tokens = sum([len(encoder.encode(value)) for message in messages for value in message.values()]) + tokens = sum([len(encoder.encode(content)) for message in messages for content in message.content]) # Return message in chronological order return messages[::-1] @@ -91,12 +99,7 @@ def generate_chatml_messages_with_context( def reciprocal_conversation_to_chatml(message_pair): """Convert a single back and forth between user and assistant to chatml format""" - return [message_to_chatml(message, role) for message, role in zip(message_pair, ["user", "assistant"])] - - -def message_to_chatml(message, role="assistant"): - """Create chatml message from message and role""" - return {"role": role, "content": message} + return [ChatMessage(content=message, role=role) for message, role in zip(message_pair, ["user", "assistant"])] def message_to_prompt( From 277d2f5c964d3174438cedc86c57ff9c68bffb67 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 28 May 2023 19:28:57 +0530 Subject: [PATCH 03/16] Do not add "Notes:" suffix to chat messages when no notes retrieved This was causing spurious "Notes:" suffix being added to Khoj Chat in response --- src/khoj/processor/conversation/utils.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/khoj/processor/conversation/utils.py b/src/khoj/processor/conversation/utils.py index f5d86e00..3e3d38e7 100644 --- a/src/khoj/processor/conversation/utils.py +++ b/src/khoj/processor/conversation/utils.py @@ -72,7 +72,11 @@ def generate_chatml_messages_with_context( ): """Generate messages for ChatGPT with context from previous conversation""" # Extract Chat History for Context - chat_logs = [f'{chat["message"]}\n\nNotes:\n{chat.get("context","")}' for chat in conversation_log.get("chat", [])] + chat_logs = [] + for chat in conversation_log.get("chat", []): + chat_notes = f'\n\n Notes:\n{chat.get("context")}' if chat.get("context") else "\n" + chat_logs += [chat["message"] + chat_notes] + rest_backnforths = [] # Extract in reverse chronological order for user_msg, assistant_msg in zip(chat_logs[-2::-2], chat_logs[::-2]): From 18081b3bc69684fd6f62ae39c4524c2a95b97ddf Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Tue, 30 May 2023 23:23:42 +0530 Subject: [PATCH 04/16] Use LangChain to call GPT over API --- src/khoj/processor/conversation/gpt.py | 14 +++++--------- src/khoj/processor/conversation/utils.py | 7 +++++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/khoj/processor/conversation/gpt.py b/src/khoj/processor/conversation/gpt.py index b9f14884..f9f6aca1 100644 --- a/src/khoj/processor/conversation/gpt.py +++ b/src/khoj/processor/conversation/gpt.py @@ -35,8 +35,7 @@ def answer(text, user_query, model, api_key=None, temperature=0.5, max_tokens=50 ) # Extract, Clean Message from GPT's Response - story = response["choices"][0]["text"] - return str(story).replace("\n\n", "") + return str(response).replace("\n\n", "") def summarize(text, summary_type, model, user_query=None, api_key=None, temperature=0.5, max_tokens=200): @@ -62,8 +61,7 @@ def summarize(text, summary_type, model, user_query=None, api_key=None, temperat ) # Extract, Clean Message from GPT's Response - story = response["choices"][0]["text"] - return str(story).replace("\n\n", "") + return str(response).replace("\n\n", "") def extract_questions(text, model="text-davinci-003", conversation_log={}, api_key=None, temperature=0, max_tokens=100): @@ -106,17 +104,16 @@ def extract_questions(text, model="text-davinci-003", conversation_log={}, api_k ) # Extract, Clean Message from GPT's Response - response_text = response["choices"][0]["text"] try: questions = json.loads( # Clean response to increase likelihood of valid JSON. E.g replace ' with " to enclose strings - response_text.strip(empty_escape_sequences) + response.strip(empty_escape_sequences) .replace("['", '["') .replace("']", '"]') .replace("', '", '", "') ) except json.decoder.JSONDecodeError: - logger.warn(f"GPT returned invalid JSON. Falling back to using user message as search query.\n{response_text}") + logger.warn(f"GPT returned invalid JSON. Falling back to using user message as search query.\n{response}") questions = [text] logger.debug(f"Extracted Questions by GPT: {questions}") return questions @@ -144,8 +141,7 @@ def extract_search_type(text, model, api_key=None, temperature=0.5, max_tokens=1 ) # Extract, Clean Message from GPT's Response - story = str(response["choices"][0]["text"]) - return json.loads(story.strip(empty_escape_sequences)) + return json.loads(response.strip(empty_escape_sequences)) def converse(references, user_query, conversation_log={}, model="gpt-3.5-turbo", api_key=None, temperature=0.2): diff --git a/src/khoj/processor/conversation/utils.py b/src/khoj/processor/conversation/utils.py index 3e3d38e7..e18f7bbd 100644 --- a/src/khoj/processor/conversation/utils.py +++ b/src/khoj/processor/conversation/utils.py @@ -5,6 +5,7 @@ from datetime import datetime # External Packages from langchain.chat_models import ChatOpenAI +from langchain.llms import OpenAI from langchain.schema import ChatMessage import openai import tiktoken @@ -39,8 +40,10 @@ max_prompt_size = {"gpt-3.5-turbo": 4096, "gpt-4": 8192} reraise=True, ) def completion_with_backoff(**kwargs): - openai.api_key = kwargs["api_key"] if kwargs.get("api_key") else os.getenv("OPENAI_API_KEY") - return openai.Completion.create(**kwargs, request_timeout=60) + prompt = kwargs.pop("prompt") + kwargs["openai_api_key"] = kwargs["api_key"] if kwargs.get("api_key") else os.getenv("OPENAI_API_KEY") + llm = OpenAI(**kwargs, request_timeout=60) + return llm(prompt) @retry( From 703a7c89c0f493089aae903f62cf66e562e2e48f Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Wed, 31 May 2023 10:52:59 +0530 Subject: [PATCH 05/16] Reduce retry count and request timeout for faster response or failure - Fix bug where both LangChain and Khoj retry requests 6 times each. So a total of 12 requests at >1minute intervals for each chat response in case of OpenAI API being down - Retrying too many times when the API is failing doesn't help - The earlier 60 second request timeout was spacing out the interval between retries way too much. This slowed down chat response times quite a bit when API was being flaky - With these updates you'll know if call to chat API failed in under a minute --- src/khoj/processor/conversation/utils.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/khoj/processor/conversation/utils.py b/src/khoj/processor/conversation/utils.py index e18f7bbd..f058b877 100644 --- a/src/khoj/processor/conversation/utils.py +++ b/src/khoj/processor/conversation/utils.py @@ -34,15 +34,15 @@ max_prompt_size = {"gpt-3.5-turbo": 4096, "gpt-4": 8192} | retry_if_exception_type(openai.error.RateLimitError) | retry_if_exception_type(openai.error.ServiceUnavailableError) ), - wait=wait_random_exponential(min=1, max=30), - stop=stop_after_attempt(6), + wait=wait_random_exponential(min=1, max=10), + stop=stop_after_attempt(3), before_sleep=before_sleep_log(logger, logging.DEBUG), reraise=True, ) def completion_with_backoff(**kwargs): prompt = kwargs.pop("prompt") kwargs["openai_api_key"] = kwargs["api_key"] if kwargs.get("api_key") else os.getenv("OPENAI_API_KEY") - llm = OpenAI(**kwargs, request_timeout=60) + llm = OpenAI(**kwargs, request_timeout=10, max_retries=1) return llm(prompt) @@ -55,7 +55,7 @@ def completion_with_backoff(**kwargs): | retry_if_exception_type(openai.error.ServiceUnavailableError) ), wait=wait_exponential(multiplier=1, min=4, max=10), - stop=stop_after_attempt(6), + stop=stop_after_attempt(3), before_sleep=before_sleep_log(logger, logging.DEBUG), reraise=True, ) @@ -65,7 +65,8 @@ def chat_completion_with_backoff(messages, model, temperature, **kwargs): model_name=model, temperature=temperature, openai_api_key=openai_api_key, - request_timeout=60, + request_timeout=10, + max_retries=1, ) return chat(messages).content From ed4d0f90766e8183f33fcfa798ea61c6345904cf Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Wed, 31 May 2023 10:59:31 +0530 Subject: [PATCH 06/16] Simplify argument names used in khoj openai completion functions - Match argument names passed to khoj openai completion funcs with arguments passed to langchain calls to OpenAI - This simplifies the logic in the khoj openai completion funcs --- src/khoj/processor/conversation/gpt.py | 12 ++++++------ src/khoj/processor/conversation/utils.py | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/khoj/processor/conversation/gpt.py b/src/khoj/processor/conversation/gpt.py index f9f6aca1..40cccd85 100644 --- a/src/khoj/processor/conversation/gpt.py +++ b/src/khoj/processor/conversation/gpt.py @@ -27,7 +27,7 @@ def answer(text, user_query, model, api_key=None, temperature=0.5, max_tokens=50 logger.debug(f"Prompt for GPT: {prompt}") response = completion_with_backoff( prompt=prompt, - model=model, + model_name=model, temperature=temperature, max_tokens=max_tokens, stop='"""', @@ -52,7 +52,7 @@ def summarize(text, summary_type, model, user_query=None, api_key=None, temperat logger.debug(f"Prompt for GPT: {prompt}") response = completion_with_backoff( prompt=prompt, - model=model, + model_name=model, temperature=temperature, max_tokens=max_tokens, frequency_penalty=0.2, @@ -96,7 +96,7 @@ def extract_questions(text, model="text-davinci-003", conversation_log={}, api_k # Get Response from GPT response = completion_with_backoff( prompt=prompt, - model=model, + model_name=model, temperature=temperature, max_tokens=max_tokens, stop=["A: ", "\n"], @@ -132,7 +132,7 @@ def extract_search_type(text, model, api_key=None, temperature=0.5, max_tokens=1 logger.debug(f"Prompt for GPT: {prompt}") response = completion_with_backoff( prompt=prompt, - model=model, + model_name=model, temperature=temperature, max_tokens=max_tokens, frequency_penalty=0.2, @@ -174,9 +174,9 @@ def converse(references, user_query, conversation_log={}, model="gpt-3.5-turbo", logger.debug(f"Conversation Context for GPT: {messages}") response = chat_completion_with_backoff( messages=messages, - model=model, + model_name=model, temperature=temperature, - api_key=api_key, + openai_api_key=api_key, ) # Extract, Clean Message from GPT's Response diff --git a/src/khoj/processor/conversation/utils.py b/src/khoj/processor/conversation/utils.py index f058b877..a95f16f5 100644 --- a/src/khoj/processor/conversation/utils.py +++ b/src/khoj/processor/conversation/utils.py @@ -41,7 +41,8 @@ max_prompt_size = {"gpt-3.5-turbo": 4096, "gpt-4": 8192} ) def completion_with_backoff(**kwargs): prompt = kwargs.pop("prompt") - kwargs["openai_api_key"] = kwargs["api_key"] if kwargs.get("api_key") else os.getenv("OPENAI_API_KEY") + if "openai_api_key" not in kwargs: + kwargs["openai_api_key"] = os.getenv("OPENAI_API_KEY") llm = OpenAI(**kwargs, request_timeout=10, max_retries=1) return llm(prompt) @@ -59,12 +60,11 @@ def completion_with_backoff(**kwargs): before_sleep=before_sleep_log(logger, logging.DEBUG), reraise=True, ) -def chat_completion_with_backoff(messages, model, temperature, **kwargs): - openai_api_key = kwargs["api_key"] if kwargs.get("api_key") else os.getenv("OPENAI_API_KEY") +def chat_completion_with_backoff(messages, model_name, temperature, openai_api_key=None): chat = ChatOpenAI( - model_name=model, + model_name=model_name, temperature=temperature, - openai_api_key=openai_api_key, + openai_api_key=openai_api_key or os.getenv("OPENAI_API_KEY"), request_timeout=10, max_retries=1, ) From 1cd9ecd449a89d41473d4baaf3f5df6bec3b27fe Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 1 Jun 2023 08:05:18 +0530 Subject: [PATCH 07/16] Truncate last message if still over max supported prompt size by model --- src/khoj/processor/conversation/utils.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/khoj/processor/conversation/utils.py b/src/khoj/processor/conversation/utils.py index a95f16f5..5e3d5ef4 100644 --- a/src/khoj/processor/conversation/utils.py +++ b/src/khoj/processor/conversation/utils.py @@ -97,10 +97,19 @@ def generate_chatml_messages_with_context( # Truncate oldest messages from conversation history until under max supported prompt size by model encoder = tiktoken.encoding_for_model(model_name) tokens = sum([len(encoder.encode(content)) for message in messages for content in message.content]) - while tokens > max_prompt_size[model_name]: + while tokens > max_prompt_size[model_name] and len(messages) > 1: messages.pop() tokens = sum([len(encoder.encode(content)) for message in messages for content in message.content]) + # Truncate last message if still over max supported prompt size by model + if tokens > max_prompt_size[model_name]: + last_message = messages[-1] + truncated_message = encoder.decode(encoder.encode(last_message.content)) + logger.debug( + f"Truncate last message to fit within max prompt size of {max_prompt_size[model_name]} supported by {model_name} model:\n {truncated_message}" + ) + messages = [ChatMessage(content=[truncated_message], role=last_message.role)] + # Return message in chronological order return messages[::-1] From 1b3effd8e6e73988d33bf872f7c0b4b6e01d05d9 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 1 Jun 2023 09:13:31 +0530 Subject: [PATCH 08/16] Fork Markdown to JSONL processor as start template for PDF to Jsonl Processor --- src/khoj/processor/pdf/__init__.py | 0 src/khoj/processor/pdf/pdf_to_jsonl.py | 144 +++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 src/khoj/processor/pdf/__init__.py create mode 100644 src/khoj/processor/pdf/pdf_to_jsonl.py diff --git a/src/khoj/processor/pdf/__init__.py b/src/khoj/processor/pdf/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/khoj/processor/pdf/pdf_to_jsonl.py b/src/khoj/processor/pdf/pdf_to_jsonl.py new file mode 100644 index 00000000..9552e5e6 --- /dev/null +++ b/src/khoj/processor/pdf/pdf_to_jsonl.py @@ -0,0 +1,144 @@ +# Standard Packages +import glob +import logging +import re +from pathlib import Path +from typing import List + +# Internal Packages +from khoj.processor.text_to_jsonl import TextToJsonl +from khoj.utils.helpers import get_absolute_path, is_none_or_empty, timer +from khoj.utils.constants import empty_escape_sequences +from khoj.utils.jsonl import dump_jsonl, compress_jsonl_data +from khoj.utils.rawconfig import Entry + + +logger = logging.getLogger(__name__) + + +class PdfToJsonl(TextToJsonl): + # Define Functions + def process(self, previous_entries=None): + # Extract required fields from config + pdf_files, pdf_file_filter, output_file = ( + self.config.input_files, + self.config.input_filter, + self.config.compressed_jsonl, + ) + + # Input Validation + if is_none_or_empty(pdf_files) and is_none_or_empty(pdf_file_filter): + print("At least one of pdf-files or pdf-file-filter is required to be specified") + exit(1) + + # Get Pdf Files to Process + pdf_files = PdfToJsonl.get_pdf_files(pdf_files, pdf_file_filter) + + # Extract Entries from specified Pdf files + with timer("Parse entries from PDF files into dictionaries", logger): + current_entries = PdfToJsonl.convert_pdf_entries_to_maps(*PdfToJsonl.extract_pdf_entries(pdf_files)) + + # Split entries by max tokens supported by model + with timer("Split entries by max token size supported by model", logger): + current_entries = self.split_entries_by_max_tokens(current_entries, max_tokens=256) + + # Identify, mark and merge any new entries with previous entries + with timer("Identify new or updated entries", logger): + if not previous_entries: + entries_with_ids = list(enumerate(current_entries)) + else: + entries_with_ids = self.mark_entries_for_update( + current_entries, previous_entries, key="compiled", logger=logger + ) + + with timer("Write PDF entries to JSONL file", logger): + # Process Each Entry from All Notes Files + entries = list(map(lambda entry: entry[1], entries_with_ids)) + jsonl_data = PdfToJsonl.convert_pdf_maps_to_jsonl(entries) + + # Compress JSONL formatted Data + if output_file.suffix == ".gz": + compress_jsonl_data(jsonl_data, output_file) + elif output_file.suffix == ".jsonl": + dump_jsonl(jsonl_data, output_file) + + return entries_with_ids + + @staticmethod + def get_pdf_files(pdf_files=None, pdf_file_filters=None): + "Get PDF files to process" + absolute_pdf_files, filtered_pdf_files = set(), set() + if pdf_files: + absolute_pdf_files = {get_absolute_path(pdf_file) for pdf_file in pdf_files} + if pdf_file_filters: + filtered_pdf_files = { + filtered_file + for pdf_file_filter in pdf_file_filters + for filtered_file in glob.glob(get_absolute_path(pdf_file_filter), recursive=True) + } + + all_pdf_files = sorted(absolute_pdf_files | filtered_pdf_files) + + files_with_non_pdf_extensions = {pdf_file for pdf_file in all_pdf_files if not pdf_file.endswith(".pdf")} + + if any(files_with_non_pdf_extensions): + logger.warn(f"[Warning] There maybe non pdf-mode files in the input set: {files_with_non_pdf_extensions}") + + logger.debug(f"Processing files: {all_pdf_files}") + + return all_pdf_files + + @staticmethod + def extract_pdf_entries(pdf_files): + """Extract entries by heading from specified PDF files""" + + # Regex to extract PDF Entries by Heading + pdf_heading_regex = r"^#" + + entries = [] + entry_to_file_map = [] + for pdf_file in pdf_files: + with open(pdf_file, "r", encoding="utf8") as f: + pdf_content = f.read() + pdf_entries_per_file = [] + any_headings = re.search(pdf_heading_regex, pdf_content, flags=re.MULTILINE) + for entry in re.split(pdf_heading_regex, pdf_content, flags=re.MULTILINE): + # Add heading level as the regex split removed it from entries with headings + prefix = "#" if entry.startswith("#") else "# " if any_headings else "" + stripped_entry = entry.strip(empty_escape_sequences) + if stripped_entry != "": + pdf_entries_per_file.append(f"{prefix}{stripped_entry}") + + entry_to_file_map += zip(pdf_entries_per_file, [pdf_file] * len(pdf_entries_per_file)) + entries.extend(pdf_entries_per_file) + + return entries, dict(entry_to_file_map) + + @staticmethod + def convert_pdf_entries_to_maps(parsed_entries: List[str], entry_to_file_map) -> List[Entry]: + "Convert each PDF entries into a dictionary" + entries = [] + for parsed_entry in parsed_entries: + entry_filename = Path(entry_to_file_map[parsed_entry]) + heading = parsed_entry.splitlines()[0] if re.search("^#+\s", parsed_entry) else "" + # Append base filename to compiled entry for context to model + # Increment heading level for heading entries and make filename as its top level heading + prefix = f"# {entry_filename.stem}\n#" if heading else f"# {entry_filename.stem}\n" + compiled_entry = f"{prefix}{parsed_entry}" + entries.append( + Entry( + compiled=compiled_entry, + raw=parsed_entry, + heading=f"{prefix}{heading}", + file=f"{entry_filename}", + ) + ) + + logger.debug(f"Converted {len(parsed_entries)} pdf entries to dictionaries") + + return entries + + @staticmethod + def convert_pdf_maps_to_jsonl(entries: List[Entry]): + "Convert each PDF entry to JSON and collate as JSONL" + return "".join([f"{entry.to_json()}\n" for entry in entries]) From 286b500f66123f22cf8bf8d843054f5be69d8cc5 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 1 Jun 2023 09:31:18 +0530 Subject: [PATCH 09/16] Create PDF to JSONL processor using PyPDF and LangChain Switch `pydantic' to >= 1.9.1 else `langchain.document_loaders' starts throwing typing error for python 3.8, 3.9 --- pyproject.toml | 3 +- src/khoj/processor/pdf/pdf_to_jsonl.py | 41 +++++++++----------------- 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ad476297..4aae6104 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ dependencies = [ "tiktoken >= 0.3.0", "tenacity >= 8.2.2", "pillow == 9.3.0", - "pydantic == 1.9.1", + "pydantic >= 1.9.1", "pyqt6 == 6.3.1", "pyyaml == 6.0", "rich >= 13.3.1", @@ -54,6 +54,7 @@ dependencies = [ "uvicorn == 0.17.6", "aiohttp == 3.8.4", "langchain >= 0.0.187", + "pypdf >= 3.9.0", ] dynamic = ["version"] diff --git a/src/khoj/processor/pdf/pdf_to_jsonl.py b/src/khoj/processor/pdf/pdf_to_jsonl.py index 9552e5e6..27c03d55 100644 --- a/src/khoj/processor/pdf/pdf_to_jsonl.py +++ b/src/khoj/processor/pdf/pdf_to_jsonl.py @@ -1,14 +1,15 @@ # Standard Packages import glob import logging -import re from pathlib import Path from typing import List +# External Packages +from langchain.document_loaders import PyPDFLoader + # Internal Packages from khoj.processor.text_to_jsonl import TextToJsonl from khoj.utils.helpers import get_absolute_path, is_none_or_empty, timer -from khoj.utils.constants import empty_escape_sequences from khoj.utils.jsonl import dump_jsonl, compress_jsonl_data from khoj.utils.rawconfig import Entry @@ -90,29 +91,17 @@ class PdfToJsonl(TextToJsonl): @staticmethod def extract_pdf_entries(pdf_files): - """Extract entries by heading from specified PDF files""" - - # Regex to extract PDF Entries by Heading - pdf_heading_regex = r"^#" + """Extract entries by page from specified PDF files""" entries = [] - entry_to_file_map = [] + entry_to_location_map = [] for pdf_file in pdf_files: - with open(pdf_file, "r", encoding="utf8") as f: - pdf_content = f.read() - pdf_entries_per_file = [] - any_headings = re.search(pdf_heading_regex, pdf_content, flags=re.MULTILINE) - for entry in re.split(pdf_heading_regex, pdf_content, flags=re.MULTILINE): - # Add heading level as the regex split removed it from entries with headings - prefix = "#" if entry.startswith("#") else "# " if any_headings else "" - stripped_entry = entry.strip(empty_escape_sequences) - if stripped_entry != "": - pdf_entries_per_file.append(f"{prefix}{stripped_entry}") + loader = PyPDFLoader(pdf_file) + pdf_entries_per_file = [page.page_content for page in loader.load()] + entry_to_location_map += zip(pdf_entries_per_file, [pdf_file] * len(pdf_entries_per_file)) + entries.extend(pdf_entries_per_file) - entry_to_file_map += zip(pdf_entries_per_file, [pdf_file] * len(pdf_entries_per_file)) - entries.extend(pdf_entries_per_file) - - return entries, dict(entry_to_file_map) + return entries, dict(entry_to_location_map) @staticmethod def convert_pdf_entries_to_maps(parsed_entries: List[str], entry_to_file_map) -> List[Entry]: @@ -120,21 +109,19 @@ class PdfToJsonl(TextToJsonl): entries = [] for parsed_entry in parsed_entries: entry_filename = Path(entry_to_file_map[parsed_entry]) - heading = parsed_entry.splitlines()[0] if re.search("^#+\s", parsed_entry) else "" # Append base filename to compiled entry for context to model - # Increment heading level for heading entries and make filename as its top level heading - prefix = f"# {entry_filename.stem}\n#" if heading else f"# {entry_filename.stem}\n" - compiled_entry = f"{prefix}{parsed_entry}" + heading = f"{entry_filename.stem}\n" + compiled_entry = f"{heading}{parsed_entry}" entries.append( Entry( compiled=compiled_entry, raw=parsed_entry, - heading=f"{prefix}{heading}", + heading=heading, file=f"{entry_filename}", ) ) - logger.debug(f"Converted {len(parsed_entries)} pdf entries to dictionaries") + logger.debug(f"Converted {len(parsed_entries)} PDF entries to dictionaries") return entries From d63194c3a94483cfa39dd71286be9785b6fc7597 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 1 Jun 2023 16:57:38 +0530 Subject: [PATCH 10/16] Create tests for PDF to JSONL processor --- tests/data/pdf/multipage.pdf | Bin 0 -> 206209 bytes tests/data/pdf/singlepage.pdf | Bin 0 -> 11448 bytes tests/test_pdf_to_jsonl.py | 74 ++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 tests/data/pdf/multipage.pdf create mode 100644 tests/data/pdf/singlepage.pdf create mode 100644 tests/test_pdf_to_jsonl.py diff --git a/tests/data/pdf/multipage.pdf b/tests/data/pdf/multipage.pdf new file mode 100644 index 0000000000000000000000000000000000000000..234f39b75b8a2dc7f5ad91a8c4a9f758f777e9ae GIT binary patch literal 206209 zcmagD1yo&4vM79T3+@s)XmI!7F2UX1-QC^YJt4RU4HDcvxCe*e?)-<$m;2_;-1WcR z^y=!8F5SJ@b;#vK#ORpl+2F~Kt}lLVpKe_r@0?u0vv2|#fp&(L@H{*WpDb)m3>+;y zO^ks|44;6^jO@&eTnrLg9PCV>4U-Oo9FUcfK@`Zs&dS8bAPZz?PzK@ISXfy2_~1=! zjo*#|zCG~njwYsWM>Da*Gyd~1vjG1+6|5KKo>A(1xnVDGs^E_r24pz4RkY!fDZN72sC8OQ?i5va%@X=`c+Wa0Q1ETYB3VPwL^Y{!#YotzCE zo&Thi5uTh}R8H(I%kX~;`KNM}J?u>wgbkbxtnJJgc zwlHx5xgaMj?xe*E3N=s>_?A_mq7H+|8{W~_#PL4~ahvY$JVreb9Uu>KyGvIT`Gn@CQ7-qZJq&?7YkGBCeb+7~24Y zfSBNRgN}{N5USEJ3%JXdTF8tN@J8FqKT88i=)w>n5)YfTACO+gQ6^H!^p@4WM%ymv9}E~koBJu z0&Q4;tZ$bAsJ1{GRv;Uw2!V>AP>b2wz6pzgj{gS*LJEVBCbrI?WP;uYP%>HHq6|u= zyn!PK{ZID)PZIt}{=4mOhcYO+7&^aI&Rh8~F$ftrnfyU3TiBR5(J9*57}$a`jDIF4X#YlI;`|rw zjsAzm&iX(6Z*t5ap1(5xul0@h4?pM(wtproD5PA>Oh681Q25z7{>(ox6BCe)jr|Y) zZU3g9g_G-Fd>|UGM%e`MI-Txb86RiO0!#l6v4-}qQTXTS0O!_NldWd&U! zf6xAdXZqK993bQV&c8PNP1C=xZ;t*c3sCCboc%lBbpQMOcbWf$-%9O2aew!3e-5Tg?77br?i#L071Str_Uuv=y{cM5h`*@!?l2E^c>S#Y?q^p_ZCG$o z-uFRhsn{m#_#z=vDxomVsE{kx8~3N{m*%dauhdepn9yUVZnlq?oW2<;5vM6DA$nXPNMu5RTQSFP(Ts35y8#nTuE6)vjahd@j7&S&D0Yncs$vMO><{ zEjD6nFluuuEyTU-L{FA0TH&2ui!T$jGw|s{@nN|2|o$pIG@s6*#2Da&oNQcP&!u-)iT&m9~tp)ZgRd z&WIm%ZXcb&6~(^hcKongf}QW}?lwc`gkL+zV$b@b`0M1c43`xKWfwv{X%~qJtyZ+W zU~1yw`Qao=#xk0P=4tFBr&p%fc!^UqAa5Vlo_aaffghZu$4G%h4lsliBWPipEgWK6 zpG$!M`vypi<|@kn?c4T#@gqD@U!Jz&Qr7J+NzG3OuA~bPsPq`NKGo&EUO)WMZgm7$ z?-phrjppl6r6Ps8*BUvRRE>q82D73D2{)>^37oBDq*FA^3v$ZJ(z&JSG|<{pn1ab92@XJMfM>IU~A(*o(*S zGgXo2fIn&dLqssJ2KkQl?Ghw>ge4=(O=|I#c9-gaoMVqt)}56PTiAh_qchCVQSJDy zfg$5*`U6jsF{`y@EzPu3MNRMhzO>{#gX1>q;HzenAw+uhA5v~ky3jQ-v^?3bsb7PC zj8Y<50oMBueTaw)i3mT!^<7pw9vs6kD0H_%g2|P{y77-y(L1#$%Qs9|T77n0rrdQw zA)|)g?Qu%w?3X_6x_L*1&^A--?Xj697W~4szsrH-1%XdWViU-8G1D4RqJYxu=Hu4p z!?R1vpdM4V_a#`dIdjX#vShSt)Jb&waX18bm!!${X`el1*{J=B&nxM*bP0PbI&-Y0 zrs&dVzTNq!JB$vUXo9sN#Ka!3p*M2XQA}XT_i0bu|9oSK`3i{3>uZ+hW+8+tw!7}& zWSl)>811w%X1N7+;zJLN$|zX#D}dXxGBribaWK$DE(Dd zh5wK+Q0=oL(Wqf>Y4z{#znem#Y>OEYRR;cfbD&iiyr|m(Q#V%UL4Y7(1wZ;Ug~4OvdEb91v^*QQPdC?h0%y` zg()Ltynh>P~lw5?4TmIf-x+3N0^i0_0ihO|A1ZHSl}!5b{Nl z!Vei~j6=|e5lY>_`x1a`Tclnx6E%h5{y->Wpc$F( z_mK>5&N7x>wl1DwSb4$gk#L7gv%fZIY1d;SM=>5d3>bCMD_^t zoQ|Kke#}+|qlc*i$z8O{#5Z`T=GytNo=!v-b~~Auvz<1k;Q=0pIL2Ne4H;pY!DkhY zl7NtbbodEGNfji>uPPjn3%|3}Rw2ydMejIK{C=5F2Bf>-)jXym`uL8rg}YAvlChA98RZTV6J~;r z^sGuC}vP&8hCm|7`Osod_E(Gx`0~02As3x<+{&6%St$j7wj@Sp(LZ^vtzSW$sbX%#yGWJ|LyY^*v~C>9MXb)5CosS@rn4NZ}7(l?ey zVLx{x)J0b)cY-{8J-#?|VOw&mj0nBzTvA5ow3`b2q6dR?*cptmCoc-6<6faB6r|f{ zHdZXacIr*=P~0|@o1gQP5j;Dy8nb-oF#*wLueMii9G_f{PUT4kG7Ug@?R2$#(>i9GQlOSvpoxP z*9-bX#FVjPOQ@8TOA3_LDk23{oF^aHvltf;I85i_7AXy$Is!!qM9sx!a8QCK7JD8g=J2<}?=EAcxyKWalWJ$0Cc z>@dcC7O{raFYdtou6k=dGsqa3^Si^%d^7mcY`;dPwK_KwU-IneQ!PAAI9KF?Q3wgz zIc+!`?|iF10g>yht6lPHp3L=RTUFtUZy~9K&ynRoC{2w7tq#rf)hGn_m9Gmrj4B6N z7voXr?$%7MhKKR!CSfK@;bA>J0Q{D#MV$?XbBx&xr zka~NZ!lOxk;e9P#z+k72qheN$o!6M=1h0)XJyAvOeZ}yAZkfzTTCETTA=j@pfm5%C zian^5!+wQvayY%oe87bGfy(b1+#)@%u<6J8<(3X9>gT{i^PjeC)W{+qB!D?6sm4Hb z9`jSj?#Z1~v~d#J26{y0xnx8J*kBF^!(9@OU$xf#hmoaQ7+BbVbD@iM&hb*YG)U*BcvKGQmie*hCCI;G;N z((%niwaF*%92hr7Y>lXlGTEPTTDyDlZZ1ajIryC*xd4q;#Ny`Ctk|tOxsH-+6gWLs z@H^Z7CDh#r*Dohp)>ZFXsRB<*?0=(OZ*j~UNX)fb!yc5^ zF0%1N`gh@!n%o_zLa=x+#vp#-RsSzgAgNJ#|yzF|c zoACRwcgEU5NoBc=d3w^esT_siT)o#-%CzjeB@UU!g|83~w^A_$^Kvwr`FeQ7rKmOE z4a%&NYzxBQ?<%^945BgYIF~FnRDA>A*^BI9pZ9h?dZ^X(LO>opv01Oc!nPSuRzQO< z6q@aJn6u|CwIXnv<%XxOZW6^I?VtgZ;)GN0jLXeTsp6$I&+(GpXD{*cq^O~0afs2N zxDW)pF?}@)B)gvyMUVmuph)g&zj1B-8cQ86{Gq?J`mnatu7-K*yN7K37!-qJqD72Q zisM)0cQs?}Ba&x?5oHfg^dFX0944$Hnc&r;Yw2`a=QwVZT95BxUpGmRCa- zOUep!T$XPkbk*Hi4oyUH(}x;yv);v&NUbr+El6E;pwf!WV$1Ge4-qpUFpJf7w9!X$ zF-BbBipQ#BRJEhHCS#MZL0vA%i2KZ25Ha@(h%t><{a-!_-+EyGd=mccLP^@Z_0#^e zl|cP(2@?x5b7v4BY-erfsAO+oWWpd~;%Z@JBJOD5!60Pe>?CjEC~RkA59&68I$oTh z-X^G1@YV(UpAO^yX(qn@FDAV4{$s+Q{;8a>jL5$?NI}gs20?3UIaAYr`+k1wcK+W& z;ta9|HYSup21Zt9j&?4###H~t{?^_5|8bL@k@2siTp;kjTvZeo`rka21oi$L?d{&W zra)&$7n47(|EmxCx4Fv3$-?>f16xX7{Xd(l007{fr92Rb2pFAHKzT!en2lcLUKIcgZ#xjHY0NQMr%X9Nv4MbiV7QG0TbHAlN`001-^qF;tfU$UV!J_+eHL5f)7;2fH=sK%unCKiD%^{yYw z{r(Lk^-Z;wagq$Gs^s{a7V$H$NXR4X@ zdTPos8W-kb^ZvZNg(PrppVCk57Kfhpj(B>6;fyhpxQnDhjoBp320t*u6@mn7M~W%? z`G8j?uJs+8gv}*Q)~f_@T2QP4a`mFB;dfD>by%GlznU4>PgfRog5RNrs?imjIJx>9 z{bUn_bevKf zkeDAqzmkO}1#AFiY>@jWIV0TbNYo9%o0+41OGS+rsP6?irctKNH0o=dl%?}yu@rUt z7=_=}dwhR^BJ)#qF~=%mu_TcmWUhff&Y8^^x_u#b4UP?wgzH)16q zsM}4n5kG3w3zn#cyHxWJcYW0IE7^2+>&C%&oRB49O{|NK=77sZLFeo9-=FYPIw11* z-#c6w*`qW&Tr|H^WPHlu??Ct8Q?%!NAlQ}c>kc_e2~)`DT0`1cNOTS;10Y2po?%&d z>BW8-(-1`qm3H&}UM!K+n@$dw!)vV2Nnn@l6dj7Uxgdo=870y2MS^`<>ZtPhV>|sM z!c~9C!Et24D%lKHwx*@N~QLW)>lg;C@Ma>?A|q1 zsnnC^_xcj9iOnU!q&=g3gf&oTA18{F*rUsdyxWM0kVJIiuPEQCKT{2qiF2852u_g| zW!w-u%vGtJ!fZ&u5JmtGHNvprovh%TOmv<3RdGb!@u3Suz+58Nz^Mr6r54NY1jBGV z*1LAHl;$XD*jEYWaUxo-Xw}KU);CLUrsvr88+Tj55R9ox+sDpAYzc3?>vti=rYO{8 zgYE^FKN(Na9W7sfUmQ7%--S5%xWk=dG5G!6HxJ7B0<=sKGxfV$Kb%)2!<)hcq3QeG zJ`p?{wEm~&xUWnfQTJsiHP_Qkq|CPjY%B=5Z6&9DAQA^jOZ{|*u+jo+51h?!-mQP_ zf8SwK`SE8LX)*B`3O+Wc@Mb7k{hhS8$hP-}JqJU+hvbjE{cp8qh+Xq}V&eV1qCqf| zxSH@znr@~JLX#$Wqb;{ZoGr1EP*8eESrBrx$S&SWVUm~Y$3cc(M|EKyNnDt*@2^ju zHV;|*@CBY<##Ujh@W(P#_Fz4BTF z+|EJ)BkRBIRJ`*>W)D2|WPN@m3!g3|De^1fsFOv4G(C--r8^u20pH<0NP z=Pw=DH@H%+e2AXk%T|cBb4L0-w-eDKt;bjAx$QcUgG3Z)p!J=(_0!^yyibS?(%Eb{ zE{=w}L-a#}YVYHO4*c5W@3wYW%)t(A57s+=ny@kd*liMl)Tjy~a@TasH6r1m(Ky~f zO*~N4&RMds(xpy92zQy{h$x{7nmY0Nc^eP^_1se3s~X&nBweFa&W~2=Y|Y~58P1_= zc7NoQ)s|yOAJ~EeCiGQF71@Zq^RE)mK6WRph~%7^&Yeg(VR$#g4{0jg9R_jXE6>M6 z4YYhF%*O)__CJFrRg9g-Z8GfvP-bX#8k3YM-Pi+OEyf}gANsyhC(ASKZ}8vbzp_dX zA!oY66r(_Y?~UIJ@=9269iL30E|wvd4wi>nHQUXi8Go$Gt!g=D2ID{#JAvjHJ0WXd z#UzkoXogf&2j`IKaMCZUZ&4%WYDjGRw3>fXs9iKoiL0iPaJ9j{9H!h@{!7qFOZ#BG zU8ThLJZ2yJ@KNV+M8d8|rrx0h^|BWeP}^v5;TOOoJ7oUjCVt{nx*LU=tSuiV3K$GD!+& z*6g2$YonQdZ_)yy!644et0?s(PhECM#=HzM_a;;4%zav2lm=myz_Nk**hrGud!;w4 zP32JiX;S5bDRZusv}amlLr0G^@`k+}oa_D}myp0iTgj z9Sl5D(_s2MyIVs%1geZ9?}PdeKGr#_$>nWiM=CK|C_bw129lhh{4=NiY)K62SEx|6ej zVdLu1f}5D9dblkFUw=nU4QzcMuzDL6qO0U~%~w9CMbZ|*XR?+`I{0%4X6aa>+u|sZ z*FWjOai>vkj8A)C2||t*j;jLa*Nr z`$l6yq@|Ky?2j3uJX+2SueprfpReJ~i3R!?I;;1$V<`-lN}^1!EU6g2JLpyhdydZ- zla})Da!OPE?_D+=`^bMoB{z`|R6%_rE}1HT)2Pe4@FqWNlv<-pUieZx0UtdnF$x*S zg*3XjI?Psa0p*!mvP&T-SLP<-!@3E7`efq<=Vq+`p>xXd>#S8m9V~Cbv2&2P4i8*p zkSp?dgAhfQIK!Fw${8kYt)co)GX8S~BO$~p>_LGDpF~%2_d%=neJ83>ruJbGVQc=< z^T$;}bvXOJRVBLW6t(T5s|1?!$R2H(>H7%h*(45mDCx=T4$ z=z}KhRYMzjocf*gr_h-T5s7zHDeQDr5U^Hfa1Y#t=i}_!H*FPG!JHq+>lR5TCf~#1 zbfMbVe}S=ijfyzVq65AfW=4261G8FnsFcF|5OJ16&9s^@RcP7xT5thYFKw?r2QjY* zN(luK2c_f^zuZwm{Vp6LoKY(hF3(Ex?PgIIdTwqW>)2Ce)YP8J*Gc=87afG{GIgn@ zBWP1F%mnD2kB79Jj3YhlXYTp!zAKuxIp7T?r&2(Jx9jY~e34RnPSS!f?Ej3-6a1o7 zXUB-S%8Uacbdw>Y{_R;J*g?%L4S95v(likwS54&oajF17pWug7beud{5?vjQBqF|5 z&uXToy-^usms+CORY>+n39u+UN6*nND$89Hw#`?E)D%g_C0*3;LA|mD{*7Low9>+G zcWs8_o$W65Iesg?hJhACu$*;DGr>S_f3cg%Em(m$S`@eccCX}{BC?!%-#I^Vu)&{qM(=wbq2P9yrbFU+&QTEL6hCz%CE z@#dLL)R=D~t0I;bPIbFvSY}jZ{C@JS(Vu*_2|y7im%dt*&TgFrmr^xUr7m$)?sD-} zuO}+mojip5toS&DoX5yLx?MwKu35Z^V8FiwghuP*J8&niWoVaTcPP&tT z+;?8Uv}F!g{&4N`o_bS^-L2A#vf91lphQZ=JxP}7EEqw4pGuiR8-g6~h?6IGxy|65 zD89bBCGV+gd&=2`boI9^Q$!3NjMqmTgv?8VcQZpaIg=7RHWX=#Ma|N39>Y{@SbAuw2Rlh+0dK_80EvN>YZS(HeGLpVQFSyj`egdRIP_K}(N8Uv5^(ue-PI6c(-PgWT zjV~UY^okS5Ye3pcThQgE%$ANmF(ucoMx_c4&Nr+a3*Yi=cp@-L9&**$eLoy68K2^`OPW%xcu_9xF`Efgj^FlGa=GN&2PpVr`gBICz>{?mN%gH-y z2(`?7eX!&`r3}s%l2?JwiTk3p8BCFhV>&CMViw|rP!&mnb$;8F1aWbe2@+Nhg+$Xj zqBGsLsOzLMl+kf0X+J`r2%X3J^lj+ezWRC<33Pa|yx^O~VZ*P5nzbf9$?1-gTppto zAy5Vusoi($Zz1tcvLYl(6JG%1HYdi_QyrSc8+FT-+fm0TE3OoDMzTm?q?y9$BuW& zh?HCoaW!{G^0-hRRlxT1wL(HX^kKPie}sn+Apwh8k_qHU{3dabgfC!4>Vi+B6N6{U zV$ry^5tTdfZ7{KNW@I-VAho0?&}58Cp_8}&oQ~##ZQZH#MUfKaR8sLE^C(Fb$afJa ziVoO>}-R@0grtKi0kR!3MiiIXK~&6mk1w#-oY!JEgfnAsZ5K`%=hh0!Jd5+VKg)_}rJWTE zJcb>|0fp?zD#LR=Bo|*fRf7p;8AfPsOE$a6!&IHTYn*reJrP8>_3~;*xv)%L?9~qcVY=W@TR)Dnw!e zj_sGf5Ik#u(>*S3YDc|Xlk(vcf{V@yG>8*di%3-9z{5>SG@Tb2G$luTH=-2{%-dQ<5f zbjPEE{$aRmk(hZnmRM?8Wwm`}-K@2=DFyQf3G&OR z6aL6#rS7}@;ht;H8!|LDp(JE6sT6T#r~|{M{9H_%#+q@qg*J%a7+uX5Zhj>m6QsPZ z)%2F7*;2!N>>^r(7*7~8MVawg+WgUZ;zSi-_2Lw4_W(={4J^T);^k67TtPQaa#ke306@S%t^NWgF{ z7KUUK%F{mtC$o1^?wq!^(j=Ci)G3kq+b5EJg;cs17-=*11-eA!Ux)B;u+ z!?i%2LmoV$WwXd~6HP{caBxkZwT}4u+wE2UW@63qsL_OfCkg1>KA1H9q4Rl0w7@pB zkUugX!K_Kq(!Q-Ckf)jOecp_9MTmDukzU$h{$hBO+D0$xCg}{Cll;iWQ;);5Jvt<9 zYE}fB=GZMbRj^yj_Kn@IMD?F~{MVj^XdmC1oho$O;9mb+e}>dBTj0Ucka&LvM!+!= z5#eQ2Y17XxOVhu0K7pu3B@U_CnD(J?0~T!9XY<9RbD{OjSD&_-`3(7^iv+7AJ`@*D za#NEZB!&712pXTThRgoa3yN4Hk=CUjBR4p63IvIHwR!Yuy$^u38aw4*M}?zG9vAZx zqDnIHo>lknEHrZX#Um^^LJdoDyGvY;SCHZBa%MyF9qFui?V~_Hh?ULL(iMt#-I6k4 zU?adAaPI|HYGTq0teeoJzQ5AGt#Dadso#mH2rEj4wm1y|nqXXieuZMZK7&2zf~WM_ zpeh1)Zm&SZYt8A;!^?uFv+r2PCbItF?|-~b{2TNO+~q?}hg?njQ=GZcdQuyI(qi5{ zy8q&f@OqN!>Ck@Mg%2iqAZx7mEGevo^=;O*Gby(dCw%cWGRkYKU-ZlBV^=yKYM z#$kBgA9Q*S{_X`yE+k66i(I~Yz4SAQXvatkql}h9v4OHznm8C+9L3W(piw8_=(3_tJ~ZdV9$O=vMeBASW4H0rT0Wm}WG)UE%y}>M_Ik&uw@$n{ zc+2j^Q=2CY;jJo{xKyi?jBD@4A;#n?dl>W;Di^!dwSoaJiB|Kz9*&-DL;cugiFO0| zEd51EGxMmE+6MBb1EwFo>@56c?fTdbD{L zVl~Amlx!c$VKf9YjSGfELWJN6Xs^_2W9W|EuMldC{G7T2k|hrGJfe!aF#Wu$G&}C9%CQi zTqp#k?t zV3i&L4{*0s>A!aLE>^Wlx<%Mik}guX4ML?T!#8RVT7ZmV zl|n${*Q4>=Oc>FIIOt1LsZzRZjmWd~EcT4L<-n(Vm2_5F1$L{ms*B12Z7?+X?91w! z!o%#8Y3ejL23qNEO7hyT@XDE*ni)zhpi3e{((mT((=89my+g{I`z#tdsu``Pq2Chp zGBM3&g1&RNggXv2E*iqPC3yn5yuDv-o;U7AO{7-TFkFhsJy*2dJ)D$UnsfJ7j^}(` zyYkKtR_iO2osAq@In-Zjt)sKl)kA3|&{xx{m7PL|o#C7)WEqddNEMs7SElf}C$sm& ztWtVlW7;!pg_UU9Lw~Hw?8a|YxoG~59RaQsBZ*kG&Rw8V>8YuMmuy23gvQgzr|5{y zW-GRw$T;+F{!%5WlulI(Us@$hnOW-6RsJ4a51^t|Z5m&ws#H)a8WL{FKtY?&8{XWc zFx0ffE_~NOJ{lLf6K)=;Q`372mp1O61XFv`=-fO&M0`!7;oRMAgP^G8h_7DTwMyUH zeKJtWGxG6*koU8vhy0yJ$6VldBaq8XZ$@(l40WClcYp9cH$o}^W$I@Zp)ZdjExhz=(R@W zB0(V-c>P{WAYi+Om};=N7;l^Yt}&|HE{X(kLZSo43sA@9ryD3`csV5rU7o2EWW-MN z2_zV%@M*jLX*iz5YEi*%K4nAW4(3kXEG83|+cu-fUX_#D;+GJm@Y8$2vL|oFrDw<1 z1G!U29^YifT0YpLkIfs`a9a%$r7>!(V|6?IF|PKLwL}P%O#TnmCc)GrPdVvN@>Y`m z^uL}dB2H9RE9LufC-AZ8zMtNgi@!tRdO^wxYR+wVNA&JyJh#rv&B{W-63e}SR;D+Q z`OG2QL~pxs-HMa*6AfIeKqU46GjuDOr+`U3DC?nh0?DGy%w^Uft%un^KPCnb>awEzzF$(Ut^SEw@XzHk(sAN3Ed z42J6(*$fVQ0rUdhCJ?LyJE0>%E>_iTovr4`PY-1BAHF%Pwa3K7e_0iz466C;dwf!p z4Lb0a6eI^YUH%mH*6I9a)xzMEL4H2F3X>ybvU5ASIiaEO=?a7M9dHIH4 ze(%~A=x})p?rYtr*weKY=IUg074$h6AAtQ+ZhRrsS7tP?fF zrm2xP-jFbD<5j{W$u$Q7+LLBad^pc4s>7VGNV>4FGO<4anvQiv(80cHt*tt4qIiuir~-QHYz+9Xn2JcFw_wM=Cyk+#No`C)&nN|NJ9SR3z8q`h^$T`$L_)5y}Sjo*t^>REv?rWwMu7hjXbJAF}w zn5o3inlD&B@4f0f5bI&yx3Vv&)ZrHP1#&Wxvb(qnngGQuSvWk{2U#E1XTfo8N#Rsj zlM+hdTH;AUB(o^w*ghx{#K{SG9ENjnK=7NACak?2pqqS7<PstK{Rb^?Y0Vb z6~2ptQ>l$aWp9-Z{84!+W0e4@9u6$~An{#LNSQ28_ccMX-E$Q$X z&mc-3T8|=T_{YmWylf ze(&kH41&nQtS2c5jf{JY)*-5x>5J2Wj4Qn?WSfhRxArh?aAfIN5PEWMA6u;X0YlZ? zQige_#re4zb9L0055Ff=uR;QO4VvLkHXh=tU4Bx4g@H|`f9Dw#T-V+zf@(1UCXlzq z_a5Q)@}N=5jA5EehLv)cCz(87^RQ@-Wbv)~nRVtgA(SbL?2Q+F?Mza&qkx>8aA{X1 zHcispNGR7Nm%O6jl==eezTp`cgqq-S`+)#FvXxx?iMKyV82K_9t7koRFXVH3bU=~c zQMV4Fd^YlCvZE7PZC86Sp4ypL($8I5rwZ_>EK|#uf;^@fLN^AuGwdeMqDe$$ynAad zzhcZ->hENxU1cWO)bTVczRA_N>;d(ni1#narS9B?i!pN_su{^-XDdS#!+vhPvSSoM zh+2LOu-T`<9SlWGsHt*+h0CSkW&I&kM%~kl(2t5g=?k4$TBv_;Egq-@L!Xq5 zgU?0ELS5V9>^he2#-7n@?kAk2Rok#>6>cT&yzcytlC zQv?<+-m|AHunrr9WkdZ6LMg1VW z6m}U!4djw93%a&wFm(25$kyY=$PXblyD(Vpu2`km(jRP$nE29|splO#!{ck)Nr zYrx*I8i;a~J2g>(On+8WYelar7?hSBL=4cMZ>rVGI058GZ2T-Q)9yj6r%%i4i`{CX zqPo0tM;_?febsjNlg#7%iLc1~dFXeHD@J#zk8^33DKnkjXq9IT<_G9uOR-Ozg9f%r z4uTQmagK=8lP&AS*S0lcoc+rPSV$_D+SleQ(n}Q4en-@e4iseDzr0|=jdK> zZVTK?rf(rkeR0p<3wE=`uh?+DIGX_227>jp`qK*9T1e(<&<&##(&9UEO*cD1VF>1V z%1EX@IJ~13!W*m-`K%$oyk4e!#&xprecWFWj-$Yx_l3Kvc^NAp!E!f4Rv65*nXfwB zMXTjlV9_SNp`v|*hb-z?&9Tt8;D(%fQrGjV+O8q;8SKq(5+iOoA{>PS@x$^wYg+4X zN{cAV?x=~aumitzq~-Q1vodi`g}oxrv;aF}5r)GzPx(qb@NFOOKem-Or#0RebGy{D zdQQ;8@Y~ko_m3Y$G-L*wHwmg#N#0JJ=HJ3iA~~oLkrss4OL^0Ot*l-6xobN5O1qjb zO`{x)SmuPyg1PZiyo^94v1-wrTUCNjW@FUqGXJS?|6vMb`-Ug7C!CFa;9ipO-3bq5&?I^z~%)XZs8Vvh-Sbt$$bzx> zExuul&E2&$8pUZ+Q6(UdS5pYm+3W61NCh9kxUg>@rbXH{QWY2J0-q4GgJ49U(OD<7LR}WF zG~#`^>nes*23E+bD_Q$Ls?+5{&b(4A*-b5b3@+1r{45A#eN3+~;Lx2Oi)~S6C*^cW z8T*ZySE)mL{$X?VP6EmJoR{f^SD6bIZOgboh{+4?W~$%d`E&HQs31mGm=~FwF9T~V z@O|w`%p(JqGx$iRCZ;ri9h-=k&xo(aGe$8IT~b_f@2ZO`IxjR6_HMaKo2zG zpq%f#c;~#(d%B!1%W!)OLwNcxO}r-R0YP&_oXWXAthUL%lno17wVxNS+`-jx#=@hK z(t`;?fltW72kWHip86{gj-{wQPZfFeXnAJyNsoKlK8!Gk`VYRjn z50R^D1#(j2sHPxh*5U6pQG92tc(PS9u0<^|Xd7oR4`Pz;q8A4wMpZTE#ArFgiyaTa zOEC4Du! zinpWarGV4I5x=dh-DN^J6f|D3wM*?DEq6Wpmn%I!yVDbt?GHF#w8!m;>Yy-QKL(AQ z*sMls+H4!dbt#%tpSuoS8sbrZ%;b*sK=E4jG>K8XF(YFy8N&xxLUiJjZgd!f`!2cb z+@{XoRi?J_oHO?9r*I>0v@oMeBB{W2a5Fz26%*`&>Q^;b^DrUBa@FyI=S-eyFOr>cMy{L@fMr4#(`yC*9f2GTc3_(^xL7 z88Lb{+yS_7cm&=gyZI@+BED480nL6&u}``_?Gez$*f=CDC?`?AgkU4J^bly)Uu3&B zpx&i6W6AwU*UwZ^ z!6DiEyau%gMIJ$fZsa@^P6_@Ak>BAoT@y9Ee!Kz47ijOuwJMUU_41+PJARDmy1Jii z2<$7wSd9lip6E5q$<)G|0v`2A5zC?|7Ix&nPTnqmFzpiHJ}KvjL`+%!^{ErRf{9A+ zELdK@iy~fQ?m&FG2pa1A=cA@MLtJ)2aJTAL0Cgq9wg3JXetF%XGlf8V7M!}76s;?u zvDOb*k~0_i;Pqnu(Db72%wOYoADd3j1kKn|^m-BBhuBSXCQQ=ZVAqB09duYw%9%208v z4zuT2Gg(sk_9J!A?&3Ka5!kY`oqC2L0IA=10qkEeNTL#~Bq32l1>lii7W=H70lwXN;EA6FO9w#+u7U*lO|bN|n|ChQcFC$53$!v~= zK}C7mA23)K#7Sd~DHKhBDhPZA`erBC-X9SrY9iS4B>eifDiQwNxPHA(ewZ&0Ea9mI z38i8GFyDY4V&a$?ZO=Zuh8p{}6Hwm%f0FN^C0JHz==SP=&)j2DiRzPWO^Uoin_#^_ zB4`1n|6Z7`Ua-(qaNt!=3xsM@YGIE|5=nbkc5ibqyP&ZJlpjM3@`c$MsT04M(D5Ov zTi-|~=fsCr+BH%ZKsj~RfvV~lq236>UUTS!EGD|Wb4FESlnvugzab02e*o090@5K4 z2t33$8lG(WK|I+PM2d&iWRsMf!N&OLlJ<>!V`nb$h3NXjv_o_V9{320xAI*yu5Gm=_U53I# zsd?F&xVUetl*2&Ojm2V~Hi9aCEY4KAYq`NeTqR&5Ljd!NGFAZ6k@0*BSRs_rhL+mQ zf$bu+o_m?gQ6Xy@{%3@{msF<;Uum?L->=MSfxhRpAc zbv-O5k&H(qKlY~!Pc?tw_41WVJg?md66iYR*AX&mSx7CKV83T~v@ zv%u)aNy&W1+!fHM4|1V?%Kk4^+)a2nEwG%^8JarR>BCW9)Nqu{_O}OUcymMI4mS$1 zXdEg--{Z8$Cx&<{L7U1>!zOPb`9Oql@pRHeq5}}(uoHZ8jGUSiCVD-F*igPI*bm~9 z2GU_fYv#Zyun-c&Zt$Vd>q_4|BqPyIcIj!Y_S-}?q+!tM+Dc9@L zAguY2h%>f)^yfF;UCQzsf%aS1{T3C_OCP62cIv#&){ly#As7+DOv)5pS(TXfJqYWj4YJo8>GFO2= zmIm1udWE2QF_Ep}+nbSLBiW1Zm)bqh13eu8Gn!g|YQ@&hW+J|0U}XUxV5#6rwOa%! zeARchN4t@GhLDyiIzE@jY?boyEB4AS)o>YTw@g{`c7Z>fbGSFD_#=uWNyz>XNg!40 z&j#j)C1l;G!#i9Ntd{Y`ZQ!T}c7y!K6 zIKrsR8?x%kF7hlw*zKpgAgS}A=jq|tt~h(ZQOjvPU36E%e4;XD=a@I>M8C=!twc`z z&LRlJhDM5HE6{73Nn^&<3n`wrfT9BuFR7InkS^FcM) zV~~8dq__&PI>%`k4&~kT0r*sNEu;%=i#>4PSCCCO`yNVs1a64MuWE)l1MXQq$;N-l zpXzy)P#!uFtiK8O>I3)m8pI3ZxG-udw0OltHrd0VoF6;omiV@u&A@d)$iM0N=X$v> ziPuk4Bm0?|_3XwfTtc>v8?fRqP#xBBtgp|l(V5riUk1`S$Jq!=+O1cB(1zV=Rmf|2W+u|!QAGlV3x6XG^t*|91_<1|2&rH=QO3Q2_k z)eQQa1A*_;;*llyjmF2C&btw10)PD)AAmlYb~}zzp8a8zOH|6iK#eW9=l?gBbbA*W z4Utj>5A$DD7h-1VwEC%$BjxAo-OYs3_GNvclFRTGE(EFT#%sFvi^@zWLwCT24#u(dOZr)YVKjCC6&lMFN&O?FwqXULgDxINS__>aCATndikUp>c(^ z0yo3N4?+lFaL$zZO;aT2xq1uK{nSjR;g7xG5dFz{PtHhqy69X6)Vyt??%<&e&)`G* z-X1Lo4A)I~24H^^##!q1!3C=FMxn>DE8;lp$nPR$dwCczRv0>(5k#*La1*1V{BA$F zaR3Q-I|qFMLYTTv{5vrS+dsv4yB_31u%^PpCx?n!rBjPYn!o4)`Evaa8kHo(?TrQJ zKD+SW1P&siMOQONY!i$0vax6+(H5jED(P6cE&{~Oa%;Qdd`AidCI_9d^>B{}@$rUu zD%gwBy#?Pi=#-{MQz__R&%a7H7w9Ikl%C|qPB<(t7L{j6N*jH_4aQkYg?HCv zK`~E@xUBX=qq5IpY?#Z1$+`uVwaRv)FY`R!n1Y{>?iF=8A-8XprxflLHsL1=h39fb zQCw5cH6qKMJ}NEC2R}TJcZ_bTrIuy2^{q#(pZTVY7V8l|94om-j!IxkE~!vd951y-`{-(4aphv=&Ir zcEfwTDUp=s&1>P9m--=D?3m@hVlxur#ZBvMDjYh-~aexpMG|Wyq7K*U4Mx%RbA7R_MIKIVO z8H`>6i+LBlq`r^G&0Nf~ju5p625nU{Bo+pjl}l-IhgMg-GX0n-l3uE2S)*H%MaMDx z``ul0q*rjo_pone3?TLNBTNm@n}p2#SjtU}2kM-_E8>N?Rh4Ai;fQE+(tILlw6Oz z>kkzm!orXkbw5C`zYy7}FVDrZ#Fl;rc28>*ynjQQJd^?(5x7FuR<`J~dVe6FeTcu1 zj94d*#T&zG8M5dNkKyuB<1HUWHx6+*lL$;;BLW>o%81ol zazo`F){6{rOf)3~{C%ABM+<2Z5BD8>o{pxpUC8KQSGSn>cXdVnG;|4Hx|V4rY1GMz zzIsGn;r5>4h(1}A=Z+bsB9ac`2>MYQiVp})MbA^eX|`?Y8fN^K*Fm4}okuBMGRi0SND=O*tNC*x+T*T$sFc$9h9@4#fqFwH@L}vRVs(FRE z6!^nP8}6_roC$=^R{)rq$Js5n8zfr{_XT58uSos~wPP;n8*XZeo`NSq1cn)^QlEV8Mx2gTgsAImSULjaR&QE%`EpuVCP zLaiREImskSztWi3(!@9k;0iysYphyCNlulbzvH2R{LRWAcIhzD?nNmfWO+8Mnx7bG z=(Jpm!s9m#UZN;y>h9{O`z>~NiAhO3DQ zzuwnf<|KYnxN zrr^JOah0gi{@)>uicj8-HF@^?`XOg&RD2N{9aZtkGn<@$uY>~|E(yX3O5Lee2&y6D z2u|^pw!vBkm^p7N+`1x!5QN?tsLZy_FqkcoDP6bRJvqtxOz6H2^iB{|+8;O}!A3a$ z+ikVO@Sv9M_1_%!qyTT((1rp~b}>@nTxyVVxF0=HJmM_D!(06(_LeaVaKB6?Oj(^_ z&HH<_IB(Y@B&teasH2T12Hk~VnAD~_VxYjdnaUFGeVl$@^A?h%WK#XxLC%LfrO;zu-}Vy34v>0-sQZj66bneLCGXma!&)>Qdwc%cX+ zCnUI1`i1gXmXfQVeudG@S;!9sYnVMA6sev@m=waH-DKk2x~UQYrSBm(krLd|)l`?6 zb^)WbJ%QFl)Jo-OR*$-E`{;7Bq{_pM?{ab4OZI}F-_P2A1H1pnEcyQdqBFDnPY|7z zjpctEL|2kAaIzx!Rnz^4y8q?xe}#PiPyU{n>3=Fd|9@oAfeL^5>Hhys2K~1qz<*Bo zulBzj|GyY?!S>&zbB_O}kqPiONK~P}IVLvv4Z?ph=z>zeq2|>5jR<4xZ*r*+eq%*+ z@tf@bV$g+VepA7<`iPQVZyg1PKkMB@Z9q>$HH1AyWQ7!rme?oG2l23LZKQnF?CUia zT*8(1XWAzBaKx*tnQg9#@AWZ{{DtBqaOZd7S3w@gOlY=2U;w3%_)if0&cHP=^7Q60 z=&GH|6C%3ey=)22Aw0T1SDBrgfeC;_oFh(}O{uX+F3xkpKXUz*`4xY%CikNzJn+tI zveqokYxGS5J{@F<&c(G>F?^s{FU(@g)|1h-*=PJui4lj+;9 z-m42kHi0IsG!}dhuc*M|k*p0~TtRU-g*Qr(Is+{^dSLR{qe|n^@#06&M{!k8L%=aV zd#^jdWubZTK1BVy8=2|lU8hF=@%5|JDotbOZv{O265=a-bZvG}6S;Lp12to4S*CCp z>nSv6N-|0i15S&qkc>O1Y$yYDWq#S^)z{%jid`e z?nXQL5eR{k@M~eG*6w#ttQojVcUJ+=_Kbm-wtB`55ps8)W_SoJ$B$A`% zR^sEa0b>^ZlC*9-xz$^fD3WsvXFEek+R?yJt_Zq_Z{UVhR0IXd7#a|tZ@vov^?E<0 zr=Kt-b#xc43nHUJMnC5OK@yfEHgMtspG}QV=!ba_K(4cVzjD$ zUXgya#W(a6`o}EUBCv2r%dw$9@$NCK)D#GGjSh6XyR)gAXmeg8NoAAfB5w~mJY}%| zqT*sG#5(Br%8(m95N}Q+MhLhq5?k>_&JGJq;2Hpj&iFVWs1%sW#LA+^etvzoTLXt$ zz~umf#a1H^n*`ts1Xp&$ra85f#}FU1M#yi!ghe&S4;7B7@D ziJl4kq>b9cAIl&<0QP-m8~j!Tl+31oL>YYH&fFcVDt7eAyfX6hYvpM0+ml@OYscQT zk9g!x-17TR`){X^|BUkgA5+M$9{YF++ge%AVx8|(afwf`5j z$$tq=7#W%WZ=s2xgc#$0qcj1a{~ziRWB>qg2mk=6sQ((|<^RXdfBYT*0C+jSDvO`5 zAE58=@85Z2{y$riAxjlMK3$a8T7NA48TL;CcSV zf``Fx{9qWLe%iW#6iyaKUdJ1e5j=j9P&7!zX>E3*~NNC)w{r^wDSmM3v*y`UHk zgqm>4Gr>hKU-~E?Hj5>WIed@X?^oSBooaiRb36p`RQrz!sm26lA&S*~u0RR!;~uZs zHq3n_s^voGYqNVE^){s*YOCzkzWm&)oaCs3M(p?61b$H$+d<}WqN`aN)*@|&RtFk6 zdX0B24{;`5;8m)6j{M%78sTJSc9b_GHP3VVMugxi{s#PVNtPfBN4oZeDqBO_!^}+726z_A|JxjEB(_bbzWCl zD`J4xg#}!-R#bLuEjQ&r-DwKQZNf&=$@3CKgT1GxdI$Hx01kPaS|dehG*K&%Uwz`* zEN<4NoMXQbnG)))`+B?ba0DpgJ@aSmcJC?QOg8NLWNRsjh&sN_>6^o4NV-Shlw!}r z%??Y`{F7YTmM!;HJXA}Z%WFm_^v6BI7h?h)4*e>uGW8?99mI48CF40Tx+7t|ee z^_QC*Fq?!1S}U61AqMJoCpkqc^nojUS8Qjv`qhI zehh;HZZbHI_;(*rHjO#6i@bU{Q!VeSor*lRWKyr~(A#If4wV9}nqg$_)3`%O4XMU9 z`b<70Ej6P>PyQPIs(It10p6Mau2j^^z>L?3_MbEbZ4fGSa)YGq*wAb!1M<*sc{jo@ z{d;+)2ey1aD1kXcPj3A3P7%BMh!t88tl5aNhJ#(l1dvF1GUs<;@w*V=UyaH`nZEP1 z+^xpK@WL8VKGR~x*00`;0cs$_%r(KBfC6duaIFW1%m^s({EJgs!w)mm#5-dcmO%7$ z&+fsWe(}q^^3fr4FZVW^t1JkcKn=x45_3$>X|?yQh!uYyo-C`#ch*sdq8_#t>r&fQ z&pTikJ-TC}AbS_*>jKmyS&eVsh!Xd6=m%!pEvi{+PL9c}GX&Be-PZWvhg~z%s?4O# z7j|*>EbTSpQ3SqxoJJ*K+M>XlTNNcmGB!^=M4UY20+uOpuP8K%bCjNfoB%&6K@95L&y>CQ-5 zCw7O79K1pfZ3(~F3qf+WzYX-636F<}L9o2mn8xEsvskybc_*VV>wL__7bHW&;R_N@ z;=tE&M2A-IzT~)1bOa0Yh*GUK49ffdO2T`p43OpH3M(3)d6eEYMe8ee8-8Kv5B5g!R9JhK)D?^E$3$fHOxF%weG z9h8v`=GW(ZOn4(Mm^W3$KQz%4vKs(DDs%_zpp`a)pWRMIA~jf$x!=wUL=s4P0}NXh zurc&`HlyQWHP)L2&)zD7mmqtu_6~r_o0a|baqvOKPmbP$JbWg4iUu5S2fq**hO4X} zzQBGZ?`&0I+S+!H)bg{HtpD?C*Lpw7ATu|>(^ zObBTH0Jhq;P5xA4D7yX%$!TzTPiSgLnV$>5N-=nNgRUbD=|sEw(Cz0`jITt!u zKCTI{OhNH4BWC2TN~zkHM)ZS8XJ9I#Rk3TE*%cEu5U>-NlwH(Eb<+*%ix(IuqZeb1 zl5e@rO8@Y~3)~Eq=eY%-_TX-&z@_hgbakZ3{83mm#_57(QKx?c7SZ+Qh~daXTN9Q- zng6^s8AR+9&c)ikJs^`5_Jm2?6yLnsPCGlE?L#=(CQuV*m2H(_p_f)!?h$4sfL*2q zsp3^(Yn|cQ(fvE{MtLz5zFAj4TJC0w2*n;`RUkYKXXFQjFB?pfm@@>rQ#jPH0h?G{ zOlnHtrCsenqH>piU#Kvtx|qncU~kzfujF$mhod{|PVC=Op#GdHJtNckalpz}27)9S zHG?aP(LPf-asn|z8zgj46vd+yvOS>eRcaqQP%btuvyOT+?c`QPqew8@?xLb%rSYbh zfXzOu7u<(smOG}<0!tzc3o56R-ePnvlcEMuu$FoL-Vf%f6XwjL^a*oOGx-Bqifbsg z6R1a1(e+TkCwicY`n2*F<+7}qu`A$Z2`EXbJ5H`mF4hB%}{0!^3OYz^GC2rX2BeAaDCLZ09{HJdY_d70-_w?Rr{H!rBL3 z1Li{C*dFTa>_9>Pn{vv5xY@~cz5>{zq)Df2>07R@W-fr- zB)<-bSGgz+wT&{sEI@v%nK&14ltf3r2N`PlT|&LUNBu0_v2`xzU_uLMFvD z9@gFSM67T02Szf&NoPk7{1gXTGNL9Z1e4xS>$^0$HKYi_;JL(Yxw;%9^s_0yFSLx@(8;{EN-{B>zpeWp+Dj(2 z+L2)}0|M?}DhZroIzSN{eTgO|_ucn|WX=HXfL`NFKN*0Z2*c#vmdU2ExS#cI8Ft#+ z_f*(;y{_61Kj+TcYzqzlhFf2~zajAkvz(jG+oc20uP3&V4zcx>DUU!k=pp5%7+cF% zEU&U}eLHk@+y2L~>f!$A8q!i6`w<6HM|2vUUJ`!zFW8$mz4Yw}upH5QyQ#aLI9xTJ z?GgcSf%*#GmVN&KeDSc{TZ#yD^^*~h%w28sV7ovZI!4WLOlp#!rMQRwg*7I3&g~YR841tp&Y7 z5*9zT?9wKll_6+Wum?m(g>PA-Y>KgI->R$6p)z=D)RqqaAI7iJd!!+1$VaRCLW%`W zhT)c2oM6;}q5Lw+k~nk1arT4p!@UGaVD>pCi+1rMhe(CfgfAJ1rDpS8F=&Kow+D^| z88dphTt?8M3F!S7l_DN2ncoV=pff#w=98Ws6Mayb{v=Qxt8}t@@h z6z$TptV1k5k9#2%jLgc4i~^NE`cNLix2G$iQvRpAuVtG+NUPbu(1g0HFowvZ7G8we zz81nl%7+Eb9`|`7o?-kl9IIdW&QKxdo3SS1IgGvbtu_4IM0=l+z8t2@pu|0LPxHJ5 z1t}}+hIRTa=~xPX$rU?h@%+1c2>1rdo1McC+zsWE1;p>;fLk&RR}=*ldIxEF$-(r~ zc-Hvqp|T{J7q^h~F?be8#%l!i539^N;OA3%n-aLloaB8l@xfB`S&$PNm?U+mKs>DV zn=GE)nr52oB%C15jfcG=dti=3rAc0ULEycOcZZ5zha4XQrGGg7}WDEQs&K5Y# z?FB|BK7%VIv#mFjZmgk_63o-T+mV>e1=D~AQfYqjDEr*%6_u_rVhmK!=~aE93VUT= z==v4XF`A!Mj#TRr`eRWPcUDrn;k!LB{74@^hbv* z;-4$9OoYnz65M1=DxrTaSvMJ|m>hb+o~cX82qiyGJ3`{I#FQxw%-L|PYV6;!Fbp ztF@F%C1yUEnk&Rhy&AVhpH&sWTW)58M9&lhTSE~*Gxzpb!`g=L(S-{JoKw;A@L|Wk z1r7Oaj$n2GF_15au5(HiP4|c|*^&@EQi#W%TL8a4dVOx!P{wWE_Y+6$o6yUcfSHXx ze|SLKixqPgHM}q^*UiSnUperDLFUBGA<_vnx>+j?##QP0mg4`tIAX$fpeiftyIUtf zuxVb6Z8it{LrC*-A?8VGNv#UO-lO}N;Ho>+t_wA!ub|t<%3ZP?svfgzO;plN%m+G= zUVZ{i{M|pm|L3#{-@hi=?hi`BiTrmL5r|74t&Q-u?F~h}FF)u9zz3|8sE53fgXn}P ze=w@Ex?<->IiIVHqBkOg{}>viDEf(mhtNdnTJl%QLPn<xhjK1KGM013JGq<$)UT`|{LS3>c+r_cuG-bCHIswyT* zgemFd5VJ9KTx;gSTCvl$xgT=l3e%z9Xy_M0ds44ubN&S*`TOLNDRY|KQQsk0Y6~3J zFw5LA;Zy3!OY8JB;nttgs=tDVp6xdmc4csF@ah>g(8JJIB&Q2p1K$f1a2<7b4)*ef z;~IbYAZ}-%y$99-el{m`sLZGvYM2BikD548t!g}JfPJMIGT)cxfGZ0A#on(Z{^ zo_%2kMp2_(2SA~f*T{p=2QB0eP^^jF@gTZ`&ylAoO?y3mRAn@^+<#F@tV|wEvCpb5 zWR)-f$b^{+@fM~M+|Y~%CdFo*Tq$c)AmJ1Dq228v^H?9Hw}rF}E<;{LLLh7=0RR&aZJ(AiHUwc)+?V${&O<2M zBv(a$AMRaGDKoecBs@wzBc=Ax)4>>n^mEy`#0 z-HvbchH#Cdjl7uL(p0KRk;k2R#e1Yv>=6Q(`=?G9m*h5benGkp=E(ut4dimxoQh02 z`%@fv&s_GAAvRtXJ#&AT>4u^el8jX_5UJeAx%T=b#CTtDu;t8hg@Xy>+-bm?p71(p z4}8u*o~>&}^?E6~MZ%T>!DEC!C}e2;VMYeo0xgW-!y$7(k-5sEi1+~E0&F9qJLDn6 z9e*=awS=S|FNu(YSx=RW^k)GQPW0XC>|#o{lE4%q#E?v37L)HnUR-%CxoHl7XK;Gj z<4Cl?aw{eB_z43u>FXD^b8E0ebW=@pnQ)DEJZ;B&pnG4(O92>)2VjcqQQ-?iVLL|; z4Tk15VM@ETu?%J_1#seAqeUKor7l?lyWD;frS2&xG)-*bK)VF$K2{nKf%$>|PWEPBH=1%N)b~ z->=}xde+&nRFY2J=mtWyGZ*Kuenij*#CZ*n()l6YB-)fS10+`%0bOx@eF6WH+YVf( zq71_QfUST8Ps6w&s9^O_4*%8ctSe=H5SBOT0#!8sU1?3t4W<^zuo=!D$dudFbMOgR zo{Qrbx<{vMAZ_yJTIVvjeBp#?i2b0wyxi%+J8ck$Xc-X}h_YL3WU&pZvMyA~-qDTm zYObta%OJDnuO(4hOc^F*d=oflBzZCP0}nw^Su z==XQR(Fu><-Y7Vd#pZLf6b;U2>V##;9Xe)&eY>cCMI_HDN6->}LPtbk( zyDCu(d1ga+f?GHgfO6bM-{&(B$d{=}17>;G7}<6KOWPil)MHt`bF7oD8kFCwb?xMS z(gYhInGtftoev3clE0qR2(9+VtOIo!GVzO#st@of%ylaa^o-M{3Y(5|ran;|*4J!S2rlB_K6!iz_~&~=@9X6)DUnO; zM}Cv#_LyU_4~ou(M@T&D-c@%2E2|Ch(0HY-;mHQJYw-NgDusYSdmr`^EK`F65miv6 zr_~O+o%ZYk21^V+L4hBZjS+ScPd?6_$h^0IeKzrd%?s=m#WoBd_3odVJ6PVO%VScY zgNh}atU(w!5;0n=b>mD7&pX7qfQ%59)&oIv`B5LWa>onseWb$xa1Zj4(2&_3N>|8s zql|d8YfXSiLqv1y&W~<#^E=wZ6w!x>67SN>r3}9cOI1|5mLLaue<^Z;mApW|x6SZI ziMdlueb+HyGs7Ipd>|pI=!>xe5x$J%bxfWqa~!K7Lq*A)J7@?K4P4Uts*fw=Y-cmx z-b!5_55yst5AMLCLj1@-KTwTv+Zy*SFy#29_kmicmy6%qeC1H+Ary_ypb9CD)l97k{t46_1PeV50x3nWnWrvt08?DYaeR z6^kG-L!%>z1*J3+p-IbzlaG{I`;}8KYrLl)rF#%pFiuT`#;STow&@lY!hATD_{m7b zp^e;L?F7O*`<3x7iBuAp*-&%nRx#Q$<&R-gP~lRFu?RWJYtRYQqveFmr)*}{KUXsY z_I=d4Puy%7&YL8q*%D~#UHR`vPW#DhA~EfT4)jZ0iLr z%IqP((#A}!PINa(q744U#_iIgChudnh3z$sJ{4wJ$U+>1)h@VIHxEkd!#+3v;_2Of zG9tiTzRp!nWbSR9Qqa~Mc#uI^9Zl|2{&Cn6AQ~hgra_7Pine6b9*@m`Vgq=Dpw~Uf zqJEXQZ2Pei*THAqUjqcZBGAD#`@%+=UN0qJE=4XN4TrBw#zAu_6&!bYVo2;N0bF+_ zq4p+-U?wsgux2mrcJqB_Is>*}B*O!UJ$QB<>$T7iv1{iBOYnz9qKh4=#0A; z%Cg!`GHW||2pini7X6kSSW+_B)Ef}uqGEl&S$dq+mbjd%y3C`*5be+0JW@Hiu4 z?==VJr7u(#8*neu-av57@ws6U1tDf9wdu~U^jPkIBjhPqXb?#j8lNzwb#TF-4_?jL zHw#m*eEx+>crPs2c|@jyUYWFPr!|jeNQg=~>!OTn03{tju(rVgsmNl9y55iG6MnQk z9UdchBpJrJ2`Q^_Si%oo7X;ZPuB*gmvs`(4JP2_cMx)1m8|`3DQRHtvd^&aQQ^HiSCxx>NzLJZXueNvo$eW+MsqsTL-TdS3<=YzGA^x-NBa$RhSa11ZQRR-dKKo z_Np9&1<`)Vbwbr{!V6PLA-YK@S)DEfAPEv&8lhhy>)`uNdU5r8-0r6D|<*$?88TLmd@Cw5ui_ zBr7@Ak;q|thooS8nmp#E@<2aMRVQZVLErRB7w4e=DmK5w!VY3zRRpHJ7gT+hlBQI* zQ}X??ksxz-9&_LJS1RL4a(2PS7CYI8%H7{knLq5pK*!xMF%O=JAJbRrv14eJUJpL1 zBl3St16KRJBkGersTf1?>co9HVTO|I=igB#zn&2@lU-wEAeVtebC}hQfMv>={V^F! z&w^3TK9I$8C8HMJpglwX`W#|Mv=&%5N)|vR3FU@M?wsHg;B#<@jIK4}3Ms_jLY`&L z^C2mbGedpNk}v2gUE_xy_FH^M!JUwU*;D|uBiC*YccCeuN*(gL=$k-tKoy@I5Y8Iq zKy6T2``H)--y*+QViUg?Cz)=EtD%ibu7~1w%dCg;W86Q1LN~a=ATPaYtafGr+y!Ed z{~fA~dJ4e$#z4V?Fx&4Pn63l?CApW|-NB{Zw+1QjGO1mMt=?GcG&f^2Kvv1PF5MTY zSVF*~}^SnlK*X;KXBQ6$VL1gh9ri!$m!KAH3Vsr)Tf0|5~Jr&0}o4FL3C zmFl10_J3BZ0RXa9BmYM?U@!up-);!o|7*D$2oUN2><=FL-m6i=K;-Ig`uJ`vCkl_i zZ250`p<#uWE*^5Q!lE;leZ@mur-!;Y`sSrn971gk!;p{wox0JkwXqLi2ZZT$<3!Je z8a)H?Vb*j%=+!OCx7g7=`~WMWh>J-Qi?aIsNPg;3tGG}eiU%-9+6Ee6 z7cvS0z25vqHYma*WYV3eq8#R*(scxS($X`EYUik!?rBg`h*A9Oih6=lVLWQT#^U20 zyB>-Q5+_12q>y47FRCJw@H_PsK6r=>oX?D-BA&aLV;g4`GOQ;(&HWFNWa4O(RV`RF z_G3*AxDYzu*Imi;5B)B${o)qZ^T73aB`yW0lj?N+npf;GrzN66z*&|=-C~VVVQ0P} zMNXDtD)50Sx)M&CS(amufz zqpykL?_M@HqX>z+o^^{lV8Hpj1Vrm}cd0b)86Sw9M?J`*^(15c2;za0A8HEnF#8*I zeB^HWC#SYnH-Mi0|}`Vae#c9M^M4M^;<8qne;NMm(_Gc(4l!KO{|b z-={zr3-CjBac_r%sQwbEBlDp?>uxjx@R3#fJBfo9X8=3Ju=5C_mfeKJusP50kn_9j z;@ky>K%kJCSj#0j&0qVow&l8;3_s@8F?Ef2MWiMdT?YXXsnGPT{BUGxiR&@McJs)w zSqMmWFX5S7>`1V|!tA1b|ELhaLsTm`vvOKRM-G#Pzt7Z{Bb$-E5Nw?n|B?b{rAk7R zBZxq=BFl)6)QG0%rlSeI)y8B0rl@n;rT!t-52M)MAt6PBGM>nH%~zM{n=HzQc7!>$ zKU4ftnvhs415-g-6G;Ion<`ZT0r84{@6!bCYf=~xnP+JivTOkFF_}+57MBoNlGZ`V zA?gXXyu6ANB-|$}@K3ZR)U~*cS*doyS&{c?om(j-r=8HdYaoi~$tap~nTCCDX;Nr` zL0w|t11)@d?BSR!GSH{SiTRP?vMl^T#OnxUkBi<0KD>k4lTU(-PDwqmlo~&QQ&Lt? zYy?2?7%FX@7yF(!ovXuI|n{6MMJM@uN7{M zOoT15DI{1WEnhU~{aNVht=qs~M&tN&4dr>kETfRaNJNLZ`7#`hs`|7UEOG)M=%&A4 zKTm++*hyn_U1C-1Co?Ij%&i{bF(UFKR}7y4xN6Epku8UFi4&OHi(U=HSwXMkg7sKY zMz#VsEpoFk8FVkJg$caejr@bV4qW7nuUe?i#DG6#)4D&h|AjTwb&Lr5_0Y8{53~-` z0S1$@7TS#n?usMqOq~+2%M0Uycenf#zDQglqt84o*DG`*7QbnsF|m8^Gu}@E_j~D8byFqNt zG{C8MzN!P%-GJIgh{xJsZ{1bmyND}>85Mz%FiOIT(}ooy6Mv^7j^iaD-5y?9V} z#j~rK!AeX+%(;g)6Lhgko7cQc%-FYV^XhYa_@G!smF$ zlM8T~T)UhRj0^HqsRiD!v4fiz(nIWfF=5-Id5aJbwyCZKFGj!+y^xO>4o0?lr%kQ* zJ8yu`i?cNG{uq1arKmoy{HiWugtJWEHh|F`)B``b8>KhEFvf0unanmB3(S{T;)D>W zjrr6j7GS}#^qxjy5+RAa8&534E)X!08Y18@7c7Fw4oA)X53>S0=wzTa3y>(nDFp-P z_E&D^>S*p#Vhb^H=x&0MB1qwts7Xc|Nj7ta-9OUmrEX`T-h@}Xet#Te9$e5OYggPC z5Py_ppu*%u^##q z@TvK_@j}zYB6l_WHzK+$QM>#S-tf)vkP~xh*|jL7RRrN%0bhJvD-Sim+3$W7U^~r_ zshiSjhCX3gxafwh`Gm=b21qRGk~=3~49CJv1k-t8-;jzCqmH|GJ#ikIqd7|k6{?95 zIHZXAIZ&}OxYHpTkrx@J=BUhst9n0niOwnujlp8#rm7G7bYmrVuHo}>+*VLczjfK( z>)fODV1NvD+gf^DDnJUG!4;kCw@NV&2bV&`Ho&=^Y~&J62w3H`Puesc*!-Wjad)M^ ziYE^sMrI#SH|7AkB-+>yj4SNx`PT$P-9cf)ZfCHX7v|B({}3%R^=eF6);_8ipOUC5 z#9-5r4lDqnH6PdIQi0snKlV@?x?a9%ld^~TU%qiQ^!hVD2RYIeAoNT*EaO!gtI12| zc8w!O9_<$goKr(OiI~XR9&+Y3N=1^@5XyDRZW2i*;DW73KKyI2l#W95YvN7pl-sgG&E+cfh3B=Rgm%t|n zU3yjAs*XqEXS?6XL5BkV2Gq)nAs0D$+3J6c>=jOwEM&xkAstK{BKGgV?rj(_-36~J zO-uz_=A1E0F+K*h%^MSj6PsRQ?r*Dy4?MV$SPVFe_}P}P7!b) zS@70=a$!ODO#ypywqaeGgwz-253N(kTtkeatl^Q?BB|HLw1#7jtF#duyD-Jy94hQ& zpK*1QrQq7W^4%5ne?sPYVf7WZ2k&eSu^V&=Ow7tzm&73_X;eiYG^?rXJ~2ly@{pO*H;Z0aGo7%37!9AD5amsr@^A z5py&*QEVaFT&Xua#*KOo6U-`PU&BYGpVP0KevgG9{MyuxgU;_$b}|Zl^ia@%3v5`# zxv?IeYVW&Juml_lREhVV4~Q22Wa7k!$RW@F8sf&7-Kxqa=ju(`&I}?=aK>s_{bXI5L9rGHk`eo6zc^O7 zo@sdF@}h!3s;x3u*%1ymFJq(s4q!I|LjJSzjn`&rBN7I-e7H2I^YsU9N|Xe_k_8e( z_Pb<%1G7bPo_6cJ4KC$frnU=0A&;T25=`63$F7PNVImNWpEe9koo7mlgW)|ir?kc9 zloKs}suruatD8z|L&hd~<^;ZhO>~JnZtrctyXkqNn|^uZ44Hp4pqq1`sK#LT4^IDI zDNo+7yOX-|2IO)1dy`25SL-BD0$eSUEI)^2o|D|t!+WEGfRFJY8>JvUT47XH^v`Of zkn6IQQs0UW(g}L^lYMYP>Yfo%=e@TGr}<{b8;vOrShh6^@1k$g}$NR!k$?_{hy2Vs8)Siyu$;QsT=}oWN)IKQ-smW6lE2%TrXS zoIAHJKb)_1DXY>o6fVaIll5`0V`1;!rV<7hge~2=PGSNcfAy!Cz#gVUL&NTubU5NU zeYFF-K<}!7{Sh;U>0I~W+qoHaw{n&7o4`p(bBbtdN=d zFh)&q8?L8EpU-CEFtween*9C`+TJlpm#*E?E!(!MR@t^~t+H*evTfUTt+H*~wr!t! zzuw>3-Mx2o^!ageL_Cq1F*9?{{P9HGk@pzadMrMc^fLzo#Fz~YlW$D22{V*$)P5Av>qyZIh!SVJ@?auT-l5P?Z@h2LEfpDDwxk_8v7^e4K3O2lP}MEB%a~c2 zw?Y$xV19}>VT;6yaxqyj$-DxxcfKe3m#C!GGU6`hv7)iYw1@G~ z=8fjSOIW;?yl9l!pU?D?-@mS%6=~Tu@@GTcVi4~b5T!#u6Y^u0Gw=R(9z&#cr*PRE z&lD^Mo@x6)^7qCEq`A(Nz_)q^bLW(Q_^buf=ki2Q@C_p#>X`)Xipu zVPB64wh<^BzeB-`B4_ z_bUf1ym*X;CFA7*SiakBz6?i6U7WpX+R8HSVkApV@8kx~ppMUpJ$NGLLsO}g(zyep zr=J~0PbBcgZn_GgYs|cnA5x{ELrVq%?*fTz+2`AUydL{Dv|SPRr-xcpOEUi`+H?ZY z@lCfe2zYVwb$g=Xh49lF%~{n%wZ?$>(-N&a;z~3_KPJyL&;|zMOo;*M!MP8p%Li#4 zCFfM(Jt8_4yIXbr54E=+#X0suuG7&V-~}5Ov%_BXFe#)W;d>pCZ6_3;Ffi7faHjRQtA z75{a>NWk>}?lTem=Xqv=f01N)dFe!LZT`7Z^yl9HJYJDbl$n6(Ul;NIY(FN!AFqau zlcOf{zZOsMuiu}!>pT3z<7N66iuXTJxc}3l|HIP3#Kg+_Z$z!=KP=n--O=HinWZ_N zyx)Yl`TYCA!68}(dB@{)6mvZRXE?&#bSV*}F*Q#-C|~31L)@DUG#?5D5QX&Em4y)t z=*<3niRNT~Ji#@3m+v+cRUwVnR0Y%c^?v;JG$dz7>Gq?}M>1PCxP&rH^7Z2`rvzU8 zBjq^7hbN3Z*oW80HT&!F^zd}QBgJ>}4vDoQzt2YXtW!8s%$(!${%*YFRIcK~1RpVl z>bpF@CH3oR{8)|;{L9_Bg1vn1G{)zB)H8l${k!|)H+8`n&V5eK_uDfazR&lAqto-6 zSzljmPH25;W$`3yN}d8&y@H15=v{}oGRb_M33r7{%(1^?#9*BfW4X=}1J~>}w-*NX zpqD1<;ZR;V-cbLaqj|=_tBKwsa^hO%s?bQ|Mf{Sc?Xs*@>Eg2QtR#j3 zH_ey=tn@2XIhYa&+Y~57;~|W86O8_daw0~lr_Y{B@q!J{T@Rj%DL{CQ?IgqjspMbt z&M8+^6UBP|dEL3FPNBn#dk*T#D9}=`%|Pg;^YN;SwoiA}wglj#N16A5uREvxdA92C z!zgkY!A$jVWR66Ok15N*&D1fBj?J~lU9h~dCUtuQvtB15^^6iJ z;jWktDrge*(=pn7cng1zR=FvA>(ws+Gn(pGjceADAA{(-PPnGn86}aKr@~f6gj;KM zyN_Kci2T}d)MAPoCi8lMrPA78b_Vr(#(a;Cj)bF38$r0B>`LMUUZ zB3xt(mF-yv4er-;O3sl|jC)H4jn99rQ`CzE&2jvg+mX|&aqo1w=tM^F|68rO>f zNap->$TvqoP__z6wa#{tvU-p-X__8y10j+~$H!o{X~RL~#D&imkfo#nJTn?C1b+iT zi%Zfg1!6W!qdTp|(NUPbgl1)(!OK_kDSbK0}Z(rkJ;iRKU93;#$ z_J#UY7;e($s?sXu=1Q6?5kzI}ft&`ZJ22`eiMI}rYD?9Frn>rpy9G(R$v-x8{T@4T zgyI^=#+L+2P)H$m@)zIekhRVmAhpv2Ck!uDTPr3{DK0Zg#2oKt`B|V+GBBT=$rd=IF=jOL_o{2U>m+GeRA!>^Fl@^fEEIkFxYrMQplIv z$WN~NhzThYAIjffOMt?QcC0{I%FCkZ{5%1Pk|0?pgFP_8(1#%Fi57@(!?^E#m?+q> z)Mc#$A9#`-wolFiq9+eu=n53r%Vm!TSwC32n=ujSdT@vXN8PqUJ>Rnk|sMBPt+6NRcnwX~ahLe|maQm3=9B4#;QZ(D`=Axu(w z=F63DJb^nKg^I0h!-QsGrpPs2;C2}*3_3cRMTK+!KGYt)0o{M^#gD6Ku%QUsXHNL7 zn2hn_*)*Ha%ZsuE0o12XBZY)gp2?n@B4}xdguKP-Ct1$&Y-c$Z=nW}{=0$6Qulh3O zc}W6qdLgBcsFQF5ejzt;Vq&@6CB#Lw)i zSDedtEzSO<>AI=htzvnKCSEzj3uuV~*9V|>N?OpEqbR|ABM|@tC1;>Gey@eh-7dor|3ZN5&rYKA1m2j5vH_b#Ap8TR==C4dF zkq#!3`~BaK=tna#sH2gI8%)nK@`blO{kL6s$>?ovacj*Lx zYtwQO=U@4Y^^02vL76*upvLXeBT!SW(jSgjXr}9!LXQI}GT!}wNdTcThKCCpHt{zf zE=d&CgW1W%!W5(uqp-G3`B^wz?<>&MTaTQUS|PJKH%IWIH0PiXhjPx`$$4V_f zL6;(BZ1>V8*S>rS0LWDmg4pWvaPeU}9DtHxu8DKLRR^t94Mp}!NZ5TAr=N4BWWycV zj>B22{WtN06ojJ6kPuU(v`@iSh5*B8KoJ9G{MsEZJ%fl}xDhd(IJ(w$s#4B=se2QLPiEoI^gj|=pvr$?24z76WNP?m z45A{6*_qS2Z|oX$AxQ>%mUcZQpg!GPYTfdU8v3)fv+}^Y`NRkl?#1%xD|#3e>VL^C z8#ZO(YT0CI1ay6q28v;hHX)S4vMnH&3_=N2r(8-7TmW+Bkr!p6RcvvSg+H0TV$y?V08yAcOYv|4ZR^aW_n-pN3<*OIyb|ifX@Rafkc7K< zwG%;ptWpHNUroLzA|ep7dM+`moljUdpv1?LIta4IqO|TTz=Ce^elOYW7L%{8kZT>C zF^umE2IXj+6M#cIkpbSl6Rgv;C+@b6FE_?34PE(=*ov?#Ld*B`Rz{Jb=X#YPW)7&1 zbX#Km6xmsk7}=`n189Vo9?o32A~ko-yt%?)i_dalh~<5NLXO`D)CRuxhFu2Idt44` zt_{PNX~90_rI%hOKUIYH5Vk?{V zrGJQhS&`K#OCqbb4)Je}&RTo1xpT#10D7pGyEn5c2KWn`SwT%0btz zUhb65!cy1xZNE4EfoO;8v22UgkjKH+_7{DRg})J%yx1<)jeVbSDs-9d2FUKc|Le;P zP;Qvl(D6;J6V`93m78)0^;us(k9>^uR(D`{Eq=zGa-|#6l66u;N3JBpuM)6YH$fM} z)A#9kAp@Q>TPchO?_~tnr+fZytW08Jq-q#Bvv6}{+LzpeyzDljSNDRiKtdtk_FU30 zg4M2j`psh@Mo3RF)DXNJ5-^gk>e1q~gwJe(>(f&K2x?sIA1*cp`&^H11^Jxe2krLK zf$Akb9zVzGAzvvpAwxb(Y{`DXHu8a!g8(7rvR%+C)?(wN+d_>AW-s9bbOtIeDAtkK z*5wV~%gV!bDoj^o_C$?~UCs;@6%qj02^TwmC=DX^`4jegMsAs|@W{qPrb~?wgw$+O zP|6I`EW$C3R@ae;lVtbc%Ix}Yb=Ng~hebMNi~vKS4;g~TY)fxYq4${7&OdFuyOX7F zcj$9R1^A^=EawdG=iw|@aj`3QiY$E6XoSF)vl|$41uU_059Kw>vc{;|FyvUr$qZd81-5I)2Gkz z-`VsP#RTaD&7Bs0=qw&;zaooF=OJcpFadYM#01#S=k`*E+9) z5iKDQKDn?Z>u6*#}#M;Rtx$!fQ-Alymx-$k+v+2?tu+y*h z%g0V`=|f_-nA4x8JTd_Dw2M^?2V8$Hb!kJ1hD|es0ssbTtU`^u(oUm8sre!J#ay4h zfwaL$DHZm?i(`0vA=VJu>&4uD7OgnNuJ8l&AsEg)41)&!&8eLrk-5T)+`D^oWt~<$ zhO(SGmJid^D&jGG7yb$jtC~p%*O~&L*J&u{9eLlCdB98^ZoL^St=7O7tmo?^t@bEH zLQd)aR=TQs+{>QAzw`xRzdH8yo$mGahDLlU_Dxf}RxUxB^os6bUn`txxM73V;^M%N zM$C&@?nok|a_2PT`-a|zrUn@cFS6D20*c)t{}`L_va1-_2uci*IM)&4s%G0KnH2BJ zh3WJO`88|j15Ha+NIdEZS#;csP;sIFS)>MqC=J61wAaui2zYPol}$tFosYkt6_WHI z2Djc|j%*pRWH2TV{7o*0`ywsj=#|Lb;sTSDPuajjn!|NJF>xx zx*G_e!SZwoaM2r0ir)%p#mDcc>+JmAH|Gw$rdm6(sLVyu?u*d%`jc*o@gO2LsF+4E z^aJIFS=a|Gc^GF<*B~-QNcpUrkvHpWQa{zeA+P{FuYSFaA!`;&!50lyRknd3tgenJ zW$-#Opl{@w&+n?WtJ*gzPBN#T)t#b2{eQytAdyXLiz9`4Y4iCe7p;*~P zfguMc7oB00Q=b-S>BLJ;*?~;X3~3Ax;~AVp(5zR$ghF=|`kCAS7_#p-lQWbF(5&sX z+&*m6=D@gI@~*9-1?zPvH(;DA3{1~mPNQ;DS1h(&(K_h#+lqzMsDGn?u0E2%ZrE{F zOPEj=imFydOvCR=P2oQg23}io-zvXiKAzr%)euuWSrE-uN=1aqCk6mp)E;YK zz#%~|0gqr{aoR*tgHbf}QtaA2?ZGIxPW{DDCHrgYcgxdO6{C@gr!Xh5XIK+)C(Pv= z-0RitsnD7pnPvn%NtJ-CoUnPdG`Df|0B&#=&Ty(o#*1rooN4YEwc9~(Q%u+zIke#1 zjjKKA8Z0lQ$3l=i%W-xFnH?#q`hmGhYD!A8+66$~t$a*e;-GBnUZ+e_Y=@gXXOTd4 zW%IDF@A28G3S8v$V&{lcFdv_D+^p}VJ=4}2^|?#d??}Dt3iJT~A;DzGOq^ppwgiyC zS~6%d#JWq-(-iB#fST=VQC<#MU~?5|WfTM3#WKc>Y7?{xzq%T{+(UqYFhJgGex_t0 z=x>L}+*zZeDZ{&WC$0nmE;C{;OV}{ ziqw#^T^V0u1SC@zRsXtPPu8LoBCNLZtDFGDBcQu)(ji88f*2u z7a}+^yNum`P8y zebsMZb3=gWKmGIddb&pUPH{Vw&%{3?w}^5Jhr#}72;`JYByTBC2b!aDobE-^b5_u?1=;l(N4e)}oBzq{;)I$ocvKI|9oc__I<=zf!Ka8%GosKjkO}B5{ zV^J_&7|#mZ`fXa=w~xfuu!e;7#A1aTfr*Q#YOs0_KDA$x9pO%sBTYts*Vo@_y6E9q zQz-lOHt^}paDo}9irm5JDk@97J-{>X62lD`h3?`b(Tkgu_-o|d9g~87uu_^FKV9MC zITWGsjrjA8+dFmEwHO@T8-=0T3;6_x3YBcScvX7KiA`Lx03j^T;tFih0z&{RjNhi? za>v;)=?i$cE$nqg9Q`S|cb3bDQbZhr^`z+jkAL^XmPy7#sGE(lU}m6Km32kS_KrRr zIi%bZ4bZW>SZEWvl?Oyju9P#4)Pcrce*a-2W&K+Z#4l5nWs$TprZMWq`JpQ1 z0UKspQ<<4oP07Jxg{t^Dlu?r*XpQ%cyroSyUUI--1c5gzl)aa+<3j}}UrU-(%M1?Z zTZD)mxb6BT?K*W3%&FJdBb~!~O6;QGLKM`O!;`SfCd9cIm-m(yFdw{X0|#~pnnckU6m@{#pxoS6f3E)g8s75-aaFrxphllu}3WT|V7M8hz z=u624K~v_SBTmatae5z2TswOwspuD5Ko>skv~W$fPxl-wER#CQ{LBe_REu$*4U-fq zX}8NR2K3tDFM+c<)RxQpnwx35qCcSd)^)o%XZkL|7u4?Q46~?)r{+oje9e@S$=@Nl z;c#OuUB_=xmIxwUzbL@3deR|M?d)!b9Llhy!WhP-#nB_|EVTD=+GeY&*5G!tQktt^ zI@gNDu()=Fxaaupv^qB78k&8HY_EG$1NbmxLhlSOCG4RWbl;x^4JabfiK~a_^19wV zYw;)63Pi{`w~9fi~0q&OY~U|8GEf^09F$pRx}Q!WzoQD?3J z*|A?K?9srI6n9F4!}XeERM}v7G^S6uZ;#_Ib>Qjd9+U2fWVA-x<&IuCQ&_SI$fTl|}$mr-V2XVg_~S3U9=&nDd>7?Brv7B`PB{--g3 zb%f9GQ9MSfH%OFA+p`Z-MM0)cD3Nc3&XGOA%uva0+SC(p)X&ZJesQ(_A&-r*Nx|)l|A)%*3=R$?;OJ^dJvE}Z2t7^o2nhz;Q=EI^@uoT$AC2I#oO2S{`KkO z#oTuKy5jyB4CD4RZ}RR3lx*v(={an9&u!w182&8=VvScBoV z^SH`#tRey8?RH0@xux}DAugvj94>t}H0qM5@IZ-g#41g^F&Br>@9_^-18tGF6cvi~ zjKiw{kIt469U%{S1r046jC*8`-6~@tH9XbdlY_`ru_{KaZEs`SyQcg>(EdF0-^M7fBW-5JeV4z57X zFuH+)T)3q4Ec|xQfa&1zNR3c~l&f(GWSG5qw;Z$^S){af3s|Sv_f)gw0y@|s;IYcR zmFW6_fiu4%DXr7P6t>qW14&%K<>VklT}HYF_?Ir|q%MS-p0xKtgV{-uxQK%@{2WXT zcn`@i_s23EmFAY%-6uC6wrR&aPe zP!NRt+wJAG(8X%C>4E(5F5+q7&(w>?&go`ruisi{ChPUT=fC6}ms)e2ot8ws#jdc& zg(KQcDisoqic#G+$oU*R#Ip_J{gYDZ#gCfWAt??Xd63g6HsH3MaaAKqfva0< zPEgUMcx9ddH7QZR1LV=>Co_FgtlZmR3%&LI-Qt+tJ8otw_Go&#O9`S0Y{m6$yJXsq zH$sfxToTuW-Mm`m7p=gxQZ{$szXDjLpg!R{&0Qlgz3Dn5qz< z1Mzb=kP_#NQh=`!(hxN@HDOwt8%4uTaxY=$+M0UQCrW5N^lqTd$<<{HSIW2$X3AZo z$UoW1z2xFKzzKQbi~DfB5nLWD+&}|^II{CN{$-}WU8&Y0ldW}%pmcucE+@^7=NneS z`*$+2j{34?)G)NkMRnN+|I+2}P0fB|QzSeS@UJnWw?j#5*`7KX4(Qoh9I0fQ30SbJ{aXVN zm7ZL4WsW;*eRk2~Ph+vcK5@17f$-aIw+ZLn>KxaF_6=W`jlb5}i<*u97X8?@)auo{ zMse(=Az6^U)?s8i;5~wXWAP zJ|HMgWA!K~`xBR?C8(h`o{DZ*Wc9;QMK?`)p79Z@YhNiEJI@!TlG(ar%Wpj}QHo5m z*D`7@zJ5!2TfLG-y`cV8#ZGe^;h_hWkVIWe!QwD0F;5`3VfA1s9nKqs6D^O;>`Yb- z*;^UK>~DoQc_8Xp6o9{iaa>&wMg5p&`3l|*qN?hDTfKW1i6XnN(sMVyxT-aivCxyn z*7)bG2X7#>N(i2z>A1obV$xMnVTdmRr|V zbEl}NT+%wKp27e5g<2~}ym z-txXfVxA}M{G~w-M9;^B6})r3sEfjPph>L(X%a>=oNV5Nlgj7(&~5b9y@|CK$2#m> z_1?hZF?>+gruHwU&z?VpZzM2Ac6G81+4Rrm2V%J_u9LCWS3O);*DFVn=E)wyBga~I zg@+Dpg`@`3bZUH%i$j;%aohkDPzF=%gyS?~(f5QpqeayzeynEhSGJSY>t-UXbl#$} z$9_HBJ=I2_LR|}i?QJQ zCd4`FenEiw#0HC0g-0d*4G$>QOV+Ef%7d|DT#L(8Md1h>S3^eWKZkCA^Ed$+>s`tA z>GminNak^u4fq7QRZP>WQsLNHCXHS@UAaFcja{LStQOAr8{D7Jid$;xjMdOfjl(oX z!LNJ8b2SiyuzVZ?GbP9=`JOl~nt8B!?CHIO4g(T+o!Wf~ZUBHL?JseW`5xqATw6#% z(Ee93@{#vJm2M|=hfFN?=A88c?U7BEO%(3og*uM73 zaZCrp-(`S0r}e~nG>$3|gt9y@p7AN*D#;x27~6u0oEH&rY|`3Z%zj-;<6v*q>q7idW=lLA5$5j{CYGXB9u^tv2pyh>AcI#%QPP&syeXGLju zru>URz3B`0TeEM0LGbTile`{u;WCDFlg-qqqClUbt5OjKI1}dNyK~#PbEFSzAH#Ak zC$z8!HN$_)H;3Jza!RX?{)QS)3Z(>y{l&X!noIq2gxbg=IBZygCpeqKlY&_Ix`=aLaRkY+`x@CKtME^o?r7TS_ux_3hW{H;>6`k=!Nrc=2F zSm|4+jb;0!_98PS?vNqpl!u8nvJs^{^|_=%vAQUd>^mxBF-bTaHyQ}~`i70wBAXFr zv9E_yw|y^zdR%`h!`YZ-Pnl~gA@IB*Azhnn`sN0slYxXtr@#hyi$T^sEPzX*b7mF! zq2aZX2t&NzJI#^1_B&e6&$`XptBTWJzlZZnDZ@!xn8RG-Y+Qc-R8g1by*e4KZxx>p zNyQzxr65z6{xKIZaqGT9)e`rD&UFLlT%|T?K6_Yd{k_y~cCXC%Z~t5R4dn+if+j7K z%?7={9U+vg$nVedX5uR>yXTI?tRmTRonia)XvED!+$~Xheet#tdJd%m1?XEsehb(T z!no9Cn(S?djb~JY94aoO!0#V;$?he9@_08(L1*@CPZLhlFyoa| zd-05Cn32y={rtP-1@%mEo9W2dJvXDG$?24`Cy>O$*uu+RZsPDw&w@?bgGqci_m`Su z#^jTz9o+~FIGj%}u(Rt+#n@F++G1+CWB3Gqf(3avLw9W%Y^B)cyz@h_&{PozeR}?( zKyi`y906&06m$2GSvra0eP-GkTZ^6%OB`qeZqoODh#D}yK}kZz%84i_#6~IOvH-&n3T`M zpOuTgy3>pySr}ZGa?#%ZzB2$ko7pX88vtEIk+4=lST+d|9VbBsDREQ7<|2QaT7V}E}DQOjXJC9 zwN3ma)ZUch*AfkU9E1(@eoQ=B*Z=IQpBH1{S1(T|6X_}1a2J(2VC58H%1F|65YXEe zhbRg_l|d2U{IwZqFp<=nV@QYn+zRS{gaB;EH=PqSNXb+x(X66%pN= zx>m|)#Rs;qy7j>><`0_cEmISMNh!&2fO)otH&{><&ju4jyREJgFWDIv)(hAEM@VnR zatltCjL`DJWLM(#b0ZNhEQ+f3TX=PdY@6$my zXFByb(@_g{_5^kZbTH`Jx7W4uQ#j%1H6E^yErk+{h|Ji zsLe%3hrEEE`F>N=HoxvzQ6jhV*rEbld4NdcEwO8d5y zxBmmiYMr;_ysna&Gc-14b zhk0gD4daVXve9_iQU6bInx?lCsw*J;u}JYOgVFK`<8H#Q(`t#-VRMG#0b0k5cagz^ zHJ#UW;3}Qr_YqC{fZBJ(_Og<#_kxdDGh*d#3E^C_*gE5)&TIUnOgX7@HB43T6HwiF zh!k*8rsk@^&a?As!M`_LY1@sq!tthr7Bkdgndde#=!ao`tyM`~=8^`Fg^xm!QFzmm zDV1+!W!8!8=d>5vXE|LD{t49RerIMXjzvV;2JIjCMIYj1vGhLqGCSc~)!$O#1Dz8I zhcHBU9N8ijxk($Vz63qqf%OFt z51{|$Qp~@H-8PNnA>I(X@=L6ObYp@6(5zAHW!4c`h8tvO2d%1(_?<_@)YdQsC&OS? zZY)t;5gcLNzj1WPW{mTRvj9ZLzhNjyu~bac5D>R_z?m2^Tb02z$gc&R&p*nm`E~U* z93*3!G9mGgJmInb#U~nmU>5^w-2s-4&Lm15>B*+@efXx4<2b=x%M1S zdBag79mqa7<#r#tKDhcnvJ5|RuRQC1IZ)-G*X%z`2iff5$w%J% zP$i?4znr0Y_ll03`Y~U`YCe*}PAJ>6BXo^gQzde?(p28&N%+zAs?H}KYE|-z0btia zh3>lF(CKO+nvY5e+B2d(ejHlADe0o@S})y0nRGaBTX={ekpXp7q$G<$q`_Be6|L^N zDwNuV!7{5WvIEJEs9l4KzlI+M)|6vQiEKY(X5KXld<>E@#KlvirMfu)g>ymR;p;=_ z;nPlmnyJdLC2DC5pi^>o?OC16r}~@FG6m#`WeF^CnzAt!Z>5#m%VH`wwd^WHiPg%n zLe=Bvm!Z7k?yQht%gBXVB21T;jq`tHco4hJ*hN6$n=49=-?KBst9;D%ZB)24OaLCe870NgT@TX}I9iU2Qm$;O zi5QTTIa?~*Pl9idU1aZxyQN>;s@X>77k#SP3iIuQ(I~%)FQ4zJU3T?&RoWK)}`L8ga4zHyC{qKXk1ndL1R0 z+4aSyUdzia?xib%dM4wn{L$LRaD>I2A&bIW)nvqg=*aGNUOjL%M@)R}0?fO2+ta|JIXD*4 zt^0IvzIzaL#iOxn<;<5BT< zQcN#1F#Z;K*4QYnOnjigk2IOe|0e1EF^lnxOu!}y>3|2i!x`DtI zbgQR1517wBy*R8^q=3w4`kk}slLf{kfVMFjSRS#maa>b#%JxFi6=w{=Pv46fN{1g! zZ>o=hprxNK9!OMljb=Qi;NR_E+scG#+RYqIeWjR*PPMz1_|Zrw0fyby%9veuA-DjC0SXV zIca~>m_TTun^_q@G4@i*+GIJUm;(iwnf38{VsV z)`loDAh#(4zNO$QKlb!~3|K3AhwrYRZadC6vmN4VR93#BaRg*o3XO41?RwV>X4RV1 z!{22W>NKI^>+xFf+lyan+d1qc%%SE3%YzQFq+)@d?M@)M>cbO{13?09%6>cZJzS7= zWV|B2@|b!E8Uz=UlIbeJtj_B5K&o8St5K_rRslT6`uLKj*Pq4KQy)m~gLE&-lh>st z_nUf0s&~|%m1P6X3(;Yf@w|*U9bWH?@s;cBW92qCsa2I*+otMFQ-?F@1NuQyJGWIs z>gwq6d@Yzq=QcY0VqBkP9nDi`(y444T_*D!wDC>@i16%+Yz=sS>rwffMcKXW4Ejy@ z?*5ngK34~{s4s#i^K@#o0FMcXFyF`$geek*>CrG)9mZ6twLrGC`5A?DG7$)vp}#3D zI2J62MnURwIAAL_|9BFkSW2%(e266wY3Q8@zr#LsjK=zCFQJVuve7%ATWm6mXN@`% z=xKZ_q}gZ(UfYOJ8t38DPQU6t*XKxrq2p$f^yZb$8l3v~f{{`k@OV~KdmSQboc$ZD z4<-l5EKhZgYJ+!iM)U=SY|X?}?AI-BZV)_?hu5wFXM`fP<9eC%d{OUA6&6P?<&&^)D?I4aClgm zviK7kowTrXBbZ?Q$|JGcU&X$>AAgVC z3?R~S+1ucV1?2ZL!h50uCT%f=9-c`5a+6OZ%fC3&veOKWEsUrL)&EdEI|lqm5p@ny z&=R^Ocp5@L&RbEUii;B0nuEZ?3csOz!`jU0*I%-8w>wQGlIZ|<)Y`_uzoVY2*9wZ&VB&E} zZQWTHqq~8m=xop*&KtktPw_4RnCJGAv<&1B%$wxK@q?{t z)Pe^+Y%(p0(;_MJZ`DG>aidloJfvpQx|5z$6U$1%Cxx7Ff;*&-u+u2a7C=_nujOV5(58i3{#kp_mhX{pA=b<$+R*21$3t*N$RSP5#BvAk81&69M~oAz5wyjTpOWl8r9 zSHVI4RablFDrP5KvNi(DGI=ANNo(EW0OB9UCr`t5fIl=@YSA;_X80t4}*ht@#+b4 z>;Z1bYMzWqH1Eq`b*qOAd#PrOR}= zdHHvbi>~JXv*?{`<@HVc^auV+PR$&ZLu^#Z&l;}p zo4~I-sAbh{`6#*41j=)~gzS0%EG|Sf;cKbcb^c=>jqx~Mo~T?k94Z)UUZL`q4X<0h zD~o|kzV_5-Js%1#!tor^V>l-zS`qOK3M$V0YrF+M5!0rdi7%f?HJ~L`eqR7k4l$vE zc_Kp@2mEc=>zkB_!d7Rp5rX=ZN%bfTds794of0e=_LIc=AY3?`% z`;rEcwk-+MeI#;a8kUiKzXoHQmL}c*s2-CjZ0QhbXRsHFzl%WBH?3W|O%3E|u@DN7 zYY~9x3R*A=R%%qz;jPFB(`7vI@S_;IVNjQ? z>ABqX?99-I_u*A4swNP-;v_nAj`yNPRFeR&MjU>Zs)}|26Pd0KfJh|m0}@mTb8-MYjP4 zn6_TCaje@+YL#;e69emhZYO4-;y4eWnuPn@{1`s)&tC@0t_!bcNt{TYE=v`8r#y2Lb)!E!`>+l6DxkO(|f4^=aJyTVu1Wylev1(yPU_ zqoXE(T-PQ|naEu#OHg+*&)hc2K?OfZh<y=IJ_KiXtKG7%-?6jNwM0r(9g4D#UBSY-0pd zJA5L?J+s`s%k?*rNVE^|XglyR$>hKAwMa@-yubrnH;d)}W7j3$Ne6pbi}*FcMk0L|DufS{9{SmLfC5 zB3f3WImDL6Shi7H?lxKM!xldoWW15$hy|e(ur=WZs2bB0dCH9|k*H!C=oxDl8^EJf-yZWU*7G+EF zPCc!fCyQGwL=%y2Fatv;Y9AKaKD@b%=`LIGqVB>px!Z#Q&r#nRIhupXnzmgKSY5Ha zTXjT2l!XA11o()>pQ-gH>O$IXO<`9N!zv551&5X&cWXTR%FVoAwRJoK1% zAg@)Z`p}NqbB13MQw^DgRC&UwmaTqyUHmiZi)r-*;N>Go0kbW;!ILV+0l7`+BSVHc zK7@91w9{#4EMdoYNayp)7_df8v=Vj$=sA9Uk9eG>9XmLm+;gv zoXiB@p56zdBM+b1;3_juf@x;lAx6>khhbRCoAV!VrLyyJ!8fxr`s;jyeR~VoiPFr< zfj-}Cxv4uh1px{Tl{uIoUv&T&Zh<(tE;1k9ryiG-5P66hY;M8|s?tk97Cu##&AMI~ zYHaR0NKt?MNlr)V?`sptKPtJHOR%(y(nbAeUbB@Jm*b+;8pa^1(T^iB0)n(D!Zoipk zod%bu=oh9I6f6mGvlU`g50~y-a8x+V@C`Z$N?7h!Kj4GW)@bUWT*n&Q<9%9m9hrRU zs&cg_L2e=8r?R>{jc9k{)P~)=UQ+qhqv|xh2hXGEmL6*3$Py-xhnrGRg%(#`pOucm zHnL{<0(55`^qcOTS>;W~Ox z;uhelSnV4yU~IGumNd+iI$SpBe8Bum@M=tJ*X4|~m(@+D@w=d$-3i1CyRF{48+jM2 zstqIJ4Nl-gi`YZ1;b7@4mCSyW@_*TE$$(nfo4ml#I+1{Qq_k0ew2}EQj)@@698?y^ z7_=R6M=PvFaM0nN8k~*5lUaAZDVArSB`ufTsqFHfVoMNnR-s6F^CZ~;xI&HtAXH}# z#mB_nyi}SlOLv8}So6E3XZXG$&2#(02)#D$88HgId7Lb7XYLqaAmit^$@ zPxjek+^jcEX7!NelrXx{#dYxHK8R!bNXXkUdQFszXG&fOALD6;|tf6-ctE)e9Btn zR{*6+nv;z3C+H;2>WaHTY3gzRu(_`H=BHfUTLm?NB2Ocli5roqebTT_``-x$%#3}_ z`*)LY2#{v#_VfV;yTeG~kWKObpbik*CG!-*NE{9}rk#3;d`~MUCUwE7JVsh%7?u6B z>)gZ68D(D3E2$U#;rkP~_!Cd8vsdFUeH+;%uyfi<7yXR7gj#`Yi)(cV#s(W?b?c`3 zJ1!d&$jA$8%dG;}ijLW9zRGoT=p%t4RlStZvN$v}z&Xh@oov`h`gr*K)Ohz5+=C>{ z$d`t?!H{-e*nomiUYySW_^Bdd{Ie>B{4WwEZ+WB+0~aI_PQ4O&?%L@fiL2LbLg~L( zJ0kt36vNV>4DdGEh0B#rx{|VPd6KU)M66FTiRlOUL+(`4h0bAC9|E{a8ckrQRv%(; zMW+o#o_rfugDgriO;XDO6kzS6Y+UB5MCZd4l={2;G;LnE+NTUu=>L7fTM1|Gy|qNh zrNhCtT0+gK%3>z7Nhu@Qkv4cK;cmx!z$XCDfHRg}wqIlYd_6MF7;(#7!tNE7V6QlT z@%n!J^M=jd_Oqxb)e8oPvzucbUo1B%IeTC8CK&M4RAQJ~7cH)x+P_cQmt_Jr`ThJ1 zYecNU$P$QOU==#{;rONvMm5KUVBaHXKi0D_wRzn_;%w%2Rpuv|zLzMYnIDlBOmDL4 z$Oo^jnjXc*a3)3vEx&aNe_hT)O+akQJhJ9vc6A5~+0q~iZsGP*wv^y;$&Df2Du2EN zO&cXBuV5vcJ58RY?Bio$0u)}aTwx^flNiVX)|j`m@4EMOx~W&d(r%7Inb>|~46iTm5S+!kK0grtc~|I#PTewe%#6~n z)7>^`GTnd}3k9P6X%`5B7ojz&qOpT0A=M*Gha59_Alx;3gj z8Bqq!V(0$00I3d|Vm8~^`#X>x@NIQNUQ7i*=A2s=LnybxG%C;@i|YkwR35Y!Mfx2& z8iP!?heMXX^B_v1K9#T!fSXtgX8l6U3?J@zS~g>|S=8%~myLaBD`CXAr@rdW+jTCr z;Jkkit@+}c?0-TczuP=OZ7;88fVZNbuWX8re1UeSGPtzpB+!GwO|^28bECJ}#73kV z>ma5l>6@}s)~{!O-hn&A(7u35%2OO)Hx_}hIJawt|?sj>|S-w*>WZQ)+*wza4H0v#l~v@72~YQZC2&0UQDa zP-wKOT*9SWS-Wb0RU^-(?xR+*EIHG9)O$?IrtCNq44HZ0-C_|j4@8w5j4UWxTXLSw z_nJ+~H}0t7=4=S4jL()dpkKdZ&SDYl?@?0UnU63S9Qvl~GnP6f~7uG^iJ zCKN1vyO#@J9j|Qw#N=&LeF6f~bYvht-N|`!6U^qGVE)GV`FGOLrcgIbZ~`ZBIbML`<_pL9X^?E_)&5X{tGS}WDX15n3jKU*r_*JN_;bS!V6H)n8y9KYh`i0#3)?6h|^ z#d?8zAR--+qiLhb1y5!ndG;WU=Re3<47pzVOs->qoLT$rT$9S#KCPIy`XP&L_d-wj z;8DQjN;X51S^&h+XAj||pD!lN0xkwFe-i}Gw6-wNMs>cJG zCIdPAu~QrcPqUz#A#d^Q0iXLXq_pZ z1u~L2t;kj634=75hK|7)6F!2TU~HK3eBH{M5-=ZIyqa*g&3XF887EzPktsxe1SNXG zn&T^Ed_;LB3LOypgPn*5%C>nf8Fi3mLEl)_;Q3XaL}vYF&^dLXIks*8;B zL`8CY6D(YKwiMbEy>oW;d|#dfkv3`V9%8!ao!MV4Z~&yH&gRKz%>G>38O)GjQBirA z3;|t30!2&urM*Uz&N$KPpPB-TDa>~CsBp+Vbg4KcK&r2>+?kyKfq^g`pOy18SSr`L ztpsj#EiqLof02S;Vifc!N9FS8X(XgCfoDCsQWKHhDBXlGtbUBlMi{7kdj)KDo;m`L zwH3Df`!^bii^#kAw1V=zgG%&ZQ{{U(+ycz>JShkc+ZOC$aN{2ckp19S5$Z(1sMY{BUWb;MnxO9$W7 zoPpYZl$;UnC@qo6s`er?U=PbUuD4edU>*{aIBK0S9P-y@GyXvhw=7-K_#^csOw}I7b6<(g9BM^>2y6rbz zdpuEbJw=&_E4|03W&5B0dXWIid*M6XMFSqP4x6~~?cPPz%o|!kuUw*@Adp)};3LO~ zWV1v%P2XjIIr95T_rSfV1Xs6(y6`xCeonjXKUxt0s>*k-*ohQIPz3$^lNF#kv}NqSH=~#1Yrhvq|6y!_MW-U@kf^06f!{>8(MR;tkQD}3hI4!?33}g zxlKwSTRzXP1yHH67Kbf*W8in@RKLCJI@HQmtDS!q+AM=coc1rOcI|o=_#ZgUv`c~n zaruAS1se@|UT~k_*NhK;+QtR(l(Ro^p8U%9h0~*=?f)xk20$-TnFJU(v_u6o@sAUt;w-?oSqiH*tP^T=W}D^NKsxU zQk>tlH)|mz0@4NbDt*rXjr?1Xk=x7(GTpZ!%ImCDF76c*JDWBqhDpCSy2^zVaEu?t zKV|i1JmD7O$acajiqnIsQE^so%cK@UIR)>V_0wTiuhK9u+M9l^+SUwh5qI|3ABzSD z9o(2Y#d_PpZyUh~K2=;c#%&0<)6o|Lxa5@ep}ecTkk0lHQF|BlQWcuWU*(UwU*&a_ zMC)Vu2a(7b&=`&nQ(oZrl_Ue*n0!(>dTvl97Ue|VK;^1YyPW)>KBuggumZyv)THx@ zk87AO9GoLF^T&E50z;V9#gI1x6+zSzY*KJ^I^+Q20(dfd=#hkG-!F?zW7!a9gJfD2 zXxnpzr5T>+dgZI?>}k(k8KOaueNbX*QD@tU(B6XZWI*FKN7Wdd*oNVtX%!*UP;Bqv zG!^kwD4u2OLCPB(BC1!Ua&&YA?-gwP`x~bHFB0Mw~gc zOb@54wO{A~p`7%sNPu>BwQz9Mw7Z-8)r@C={v=wf+?Gh);ip0~)*0Tw9nraqG=rQM(T>Xf!ZG7tyw>f_XOr8x%c z*%yfju0?4NmGo_fSA-Q^Ggc3Abnsadn6CUL{7*9mncZ5*jB#x{84$_oPux&X<1&6J zq2O&tJmXf7&rI0zNZ;Qnxc6Y#(6s4~(9|1$H}h@uypQmG$z)jY)SMg%7dyZpvO3<5IuX|6H76`6)FH{i?WfH^)Fyq!>tAQwZgX% zs!vdneG#8&35L-5sYEmNU~2&2fk2|!Y*^%_jIrYKvJf9ohwM00HQS? zlumhckO_o%vbJ4*Z(!~de|8yYvIaG3XGShaJ<>Nil+RzLsl8M(PRx>Qm&(t&H<5}Q z%Et}K;r#ppG=ekDW911!0ON`$s-0vz*yA8qXBWZ5E&W8a8OZQV&KP{-05*yl1-Zn)3_ zP}zgiZf%mP61>usMTuTTSg&$9o*ybN0Obh8g&9dgl(TKWYe{hOI0925Eu2U4TAnyy z4%3G-t}PCJQ*(3Of<(qm$+Rsgq*H4z_y+t`>T~*ny2)0UgmGDF&a9ZRUBj`ZV-@Mra|HC_3Yi}DMc@;?(;L}f z88jcNrb}pU>kuZj$3X{$f(D3X_s0Fjbo~$GXXrSTa9rx64yvD4}6F z2P6rEwVg7~2W}(SYrgyZdCMg|Zt#0L$wQmB69C=ST^hN$J(L^;!jhUvKwl7rB%RXc zI#*Yn`y_a68Qcf_hR+Dp?;CCio8C2Qgzs{kWf;3NXp$rw!F|Me*Y$bla~B{ikm<2; z0-6nnb-@COwm8BeunT%G)3A5W&P92qht#a}ee$SdTEA9FeOzL@rr+u!%}e&n?5_n7 zU&nl{gV>u-arSj*E=!1_PVtI6-SoQM{`mJFt)0mAB*SxC<21(`&(7xGo_hYY_sQT- z^iF63!ORkR3tLhU?ehP?kBec(WetH$UskkU$8y;%xZk_SnA|MS=KmI%IVE06^}LBp z3cF#eC!F<`CkuTFh7~h@;{(&#+?iaR^WFQN`IGbhN~CODXKCAiQH#Uzf&gj@XV7!} zbkMK8py8Mk)`*aUY-AciuN_J-#Te7ond4HU^a*$$)+y5ZRTCNJ$2}qV62W@DPQy7@ ze-IU8p-Yi{6R|SBU=S2(Ddsg?Shv1b&1&0&a~3GHk0<>LBp#ifTxIPSB=Bo%-`5Np ztwomwuf8;Sh4#06IWKMpVr2IGczsM7wOU7^>oT5|+5YI-ZnT^@tAx~axSM_Tmkuwz z-g2LtM*sZFu~c{^d1q_Ldg<-Sg3a)k`;*oHJbiS8YF1Q5n)<=vY?Sh*BYPLhIc1GI ztPa#jthi)?PgKN2p{mDlc!?1#a-ChoAa4x5H-@sc~XuiB+tHd0E3_<(Tz6aUHrQFRwC;SxzXs}cg zw)u3S3p^uhvIJ9qA}AvRC;d^T^O4hX1oOUlzmdZ8Hd9c$%mk2J4*EzFqh6rK1mse0 zw(A>~okLi@-m-6~t$C6NW=sZoo)Vr98lITrH~&>{4A}Bz=gi=EkQrfvF-HuE9HV0| zr13tygU!t(X-Pp~{z<7e0M6zmA9nt^FH8G%#+s`C)nk@ObLjkmKM zf~VEo(@Ew8#Cfz6tnugSmKeO3~^I$H8Gu2+yhC6KMV~x1Ox9$FkCW#(E34thUvmSt>J5U*mrO z&)`wKI*ATgH_73hH(D$@@_#ntjfg%M%M^B8La}Hnq;MIf za%yN(oKY+Lw~_$ZPqt3|_7J1lR_a{(rwqSsV_jrRsCVk)!4YOQxvAb$RtLY;?b_)`bQWRn-}gB}wemh?@kgkn7SKaO zLLX^N-EZbAIx6Lw?XnE4)xjkCev?}H8B($%O$;AN5f<7o(n8~LR=NYR2(ZbD_i!f9 z%;w!YU0qkUcP|m<#6o(D^ELx#%Ovx+0W=y8LOuZdd1l7oy))Wt#!?)7Q^gnVwwKa_ z5Wib4A2+tHi8nz(R$H0QQV>n!mO&>c$*W-J7wceGXDdF`lSSA$qjo%SqWXctR75Lq zbG#3Lo@R?NPn9pBzWPq-`?f7{KR(ye#*mbs1|d1KugYEROo+Zr4Q8PXcnHi7s@bv@ z&WDfs+wgMq=~C*|7N)IVDTt?^U*yqTtV-~~S3q9Ks>+>rxHJ?tYBs+K2}sW#7w=yN z!$FBp0kOYoI!Xo0*GA9ufJ;4q`AKyPo5gw#hHuA!c)_Z)}*d z0S0gZo{ine3Eaw{rp6zLBHy?{A1>;i8S6|h2c>TKu>X9{0PP?-agI#c0=f8Nu~r=} zoHnq#@X(TVBM+Jr1+tSy6?L-|-6&vl(-6fY4qilvYGTK*f3qO$)F(BQ?N0h~_BlDl zD;e&B+B%{{ZL zBRKn1a^IWJq%K9B>)9v7D=?4w^U-zqTbL@Vd3#pKZ146F7K@C-F?i_AW;_g#F`pe` zK=VBffuy}P=h*j~0xz_CERTN`a^dmH)r!NYmjmxWsS(uy zeRjiT%thj#>?sZta3o%uB9VMdORwiFfkAi8RWYQV>Ur=)fIpB-(qa5|b}&cNeM#om z_}!g1V^ep}4L;TgJ!A7%irZi}MK6+KO*wGidn95z$)r~WqX}80W_y-7z~1)r9uBJP zB0nB5fi~?kzyVHpDGH|uvnR;J?IHRW8D!8rRVRSMEm(_~+8i)2ptH2^r50RjI+b|z zZS6mMGn1&j^^Ez)p)z8M3CZqPh+^aI0eIE7NYnOjUGOEmCJdc;W*A5#q(3i>6d3`` z$VWN#&2QDQ4Hw@+o#e3(`ZI`chojr~23cG<6Kuxr5D(%brLWeC&ol|R>HD>^WiV)x z_fAK~;pN1QG&9*?AqR}zXTRkP+h%Jv&bbTOomo4#izA$7AoX=C{J>W1vZ*aV1u7N< z7xP+|A&C72Jk^q@)??#%&Khi?E9v}Zny_nj4kIH5PPZSuGVUM5?Pq#TI={rWl7QMi z!$ka3o=o}*lX=7+;_&+R`Iq-0Aq5khp$CK)u{ zxpMH$eOo47(Awn-LSM?MiQU<9bv z37IcPT?x`BIcvXBf~^_++j(bw!~!-@1Z#3!=Vf#k6s#Zj`C+|t%%h|B48n7qC_Q1n z2Hy7@g~lgw4t4YJ1T8+JwtXTV*~a+mm+>VXC>!-0E_oYA<=Iec&! zQCHC*ejzX@ov~Z&CJx@)HYNMF5T>F_$VR9qmGQs);HJvis|X$@laSOtCH%F#W-A1E z23M0dv!Y6VLvZx{!Vo*G(F{T#k7M!8$1Mf+Cx{;&k4?hMNcRc#!6aL!>d zQs2Y7R{C+(XHh)nAbHGvG%xedx^B<*m5lI;U z1}y8;_OE)zB&sGlHFyg^^9|l>tw2fj-`qpXz!Z4Sy4!^oX#(=k_C<@1#ugrevTBhp z;|F@{y4CLzquhGjE>i{7=er*V5(TLsP$=+obq)sXi2&5j)Ce^Sj;g8G=l2#pLtX#m zA<$8prg6|6C?n^S@O}yNKN^Jcr1q~Kd#UflvvVPes-fZx8RA=G16e{$KAgR0&*+rI z6nz8Hg@e~yVz*UF83??rxKz>}g@tF+$(${0y6Zr$3=GXnv*2grg}I=-4h4eqcwZuOlFDq2lFcGRCu! z+|AY7sA-z{RV7LixQy3{VL5u7Jp)nqxbrJB;E4Q$clxo>H?`YhWi5=%-2hw<1B-*App+OX!G^C^(m-hjeywo>NHQ zlkq_>EvwyLp+c5U$0Kj~C0iB8QtzVs(uEBA&&*A{c58cxGh~=}dYhk})wtvwg`&@c zJL#jJ5pHR0>mSS*)eg<$FMdcS@iBVW#;%d_L7+9^Kj%-Jq`yHZqf*__;M`#k8c&Mb zWW5IkpE1%y8kf+vUqqsxc=_J0@@V_W@##_^8EK2Tuv%?*AdWSOjj=dAc>4Oz0OW$2 znU+UJV?vGNR)@Hu%ure7_Wmehy+x(A6`ApZ)0hQ6GNNbMXL zQ3;9B+z8)n?LLx5#4&3Cmn0x4=51r12kg2ATngUSNFf+Wby+VKFUCDbMwxb=C*MO? z9F?;13E35(Rp{_^0Sj02ZbVV#DRL!Nv2>2R$h0Od)ZLWFtt~>r#d2=7U?)7UN=PV# z(#J~n>E~;u(Jf3OWh%0k-g}A;`Gd@Q-bdi;_DEfR^MGN>=cuQ&36B z6|TUyw(eS6YLHw~2W?AvxXHF%_-;i81vB3uTWLq^sA}cs>`{Ls$>wet>xPznz_JB% zv}i;8rji|tIROWp8K|~U!UT>^?r2VDz{}(F*yUU;Kq|04qd=PWDx7sHVolC^P1uWS zeVQD2B$RkdOM;(_+NE=X+^M82@WDwNnNos$$muE6K7 zdz|~>H^@fm+no@6D^p@%c)(yozPxgwnZ!WI#139C;8kfZtv?~?FRx^24TY0m5f#Q7 z(NLnV#46Qm*+Dv5LV=F(*Nuf?lbO*YH{;x_y^2{+om5?xRW;ZUW%u6B{V1rYj1z4g+} zue*ScoVgjOJ2S4i$Rh9U@MSW6X!b;5XQ&ujLG^4j{fXr#r<6{t0W`69Ru60sRJpfK z<3(g-94nU$zm+T9Q@~Jzt1YJQlm;J%`q6;;oKb){E(@A0BWYRt!Gvu7uMR2m#GF*L ztb;a?He5I6@uWjR;ZYw#Gc*D4@|PBVoFbzA_hzeIUIb!>P2pdkJv9-)MqWkrqFOFp@$kq|{2(H+>4fAAx<2xpgYcsYeJq1SLrBrOWl z2!O*O4qQ1u;Gw4weMk*9-LifBCnLQricv78O#%MF+jskdy(0hUmGf`tF85?49iwTH zVY+V2P6Gv;!%gW7he|(kAps?0Sqys!{bi97Q9f^-iJm!yO z=)-0}bTd5xulF?M+QjrF{(|EX5D8N^ZbHGCr@q5@&0!m1ul2{K#bBCfiw>k#lbUD` z-ebG7+G=lX@q3ZvU-btshFE$6y`MGg_4of?|F1~j|HQNWACSJRY>fXi#D<-N?I)SV z#@1?l_WQ*8cQPz%Ek&G)~j&-_oCFB2;V=l>5dUy!1oT;qZN zk1*e#fk6K`;D0Xv%l3bP`3iOXD1&R_M@=liKSHJn`_T!B;g1migXskpa?lZy{t+#g z){jJ)<9?J!gZLwB;>#c9{AU!1kYl>=?2jtB_kJ|aiuWT%+Irf0IxNz#AJP4Pg!zJ{ z{tuXMCtft;ZRLwePjH!yaZv(5sEPOk{&_7Lq52yO8~v81vg6>2L>KhhSNNKGSv#@9 zhf%dxNNQ6X7)LR6E6fm{95f2|0+cdtKGc;srB?$Fr(R8p&b=q?}te8(+Z9kQas`19krqW^Ty= zCcHC89*iEw(q`j}eRodX+f+J)_kG%>lLwO9?{k(i;&LYvF18}j&_eX-*lL)RoTT~G zstFkdgD&Mg9|*T7lAcPH(2*=kj!<`+GCOTQ*4)9&ou>jPzqSMJ0#~DM{lEfr>^f}; zm2EhpY6>D&aT9&60D_)D%CX-j$;8L(?v}Cy%WkL8cr zri=j!Q&3Q9OHYaIIQc&v`r5l7Jb2gsb#E@@lD}%_-<1<&ZhOf?)w_Dpo8fV;X`VBQ z|D0M&-nZdvtiHT@q8#XeoL=r3j#gp&sjT)9s3QF5tmbM1^P9YX!%esSaajL`F4^DE zwkvBMn0~2V*t(*tIh3|+{^^x9kq-m+d4nceuYzwG5mN-Zh7Mb-&cZQ^; z=_og>T+5={jwLYI9+M>=5$Bq>(+bB_wFhE%6Z%%QfRD)t{dk&`ZlCr=%=9g_ z1I`kExcjE&7(Dg)mBaHZqz(($>XGXfw_7ziv$_JBNMyl~;wCK|ig=qN`^HVhL{YPE z&`gT`Bw`-+5`$R}XiD~zu|_FioSJ(ynjxQrcxyp3S&gNfbVO~*BqhvDO7?vE$pkau z=^-{R+wIPX8=NKWB;5-=5fZJDBL`kOE}QnWgR#FkcI(^x+9A}Wwcg*q|8{5aNEfsc zh!k;g@MtWTu(a2L&or}qr7T%w!uK2>-meyw4Y207Z3w?eN}UYxne;c6tG)=`UM<$e-O}Tf@T-%i#sW*mgEi5xNG=2 zOj62*{iLgtW0d6BZ83XZYP3wOff;VHGrzz8-qYeD;|CiuE!o&ZV7q{G_+6@#OA|7ZjP1D(k4K;FnflT=4Y^kNcbtAL z4!xuciQg59o03|Qz0^9*ujw5$_b5YhbHcqgsDx2nYCrBR(x|~n?12_O9%4!YfB&}M z4M4~GIf#6~D;f++{{LD2cTV#kH~2p|4HM`8O^;{h_}}5<#hncQ{8xTF(~lDw+nbnb z|0Id&{#Ta#{~*Z!c+UUBbc7_ung7>Ju>U;y8G(Lc?}1SM*Vuc7|K+0&2t8k$D~y;ZU^>k3Vzwo| zZ_ruvz?AJLTgin!^t}*TyHX)ZE9TRPnd~rH1TsVx3a|Y`{A8RZ+U z|Nal-_Azsh2CxHLq^!vMuVhTQ__mK7nf=L*f1xIUibAV1%&YD}J+AWl*9`5`fjus% zK~55wV5LiRQw+4^wCL-oLPjiI)a&@7vlf1~2|sg4od{I4oV^m}1BlA1LIpm%z@6I8 z>HZ*$YZYu7micBbK{ z%jYV=L=r+4bOfwo1vsSs_l=O7zk1sNAHm6+%m?o2^|6?Je6gX>OX1=Q&H42$9afWA z8__`JCwcd69p9@I79Aa)tI=v3&##XIf13xMeF2BBJp8)l6=0y5dUc2Q02jKoeWgb? z5#+d%9+ACeZHNoWJ`z>Gt-e5Rq+%^}SvY8Yrc_#(p6VU2|7zb>UMd9<|48&tjx zrqGiv%Xk`PhsgPn#_?-AAulqx8%}7x zV2&<;B3q*2;?<+pa4774lt=>>Qa8ysm3 z##Kk`TZlwH1dqs=lg5~^f`4HD@>*B@>}oL=UFRaslVY8Yzf5}9S7Uz?SXu$PCC3MI z%mTfR4fw|1tu)g;w%bF@N1)+KR0s7;oux>xQcG_(C>QteJ_2eXGg=J4N`P?+S4zB%&ATpMn{9e~J! z!!F|ETQb=d8^(il%hO*O@Y5 zW7&@Q+6x-0j6*Y`86#V2m~@u`V{WRT{Md5sA{?*4Fd1>Zex|9Y@48l$aemt#wy6PG zzAwC|`pqCFOZ={Cnd*O1|5NPMdb6l0iS|4#hW~Zw7Q7vd#!Z}|*rc%vRylujH(N;3 zP&@}3;#m5+#d35+X01xvK*1d1O}0QWbv?RCKs-Aj3zf67pZw>&=zUr-1Iksv3#?9B zGHrO27gB`E#?an{M(FJ>TqQ1?%KM-zJ}zGTo}fSei*JhpP)MfPosQEvEC?g>stub= zF$6Z!iP0Z5)g>3-BrxFD%bMB>fWgi^OrrRPv;38@tFqjzU9>FEMQD#W)i+H`Ivt{q zo%6&*ne*(mspwC~y`cKi^olty2Hlo5ABlEt)@o@~HE>E~D97m2d>l;+5h@&2Py;EQXKi6A z2Sj5OM3A&_1qo<|ls5Pr%VU1f{cGn%JZyh}w;9P%UcL0?X6jCLAS*v?CBhumrtbx_k2V__uN){jkv z_pw~rG7a27Nag%=ZC2C)dZqUq_nod8z3BGbM%XucMckg8#t-Wqs{GIym~T#s=~!Al z{4}qnAl$U+wt9P~QAc|FwTfEJj5*bW)EUA4NHFDR~fB&Kx6R zMyMMWTLJs6vNFEzivI0S6u9OHs}&pj9m&-;{J)$*DlkDlN^9pgk@B1yEXKz%UX6u! z$g1j|^Gwu&SQo8bws4ehW0sI0e4y00DB;PkQXF6ICM()TZ#jo=>lY-rs}Misl_cds z(w>n&r-*c7Rs7W+y(w=8Jg1=ZZdXIMafX>nW$;O^aQuGN!ADQiL(#yV^6erqQTm0E zPMScU+@ed;@0TglzN?vyo|qG#4VlZy$bn1H94WQEljHKS7cv z{RAGuiCI3<{&1bc&&u9alz7r#USjTBa6M*#x_H#+!H0sYV5z}r(F82%xxI^MHL2TX z_nGNp-LfUuM4j(xIT{EwtaKb6V^NgEaVJ7`&&bcUrE7UZX zgFuI-6+-w2k$X>Wk97fle&c5c1&Srwh8YSl8gdA4#pKyC6uQ+?1nJb5CmlgUWsxD* zP6)FlT}-7oz;+~ShCA*J=D)!?*j+s5X59hG^NbT(h~1-|?MO}X71v{5dFf7QCh?W@ zujD8euIhP+){RIZ9#pFRMPv zBf${Ng^NQ#8cH7G$Yozgr$^3#v`$K1oz)Wq{SBVd_i0BG_1{p@%SXFH95DRfM&^dh zEo9@ehv~V}6md8R?yt?&M7DT^084v_#FG)=A%*@amEwLrXIA#UwtR~qCBDny#Kg@9 zL7DD{=iYaDq>AaO#&aEej~0Zy_dJ(HEt|`ql4AgCbx0apen9foN!O8RgpURu0*-Kt z@r8;#yR3MCaa7w6U16=rM-S0==}ag6&f4n+d_Kg~#{x|hjU#{!4!WO<|C`cnoIH~R zMc@J{;AJW_TXloxqHyX&;R~WWycF46{lY*w?=NdGn&s}NMjf=r!MqeTA8&>MDEao3 z3oYa1XAbuzfmrvPdPRqL0azBuDbfJWW2>O(KnXlFw8*cT_?0*%x={e}p%JRYUJtmJ zIJ_&GO=CHDR!nt|*4UU>+Vh*%q#4NFjU5YUcUj)Qs-dre6K@?t)Jf31!4`-wlDli0nt`GOR$$aw zUN-a9{rs@AR*WyeXS{}co|kXCOYvq9kIik*wdy2_02Fc^ zRtQz-uN1D_h^n3#SW^s`kSK}<&W)3D2FT{=z7gM(5r%TpSM*<%_6U7H*ZBZELL&SR z*fu82|8s`cu0E-$g>J18uf&~)$|HDr{?i`WE2xdADWX4qnuzq4{=rm>lNeO-e$X?q zE4UHL>GG;=`SP!f2n)SsPp^7#tdfmkjoERywWK!%WSR=X!y&4cD%?-I1mqGG^9zk4 zip51W=H*=}cMw64b+!U@(+OlzARz~pVrSaVSDEdfv1fv!mRakdHKRkK2tRJ#mxD|E z;TlNn_N`rcB&cybVzyVZfh>{qLPb*dRAHAtQ-(3Vbc8FV6IgFSfV z&tw)`5_4Dh>Rks0+Z;GmCz}o5D4UVP=3j!6e}h@}6_r{}SgL)9Dbf6M^7+!*(2tA) zs1bh6&{sE1@(-VJq-*C;rOrSh#XFOGgI=Pvo&lenIUm%xi4r#Sj~GRk%dF@Cc`vC$ zM$S(Y-1~r;VFMh`EbF~IBhb7#-zAxgO@!^3z8$)7I&R^FZrVd=RubomooDOmlBkZ1 zrKr=_GYbbBjG#$&f3L2Ugl}4cmh* z0>%lJKxRH1Zg0tnPRK%1b?bzAT23DTx^I{>+`bdTk9}$o2IqT#gU?n{!xsWWuAYts zUgILe*iFD>uA;2a{52*0h>1hSdF$x?XEI3-nb>K&* znl98)jhUTUaHr{&aHG+$MR469PC;DABAzzVxvuPGr#~9-J6zpBMWA84kO+wZfJ!EV zu!f3ZbQyB#DaL+5rQsZnYAUwhgzne=x3l;RkNd1&-K@7?H>YUM5Qb`V6yBqneKFO! z*g0D~cOJ$ssCC0W{t?-Q4kc&;>OFclPHLmfX_MnCeULtZ4*m2$SyoH^2oTBwNPVUR=Beczrr9$R|=BHC-S~@MpDpF zm0YP1F5Qt6c3e)bT5>lRx#Mu&!zinumBNu2jrCTD{BMurkd5Uz5=j3V zg`g^Y+wqwrtUNwAKHo0drk{AwXzH`ef77SS%SVWVq~M6WOOUsGSxdDSAE>4n-BW2l zn6jG`$iI^Q+Fa+X19DYW@{?|D*RN*9xOdE<_I5-ir$BiuAuixe1 z{O7aHjHuZ}d#m1Kph!d@H6z#54L+!#RufcE%2CK>&~@0tTQ!9ZkUz}|BZf`M0n>Eq zgI9)=dWOH-!hbyf5c!0pufp`1&osEIK&p%~l^kPv3`|kJ>%jL*<@u_+BeUqS(8Pfs z#Q@Fs53xTw8vKnaHY*UpA6EnV0*eivMTcP0Oi8g#2%ZRFmg=^ySyqnwT+6<%9N}PL zG=m1Vf1F}=3;TJP%_8FwIcO*vqcd?Wrk}5+2S4}o<=av!ndAf(#IS(Is?VLI;(}iX zWeeXR_QLwB;F9Vy|JiGN)8z!p*M{VQ>9{=QLLEOz`ykZq^A!m;5S$t-Dio<^+_&V_ z@pN%(!Il0~sJFbJ@EXH}CEiRe`>`8w3i?giaDD?YdU#vT`$y;mYZq$UH#0(crYXJ> zj;?<(+}sQ~X1bi((|sgO^XU9+$M}*XZ}>Xcf%$?#v$gSz>}kg^Ri8YN4haO$Wm&GQ zUQ)v>r0vZaam3b7n{ex!6mkYjG$NvEYad-2){1mWl5&rOH%hmA;&)KB>ouvFshC*& zUIPPm29PLinx8P#ye_IkAnd01^10SC5kb_Dp~}%+Z=h z8{YUF)hoBQZgOe_8OR+xH?{}|Ag)K~aly!^n8z~}8YY2UKeSgam@A8TYL7S1%YkD_^kwX^g-+y0WUSo4V;NgK2NJEDez9a+N*lk6)-vd-GbJ z5`358DvoyNW(yEj@evH)(hDf`oD_};rsEoc#|;!Lb6N6?Ev^~7;0KKjYt7k0UCwDc zsIbD6xjCY$3OX+Hr=V)DjdHk9GyJ*4FAG@Ub>DoBflDGFo;q32I=|rd!19MulrQ%+BR=NfHY0AR$Qzy5#kr(2Ln#B+Uu5 z>ANABIx7jMfQP9i88pIr1TN^r!gk8E7?-Ph|va#_E{BgC_y+ZINb6WUb@^=J@ZmX zBJo37Rs`0+0IxxwpgUz%$GWl-S$ilaY>g7^R&UH2IhQQwI?#)rOz=^QC8x9_^%{9mGPet)X#sQ3ex_ZLs8Dy(k=p^#JlFV7()IpJt1mPb;BO)&@D&of`P zWJ_&du)_jIlv!(rLJ_e9(9Y)J-tk8zFFq49})GV<3Z3 zbCZ)5Kx@hNx#0_2Wg1%&W|nr^sdi*tF#|#y9As&7Usv-t4)1945-6Y)3r9M{S{hka zxH_$~Gpf=zaA0msnwrk~_~I69kz)DPxkxzW5frz>WilOd?qO@)9(Fp*qUUhwS)y!X z0)<~k7Cpf6z*V6Rmxf{1Os3e1kgd_JAPjDcC>ai>%H{uJ>@A?`T9!po+}$N;aCdhP z4#C|C?(XjH?(P~K0t9z=cL}aR{v!MAea=7kzVRM4dUaQqbXCu}=3w^fs)jh~)QC3% zIvaDjy4$LiFNyF!lLC=I(OA^Tf7gVckfKEpN6K)`V4nQ#dJzX~IaU~Q3d?(JX;U@a zB}^KuaC#*{RWWE@*7am8I%qQo~HguwCaR@G`4hvpG8bgVYa-X2^H z)VutEP34Bgyyx&6(y`-KFsmz;s7k39R=%yi7FvO9){%d|KjcuLK?4y$aGu*ThaY~T9y?5SQ*}h=#{A-yn^r& z3P)_z3qbLkUb)`R%?h`fu4V=euhAbloYUZPuuz?}~D!;>3pHix_N)a+^tLD^u(vIX|DMbC-&;px+8N zoa~mhkPm?r_KnU}2fM%228MM6c#Iap5lP;X=btash}7N}RA|t!F>2{#@{N`zW;dJn z&QYayRm9_xIeJ$*Ktbx!1xCTEEmYW3Fr=>Om4dUq5eJCo!d5FPXK*)|BE(~a8QTyl zgh{N-Jxtu})Z!5uyaJZ^EO4nPFWcR#ujWaeEsgrMQW6gAAM~B6v^!+X2i#AmA4fGF zbJFL(A+mdkvBdqbiiUC0s9omO?Qkv^r2RoTXMDY(rOY1X7kJD* z+|cIafv$b^dy7~ge;d^g!)aS-_qen=?{1A-{%#=^A>C(hRWD$klc#`H&ZsX+Hqh_W z_EVAVM4Qh-;W?Yhi);KK1oD|_crCtjs?nPY+rjRW%!)Ag02!s z2*L$)Ubo&7yrUoOt&}*Y!9T~pcha!ST$$lfH0A2T)R*0%lbB&%{`<*TsoxSy#5MYwO--?0A_g)GOgS<^gHFhv%R*mu~Ki7A8GAeY>7)Eix@;UXcA^gs8!(HQd ziS{I5i+6rn+iW&e`)c=6T#{WCK!Xp{&ek|yvn#$jJh7-{!@#1dm`mXiP!Q_(E;Ni7 z0hFgM+@@gwWVeFfFm~~btzAOKqrtk`KGGHUs9=t|C(vpRjnvCXdSJ$bueTRA_cACmgHn9~UCr1Y5v%8Y2~LAAA5UcWK`Qk9P^h8s;8 zPJko^^T4LJ{Xl@x#?Hm5Ka^b5^S1)4<=y0U6B7F_1hfSa`;;aQg6h?#)&X?;FRdE{ zJKQk3ov+TMyi#voF~_{};0Si>gEUGu>;7Ak$;13iQ9M8)Y0l&f+Rs<3<)>rt}E}a=|Ewt7^VIUMDIRQN;6S;h2(R zF&REzL7^WC7-EimhWR8u6o*ch-WkrCC-8(V&3WQa{DojEe4&&~mp2i7Xr^rpmmCC^ zO2MWoxeE<7Sb5VV-U)Zb*JFGo(>|qpDbL!M#p#zgM|ZaVkknluja;3G16lBX)r4Uy z@MN$T^3S{dPWCIW>+r~xYs;8LB;$R^&p#aG&EK7Ws){l2CEZG#iB1mO<>Z|nUb(Yw zSyuws|}QQb$ODe7{s3WZ4JpW0ElgBeq- zaH;Ra;GWwS$)PPqV7n&!c;DR(p^KsJf+VS}>jh)GRQf={iK!7+Ny=XeA8g#)p(2Q6 z?Uv3LpJsO%g*7S^ISh!jaTd`YeOG&*Y2rGQ(}aUD~M~ z99JvB7m)C0lX?i0U$4lU;`_q^;9L-O8=hrUE!%)&F|u}Z#pH$~@Jlv5t8xsNcy zcff9xU$g`+8WR!vhuKJUPO7Yc5O0a@QoGq39%<91XR ztn+SbxB3pMYluUg^NSwoU4mI7o(4x!$hT~aI~r@H=F3I77Hl=o+D_J|d?(*)wt%3q zD4-b5l2_~7*dc@3+&L_1ghI*f5&hz`kfZfTYB5*CUN}N%XFg&!{m(2Xn|iG86yAB` zBl2#y%CLO3v`&~6cH6BOSCvuiyAv63#_pw|DOd6@I180H*62sSP*X-QN)o$amoaiU zzeg2rjrYTZ=4ah$RCNj@W>a2a;Oc5f>=mi`8_WA8XJ#hW z_HW;3v>{Z#gcn=1w>&=3h?T+H2ouuE^U)F4QQZwZ(X#vb$e6@lZAWCJ!4PrM()y5L zIE|BcVp8(vaFu8AtO~SwBv+G>EE0x^2|yJZxtE4ZRdC74U4%H{S9K6OS%Iqbyc;FS zSR=<0KRjsNPgJu_%KE#Dsu^iS_QCOsw_?+;ZJ??hhn3=?IwlRxIzoP9=Y$i1L1=!$CnLEMNhmfW~BY&c|8jaKaGV1$qrd?4o3bDF_;G zw1j879QWY?t`vAG;GOX4XsT=(^Kk)`0o2+hL8D90t*q%(?nzcQ0w@y4$FE$L9cjfN za!ifPt{UZaeXLdrByja-iJ{2d)jMg(H@BxunhU1@pzk)?fS<{zrcJ&o$4avrkgmV5 zh;ywQ7VyQPn>l45KZAK^0UOwO;6~mnB*ya#PN+mBG;BWILl|Gp@i?KS*bd;Zk%5z! zdOz%NW1(9N>B7R{!9c^gZCAQC1}SwOV#k1QlYg(r>*rY-8mzZY4APiX^r#BRxD#kO2FoIG$WSKTwHBB6--kw zo5LJ|jfEH{XebW;|q71E6 z&F)AOPRk~)i18vGoh(5}$Y z5v9p21b4$t8jh_C!4PFJtmfd%B!CEovHZ@rTc~=8DT&JWFSiti$1P*bI}8Y@D3caV z;dqSL`o?@Fi)dX)Lieax&s z+*siogstIodOboyQh$L@lP*V_QNtj3b{%j9mwPdtkI-i=dztH4gQXpNUp_!qMg_rs%1rVN$sYY>~%IKE??v z)^tF7LqxF8srkDxB(cAnl~0JIoGsvIlHIRWHZ6T}7h&kkOy&+_N4sAQ&dz7Z14w7A z1cY);2E?`YWb)(Q*82tcIY}6^F{ztiRw7G0&yrOua}_5|EPt~doHo`knSJUq64uF8 zKE#SWUsg2Ku4QsI;cYz4LAUDyvG0~vAvzNk`hU!jsvtD z)IOQJlatpn)>nw&_*tU!u+ebc(hB<(a76qlOWM3L(yE~}C*ks$bX9(O^n8YbZ-9N* z{H${RbeCF_OEkTD?ec1Zz)OC^r?;K4B_%EVReTMSa=SPtyAg?i?odW`F}~TE0Cfh& zuQ(+6O+_8Ts1q`%OkE+dT24A|K#k0l{(JsbX&B2tQsr!K)^O^gRED&c44!@@u3|bB zU|TwP!HhiCHv)AV^TnQdRIN9wIGk?ebd{o)W1~WjDOQ0@G34#C;&y1~#<=qy3%Fen z=;Ly?`f}Pxq__grW&$m>=&yKlnl<~Q(h|JBgzW_-f;kdTotmcvd)C&sfD}a2duRmV zf$5%;15WW8B!P#lW4ex*8Bb}fLXe!fh^jv2E-h}w+VJq3J%1^J?M>!eVc(y>zaNEG ziUbcr{Okg8?%Pq0DEqSq(fw#VV($DM>Yv>uE@vw-cM<#QxbmZen z94m?ORZE%U!h&P9bgNrw;&+Q{^_}XyiIo*xXo{w+Pa8yw7+qvXrc75gKGTXmGbVpV z?uB6vC~dOYKnSCdCimxMk#zxz+P~Docw2Zrinhx{Q zoAuKP5?8R5b2q9%LBK>L%2DXuwc&Mz7Eu&(r&E@;cSe7VQQaX(W?id|%XK_vL?~@k ztJMlD8dTjtxA@f1l^3R~k?m-%Y)Y@N&`415fXDkqi$%zAdj4B)tHzA81J-O`7J|Dw zyWBPJkyGRX8Wd`uj#7v>=WH$_?iQ_)v+-uFYN`r|y`x6Qse&*Q7)kgTNpaa&<-Ad3 zpsn>aQq}1ksCW1o|Ewz2-Ub0x+Q8Km1$AGFL;*Oq0)N(L=*|Hg&jwHX(JWf4Gv(QsSE?^LL&r?Rlx@v>3P($>0tSnay-g`)5pD}Wa?9pSK1=EmrCW< zt^D4{sUrRnVNXX#lfR)z5MXvvp$C$U&iH(CV^)DhSc*Xz##L==Cv4RHNNOmTWHP@s z4c8q_Nw^ETSh$PZ;f_B^3Icb+=AT)|XgjJpQ9OGJOs|;VD4}I8Zjv#}nszFiKlXR* zkBX3;KM%fr3wpL+bt30(|FZrW=6HZ>IzfumPHui6)$M`2q^VP~%KGBzfLG!c8bkNn z6YRt5>l@tU|0xcwx7*{``PY$M4^pT}P#( z&$TJ)h3qxSsH2jtT~U(N_`PT|sxWm(*KT&0Qh4CH*a;lu;2qxyu=GcZsY8OsUIGVI zkf6aFV1D?^zB33;x`T}?eIu~Rm5(utS>Da*@4x5giqfWGSvd{nt}1-Pd1%YW1Iy^_ z+W^EOQ89Ri*UmgLoor|-rt$Y>xl@GOGuOsZkyMfkxTYZ#>zh?d#?2=b-oX2;4d`mK z7;ojgR{}N|f&dYH>@NhO0|NPbf8jge4?u|cppu1BqIiRK=CVn=_DhbJZ`@|g3Dw*D zkpzVx1OZ4QJ^c5+MG#<=zf?fNJ~ySmFkKN5uE~Q|#T22jV;CJCXA~5Ju9CE;5tnmP z+~t?ycUX?hpmW5HWjZyC&YExpESJ-#wW_RY*g;wTf(yF}V9cUzSxWsrX(mY{Uun4) zKJ=4rSquI~NxGYs2w%|Y?9wjvN_1OHDI=&xG>Dpm=>bU;nQlRqxFTRnXDT<=j5|oI zk~5iP(Kl;o$LZZj!?sjxjzz&}Zgkh6Hy$YCooQWpot>kE1l9|f+XZoiej+gSB%4lP z@GC4zD%YL{YB>Fk!|KS$@+JMyn4#&Dx4sfHI+y8=0MU02)`dzFHb^0a#y8)hUMbpL zrZ3ZpkB!=kO$Iuv$jr8-XNf&mI&sXoL9ZX zX>YW-_Ais^`|x-M%RuO_AC^AN**S&J*f`)9Qqn#4h%+0UHg$W=mt>2QzHM*e?q4)+ zV~6guP9~ucel@<%s0H4WS&A?>nVQt+#Zh@(7Czc-HOurkCsKNq9Hd*VJfDjm-(;$5 z3tn``ukrrHF=E-^M*+jCdhTg5lT(XuKHR3iq{?Vr&88{^fy(21qAZ{+bDCsC8i4A> zA=Yi8c3$#zb3!?j3sb*;9Z#VzO`*HA&fwN3*xdrDm>~U5jU<*Ej|44fHo*jcyUU>c zn<&d!N1{}w#BhRp*KFom-rJ3vpCsEV{=sMe;t3`d#n<2OkO$ZEX*Yv-fN)3VQCWk5 zDQEDMEH57<6a3f0u?nq*29nv5sIo;E>QvR&zoKkYg?alMP`_o1^`#!6||oVM(a`*LyTp^;l%2Z7gB-2@i}&F?##Ly>oh z+r$Hk6N&gmoZ%33n8T^$Omvoz8WpmisW%TRz}n8VD=Dl%B?wLoH6StOiSJdVfu6M` zCso46ZSI;2Jj+wwl9 z0pEv2Bq^(w2bcr*^vBnC&ZlMZ&r?k8=4u_Ym{q-Q2JvHjY_IJiR+ZKSO{yC}LRGsu zdA!(_w47Dh{i;|N$3(nE$P73jU>pxuTjBBQj8~h9I-lCzQ0!@7%r1@Y)+3txDGlAw zh7&q;kKJi!;?lu`9fuGVqOBK=j9#Spnb&1M1B2|y9?|6-N1v!_z+!XAEa*ld9oxZV zOs?=CKDQD{-e+*R8F9+0d)?Su(~_Qo-yMxU75=i*Dxsy{N$Nu%&5VtcfowUta^E)6 zcaf+z!5j{}H31{C*>~Ab1$CPd4D>%#cd+a+iXPL(-fgBs&3|r%bqFvx#M!B+UJk!z zlyd$--9sL&2^7CoFP4>0SZ4m)`}#Oxpir>kuI82FDS;Z5i_RUq?q!$hNG*Emv0X=Y z8ysigtJX{W7eVl=F|V2_#o&BSof~$SX-?b5CWZyvLxy6ogejF*&f;$I5%`_;1Kd~G zOXw9(qy0&69L{Ra#)?42cU%ik4P82q`U)Ik&5)bG=FO{b>(A(?q7gtyuOhD~VH8qZ4f+wp0^v zt^~qd&F3bo5EJQB+?G#SBP(APl(14R7WT6y)Tl17SI$UT%?I}1P z4o8^r9Mpd04-Vw0)+OpZ7s5P{M&}Tj*@m>=roi+*A+y)dQa@TSBZt0FJQigL>3R|38=Xa*q=1LiV%=M?+aAp4hl72T zJ&H zOP;>_s{P&dx5*CER%10=sp=7&0YJ7ZpC`}R&!c_Dp80!ieo@JEdDN$T;sKbIwP2*h>!1*}f#LuhOKnAG)- z)N$bQh#O^4^$0xpZ5XWu=P^VVN{qh6ar|D@JVo7_|J_i09TzB^O=!zHp-5c zsiF~*zI59uT_brEq8ci7H%B#2sw^b~i1C$|WR-@n?6j>k_6)9+Ht*LqoF|{^8t#iy zs71s@8>h*)+Kj6soaNLVzLwiK6XYIoC4@pYMBMGu8qmdH%KqK-jKamn_Q8weF$ng0 zobNH+yFHPDWKyVQVBzw|p;)bTCT}zG7CoS-qW45fV36(iJM%IeyqnW5zM+#;_J`}6K?P)o#4yZ* z@z-hx(X;jg_2P&k%GH**BHjP$HX(b_TH7sK&Epht;HW6V%>6Hbxpgth+qx&@-$!unL-FQm$QR{hI1CU=&?(6q+tQ2uKs3qm$7|BoNc z-Z8e#;U~G|T)VbCxrMg--27zhiA$pfGj5`rh-Xm-QFyBA6$w6+S=5GG1RgUr)2@O~ z4IB+PRC6s=dg9RzqLy*@44cskM-VRcDE843gkkfI!O?l|koU20hY)rsq^Va~L1%ig6AOM168AtdbTt<1{bLf^zYuTkJkWw#HyNc9x=*(*x}|nGZ6W>CcZG=B zKSCa;`BN#3gk;|A?QWR#BKIUUssD>dgl{XIod)0bqu-1eLho0Y3vIYKv!aKXMV11B zgd`)HD)92h;TJXa#b&?9wSv*#9EK~35zmS-46U*frU$`7)dw&Br3v&**)Enz;h!-= z-P5(_L`5}LJU2)PoF(KzHFVr^RdyG%k2Dq=?75H`JW>?x5uA`*mK2no4x!S1%h+SS z%bvU*M!~oSA@w6lds&NMW53+sUKJy=Sw@CN5eDf%`#7%fczvHS_~vaTMXvL0D9>Z~ z1U7i`8Cb2Y6+_=#T-Ok2$55Z4`cpQr;FLq8?FAOKTFJzH=ht&}36x6dg74^W$tKeC zSaZ8g!h6D4szc}NTbV+PkfeNwEM9oh#X&xvHNuBlbzmCMun!VbDpc6$^xlz2jV^fy zF-tzW8bjN8b#pzrr3#map~|wjD?^1C1`CQuH$oD69_a1?CU&C;Bn{>J2+o&bv!ue6 z7-YrSyZme=EV}u-vA~nFMwnwFd-~ESb?>MNX5w>W{JKPXmq)f|MbZn{;GrR~$2M9+ zBVUtFFZ}nSfV;wEqBBSGNP?kZAi@j77Cl@pkL((JBT~?iP5RCEeOUCE9#L-R8x+oO z7f(>^DWFlf6gq~}w8Rcmf8Fu3k;Q$n1PgTRUk+jI-HB-;CXP}|uKUXI=}`bk5Kr8~ zs_x~maEvf{vW5bj!pI4<0^!t>>ehbt9&W?A-ytj7$+bu9Q}+~R+jSfB1eW#psmFOA zLC1SxnC=%RUuT;Nso@0??Xf33tW9m${2i9x`G`S*ziEG_ZK>q96P82B8fhtLNo+0^ z1Zs;BKKTawGyF&|s`W{;@P6pKUxX4nasv_MQ-L?pVz#FRf5r|-tC3f3IqQzjmLS3K zWT-`rwQ$@g7FU%q80d(aYpCd}u)H6A9e!;8y5uDxP#Ysmzlh_fp#=e?Do(yj{EdM^ zCiVGgtwMXPXwr0IBwoahO7`%FzZLf;cQ<$6$U zO&A11%dyR+W5ll15A^{%1c82HR}}ORCc@zpy}iomLT!+;utn)#a6qo?fX^txnRa&`#i~6U^81X)jT%bl zQBf#>j5P~QN`09ACKDfUGiZc5xsbIXNa4C;ZjtwIxp z&4z}whtt6WF2N#~{3OVG@|3i#c2c}T$hH&Al}ri9P+YjrBLhXi_AxJ$5+W;YrX-yt~{*&hiw zAYJ_!CudTCBu~ESAa6Vs?0S^?^B0LOXca$^6;xN1|C(*Y9ys1xrdbO$%7%l|t3tE8 z1jV>1=2Y{aRy|ze3xlcOA4_e6*=d5u1i{xmP@RHusu7i+dQ_PD#YFdNo~^(Oipo}G zXOBVDSSd64W_yl{>??qLIcrN7oDe) zXOnGIIxRPPy9A+5je>0Lx^~JJxKwVbHuY$C$S5py2&J;f>;$7CSm8FLC|dH_m~3MS zuep`L0gL=*)|`#o`*u%vgy?>C_afIz&)nA)HUxfCPm?~EpS!eU`|cfc-VjqmM>&i> zD0ZScV#RWR`0$10l|RoG3dN7L)`x0$wN>{;ATh#zmg<5D*J#GIZJW^u5>xKGGx75tH87tpbQx-@q&URcyPk_J3QWWTr1< zkc8yY+C@X)Kt8JHUzIs#f>tQZ&=30Xc;H7Nc;mgZ1wM7?0!Q zGO)4#Q`njQjeoR1Z2V&%fcFm{VB$Fd_Wq%L@B;9^Wms9+{(txf-`_GHd>=M^*!;(z z4;uhF|M3mbW&vF8kG_xkpMHSO51GGx{ir`|`WWj!eg3fVqx|6m&^~m0jQx+k4>}7# z4-;TaK>aZXfAj#x`{U!^a}2;482}%DEB`R$uMU9L4}=q-`9tE5=l`Ob@R zaUcCx`SAOre2o8pDjzZ**YUs0-}l4c^&k2Fx*z`037D6E=pQ`)DjzyO`T?~zy{I)H zn%>OX6!7J=7PNLS`y2oF!{Fml@vn!$zoP4zSy-c=^E~3Esd%NG_L%CLCgnLk@5HbiD%+1Nv@8gm-if@VuXgJjvY{vC3_kdc5Df=)J9$ z)bM-Oz1;m$>PnFUeS0c+Au&3=`2KzaN{?_j-R=1b*pMst{`M5%GJD2ysaVSu)tPFg zjrACpGW^svVwOJ!`@KDCs0G!hV$am>;k!Hs4#v_GTs^75*w=J7~_ z<_;@E9Q~`Vi!g83q%OmyB91wAv3*xv1BV`LcAy)Mvp?Y-)A4=H#Q5IKNJvcI(5ihc z;wZ2p3WxS-y2L{?C-J4d8(c}78UB8V+1}5(;0ClqGpPq@Gb(m%<-_gh*h^jvynI3> zB4m6J-A9VA_c=A2>zNeUhEyoNGeXo79U}NArW?(73@V-QD}vI|pJef}p;t4_dO9Ss z)oI}ke+=9MEyyl-Pke`c%+BR+kg}}=F3x;eU`}h8MTfkY&Dhaw;O0Titt9a z*e|Ao%R?B^SRt2P^+GhUjF71p8!hm65v|15y)@a3tzSrM5yJ`$zYg!h7M!!C5`)1R z;ThFo601zBz*qFhtL01ky-`?XQA*KyI56~;G?*=u|w7|(35dbHd7Lw>h&woF(&uK@;gO2Wh9fH zWrvC`zZ4@u|rlQCWhAY;dM@rERy>VF@5_HE(<@zYcl%wTgLSo)~N2+$_djU$kUWzLg zn_Axvz;?t&lPOf6zRyDj3FqE%tWM0_#~<3kexs%|46XQLxpg_8twurOyXf{Hh1 zHO#d6;Bv^C`wsv>86qI3%WI~YE>PNc9lVuUGJUMP9dq9JBA zyDFElJr+^+y8;U(9*bGd2)O_YI$-)n@5T!#J>rt5B06up=&$eQH$M!#h^h1y{0G8x zJju}}3b}9Vu@{7*oGZ^h2VS}5UX^YOi^_ez(5;weRTjD1mkMb@JgSkX5v;?rJviqE z5up#;j#09=Xm?)Z-|@^7iMi&)vwTI3sEJiZ|Exi!Q$^9ZWtef+yVUq;G;>n>x1!+j z;NZwFKOQ3A4we^mX0bElQ=ri#wf5`poy0Kc@aiIjA0sD+lk%B#?`+6*4xP14+wwk10!Uil%YZ%P$9K5lfGLAlRi zU`mvFsB5}HqKJ;=yFr8EUiV8zGqC(7eOil9Q@0M=PYs_fwsV6FU-85XTyT)6qqHUN zEX@(FE^bw+P7<1{BInz-&L6U5uaa3AOhTf^sqQhFD=yEk?+=(ZGccoTcy^a27M#6F zf1Jzwa(65NQ7ij49_GDVyKV{g=xLP_R-T~F*O4!{d@la@(x zuOa)4SOh^191*grWEq3sXVYgu_p!+LdAYjrK~fmw=F*w#E4{T#_vz zD9Whpw`3-qlW6(P7LcSYXJw_$lhhifKyU3apAsK!c9?NHGEv6Y9kz>5CB`+SlV2k( zs8i*zyxY|(8pI2>GSTW!YJQH+!c=A2Me0cCslMV)Gk+)~Sl6o*{i* z^aCp@Gci!ST^G6Q+OFfyj6-_%t2o)nssufL^279cRm4m>-MOTd3 zlhr)9(@VrMM>pp0RqrncTI4lbtYkIlbV%dq5{SJz?v*xEOU2-zeXD19%n{{0YZpAB z&tvuy8N{z%4W~0!;$18w!VozSM6A}9B1c}kT$~2DQhvx-jfU)9tNp~lBv}_6q z_>$+H-at9ZuWKA<>{=%J1Y%`RIQ^bzd4sKlIA>iW0$-T5lgcXsyt#zwXtW)3F@rI7 zm7{bo8yb0roq{rAp;S^hRfvL+Z;B4jt+ykMfTynE>!)yJlHpAgNp*>s%B&2{q)7tn zyUI1?;Y3Mi9&?>7SU%O!ip${3?`ouO(9#}!Mo6o|ODpg~$FyNN!kJNA*YAsaFm=h1 z7;LXvZSit<$+EvFqZEd@oOdYJj``gTVJb4oF=AfoQ6a=iz-2WX zv@FE#q$kt2p44!Cudo!5nk9~1Y>MEBCKM>SfDLi-Lz zHX$*Y4;)RIvfGaD_9SQ>rhg-5;A9|Hv++wr_hG^c!PY{x$}+n?iCpKfux z?Q$=g>qOjK`-Q1mxCHTbqD57xxsRz6i9jO+kKJIEyvpx`#1LG}`f50PwbZ9o!YKtt zs`M>_<*+gfl}dG_Oci>QZ1*x-pXXN~5=^g2tH-9W1eW@3g*(=x&eg`UGus86)w$O^ zoQ;%mdfsv!>6~iHgx6hoG>;2Q)J-)SR$Sdv=k@&p@#mknIq2mwSJ3f%s=3Z#5OfKSG&B3$sRE3^5L&#!jrWI=iUcTY{FYx2xcFgL*Gr&9}I3s$S!}QLWidUP;AA zb~;>V;~__Q>pcXUppp zB~@uHTKaJA#!sUD=%~>aRZI|NI_(acj11DYgCQy&!o%jcwpRCpU|G6zH$=9A&-(O? zyrTZCNjE#~#7gaMVSlZY6PBzE*!%dI`a(NKN@xTs{PbRWQfSps+{nuX8cCtX)NRwk zptn@gp>t}k&a`tgUX0%f748&|R&9xSr#N-<=XzW+__oFz+PzA7Hs-I0cY%l6Y2uc? z5NIdjaBrNeE(!bu~{$9xWV)d~y^=DCrknP{u z*f{^UWNiP3#GhXPt4j8^HXrYRgpT%3#vj=~Sw5EI{=HVl$;`<3_sgQByxM=iDgrh; z!I{ew62ilTzyR7J zF#Bd?4@lA$2-r2H_Wzjv6TtXK;Ey7}$A97fBmJku833jQo&j*gNdW*h#uNY?P`Uzu zS??XaSSYJ14L`X0Fi=%HP_)Y;r5mNi4f11dQ)5Vm{K0($ zcsR5P3+NcoVZq8XGJ|CDu|>j6u%aB(X%Od7#a{4Uw&3*1Z07+-Zu(d(0b|8(jxah- z9`#q+jTlsFbCT`QdnGfX2sV_gOQe&?FwYpYXi7|b3aB`kg)>kn7<>s-Da?0;U^*SW z8z}yX@JM`1>sBa=#9EfvhVQ&T^9>`opq*d3@WmtEp_MHfB|&Y6&}vY0m-1rsnUoYr zW~%BDJpy~a#TV<_hkQyrGhJ?W5|hh(;Nl>pFV7Sc|Bm01+^tn&z<O29UZi$*`P zYlS{g)Zj0J_Ck(9!qxHxZONMwB}6nsOwoz?Mmcp=%KT>Dd`LuO0*1?-yjF&&b7Cb2 zVR$?;(IZa>E~P#L^ss2B%{C@N;nhb^|`*cz8sq8QSSX*5iY znQ!f#UWrQgLVn2YWWnkS(ZyphKOiU@Vt)`}$MrnO#7KKrqZwv%kf{Z@_9lK)bO(uL zyP?2bRwe_a9HvHc8euTev;7`QvPX#bo&x5srw%=>PTOpr_y->M#3bIbk{37R_hi`} zijCi1Ep61Mlm3{4q$eef9^&*e&ow1AJ2qs;aU%u5|lDGJ(+I^B>g%REm)I)GKo+1plHFT_}&go$VnH3f7 z2~1eKxrETn@^tM-q8fQY_734G=K<=k4h}-SIS!w_({C43Nxro8A*A)2KR4n6RdUFX z2n}n%)t43c;x@`YnY-L$*wu!u&~eWlPjITIjEbYMvGcK!X)M@S z<;j9PznQw#L5SITo8h|8Vkefdh5d#B#*hHDunJ?8Tku)`Y9^iq7xxq;rxHrU5*g@4 zN3AcjOShQPyKs`c=+@OiC$Wu1cOeI_Q2N;+DG|4*rvf|~)yX5dF=O;_%}@T&xfLjo zv)LK+CEFbu7J3Ww&SytNIUd|d#Nn#Vr{~OgzqzP$|K&}8CR_AJ=w-NKbdFb;+6Jt^ z=A#{K4^TCP8-5Fuug%a=vWLNmQNAg8?RPoexc-R>cgUPmGUH|%IX;P+&Shvg>%q3D zHjhgp7^E{am)?CyH+%TxxbhcCDp9@!GQc`aW6F|CS+yrS?eJ7`;_EMI3`t1}rz6VKC; zt{Gw+-Nw-trpe1lRH&ToBtx5?2S0Umx|ELy|?UPG7Leqn6>2}_jp&K43PUsjzu*c{bD2`rY8@*;N z$NpJZhJM>9?tZH1??bdkZ6RtTfp!!3PNOzqYzJ|ev4D;36)wIe5$=8$yq+dsg8l7b zauUYpE$%zTv*Nzk0@A|8Q|K>mPF|>`YeA=XrTUQEp0MzyijhK0XQ3`rxfAK9yia=J zZ5wQD7aepzwb2oM^o=FGAbu?IDrlaauHG;l-d5+f8%9k*^3Npg227n;5WB@V&Wx!e zJkeSZ;iBQ%``>SksabGJI5hoQGN|3RZ2Sz4wIf$R=Bc1Z;J^MRWEB4nbwYzV)6 zIi}}P;YQ}Z!mZ7)n||!JmqoGiFdNB*Hw1AO=KzkQ{}5Ze7xAEpvxSL2L)RM!(p89a z>d`)Ehezqzc8>B*Q{Hd+mUDz45=PIIY$b!!?i#V>i{8W!47oY3ousnf-6AwtL=3)F zzL>p~o(&GfAIw@t(DsHa#`#A^_pXZ;28vmOCOs`G&~o+8_Y0;-i9}~qX83KkQp|I> zKYM@|Q|`4|!C-?Jnlg;+Fim&_As4zuD%L9dDtemr^P?Bl-@e4wXFvVyHW#TGpQw;{ zvn8Dlz?HeE)_o4%NVxCZo1c2=N|Fv4mMS8zEQasGo60O-vFvV*2i}UGm|axDseRrh zNR}fP%$dS!n_nZ~cgMP5{atAOxZX6t^BSRs{{5V9c1df~9B92R!=M_EOs@$6UCR>x zP*FvE<)FJFG8tuFW`9pR+54ehDyg+reZRa>iB|ofAAo=T z)Uyp9SDb;AYk+Osa~N!+E+Z@kvv@d_c>OD7`45w|h(~VWxp@m2a3xJM2pO!Z4J_ox zdE>pEK{60%Dx@t2aH-L}Tmb~z7RhqqWvItzxcA7+J71((sl^`+^Blse_aPvrA~Mz>ot+DIo&595;p{O7S^)g(TSQNl5Tyk~Nb)^H5TkHITy`^uls3qnN9E~}SuUQCp&58m+RgXNNVu8*0)r_q!a zi=YKnT#$MWFG6AP?@xKmi@s2KDY*2W2LyxX*5OR^4A$+qEGcBFKd#v546l2X@(K+keraLi^!NElO7%*DSU&9mC+0%a}Wc`S5)772(1w@`}Q_@PQd z7}2K_Y6{2@U{B^^CnfL-CQS`6Ck>PGP(kih`SE|GBRE=7^TnJDUMNB9TetsIIN3s_ zFk|vu?)G{&X9Wd2Np==`X1-$4XCyLN-`kWhonmR155`#-IznC&@!aKcL7;s&_w##v zdvDVvb1f|N&0XR5ipBo+9`NzG<(<7uLG0!JwLMxlJ~&S}$v$}S(S=4< z%^|$(!b&aDzy9Wgqs0Ri51_Msc-09@lsuojTQbR#aKEIBwg_Z(=N-6Jw``l$>dkx4J(ZZgq=6pu!8oji^z0LS-bYvnE zqJ=k;i)q6cU`p9FOm~g2&3sXiEVsH7mCk8~oObVlRchCK$uAWUu^u3<3MxPg84y7w z%N7AZ3C7VXusGL}IC_&t$7K^QEpCe>Rrv6jfyy*q-oabSmUob;K4$;6cq|~~ar{WgcM~XbT7jv8!$3$r1Sj=s_Ie7;r^GdDvAZaDHhxw&+ zSzAnQCBRY&HNNpJb*uhJQMl9`G>)Iuoi$$zFly9AbD306$u7Uk{5@Jma!nJ?cE~9Y zb>j_E?l~x(V+UW?yyJULd6WYXDElCLHyl|_74`EkRv!Q%@#$wo*H)cd>oUvU*YaD7 z?ZsWGXwdjlw4^neSKPT-XAbVe7ECvQKHv^I$)SSsP<-RoWoW8e#*?SMm{Cojc{A}e zAdur1Q^y@)zWGS0x(sogv2lLy+>#e6sP{#PT{&1q+R$R2?g8vcVg45kA&tOnwEh|5PllVvquO91g zY(xMQ@Nv8)@1`Z^xv?2bbo#qB_#gGte{3LuNvRwP{C^_pdlaGjkDZ4u8eZ{$y30Ob za~=%dD>5Y1t_aP?kx9yyFMuiI7WKX4!nM^{uqkLFSUZu>M`t*IW%T?)sSI8GK8`$Z zq|Yzq{sB$!<-m*fPAM&&y5$^pT#S>WdZ{ta>wSL)jwqyGP(*RhH3M`@=Hxwf^BmC7 z;0`}Lb!UNG1-2s>{17=>l`b3`XXj$saNr(1Qra2ACkD0#It}&`?@^k5b8um3)QjKO zZ4O9{bl+aCI@E9`Bus`#Aynxf zAWesfMe+Xg6Wiz$Kw4d2#@;b!#>zW6gG%d2tF7(8gScwj_qo022*|za-A_~r@&-Pr zhXQ)v5AS! z;oKuf=!mVy@`qoO#Nx%44S#!qX-l=7z99L}S$a-=K->TmkFyt9Tiy8%jmwXR!IoxB z>~Wtr-%iGnB)CqH82s4c2A$A*m^h5$3$`I8yi1McI8Cs(uta1^k&m5F#-7B|@*;u9 z3JLbgC8o=ZxEmE)#X-M^k=k45R|hsS1^__q zzlO2PH!=mH`~MODIkt1zn+1Ezv7JYk#U6P6ZHm)Z3c&|0(awzC6pd)?FAFT!lrlwB z<(|XV(X8cp2y7S>sLekh{Vl>qFj3zl0{WcizTdi`(RC46WWj`@7MwM|({b+9RS$dT zp>obGbKt$D`I`=ro+cX+C83K3z)e&w8c=ToXI8-oyeu1A_C$cYKahBjc4@#G&cPY2Y<2t7(~|y;nX+etP5s<~*WbeXsI9V6D9+Bv-wMdU%~s5FH9# z@g20PE9>X^u|kogoefW%utxw zM|O@&B=v{l>W>6KW~fewlkI__tyWr;0kZZYCmuHDfpw*kddJ=V!$zRnryJd4E{XI` z^Z}rxn0zw2Hi^Wo2v}}ic3Wat<3&R?l3i{h^<-es#1eQpQyOJ^pGmFJvJFwcJ7%ab z?UzEO=;_hE_vb3c?y-uE)HI{jk)t(PJ#eV{xFJq)cO}50`ZBVmXgi-!MK$PDs!#&8 zc;fTZ;3B$(BFUDR3M$l)P(+{F5D7g336qLqW6IqYvLVJ*auh0rn)mns0HMjjsx2aH zKe|+P1BIK&vP z$6E7&>zlL{ZOYF_?OkV=wm_melHpis($KjYSmPeQ z;ZO~sUCe1~bva-c4PatcKVr-qQ_{*l9-q&7{D5bVgi=F;#d_I>AjzR<(Q^YlbADa_ zd!-8NLh=CDAv?J~>P3v9CY<7j@J#!;?9=LUk&lL|@>PSE*3#Q=$3tN*peGGgF$lf9h`TSBNKbO*-08DD3wd@fyb3qTftW4ZU zo4~kBfZjCs8fG2Q!!K%xZG&Z4oN>K*L+;IXRCGDJxM7Ts}hx6q9N}- zf@Ub*6{s^!aPgLP1Hr>DW<#i<%x&w3vws%iuf}lYFSUv5YnVxtlLbb6u+Q7Ac2(C^ z?2Rv=3i2+;ntbO5ppPE6V{VGY>|E9%-WOv|%dlmj2;a&TZgWgCG#Cw;oNN5^CE$GFJkjYLV%C2Z@1R&^)< zUh{Z!;{6rMjB*jRu*13Bpcz+p>J{)Bc*lc1>_Y^r=MpqVZ<`C#t|L83HyQ+K#$b(7 z9wK&HGEmbV@)AHJ%elmFD7lIhuSj4~B+d(ej@=ehH{uQ<*gkeqiGg6nV1bIcM)KtS zodvFw6OIA^wC(p_v;I!z#{hC_hEUC{WT0QDF9cPMtb{!EnaGo#*H^O-+2>k{^rRV380F}Y} zYY`vAYx^wK2-C#ERdQ{YhADCSc4s1kZ=QQttIh&zm00dsjU`Q!Zny(h;YP)iouf`U z7_Q1Z3pz{p9ei?~;l;1LWx%zBlrD0*R8Qaeu{A$5+AoOoY7q=;hbIiM42ZpDUJIv4 zO~Q=TNaBoPa4RB?rF)ehXhS!p7fEe!o>hL;reTzRI`1vzWZ-GXd3w6J{Vcgqss#Bw zc=%U#M)@nA_2fm_St&V;;!4Nm!>=pP+XJq=-_)#wg{ssJEa}{<$Nfb1R*h@}@sF&HDJ&foms+Td&dh!~?4S9Q{qxxzc5fd(f9H}~J&Tx5DC=X`(JrH<#+zUIXn-=uzBh_{6 zIhM#4CFo36wgb>%A}86cPFuodq&3Xq;q%j5_`(#Tf`W*2r;t^x_DBK^DK8557N{yN zrlPldW^=`*DTvk|0=2$?6bA6ET!6^7abo(*%FOqpuIZw@53Hh(j%`_2>B|nO2wMM} zp!;1RfN@Pp7Uk#zydr@y`Fj?JV*=bxe@!&F?jOdG623WVSAs;$938e?ck$PUoOD-` z5E-?QL-`V6*EY#t#q$vylOz6j25uS9sGPg$k4uP2m{w=6xa!#!+la^5-3hHpx4;`p z0>d6sdK14t#b;2;T$J_rl7Zdw8ps`x5XC{f{+ly_dkQxRC7X8eKM6Y-lji^&mE{eW zl!_{hX4plIR>9=M9zNm(sig+p+5~aDLKrrB@umHPCc3U*u2IAH)Hl}V2xnH55zEQ~ z-p_K&saOAQ8nM9aXKD6452L^CVX)}U_%b6GU`SN~jLHpQ4W?hn=3C~Kn53)n95xz)n=kkjrQ{>W=D;=Z{&?6dDY%d@oF zyzo51E0B~p$7ovX+9>8G^j7-@Y8x15^PU~E9F$;a=Nq;f$B6%!L)M?c;zNfcK(QhQ z#!5c_7^sN%JMMsxn>UYtj(yCsVzGe0~NePmA)6+QfjRe5OMjaHlDyD*PdaGz@RU7|Z${@n)FAy!Bi4HMipS;LX=*SPaql~5>w&jK(W>W}X zoB2JgRM`VstEIDst->BIxR2F)h8=RP2;tGB&UDMG2Qi5U1LT*}9VtL|=i%Mkq9vRu zf8ho7PY+ov3t79Y+rY#6MZ7;zAj0{fp*h1bemjlEX9nT2+rg}G>c{ic+ZwY7oO7lv z7u-487gijN_g1^L$}s+E4MZf4O#CxB9lh7f$u!JW>D`p1LB-x$>{c^>X<;v`CgMeb zhv83@`US7fM&wp^`xcTE6s8dMc0AL^_V4oC`q69aFqoHYuC_wO9*5b2XupSnOp_@) zx{EG>}q3BzwZeq3k1 ziE41UN2I)DE}r|m4<4nnLcC-phrWqh>~9piiD#$2q)FJwpV=Y1K|lI09~iTPSN^s8 z?&D@2w7Np7+>sP@f;aXDV+;6*rkj? zJ1rs~zTMG9uLZ~ebT7_-@+>FV%MNWQ-4jC?0c@wJuOs2vdM2iI7@Ez!`#cUQUa23K z9G?d?$7$U8i{|Chn~5|>CPnfb(?soO2)reJD2L7DBXd8?Cc2>tc}Qu@u?_3+P6#Pv z_Ys1Wfy(_L2SrslK>3!gxoJ_WP`lY#Ld z=`_A1lW~WA+lm&ODSv_-dH;UET<;N?QR(Bc+oPTWlF`AQI`_~nt2s#yha?x^Aw9D@ zCo28%tqOWzO`bRiA7yREyy!Ex^?XaP^Ue-BYQ6xa4VR|_eD8VtJLM50UNP{S=(sys zHaZ)sk0Q4uMx(uz;_7G|$RpD7frjp>OG>yHfRxidsJxX@U2yHdy=JGk1Y{?0?Yw}g zcz#9P?5+*~;wlOej7W63BYV|pzGuZ4d*mpOxb2Y!cuqBaB0xcACi?JgU?PFXn{G*} zHr2B5U5<1{*5-~i@FI&lyWxWHdKa0%=em9gp>_{|8OdQMDe@+SI`#}no6)lKLo>lu z%i_LZ`i5fF;aneiYd-zH-76P!zTTqbdbOI^g9U`#=9AkK)_LWvdFk?TNd%+B8BQHePttGv45lX{of$NW zaj|@?L@E{Mo&H*q-QvYh>yu)=29M=5&lQPw z>xg@LEhfpMGSbD`2sBm8{3rP|8zP;J<#ii-gVXDH5R|*jCODH$H{$|T+}so4GQX2& z7(yB(NmbEy(zW80eS63+D0O9v#2?BoPS+{IvV|EH%yf)+7r<<++|CANB!7FZi|C#z z={~xxQjn$T{r7x=KpX!Gk@l@`--D`jeC0UqVY$S!R6Av;(&#*>b0igMak?e6kudMn zo9nayt!)y`V6UEA4%)pp#6>g-Quh9Tcqwm9FxO=d1b>ABmrZV|(bG0OEX0zq0-1Yj z@l)TSuG)7#$f@9m#MpQAcHN^pi+_-C0RCE3;tzJ|PB^)>Ef?$AMoRTBG#JFRj?w{b z!P3HT8>kE|GEslz4k3!poKEDC)zQ{?yplc(-mZh5YllHw`cj&pf)$KcNk@gWz!3O7 z9B4_^5LOppB}*TKybpt_Uy}D>!?U^do?Vx5dF|0ff7g?Ce(6`gT*Lk8-aqp2xsP#e zr_<$d>38qq2mSH$1VypD&e&!t$#`r-Lq}LbF%Mxfef>+ZtsLS<12%mGELyR`wmh>R ze}$+Tl>{}VnvvM%^_sj;RQB9*(9o=ewb5#>&jfwhn2m2}ki4^*EVRB@^e|C4$?_N@ zU>5O521z^))fAwoK!}`!)-LXn6AcLCNo|Ci!z*tdx*>Mwa=U;}k)n)utYKLP8tE%l zh6oi0fZt`pZ@%wn_`(4gVa3)x>$iMIp*;X{f=|FZcK867-*iw?^xWX|=9AN0+Xm=O z39i5{uo|-As@wEj$qZk1`YGYAyj<0URJ0~mG~!S1fTMMrR$K5lh^ZQb*upxg#E8sY zczcr5YT|KN^Ey+ZH2GarpG% z6mZ&Uq>j|wO~2^f6_-R``vH5MgLDj{K)x8MMjJ%O6+YTn#4bFePCgm`6P}w?HhRo}14>;?YI;?w{ z0IksA6aP-JQH4pT$(Shm; zdJ+0a8Ps8-RxKv3T(V`*2tO>E8G9&khkgEN+#_EFA7q^e*If~)t<5U=*e!n8z8zsp zj}9HIMg%W5x80$2=!7#u1d0hoDIaF>6K%$M5h(H{sAroc^V5nmeyv zi`ZvVL@i0bEs>295z7#A9k!8QP0UMyKE0cJPbV#|A2)8Z&QCVoH%OL;n)j~y zAS4aARimPYTqK6cKA0SIp>$x6fh=(zBR?+QFnJYq^Z4MPB7;k zFRn+rVn>TD7%0finDQvP1g9zxW#BQJsMW6gYuvQvoRc*Cq0l?c4)UPp20I={)HrUYBM~~y0 z+u(u@dolb%?zUXvD7@i$wJdLFkdoz zc7#JlziX|}Y`#%pL0s~|6er#Ec>J!V4ubePABU8vxn~(Rvs7 z91MQ3Af&hE7KJjM3Knr^Swz$PJ(z$1?0l=?{AMb?qWPNpVfcFQq3)`~(JXhLBLEt>>yGNdUxXKe?k7scaB>v>8P4$? z|ChBMcuX)(P2{s^5s&)M+b*3_EkROX8L}z?X99h5Cb3al`?ARK;f1&yxuZUh=Xa-v01P&i7vGsyXQ7(xCpV zY8~A?LmfQ09l(~$@RYU*3#;RSws>^>PC?VLFJAHmLAV8_4jT5L>x5Sv?!6;19@K1RGI9j4RMa~%{r^EYqpDLdNj7D07 zTY+4O7@RrmrM4zSn=&FNyg9_tiyAZs2h!Q=WCbA@#z7at4HDf^I&ja$;c^jDQjKV9 z-oUzB?7tT9$SMo6^U>Ak5o=J5p5{cvTpc%7e@|#5@voRfn6Z>=v8bJbeOP|L_dgaC zm07&gAtqmzp(om=dkAXbqTvy$nIa90@oX8|qbAmR)i@E-Yl!yuyVdM3)5EZzhrsK; zqGY^iUHP|Q*D7v>#qGaaZnH0W$QWMWK32^oK>iN~br)G@{KPvKL&7^X!SQ&kQ;LcRyJ3dP z_~|d=B#^4jhi2(p@GoX5oGLpVhCgFef~vuI?NdQFr~8Jg%X*GPw12z7G+G?&8zEgj zQx7Jr0O}4{ao68+I}w@_2IWEEaldAC4lGvLMC&sK$`uEzazX&(avkRSEt0sTGXM&V zJnJEx4Fo#7JFnS9-7JsHFqz?@)gf|0X}(I%r(y_=W1MMBRureP&2&X(Mmlw-e2zyw&KdoAwDVw{!X6;fVW{qft6K?(!=8a~&CO17YL_7-rr?hm{GTMl9G%b~I}TLEbzX)GP8aKljDe85nLNZl zu2S@%qHS+n;gxkC&&)idX9Vv{_Vl&0&ZqM-c>o0KrYCjA0rvjC$13XApx2Y8KfveF z#ORb+Co#L6nCyOS2yIElf{#H)c<$XjW~pTLsIxXh7#E)8Mz_x)`v*6n^Q#%MnBnc{ zv-->?nFC*sm|K|=mAM)7Wjv?9ecI~u-+fqGcR^m!2gTrLw-?hK~}5%~<79 zrm~OPS!;blV7%vgtUd(tsHZs|mdLoRY8Hc@7$y)8c)1OFplwc(1+u)kdKp4uA{s3W7P( zjMH5d>9eU3eT#z>1FDAB&f!{Jxo&Jcpmt}11NgH+wpWe0r&LwJFhJ~ zsAt65Vdxjle!eVnL{Oc&lQ>jhfthwrLuvRLNZfR^0x8I17k3nSobDd%*!p~h>~WWn ze;^bVuE9ZEmD$>kQ9 zAV~VsiIX0F*J2O8z}r;lCVYv7(-kcNpRZ3ZtIH-cbtH;y2$)h}Y};cxvI`zMPjnr1 zb;%%b8X2&E^{z#XhQQLtbR@uD)G^Vt{;_HhnDGl+Jj1QqcP-=*?6uw7Tb-y6V9{*r?qtn zu>k8z5tghsBx|ws+_u=eDG_94?rV~TH~0(9R!&;Rhe)`NM#y|DCXNq52~&do9e|T> z&c0ZHy2iORppl5TScSH)11q>vK#Jsc$-Y1LmZw~*WOJlBtP0YtDJb_hh+#|9?tSY2~&wb zExfI+ueo{&eqYcXYMNW5%Hf6m@=DpXffwZ!*^Dxjy-@8USgH|qkekfXO~ikmI`Q$& zw?qZ=e_&Ed!Clc~<9*TU8$2&o;jOFF$lw@>g*n0#W>TC;9fbVwG?b#%Zze=}Fx#%gE9FgojVb@L==y>BsC5V}tS-VlItfE%Su|E54XQuDOh=ZnMVp~58fgoWEB<+`*^lmS>pSIK< ztpDp7gZj%5*S~aXxBe=W{v#|ox_)eV4Zk~1dP6{}ckC(0+4@SoFh6Q76AA7YJb|ui zVRiXFQ-%#g5P4%YLwG&HWpuATOh8z>s}a|Q$Vw^U)qR8`^_>l%;yYQemr^s{u}-}B zQn+S2(~fHqN`*o~MgLZYTj4~*zo}Q(r5%{kOGBkbj8lVTrTQvS5v2}EIM8#J;k7Gx zO!c_Dp8{XuECi#O9|!uL4v)ShuiHu+VRokEB`gA+O1BcSIJvVTn9+uh`c+<4KOGag zAWSdg5@YC=l12ussInEqf7jGEWhiE%ps}z#48TBCj&i8@bWsUooj1YX)sncRd+2{Y zhoz=tC_Bo?N;1t2Sf%N__U!iERdA%qF@6;qqmZR+Dq2}&mn5i2o;?|tjnC$s|5t2 zFmspu+N=Q-L(!c7DO{BgGk4Jy6yv+FK5bQHWErG4S7PrpelJI9Jpc>|54R>j&!rYk zdWptG|Jpsnj5jkqAO$qTvPJ$4HoWU;2%+$IOSp8_ELi$pBi>g$h|OWBDZ2!1r#pmqoiRHR3NnL zgI-#^kNhlU{K4iK{Csw@9=A_*+z;6?(bN+`6|BHB_XTaP0L{lzPQ-nBcLh$ zRA)BKhh&<(XW!6bdM5=L=l=pb?oaFIuDl5F2`#PPwhR1Qob{T%)+O;#Iz`s5$h7L% zt{Dbl4rkdFB|0V7jH}UD=*^sCFJ{NK*AYTr<9We4s6-%y<^sOkL|2F;i$s&Yr;ER} zD9Q6n7c?Evtro}1R$~%PKS;}wGdD1l>%l`urbO(+zVC&{4$zL(SsP1R7zY(Zek0#1LoI1E4ltzx9xbAHd*k6v>k>B5!K3e;5G z`@~8j=GO=+iDNvCiLIxT(JygVD6kr~z8*o` z`bq(i>x&YICY!r7b(%W={w+NgPW1E9KILkF4~NB9tDL{0DnD10BR%rfRI$}-PfFG@ zj0f_fS>M8&z94}f?7h@h0kb3)gjr^-CX=?1Rz09p=WQdb(l-t*WJ5sc==KNPs$o3t z?%+Tm3Q+%zgOqS^i?eA1;nVz%p#M7Buny@pl%vVWRPZxZo4Z#5@tLyucBQBGE5^-d zfPb6$e`8tvDPL0_ z=dn%cLYLfMc?{H80)wH8*oHsv5Kp+7>j00OM`nkqj3O9e&--^a-7qS1OnDyN z%j68~mMivY%=jRWms}+kHG~Nw+glT0<(=jbfNvUVsgs+_$}TjmC1+jzlCO?qUKfux z#aCu;Z+i;S!ohdfy=iwc8fLoVe)`7A;3-vJC@_y zI5izv4z_aB%xg|Jiy_khGoNNfMY0jWZW=I;3@Gperu}g{3mn1E#YxK#rMj?GRUNA> z@T``vAY9Oq*>euW^Ns_V6$ymV40vuPrT^LBjG~a9SKAGld?o%1vtU7Ty--J?@KFUN zd1zpJ)SP24Oggw85P%>>`e9w7Gq*ixh{VWZ19NBLsNI@N9=r%Ip{y>p>J{JG}QzgHekJGZjGyVjsFMXK+ ztQ6|!6ZxohYjOvX@G9I)Gbo)w=G_6twkp8K-T|crhM6a!77*}t*9IN_p?2VJVmIp# zuVMaAFN(eJY_FU_pU&R98qydb>e1mtREB%tg;_;yXR2FF5?pAw$;@&pU?ffl%glD# zs5DM}v>MdrUn6p5hn`Y$d*vf1wB+)=Z08%4-$su0%1cf(ORLZ4ztv7_@@uqqtOwY> zD16u-bgB-$26q+B$PGnR5+W&O~hE<4^cv@zj7sDJ3H zvXY$e;Jn3&fD`13u_2v8|NaTbYJCD_O7BvVQBQ1o6|~A|i=tBJghDrwPrg$ilaOd4 z{L{7=ylW+`lTs-ZtWa0gp)`<-a^pKQOlqSO)KuB@i0Kk^#$paG=-0k6WHOy5vO_0f zc)igx(qb!?7Vk-4+to`UklosR{RXCb+PHzTp(hX-t1YXkpY;uCrJIX%UF65pzbO96 zxD1;kDSASa1Yg$18`;l385ZtT?nt3P&#iFV#d$zcDO>g^e_DG^ouH1I#nCYg>wW47 zhyv%}GrFl4%Yn;t_yt-^h0BxQ^W=*uoUc|Uk@A~@Xt8MN+2wbK!i($QIWAn7vPYDt zQuPPQvU+aRj#U*TF&1weQe5y#R(v29lW)ec>~?@(^(HTHloW?p?!5YdHziJ*PeI>8 z@RQYdsT{hZ=XZDe4JG17>2-PY!h#06z{uWh-9u7!{I<) z0YD45UOcOJgl(%puHQJ2RyE&98L*l+>ShnPxNd}G^DEE1#%ZQT#u}c0iyu+zVqHtU zutHuR^JX@L1)i>`uWXcex_)--Dc?_Cj-TUn{0H-2zLk=X80yNSgO{SQ3z3o8(ueES zsFdw;>viC1DefZe@`>=H`NJAB{e4Z|Joy`4xmcW~mK3M^ciKBKuRpXuekupk^KYtU z08&!jnpOVZ;2I$8Hw6_FCZC%AcLSQi2xmQOj2)t(mKs9=odn%G4i9`7~GzjY2>> z4{MN7=djTl$bhEaXX_K`qT_&$-`#WdLbMr31G72J^(8Ks@mlxj_5w^w4!oOxHKjK*{K z45V*Dwg33Q3DN$_@g;%~d9W5gnhxEn6$ktxgH6JvYhgJrWl{MbLWqy`sVFS$;2AAY zSk>c73NV8HgqGqaO!!j&_2^zgg{MwXQWR4K8}|^H@_MH$J64 z46x)9F>IZI9<~lpTW(C-RENC%m#Qd$A%E)jEi_-itScVZ8Bl8^%|C7o?ytV(!h|LU zpE@0{E(VFaz>8_?RmXdij5BxCxq$tXUBuuVU?Al>!xE)LExe5o>drYh)Oil83DV;P zH$zkd2!cmEuh{rAIQ6*Y?6=(t zmR+>MoBXImCv>Yww5fG(xmbHUU&suP%!LKUz6ntdWF%*fE-IQdJQvVNk{GX2gNU3t ztoy7A#fHYQBvrd`DeIhHgHO-fs{a#svy|4Emj=$$O-upL8P`VM{O*|O5 zMlFGi2tE)#h@CE%Wx_>V(amFXGLAVV+XuZto^Dtn`h<7m$eWfFx|Nn!=*bb4;P3fQ zXpc`uQU4_^r`cv>pjn*Sg;Uhjq3Iw+6e59lx?QEtYmef66nhDUJ(SL-c082acq$yr zc_C#&iNhI9MNgC`Wt3* z1vx$OGSNK~SD@r@^@a;@VlMWLP8wIFj@mzK&a^*R$$Jo67TQFSh|SKP#DDu;fcJ;U ztF|eoXzl<2P7kSrNG_%CW(5WaP<>D~2H#(lwhnU(Oj{3BJaGvDyEV0^pGci{{ueUbeyk`QoU3}M6I}+!D$q605 zO#6ycIS{;h+Z7!7#$?x2%^Z%!FDA~llC(5}io&uloh_T61r#N_7KrMjik+-mX>$=hvb!V+BYI_D)I)5M@Jt_Zn3-3BR5nhc2oRB67 zIcnS6Ng?%z=A*RFulUOmKS{*RQgX(vGVuFnIN>t?Foo$1KIxH+xf@HDOo0G7*lC_ml$0A!o_7#O`9{{lI2tZ)&be_Tu;-rdl*+gN+C(0 z6N_g;&Vy2(G1Nf(2_|hci~caqizW91qyz|UO<*g@I%e{rYLagPGfEiwwe2#yzXgXe z!^s}ay*qyW6Y8{sY+=~7dtzt#@yfDR0l~D>9Oa8{)xE3cZY({QXpQ2o`mf0PS8k%~ z%WhafB_^JF*4UB#^Kp5~x8F%F;rwBX3TZCs;BR19_2KTIBBvp`JqOVraVI<};>JT4 zOWG87c1`0>Oh;-bu^=|)rkz ztzb+n|J@+{|4|ACR0se7IPm`{1^fLF;6Hx&ujhYy|6inF0v*4kb4>iw#0dBc5>@Cg zCq(+cApDmUOhED%Y7UKGgc)Lg$)!U0#gg#ym+b$Nf(g$4QpvgZ%QzFxFZ9&))b%u& z#G${?{69*;KqCHA3I^JXm!5*}^4c*!_ZCj01~Do}B-yLdd**x-5+@D^jiZ2aE{`vw?Mnr+>&ZQHgzdu-dbZQHhO z+qONk$2RwP-u}JKC0y+1yniG4K1i7O@ZtX9)>^2BJQ zN4)Q1o_EXf6=2VVpN1jqyZb5p zAGaVNLgc(5;e#?T{j3+lH7Vd`%7EhW}PcxWmt1i z9Z`pk-UBT~>RB=%AO!uYj@iFznbQl{&N+dPj=NjI#`0ALDP2tcN9?@l64cK zDzMrH@<~sXcRU!qt;{9IYRZWU4y4qC1C5J4ExJH^QS%^QwQSd(BOz&P@f#b3b9dque%0l3}i0z5-c>U^SLv$jI$st~2? zzRrvyM5t6FjzRahf_~t?M*hl-zF+mR=Hai>2);PHL%P~;=cc;{+KK77YQD7e^KH5# z|M>Y=Yn7#|()Zo#&d%8oRjlEi6#*d%(X2F0u3XNnCgI2NMPL_Dk>|VP@C)isXIZlK zni!)#t5g+^2b0=^ON!c}b*BTr8hz+QA%+WdLep|s(Uwv877Lt#jQcSft4v1ic zlGbU!Eo)UgQ;hXJ{3yI!U5k1qFy?pnnpAm4-{Lz>@$IZi$njagAE-Sz$XO51%) z0AT-4<~|G%_E82|xeW@fzBil^2pAsh^0}Xi-WBtq{yf`thQXt9d)X3?^Y`C-30q+B z5RY-+o;n)pH&dRc>8b~x63_0Uo4H*w@Ezsy#TzxMZm;wAZ|BO+KgMl@ z-McV7F4?nhg#GmYr~TXd@=po)f7BO7j{hq?$;AHev?u?)M+@WM`t#Siz(nhB{nDZT zUqY1sX;r|;!obP&-|~|}5@JmMMt~B4;jgSD008p;G}M*a+ z(D(QE-#QWf&yh@*Jcl~ufTDNGPS75!Sg{1fujdp2R2Vpxa)^vVy7~C@I!XYXe%YjS zHaN8wl=KUnX`~IvloX!<-1W!gBPygTRZ)|%ymRYMR7qny_zV~GJL8wPN3IxI1$;$g z?Fp&UEKnkWMc-*vODUJVb0NI&Xkh#22%wl+okkf*x*F>{3Os)uH{C+P_I}UPYaO_1tEkXNCQp`9!bQf005zR^ zOW^I{&8vAjqLr&dM2(zDAaj}lSj64j=Wvs>83@^1j8Zuj(Au#VMG=h64*0UYF$>uz zugimobv3sDqOyF4086E~wiVtEJn`N>&T;0Tif0s@yXk@ohJxgD(lGf&)>RV3z7$Qp z1ZiBd1)ieKo<=4qKMF@u)7;`%_EG*=IfT4dKp!-WT$=0ik^AZ3XmRa@>Vy#h+Y>HA zw(AN-g*`38^vos8Uy8pn(t*2zxQwiUPA{-u6eF&oX!!Ep4=sG%_kZ{Jt3(QO$0ORZ z&fv}2C_H8cB!MlCR1W0C+y{VA$d|3H>Jc$pPdsOpt&A~jxlF&3S8_xdq^~Xl8G>F zS)7U@ZwSv#Fwtwofy#ip>KUfXQ~6#psUI zJ8Nn!e3=HCE&|0ds%h{wv(c{C9Q$q2QE!0K7UA#c_@;22oy^@JK=$gTKtzo6ZIDD?S*(yO#wn}WlL7JXFw1QLfXQvI*C5D*;&KIU-+LqWa!FKdB zTQ7dJ3cyk^Z@LmPRu$L^M#QcQe*(4fmo{p!R|DTIN(b3fBwdEK~ccT+G3Kj=*J zzJneuQ3=qVRqT~Rew;%|aO)IQ^vguJ*}m+H)}QY5&4^Qzk&rrn{*?64+Ff$w)&UO{ z4FQD@wTZ^OyL?rhRQIpJ zn*+*wQE0yL`(%-Bq#LEg-CDPxHQ}c+ppJ?Xqumw?E6guL7D^8wR;s*#X~$2WDp(T-nLanJqCva-E3tBaxC|W9qdvFcvDq^;}o^H9luplAB^l%n<6JR zpP1CPdiU1oY0o!OO6fbO5B=MuT9Z`2zrWYfUVY6+hy;*z}k2i{CYF(~+p z&D%KJO3Wib#d4E(>Wdqks#_@wwR-tD;>PTKj2S9lG!hYU@8lH?m9l-> zu*=XE`BkiJMQ_$J^(z9}9EFJ>{I^NX+i9?ey`|y`NrWWpE8z&CVZ~Z2YKal<_l-eB z90M;BJcC4P`J8WxW)G5(3V3#bU?r~Q5W8WWM~i4uPY`x z!o|0qVF#2Ep+dGzXoe1P&yhW@*gOux+c9doEOi?vdU30K&V%fb=@%WSt4Y?f$Akds76yix&Y;b9-!Y*gw2tH6iMC{9S# z!ZLPMfvPVZ)j8e7HG`sKmuaR>#`Pi}nd$}YvT49uw|mOoN|-K3sByMJm2A^{TL3iK z&U)(WcHh3YFb5R$k_2)q+{Jl20zU$?CG9(7Lo{~V)b2J3=Jf7cE%x}DVv5K}re@(J zva1*wl6~9Wm+g@W5P|^p-}PDTj@KdS-cIEVppB<$7&D`0M0!~kOTR}XymzfsHYs3; zhey=R0fM$|X2m%mSzfw1T}q)q$8dk`z<(Ps>hUN~3&Oz4LNjz0_9a2Z$fp~-z6K8%tJu@ixbGI8H z*3*czA*#N(0opNT+{kOA4r5M(i=$)Bw1m|RY>i|_ZwH93H~{_G72&o6oeN1E8A{-? z{~GX!)fyE>l7NDKMEU0F*pKDf!~WH=uSomwmqMe6@#PzgA#7PVj8--_Q+}-lHywyZcT%X?4?VA9s)%P73+75 z(ir2o!l;U6=(`(9eR~~nmw9J{P#9mOSC&#AE-bc`MO1(>JkY6?#Vr%nZij@s5jL+) zB~P!m_J+xiOW%>KocToj@`!!9??Gv!c}{pJlAY84XX^1b#mc98tPQk zk%OOyY!FF^c>VA|YyHuaW~hzE8TP>VZ!LK%)$1+8-|QH}`Hx*qEw5Q+_59FqXCkQS z7K^ckj$WP5ljpJb8H?fJ~YIV9N}k98=Isn;h9yQ zjAhCKw;)?FZo%U}u!!`KzvO+_QqSH&$xdlQ%NE}~LZYdh-3c^NzWB#ucv54%8B;jgXy zxx_ZFf1Gc1KSy?%uV=KL?vt4~&!=tq4{BCdlSQ1?=K;LtA=J(CtAu)w=wzbT*ga&* zVw|o9yxxCqRN|9F z(|Osw6imUN);3cXS8R%1Nr*NzE~Yi|dsA2Mb+}_}Mq=iJc1)pJ9rf+nc>d;mmqI0Z zu2(vUr(~TBsB5F<#-+m6}x1@oH+{`;`d`>7!pwFB|jt;=Q#Fn z$3`^ubhnZ&UV$K>4q#73qTv#DTa}87`15)H7c>Bxujw8rxarSO1LxIdlZqNXIL|{JgiugQHnF z{|TWPG%fB%gzHxlbjZ^9Oq3{}A5`?_@ScT#cHfve?@wW^yNi2k3Y)5fD+}j3M|Ivj zDZgYhyca_(0W~YIBw@w4Fu_D6zzztV&%YDBt`P;-z~kQ>CyhA5<6W>Ot8BRp7EEtu z?LXxv`GEvFkz-R92bN`7YswDsmh@fGm(PS@S_o6tsKg&ezeX62()Ws^PUO@@phs%* z&5(8ePK zBaLZwqt2mlVITU?2ihkfy2LtMMO1W1jEhQxXt;BjpzPRyO$KN`P5yHZSRv~G@OxHc zFmX=Dw{jR0)?7@C@XNwv)jd{>Ce2eK!`8}#S6R@<_io8ca|ku!iLr)O!Qz_?Ajj_m zHKD?Jf$g`MMsHE{SL@I*wPXn`DlnH>05OV;LsJg#m*vH=^q|3^m3*yAOQ)FHBx0Tj zrH9nfpQGL3Z0onsA8op5uWYDya#uT=u%NiLNK?wQ!xU!LG6KRU$yG)tk*yucj9IzU zR+8V_bb}&gj>DiAp))Y|W1g6G38y%mYX#=dd>GeH;tlJEHDwXb+&<)I@`XD_=yX=ez}d z-buAemuX}299w&I9%KJ@GTY@bdYP*@;O~_RPnVcq?m^R}$p3uX^rG;4`Q56vCr0~F z1;0u!!I!Y&SJXpze>cNI2RS2;1E$$OTyE+kl z8|w@eipl-$ELH{SJyeXwr@|(+!YQHOn8E!)sTJzt8oMfGs3{plJj1?vV){-}a2@`2 z^3HHZ|JJoRHtlc~yo@K&!$-KPF=Bb#RLU(*eM;PjQxDaJ&dCxvy|5Me+7zB) z#Zf6yTY#ma4W2^6PcL`ng;yGi3z(8VlMn;Ds0qq1W~y8B3&k`svpG;G&}X=pKVgt` z2l;7Ctn#d@n4?V2I`L`DLaoBuKY^ZZc1A-1o0v`f4Y?6<&rRjnMs9Y0)`SW~MJD&u zQlK7RwB^FTUpdAyNxaf>0a#fF^PFYa+KPTmhYE&X3mM*nA4QO)p9X+Fq#x27X@zEczDNMXC9r0*)K+C{f(eAJ)3U{Y@o*)-vyAQP3s9YC(vhZ|i`aun zGg+Wvrg?#@ZzSJC7*AVv=P*%mQ)_Nd?{7CCi zcb}nGrAL1lqYH*5OTm{WNCOouSD)d2G6TbxjM{l&Yg1M}s*8IJE%7qA1A7XX20Ke( zO5X7R-{G+^y56d>M9bYK6EQw?SX2}?N_{623#=4Y(Zl8JDrUE^#3~~HO4j|Y9SWBY z^!1au6*TGJuB@Q<@BKH6LqadjY`gJS<~AeM63@)Q*b$fmU^wlg9?lWSGwed~5*|G_ zm(W9Hg^2L4_M$br;+xl&`D@ybm&i@ElbL69egxHh?=E)2ZqR+CVRMc3bQ`KAy=*x> z%Dh^4$s=Rbm{?_8gBQI`J4jd-8zvFpabL*`L@GBZxo{!5`m&f4{**1PeW@lrxRjSi zt`Ub1t-Q3$Fox(mJ-N{Npf@^^AyhXIGp=tJuw+s=H=wsP4bSRNkw9a8ez~>hBd4ig zQ_em8Z@eQ-B7S?osV2fH`BDA+JsjEUli?ScXUJazW&vlsL-KrU_m$zab#6r8_pV{` z!-O2cavz%PZ+m5}VH=Z}qdWvW@FV7zvt2WbQ(o}4wZmQH*bpBuQ8DgpjvK@GuyHxj z>?s(Q&RBT6_HMn${-c}ofUf{#cC7q=ibj)<$~;nMB&NZ&V0T!Er#^+sDxjiWbx409 zb)ghtoY(q17yCU^QtIAc{ZJYn@?NMaq(v>(P!_8k`s|U<6~}~WQG~BdeF{R%qaK0T zHv}xn^0|#GhtJkvp?ir~7sc3f#yx26QjgXM-Lz@tfC_otlIem(Wo$}85~h-t7^SUQ zd9tf)`=*nkIz>&1ErT?Ge~P7T+&nQ}h#p_Xk~Kmc2q_w+EMWS+$Mcbr*5A|Pq@qa3Pa!Psn#-xNE30+fS!^QE8(ctWRVfW zw|Zypo(vIrXNkv;+fJfP_<~Cfa92vQ_F3q=1a|n-o<-D%7YpUnqt1>o)^QU4n3RL? z5cYXu>T@ilz-?4@j_=yVB_4pTm!bqV+utU;tdqG0gXc?w7I4pZ?6oN38*!u-nY>C=w< z2{zcndedCN`YYBtHgx@16uB3y?(JL_XUATSSxD*3h|W}(E?p_z*MP}{pzxxLUjD>e zkAbS1=;P49f*7Bw4G)+BIbbEO^*3T45nRQ za+$!y_@%r!o|-S;ZOIiJLF>~f2w+e%>b*N@V4?~djh*|;rsDpDM3U1V@kkwq`on6; z#Qg-{AzSwd56wYP{inDe?KudUOlnbyiPpkZpdbNapaS^1F&LW!Q!BJ2W>dc}sR~Cj zlBFwnoJ!slJ3kyBvOZ=*ll+&Tu+jDh8#!CW1N7s@hdw(zY#JPp3i8*Y3F6`xgatX0 z>zxh5BhY~URsyLo2sT?K*&o!92P20MK0%E$5x}n)tweJCc|`b=D&UZHw)iy0ugbTO-vU zE#11o&_Po5Y}D?_yksSDXI^^aJOP?Et`)an0s4zd-w!b5b}S5!FYAq!!(*KSDSFKT z8joa@TabjI@4r0=faUaov>I-+hi09;*=L&SZyZ~^xaJUQ0Y;rJ$J`ArnhVw)!T5LI zEj#R?Jk5unAg6@fCt&+3k5y)AWBh*oh6{3iF@%T|OdnwYqSY+dTxZrg67gHYJEv)r zNDu(_?_xDRSnBGwX*UX`Oy5JUue*P=XfrpuoRJa!3=#pAzClMAO?7pyxHDtOhzp;Y z!=8Qqwt4imJ4doZFq4Yi!g=vn@Ks<6{>Ev3A#r#^VoYSZ^3;wO92HsmBEz!}5f6nV ztbE#Y=s}#V2|z4(4JXB*96)}ZFL9Pys+O9EA>p_J{tZcWZ<&*O?LNQ&=`9@@>JRTI zn*an{x#R{~X^TlxH$~E`O!htCOP$B-4CwGwno7unjp_CgOy=)$jNIROMeHmx6o(f9 zbG`FRRG$wfR+Hu~JBuB6CY@(qkBnL`r^x-W7P3pV8%b$)=XTsajuPYX-F|vRN5MZ9 z+>Vqkx&w!jiP~s`HnIax{~If->j(4GaIe$ zGbovV>}IICqj5|~ho*q-)w@7Q!8q`Q^Gae>zQNBLn4S@V6ZDKpRy*@J_&}80kKq6K zeKf2Y=XVB-2#wC}Lxp=zDJoU#Hkv*qGtiCU}nK4_$@WG&8(B?C#M{bYulcl*qt-Y(H7f{R;O`wlRK@)^>b-^yd zr31T32j(0a8J_g&46OY9-NbaGuKri-^hX{_`{?KniV<&<>1^N)Qq4XP6Z;0c{uK1i za>Y%&qa8nJW84z=SiV@|ScpKd{`K4VELfchIqe8;?LxlR&>a+X@kxBc6~i1pj-^?l zMen`|{M;QbcW>=2yo)jxd`#VZA2zXJH6>vtfpr2*Vx?Uw!uA=zP*K=X_!CO zx&KC);%AEh{x@#DTdR7pFNkbdaH(B2Bo>~76B8D_E-o;4NII4GfqW5bc5YOG%*mr0 zxM~nwV*oeg{Gm#29_E*5NP*AIZheKAKE7WtHNq%on@h~c$Vuz)20f$;81?CRgwJ$Z z_1zZSOjC*Qwitb;+PL(OS1TXS=mya|e(^RuB7!`9B8a{W^+U|gHk}+^B0nEvSi+7x z_azyWwI3_NL+bAfB!Sx^FZE07u|>TQXXaQT7*oE_2np7QalEaufRfI< zQrZ^Ua?S5`Nx|O^cC#d)56$Hw(`tg$*t5imt?y4a_R&8CcP?2@MgvbGBrvk?`C~2( zP!LTf%=5BT(k~u{_p_CB8Uz08g`Oi3dVr*1<$_R<;cfC>0&^`@Z}yj`HH`~#7YWPp z`we2$^P2Vp= zyT1M$1sQ2IkXHz%J}K9pra~cq^HOGg_PMwDHPIe2LGX52zbUV?&>=$mV=|dBlhgwt ztd-7flQB=H*_XK$3j2N!~FH{hA4)=W?Ns_hwPP(K`h;hJyN z6;p8Q6?p@xJE=KsqbVw97z;l?2q1mFFpe&nd#f0YQ(d;?V1$nyOA^(e+DgPu%@i8g z-^8h}{9Rii0TaUMHl6C{_F#8yx!B{}LntyWL$JR8VP+qWUZ-phgm~03Nssfx_$*$R z@i<<>7j=geO$o_%Bk2qB2++X?Pn_0>YWBQgYhnrow$cqQXPy>@C#ap&0h}k z^aV_nyuAykZ(lq--L}gW4UM^%Hg?orE%3Nj+qAL9pn&n!fy4Hk*xyj4-!40++2&js zxJhbX>fA~ekh@qs%OatxYC-Ptp->BK2YerzG(mFOFIaE}Wh__>o3@rF6*?i}#B+i>;Su-M-U84!Ane8g9$sAJcGm=d0$DX9j6friA!RGp-Dt+`5m&bhttO`a4+3dqJ6j?ack4pA| z16aT>DP(%}^;>=Gw$$oZk=nJ8?lC+o{2kEuru&M#Q`!_o7fkuHH$Ov(#;)v;Cj!h% zE~^WlA!KRaQs`4c!KH7ym#L!E_L2s`YeFhYnZ*twYXqZtyHs0E@kr`F;Y384&2at_ zDvH0$q9KRTbP?)leH}o(JG!8bWDTbtakDi|3*yE@CaWbf=lQya{d8b4?kg$-aP-7s ze_5q8%4WFpkcDl1-?qn3ji4RUElKtIf1$0?(B2XbWN{np*4V)^2Y&dU*-+^vCsqLU zN@a#<&Gv|4cnW-;2=eDZJK-cw^~kP&&%;1!NXa@I`OWKht^4)KHS7#+Px?ROjcGxv zd!I1kPRPeW4>0&mTfbrHY8No0->G`7B|5kMNRRS&6+Ed@ojzPWVK#ya`;}0_nYG>^ zaFzFs-(f6lScdpPvz`1-m88g~R~v`XH#%Yl1s!3OXs+3Iz5>6?5CPWnz>w=l^y?xN zB2+x^r4)-)Xvya3AR1HayYQZ14eC{J4dOc7=7eWVs%` z?`HaNnWMA(9wse%5O!RHIP8-vDx9Fi3@=7y$ZKVI>=Ab4&&g48ORJ(8(>Swn*#-1D zKuul6sQryAIwmzq@@UVx!1VrHmU3qPR`nh@la6L~-Q>b?e324&Wy;kOg6cfCrUI}38$mW3v!XZ*w6k!cNjORh!vF&# z=Zu3vh)g#|U55>Z^|ZZpC`d8BgL{V3fvD4hUvM<}^+|}^j+myZ>|0D({-qd7DiUNf zyvs>}`)v0y6=zv#+V0I?kK(nfD+_ws))%nndkUCr#3_Yo89d}Sd2Q)Kl=Kx2KbILC zlaHxiqnd;V6>lamN*n4x+=v_zo$=63@>xC%SwCjadcCH#p#cIjyl0A*HC+oQ$6>@bergoUSb4&`<9F57tn$O18iX7=OT)LH^krU;^LIgvKJVcA{ z7w*K-0(%~#8K7`wba?6~-vhMBw}eG-RTSYP?ei8bc#xCQI>0~-vIU;3r7JB3O()hm z3CsQ}D1L`wE)0F$uFYV!1j&hiWFxU*?)@l(3bA7ZJb4nm#M~0?`VOh8fVoJ-d>Y@` zpwXz*&q%sj6bYf_F+~y(PvBQdvb=3EaXutz`h;_anC+_xCfT-S%@m(ASL&#|CmfQIbm8ec}7FOzmvM7R!vBjI{a2;ZVBGfY z3zLl)YI57;bdHfk9k*GPl23h6mt4Q9JhKr7q2E%%GgpxLL8STm-LQ$3>=Pj=vd_(T z>?2zyxWdxvtRHp+Fz6k3OpqVUWgiyCpvCvQo`w^as@p4je%sX&-8xG3+yus1_)D}JwVm+9@+Sf~xqJdd2< zir`D{t2~iKMupQzPvN^qze(T>iiQ`wlCqf*s!e(XJA4g2Yf=uDJ83^4N;2R@=3A6_ z6F|Wq>7Ix-Q{nch9xJQ8X?pXjQ!7@jtQg*MG`G-@Cz@|RLii)|&R{g2RbP>)VX7+S znm5DL?sPT`7Oq2cux&=xJfWp$L@OdeVvdJXbcIngs<7}MGg)%{;z1cUNxOwBl z&Pfe^*y~E|5A{LcQFGm5cy9E{ z9eV;PACjhSXxT`P?dFCuWroLs@)a+Z>7M=ezvp*7o7I#18(py_JL9|Fc|XIQSY?f` zK^82@Q_A1z%Q31qwKAru2V`dyzUtLncV{WfEUiypp?wZuVk4BN%=EF7D}dODfdLtQ z0DTvtKs?j^?o1VJtI@ye^%w8Q;nHsIuPCi9wvQLqbqxa@IBo}g#S@qJ_m(QqsMQ|k z{_Zav<q-5heEfnnt{s#)4mPAW1xP_~Re4QbDg~Wfa{x z3!NhUh~b7JQTGa1J>DdMk_YO6U^bZ!aAy-mRiBGV@le8i!nj%^G$$$WC@$|TFGcpR_0*h%Tz4MqZolMBpEP4v>;U-B}7x}DrNF()MpBObcA3hHv zpjvZW5SP_JPVAgQ3HMfC)jPwMn}W9}l%0M8%`q4&C%w~mQ_^GHs9gYw>d|1yo1BlW zg@?+s^KV5*1m47MH5lE%rXgEMgThfO=AX1)neE8&7YHKVE@Q6 zll$Iki1*rdq=FaU-bpyyM(Xt(r-kZaor8xJ1;85=KDwSzqM8S6r1T37zm@vTczS3Q z)0{y8KbvC`!Qt&;etKgcLR;ua(%CGq=`ry*iy{{R_IEY=E2i~Q$hAP! z+*{oYlG=XdeFsJ6MZt>4tfiGf0DN^S@DPP`dAsw3KWN0hiCLDvZVId%0cgxHXr#Gn zCXPX^4aZTmQ?(QCTys0e*rBDK7LjULuYR!Z)w;`5{Jq5DDB93>2)RM-%iaUKmL1fm zPa9i$iEtR?QrY5&h zRm;*RgBB^(PzT7QK{Y#D7|~ie1F~P(_8zwrFwpnelp~iFcni?`HWwUN>*a6vo9G$%~!a-(Ac5 zm6VUjtk8H=FXc<8=mYT+Lz6)A~(=lBb%0IT#EX5I^DpqgXN7 z6Rzo(&spUc((lTSGm}cON4Qs2eJ{qnmI;9UD!@etD_m~plo`J9z{fC;(m$`XTq7tD ztG%Z`V4O(6keVNgyq8QZ(UYgl-wvY!n{xBnpBeW%p?$CNilCIaj3c$w=Ud zN4bF0#ZQ1-%kq_3e8}6#CIUV&r!Qu_RqYAyLII>-MPs6IPy*?79=h|PS!->haJ>Y%NGw$W->hyAIl9>$FL>|ty`~*%dC~FcL37;u#+Xu0r;`IX?S6Vldz`P^Z zwPPX$`#F+`b*V zPb=qIx%854U5}l3AF+ZvZmAOmoW)jUCBUG~9VbAczMg(;00BlG*d3Bq!d;OXVpb$| zgsVhE+0A(6qXgf8MN~_&E9xr{Pj0t>9x<)3^E0#83G6`0^>NdxNY$4%lY`%$mv(}X zxl!qeIv89e7=Y;1(hqD~b!D+>)8y=HMH0^zco*LG($1D!j3 z?Edi#=-46U*fmtJgTIJUtY*qvl6_wv%D)Jt|NCjcx0{%-T zbDu!ui}|!nWx;TVsOu0uP)U!oY}Hf7shlOpGlxi4b? z$(z;_4HA9_ACD76#0q#Bcm6wL9cWWPD6U>%Oa^HYY__~m0wOg?N{@Cg#l0KEVF%au zI&wPMpM^d)bcX`?tYZkZ`{@;SwhAf!MrL8vDMqNe1bc#bgz7<;0#M`5Krme#pFD5r z4(ll_9}8YUX1AX|)SmNvGKo136skSwYhACYgO+y}O9v-0xbd|JXk7pkF59UZLu4 z4RBwFF(il1R{>EWYGRsM(ZhgxZ}HBV;tMj}f=)&ky$`R?$3*g3>K!5grlBpJ*r@;q zqChn}S8FkxliLu5Ks1HL^~Zf_e+hP~T0!{zeyXi;S8#1NNaxqZxB6CsyZ%h-nY#BO zo(GWsbgqLcRLh{MJHF_AyIgPet@C15T;`{mJCfKqK4?g_)e^O@4PBXQFReajyczQP znBZilU2j}-U0l^w0|y+)wRk&T*J7~rM=di=fxqAA`X(hnclSlV(JU#0YFxp)_g->4 zw9(?10aNeLI^ zhR*h3qvU7cp*wC`|Ni}tmmNsJ=_)n8#mgHRcjNiPT~r|K3^Y5?Y(12l0+Da+CM2JZ z!i0FT*dBZqz1hQejRPvJIszP{WZ<-uy*5tl+q#LQ|Fj4_ActIovR`og=HQoBe+9Iq12 z?*c&|p)8V(Ss1R>>%E$2s;gU+dt7fm1i7IAGL$HCX4&{b&SEXo=p+`DP z80rTS(FuyzNF`?l)1k{RC5M}oM?{og;i3l7lTRox)lsmyWpSS*)z?RzOCTKGCSBL+ z6J7qV4=x8(e3uA^Fe_e;aDSbfB{rQ{9J`$8sR9aQR#lTV$e`l%`?wmL{MPX$dXllCn5w>@BGEK|C;x?{99gu@34vL&e5Dx&tE^?aka>uQ7 zZuI`F%k}214Yuh6V;jGFi)9Lc!a6=t|1t(SC2hX=4j&s)403n7VrFKkcCDX(c1+t} zD^>E}Ha3D;By119cnIeS+i2)s3~>K*_2YM^jGn#WkRSFEb+ebZe<1g3j9>PB^RLU* z_p!@Uvj=__7O45dTdM(C2A=iCE?4jf1PyN#NrFs2uNl#%@vHX&WgFs(taU~)iRLP* zHA61yblk#)cBrLSU!os+D9i5$yK3SPpfBn` z*S!~hbr*WG+BPjM?m0Yg=orYK2A=b@T%!SWqi1fd*VIX{kq->?XnE)arlvZYR2M3# zcZ^HoJ17~LkCaH-b8XD(Yq7OQMh(EO&V5n4MCgEqC!j*Vox;&#aj)fqjJvK;G;P3> zjgS%-_G8QGH4F2{?X4`({4(r&h4jl2s>S?SQVxY{{2kAr}%>|2y{Rw_e$WPf-1?ieRAMN^>N`@>hn5$kO}y!v|lg8oLLVJOiAet zuJ{S;%%alE3?4D|uRIfLB7c$gIs4cHzIuc3DZftmg3Ubfx^1qxEqH+^poPMGLem}n z4XfLxy|DF-95hS;j42b!6+@Ea^C3vSkiQ|pcuc*zf1%%XnxjM?1Ba6LG!scXOK52f^- z%)Tt-c-K&|sCW$KRPckZrrMs@Uxyd znpdQ?q72B@v<2u#8RdOA)%eDF!qsn-#dgx%ZqWw_jTPFy&B5rzj)BC!uBQae1YzAP zr56f(oP3s6@@#_!6TyB|(OZSTWL9R;lnA%y#ul%fkaqgV)-7Ie`A>+N^@{gbzf9}mGau2$J(ZgXL<{qlGxtOL<4z<4oG-H*s z;Sl>Ql))SM`HA~zLz=tB%~gKzgS@WO)NI|reX<$?qiJT$5Z=EIv`9YxaI%^t_2mnt z2jk0Y*PTr{h?jinfsziUR@1aauYOmFOr>!wPyC6%o)0%&oB2b3j1O0VuIq<3aO*_k(Z;5-r8S@FX~q>7mP*k`tT^7_f2K?l#kJyGosk)@U2Bmu+Z_f!3E*x}6oANJmV zal;w^H#7X-^Y%FC{}(mJ&0{A!cVfnxFQTDJmp_ex>GohC; zF}5%evUAt^hh)ye%tXM(!l6U2XyRn&;%H>z#KS|cE@xA0NG_o$Wt2i~b${AHKXIy(kL-^FPn#Z}M+i_;1?8 z*4asmq{JrD< zi=6^!Cz-89jyno4pf{IqXT44@cettUJKQV*L^qdb%;Uslj=rpnzVA8j@ic8n>GgAw z_qYPRvhVBr>E`&u?)&re;Zh0BtKhwCH*c4B&QGmx>U-pI7aoZ&`{p87WpZDt)zwi6|>5up6%+K9%8{#(QlM{Wko$r{oTKKrs z;#=FHyxq+QJ9M9i$Gc~OW}+97d+gHsBXM#j!XuyW9%Rp)80U{E!l*9NPOj#wZe@w4 zb3NH}&+Ci!U|hGku41doVnsFP_gb_W|sb62e+rj+f;|iLj z`9!y|9*d_8Q8$fx4P=jU9i}FS?G0!}3&}!bT3?Qd2JBT26VHRa@fwIO54}gtR;}fj z@3%vFv5gPQi(${2Rtx^-jpP|DE1KL3F11k{vX((d8NHfzq$R^3oIvZ;nj-z0W)N^k zq>7XfZAj78k(caI1$nb-t>ZjDl+)U;K!_0#QKEz89ZCdhVI&39E%6Id&lxNBT-TN> zPg|3Nkxj>{P=3`;)!cEO1dZLOmKR_1u6=R4;seR*5MR#L?c?bC%qbglw#lAphY@YN z3hOT3oXbK>`7WZTwapn~`gy4>V6y|r(LvX%Gv-r*=rT8-9bF8}N}ph~`3@^R?u|dU znEdjKV1O*7W)2t0o-^|kg?3p&7U^y-_@G?MADS=OQ21%xi-tI*N(|ajy12Zn4Iex= z7nS^yFJP@Jh~V(u@^-6jbBiFy37GHQ1{G0pM6>a!TS~=32 z<~J*nyUvl}8z}{Ah#;)76(d|}@u+_LQ%zRxQkPNbZV;Rp!!qgiue`U?QJVm9eTYq> z)ijan7G9qp-goY+$NOdR!$ucD{N3%VzU?f;;<;O#?%#*V)jvXI-=>>P>=>?B0Up(AO+*b)tWcF% zV$v{cOqABEp(2ckVrgt>cyRn;1y!qab6RRJOzIA35*{J%z^IHja=9?^ai6m>%@BC(Q2$?(di@g^Xf)6LqSR($)nuu$mS;^abB9~2El|C;im+6#6P zSB!!%PgSq_u8T)edp9OU4>Q|c$Y<$NwWfGwk1a4K$`7TRhnYwyBu(bw%6DTjDAQgt zf$V)WVCu4kmM2c(S&EKqIr$4-^qa2XkS^lGLg(sdCrx<6EPzv54UaQ5K1Cj~k2A!% z+(ju8EeKUV{`4*sus*6qx1}TZ!!Ke5JnD1j7?m|i&EBSCf9t9}s<;M>b%4jGE{M#J z+C@%OvC2w1P*u5N08Lh+w#V#k3duiMDDFj0sTb&Rt&57R#aT68c>-BSjDv#(_>FfcPtbyF_wau|P4&tSb&(9Nl=Wo(cp%#>7bmX~-=T*8k6M12uD*oSC z*iJ;?l+cHYk+@N%;`GZ$1adR*+jfWyFlJ#wGV<45qA!E>5IRU+G{4rZ! zqqh=5xpECbfdQ{!74O7(OBoOOnar7nlen&-gRN*C!n2w{=h@9`XH)`V`_$3}6xmI% z@g!$Q*c?204*vS90HQ6a3=-7|ylNB3X|q&+q&@kZ6_ZDs71>VZ>#Hk)C#T=@6Syvr zSX0X0>J--(J#kudg&-!2q=>`f5P+CzGAO@jhB7Cm5Gg<$!XG+WZ}{6>b6T+_RkNUSk&5`$ zQ*PX$Vu#y)($q@0cSI4X5b)SMV+h2QG;6&XQ|WO;>sFv&EW3n+SeLIH^d>etVTG=% zE?v@cK@7QDR9%?tpbIatU5Emc%pTf#d2}B*oMGjy6BX$5Jdu$q(X?s56L)F+*#c0X zTT#r`z@rkqd5GtoH!7;%lSG@3y^}62DS1-+W?CG2<$B8A@{Jgi}tu zEb`!av-_(f!oKS>*HLruRSA713>i?~trAw+efP(86gD4LkRu{e8D?NXW+D|{wiJXw zPD!%4oP}eFrH)bvc0X8AEAUDzlbT5;KCJ~7xNbgoFF>!Llp6OfF2IuJh5pjjnojFC7|@i3r$@9(N`HiFwj`bT=~n` z;^%|phT~=Jp=5f4(|O00h!jMUO2X1I2CLPWQaIttQ(2WYcs&Oq#|ZngRca|$bdv0v zXO2;58+LZ$Xh&v288*bTpB*ZY12Arm{NmNXoY8@RAiT}M+#04Kna$;VYLnIcFR8h% zOT#>n@=G$H$Or56vE?8iTA$}1gn%wR>Lb zZ&?KKXw8$ti7F;-p12v5Nz%9A^dcs4Gxo1lrUu|Ma>ANSh-pJ8yqY|!K0?zUh<$)a zoJ`cMI}u}@Wz0@hfXRNF>KmJH$ZhgT!5DxCInwx7Uy=_~=oIdbatM;o z{mD9Q`o#yyD-s4I?KC(AjwrT*yVIq&J2AVgogqpRmh(#KRQ|J`tn2{VFeP!h=|%Af z;90LFA!4H{B=px*x&Wfr$TrLntn*?vHnD%>%H6L6CGuow`n#yk=$4E&k*%@{QSu zSs6#mqi3QG1}xh{2nHkJoJDrrETH3H7qj@
J?&M&Xz#qhdrYz(1dwHV)c#VK4C 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⪼Iy=`2ZBS#OtgBpPj$=vsO|(RmUQyhW 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 literal 0 HcmV?d00001 diff --git a/tests/data/pdf/singlepage.pdf b/tests/data/pdf/singlepage.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8071613a04ca1a60b18bce0923288c299fa528d3 GIT binary patch literal 11448 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 Date: Thu, 1 Jun 2023 09:55:48 +0530 Subject: [PATCH 11/16] Wire up PDF to jsonl processor to Khoj server layer (API, config) - Specify PDF content to index via khoj.yml - Index PDF content on app start, reconfigure - Expose PDF as a search type via API --- docker-compose.yml | 1 + pyproject.toml | 1 + src/khoj/configure.py | 13 +++++++++++++ src/khoj/interface/desktop/file_browser.py | 2 ++ src/khoj/routers/api.py | 11 +++++++++++ src/khoj/utils/config.py | 2 ++ src/khoj/utils/constants.py | 6 ++++++ src/khoj/utils/rawconfig.py | 1 + tests/test_client.py | 6 +++--- 9 files changed, 40 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5cd1763c..0529b150 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,6 +21,7 @@ services: - ./tests/data/ledger/:/data/ledger/ - ./tests/data/music/:/data/music/ - ./tests/data/markdown/:/data/markdown/ + - ./tests/data/pdf/:/data/pdf/ # Embeddings and models are populated after the first run # You can set these volumes to point to empty directories on host - ./tests/data/embeddings/:/data/embeddings/ diff --git a/pyproject.toml b/pyproject.toml index 4aae6104..1750268d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ keywords = [ "markdown", "beancount", "images", + "pdf", ] classifiers = [ "Development Status :: 4 - Beta", diff --git a/src/khoj/configure.py b/src/khoj/configure.py index 448c8bde..ae49678b 100644 --- a/src/khoj/configure.py +++ b/src/khoj/configure.py @@ -15,6 +15,7 @@ from khoj.processor.ledger.beancount_to_jsonl import BeancountToJsonl from khoj.processor.jsonl.jsonl_to_jsonl import JsonlToJsonl from khoj.processor.markdown.markdown_to_jsonl import MarkdownToJsonl from khoj.processor.org_mode.org_to_jsonl import OrgToJsonl +from khoj.processor.pdf.pdf_to_jsonl import PdfToJsonl from khoj.search_type import image_search, text_search from khoj.utils import constants, state from khoj.utils.config import SearchType, SearchModels, ProcessorConfigModel, ConversationProcessorConfigModel @@ -132,6 +133,18 @@ def configure_search(model: SearchModels, config: FullConfig, regenerate: bool, filters=[DateFilter(), WordFilter(), FileFilter()], ) + # Initialize PDF Search + if (t == state.SearchType.Pdf or t == None) and config.content_type.pdf: + logger.info("💸 Setting up search for pdf") + # Extract Entries, Generate PDF Embeddings + model.pdf_search = text_search.setup( + PdfToJsonl, + config.content_type.pdf, + search_config=config.search_type.asymmetric, + regenerate=regenerate, + filters=[DateFilter(), WordFilter(), FileFilter()], + ) + # Initialize Image Search if (t == state.SearchType.Image or t == None) and config.content_type.image: logger.info("🌄 Setting up search for images") diff --git a/src/khoj/interface/desktop/file_browser.py b/src/khoj/interface/desktop/file_browser.py index 4ce9725e..d7071664 100644 --- a/src/khoj/interface/desktop/file_browser.py +++ b/src/khoj/interface/desktop/file_browser.py @@ -42,6 +42,8 @@ class FileBrowser(QtWidgets.QWidget): return "Beancount Files (*.bean *.beancount)" elif search_type == SearchType.Markdown: return "Markdown Files (*.md *.markdown)" + elif search_type == SearchType.Pdf: + return "Pdf Files (*.pdf)" elif search_type == SearchType.Music: return "Org-Music Files (*.org)" elif search_type == SearchType.Image: diff --git a/src/khoj/routers/api.py b/src/khoj/routers/api.py index 0c7f278f..7a79b95a 100644 --- a/src/khoj/routers/api.py +++ b/src/khoj/routers/api.py @@ -109,6 +109,17 @@ def search( with timer("Collating results took", logger): results = text_search.collate_results(hits, entries, results_count) + elif (t == SearchType.Pdf or t == None) and state.model.pdf_search: + # query pdf files + with timer("Query took", logger): + hits, entries = text_search.query( + user_query, state.model.pdf_search, rank_results=r, score_threshold=score_threshold, dedupe=dedupe + ) + + # collate and return results + with timer("Collating results took", logger): + results = text_search.collate_results(hits, entries, results_count) + elif (t == SearchType.Ledger or t == None) and state.model.ledger_search: # query transactions with timer("Query took", logger): diff --git a/src/khoj/utils/config.py b/src/khoj/utils/config.py index 76baa14d..7b590d13 100644 --- a/src/khoj/utils/config.py +++ b/src/khoj/utils/config.py @@ -22,6 +22,7 @@ class SearchType(str, Enum): Music = "music" Markdown = "markdown" Image = "image" + Pdf = "pdf" class ProcessorType(str, Enum): @@ -61,6 +62,7 @@ class SearchModels: ledger_search: TextSearchModel = None music_search: TextSearchModel = None markdown_search: TextSearchModel = None + pdf_search: TextSearchModel = None image_search: ImageSearchModel = None plugin_search: Dict[str, TextSearchModel] = None diff --git a/src/khoj/utils/constants.py b/src/khoj/utils/constants.py index aa10a4d3..87eb07ac 100644 --- a/src/khoj/utils/constants.py +++ b/src/khoj/utils/constants.py @@ -28,6 +28,12 @@ default_config = { "compressed-jsonl": "~/.khoj/content/ledger/ledger.jsonl.gz", "embeddings-file": "~/.khoj/content/ledger/ledger_embeddings.pt", }, + "pdf": { + "input-files": None, + "input-filter": None, + "compressed-jsonl": "~/.khoj/content/pdf/pdf.jsonl.gz", + "embeddings-file": "~/.khoj/content/pdf/pdf_embeddings.pt", + }, "image": { "input-directories": None, "input-filter": None, diff --git a/src/khoj/utils/rawconfig.py b/src/khoj/utils/rawconfig.py index bc8ef78a..72d82ce9 100644 --- a/src/khoj/utils/rawconfig.py +++ b/src/khoj/utils/rawconfig.py @@ -56,6 +56,7 @@ class ContentConfig(ConfigBase): image: Optional[ImageContentConfig] music: Optional[TextContentConfig] markdown: Optional[TextContentConfig] + pdf: Optional[TextContentConfig] plugins: Optional[Dict[str, TextContentConfig]] diff --git a/tests/test_client.py b/tests/test_client.py index e7087e2c..cee0ee67 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -34,7 +34,7 @@ def test_search_with_invalid_content_type(client): # ---------------------------------------------------------------------------------------------------- def test_search_with_valid_content_type(client): - for content_type in ["org", "markdown", "ledger", "image", "music", "plugin1"]: + for content_type in ["org", "markdown", "ledger", "image", "music", "pdf", "plugin1"]: # Act response = client.get(f"/api/search?q=random&t={content_type}") # Assert @@ -52,7 +52,7 @@ def test_update_with_invalid_content_type(client): # ---------------------------------------------------------------------------------------------------- def test_update_with_valid_content_type(client): - for content_type in ["org", "markdown", "ledger", "image", "music", "plugin1"]: + for content_type in ["org", "markdown", "ledger", "image", "music", "pdf", "plugin1"]: # Act response = client.get(f"/api/update?t={content_type}") # Assert @@ -70,7 +70,7 @@ def test_regenerate_with_invalid_content_type(client): # ---------------------------------------------------------------------------------------------------- def test_regenerate_with_valid_content_type(client): - for content_type in ["org", "markdown", "ledger", "image", "music", "plugin1"]: + for content_type in ["org", "markdown", "ledger", "image", "music", "pdf", "plugin1"]: # Act response = client.get(f"/api/update?force=true&t={content_type}") # Assert From 85144006a18b482a9b861c1b67468d4b0694ddb6 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 1 Jun 2023 17:47:45 +0530 Subject: [PATCH 12/16] Render PDF search results in khoj web interface --- src/khoj/interface/web/index.html | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/khoj/interface/web/index.html b/src/khoj/interface/web/index.html index 42831f5d..bb3725e9 100644 --- a/src/khoj/interface/web/index.html +++ b/src/khoj/interface/web/index.html @@ -44,6 +44,15 @@ }).join("\n") + ``; } + function render_pdf(query, data) { + return `
` + data.map(function (item) { + let compiled_lines = item.additional.compiled.split("\n"); + let filename = compiled_lines.shift(); + let text_match = compiled_lines.join("\n") + return `

${filename}

\n

${text_match}

` + }).join("\n") + `
`; + } + function render_json(data, query, type) { if (type === "markdown") { return render_markdown(query, data); @@ -55,6 +64,8 @@ return data.map(render_image).join(''); } else if (type === "ledger") { return render_ledger(query, data); + } else if (type === "pdf") { + return render_pdf(query, data); } else { return `
` + data.map((item) => `

${item.entry}

`).join("\n") @@ -279,6 +290,7 @@ #json { white-space: pre-wrap; } + #results-pdf, #results-plugin, #results-ledger { text-align: left; From e3892945d4d5b9b2f4920fd9622bc23807bfef00 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 1 Jun 2023 18:04:24 +0530 Subject: [PATCH 13/16] Render PDF search results in Khoj.el Emacs interface --- src/interface/emacs/khoj.el | 48 ++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index e553cd47..b83433d4 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -4,7 +4,7 @@ ;; Author: Debanjum Singh Solanky ;; Description: A search assistant for your second brain -;; Keywords: search, chat, org-mode, outlines, markdown, beancount, image +;; Keywords: search, chat, org-mode, outlines, markdown, pdf, beancount, image ;; Version: 0.6.2 ;; Package-Requires: ((emacs "27.1") (transient "0.3.0") (dash "2.19.1")) ;; URL: https://github.com/debanjum/khoj/tree/master/src/interface/emacs @@ -29,8 +29,8 @@ ;;; Commentary: ;; Create a search assistant for your `org-mode', `markdown' notes, -;; `beancount' transactions and images. This package exposes two -;; assistance modes, search and chat: +;; `beancount' transactions, PDFs and images. This package exposes +;; two assistance modes, search and chat: ;; ;; Chat provides faster answers, iterative discovery and assisted ;; creativity. It requires your OpenAI API key to access GPT models @@ -95,6 +95,7 @@ (const "markdown") (const "ledger") (const "image") + (const "pdf") (const "music"))) @@ -140,6 +141,8 @@ NO-PAGING FILTER)) "C-x l | ledger\n") (when (member 'image enabled-content-types) "C-x i | image\n") + (when (member 'pdf enabled-content-types) + "C-x p | pdf\n") (when (member 'music enabled-content-types) "C-x M | music\n")))) @@ -150,6 +153,7 @@ NO-PAGING FILTER)) (defun khoj--search-ledger () "Set content-type to `ledger'." (interactive) (setq khoj--content-type "ledger")) (defun khoj--search-images () "Set content-type to image." (interactive) (setq khoj--content-type "image")) (defun khoj--search-music () "Set content-type to music." (interactive) (setq khoj--content-type "music")) +(defun khoj--search-pdf () "Set content-type to pdf." (interactive) (setq khoj--content-type "pdf")) (defun khoj--improve-rank () "Use cross-encoder to rerank search results." (interactive) (khoj--incremental-search t)) (defun khoj--make-search-keymap (&optional existing-keymap) "Setup keymap to configure Khoj search. Build of EXISTING-KEYMAP when passed." @@ -164,6 +168,8 @@ NO-PAGING FILTER)) (define-key kmap (kbd "C-x l") #'khoj--search-ledger)) (when (member 'image enabled-content-types) (define-key kmap (kbd "C-x i") #'khoj--search-images)) + (when (member 'pdf enabled-content-types) + (define-key kmap (kbd "C-x p") #'khoj--search-pdf)) (when (member 'music enabled-content-types) (define-key kmap (kbd "C-x M") #'khoj--search-music)) kmap)) @@ -544,6 +550,22 @@ CONFIG is json obtained from Khoj config API." ;; remove trailing (, ) or SPC from extracted entries string (replace-regexp-in-string "[\(\) ]$" ""))) +(defun khoj--extract-entries-as-pdf (json-response query) + "Convert QUERY, JSON-RESPONSE from API with PDF results to `org-mode' entries." + (thread-last + json-response + ;; Extract and render each pdf entry from response + (mapcar (lambda (json-response-item) + (thread-last + ;; Extract pdf entry from each item in json response + (cdr (assoc 'compiled (assoc 'additional json-response-item))) + ;; Format pdf entry as a org entry string + (format "** %s\n\n")))) + ;; Render entries into org formatted string with query set as as top level heading + (format "* %s\n%s\n" query) + ;; remove leading (, ) or SPC from extracted entries string + (replace-regexp-in-string "^[\(\) ]" ""))) + (defun khoj--extract-entries-as-images (json-response query) "Convert JSON-RESPONSE, QUERY from API to html with images." (let ((image-results-buffer-html-format-str "\n\n

%s

%s\n\n\n") @@ -592,6 +614,7 @@ CONFIG is json obtained from Khoj config API." ((and (member 'music enabled-content-types) (equal buffer-name "Music.org")) "music") ((and (member 'ledger enabled-content-types) (or (equal file-extension "bean") (equal file-extension "beancount"))) "ledger") ((and (member 'org enabled-content-types) (equal file-extension "org")) "org") + ((and (member 'org enabled-content-types) (equal file-extension "pdf")) "pdf") ((and (member 'markdown enabled-content-types) (or (equal file-extension "markdown") (equal file-extension "md"))) "markdown") (t khoj-default-content-type)))) @@ -647,16 +670,19 @@ Render results in BUFFER-NAME using QUERY, CONTENT-TYPE." (insert (cond ((or (equal content-type "org") (equal content-type "music")) (khoj--extract-entries-as-org json-response query)) ((equal content-type "markdown") (khoj--extract-entries-as-markdown json-response query)) + ((equal content-type "pdf") (khoj--extract-entries-as-pdf json-response query)) ((equal content-type "ledger") (khoj--extract-entries-as-ledger json-response query)) ((equal content-type "image") (khoj--extract-entries-as-images json-response query)) (t (khoj--extract-entries json-response query)))) - (cond ((equal content-type "org") (progn (visual-line-mode) - (org-mode) - (setq-local - org-startup-folded "showall" - org-hide-leading-stars t - org-startup-with-inline-images t) - (org-set-startup-visibility))) + (cond ((or (equal content-type "pdf") + (equal content-type "org")) + (progn (visual-line-mode) + (org-mode) + (setq-local + org-startup-folded "showall" + org-hide-leading-stars t + org-startup-with-inline-images t) + (org-set-startup-visibility))) ((equal content-type "markdown") (progn (markdown-mode) (visual-line-mode))) ((equal content-type "ledger") (beancount-mode)) @@ -973,7 +999,7 @@ Paragraph only starts at first text after blank line." ;; set content type to: last used > based on current buffer > default type :init-value (lambda (obj) (oset obj value (format "--content-type=%s" (or khoj--content-type (khoj--buffer-name-to-content-type (buffer-name)))))) ;; dynamically set choices to content types enabled on khoj backend - :choices (or (ignore-errors (mapcar #'symbol-name (khoj--get-enabled-content-types))) '("org" "markdown" "ledger" "music" "image"))) + :choices (or (ignore-errors (mapcar #'symbol-name (khoj--get-enabled-content-types))) '("org" "markdown" "pdf" "ledger" "music" "image"))) (transient-define-suffix khoj--search-command (&optional args) (interactive (list (transient-args transient-current-command))) From bbe3bf97333696efcefb2750808ba262405f3d30 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 1 Jun 2023 20:31:28 +0530 Subject: [PATCH 14/16] Render PDF search results in Khoj Obsidian interface - Make plugin update khoj server config to index PDF files in vault too - Make Obsidian plugin update index for PDF files in vault too - Show PDF results in Khoj Search modal as well - Ensure combined results are sorted by score across both types - Jump to PDF file when select it PDF search result from modal --- src/interface/obsidian/README.md | 4 +- src/interface/obsidian/src/search_modal.ts | 29 +++++++++---- src/interface/obsidian/src/settings.ts | 1 + src/interface/obsidian/src/utils.ts | 49 ++++++++++++++++++---- 4 files changed, 65 insertions(+), 18 deletions(-) diff --git a/src/interface/obsidian/README.md b/src/interface/obsidian/README.md index 2bf24228..142b5041 100644 --- a/src/interface/obsidian/README.md +++ b/src/interface/obsidian/README.md @@ -42,7 +42,7 @@ https://github.com/debanjum/khoj/assets/6413477/3e33d8ea-25bb-46c8-a3bf-c92f78d0 1. Install Khoj via `pip` and start Khoj backend in non-gui mode 2. Install Khoj plugin via Community Plugins settings pane on Obsidian app 3. Check the new Khoj plugin settings -4. Wait for Khoj backend to index markdown files in the current Vault +4. Wait for Khoj backend to index markdown, PDF files in the current Vault 5. Open Khoj plugin on Obsidian via Search button on Left Pane 6. Search \"*Announce plugin to folks*\" in the [Obsidian Plugin docs](https://marcus.se.net/obsidian-plugin-docs/) 7. Jump to the [search result](https://marcus.se.net/obsidian-plugin-docs/publishing/submit-your-plugin) @@ -151,7 +151,7 @@ The plugin implements the following functionality to search your notes with Khoj - [X] Open the Khoj search modal via left ribbon icon or the *Khoj: Search* command - [X] Render results as Markdown preview to improve readability - [X] Configure Khoj via the plugin setting tab on the settings page - - Set Obsidian Vault to Index with Khoj. Defaults to all markdown files in current Vault + - Set Obsidian Vault to Index with Khoj. Defaults to all markdown, PDF files in current Vault - Set URL of Khoj backend - Set Number of Search Results to show in Search Modal - [X] Allow reranking of result to improve search quality diff --git a/src/interface/obsidian/src/search_modal.ts b/src/interface/obsidian/src/search_modal.ts index 5f88ff9a..9848334d 100644 --- a/src/interface/obsidian/src/search_modal.ts +++ b/src/interface/obsidian/src/search_modal.ts @@ -89,12 +89,24 @@ export class KhojSearchModal extends SuggestModal { async getSuggestions(query: string): Promise { // Query Khoj backend for search results let encodedQuery = encodeURIComponent(query); - let searchUrl = `${this.setting.khojUrl}/api/search?q=${encodedQuery}&n=${this.setting.resultsCount}&r=${this.rerank}&t=markdown`; - let response = await request(searchUrl); - let data = JSON.parse(response); - let results = data + let searchUrl = `${this.setting.khojUrl}/api/search?q=${encodedQuery}&n=${this.setting.resultsCount}&r=${this.rerank}`; + + // Get search results for markdown and pdf files + let mdResponse = await request(`${searchUrl}&t=markdown`); + let pdfResponse = await request(`${searchUrl}&t=pdf`); + + // Parse search results + let mdData = JSON.parse(mdResponse) .filter((result: any) => !this.find_similar_notes || !result.additional.file.endsWith(this.app.workspace.getActiveFile()?.path)) - .map((result: any) => { return { entry: result.entry, file: result.additional.file } as SearchResult; }); + .map((result: any) => { return { entry: result.entry, score: result.score, file: result.additional.file }; }); + let pdfData = JSON.parse(pdfResponse) + .filter((result: any) => !this.find_similar_notes || !result.additional.file.endsWith(this.app.workspace.getActiveFile()?.path)) + .map((result: any) => { return { entry: `## ${result.additional.compiled}`, score: result.score, file: result.additional.file } as SearchResult; }) + + // Combine markdown and PDF results and sort them by score + let results = mdData.concat(pdfData) + .sort((a: any, b: any) => b.score - a.score) + .map((result: any) => { return { entry: result.entry, file: result.file } as SearchResult; }) this.query = query; return results; @@ -124,11 +136,12 @@ export class KhojSearchModal extends SuggestModal { } async onChooseSuggestion(result: SearchResult, _: MouseEvent | KeyboardEvent) { - // Get all markdown files in vault + // Get all markdown and PDF files in vault const mdFiles = this.app.vault.getMarkdownFiles(); + const pdfFiles = this.app.vault.getFiles().filter(file => file.extension === 'pdf'); // Find the vault file matching file of chosen search result - let file_match = mdFiles + let file_match = mdFiles.concat(pdfFiles) // Sort by descending length of path // This finds longest path match when multiple files have same name .sort((a, b) => b.path.length - a.path.length) @@ -138,7 +151,7 @@ export class KhojSearchModal extends SuggestModal { // Open vault file at heading of chosen search result if (file_match) { - let resultHeading = result.entry.split('\n', 1)[0]; + let resultHeading = file_match.extension !== 'pdf' ? result.entry.split('\n', 1)[0] : ''; let linkToEntry = `${file_match.path}${resultHeading}` this.app.workspace.openLinkText(linkToEntry, ''); console.log(`Link: ${linkToEntry}, File: ${file_match.path}, Heading: ${resultHeading}`); diff --git a/src/interface/obsidian/src/settings.ts b/src/interface/obsidian/src/settings.ts index 2cdc79a5..b2809cb0 100644 --- a/src/interface/obsidian/src/settings.ts +++ b/src/interface/obsidian/src/settings.ts @@ -108,6 +108,7 @@ export class KhojSettingTab extends PluginSettingTab { this.plugin.registerInterval(progress_indicator); await request(`${this.plugin.settings.khojUrl}/api/update?t=markdown&force=true`); + await request(`${this.plugin.settings.khojUrl}/api/update?t=pdf&force=true`); new Notice('✅ Updated Khoj index.'); // Reset button once index is updated diff --git a/src/interface/obsidian/src/utils.ts b/src/interface/obsidian/src/utils.ts index 05fd1139..5e176883 100644 --- a/src/interface/obsidian/src/utils.ts +++ b/src/interface/obsidian/src/utils.ts @@ -12,6 +12,7 @@ export function getVaultAbsolutePath(vault: Vault): string { export async function configureKhojBackend(vault: Vault, setting: KhojSetting, notify: boolean = true) { let vaultPath = getVaultAbsolutePath(vault); let mdInVault = `${vaultPath}/**/*.md`; + let pdfInVault = `${vaultPath}/**/*.pdf`; let khojConfigUrl = `${setting.khojUrl}/api/config/data`; // Check if khoj backend is configured, note if cannot connect to backend @@ -32,7 +33,8 @@ export async function configureKhojBackend(vault: Vault, setting: KhojSetting, n let indexName = vaultPath.replace(/\//g, '_').replace(/\\/g, '_').replace(/ /g, '_').replace(/:/g, '_'); // Get default config fields from khoj backend let defaultConfig = await request(`${khojConfigUrl}/default`).then(response => JSON.parse(response)); - let khojDefaultIndexDirectory = getIndexDirectoryFromBackendConfig(defaultConfig["content-type"]["markdown"]["embeddings-file"]); + let khojDefaultMdIndexDirectory = getIndexDirectoryFromBackendConfig(defaultConfig["content-type"]["markdown"]["embeddings-file"]); + let khojDefaultPdfIndexDirectory = getIndexDirectoryFromBackendConfig(defaultConfig["content-type"]["pdf"]["embeddings-file"]); let khojDefaultChatDirectory = getIndexDirectoryFromBackendConfig(defaultConfig["processor"]["conversation"]["conversation-logfile"]); let khojDefaultChatModelName = defaultConfig["processor"]["conversation"]["model"]; @@ -47,8 +49,14 @@ export async function configureKhojBackend(vault: Vault, setting: KhojSetting, n "markdown": { "input-filter": [mdInVault], "input-files": null, - "embeddings-file": `${khojDefaultIndexDirectory}/${indexName}.pt`, - "compressed-jsonl": `${khojDefaultIndexDirectory}/${indexName}.jsonl.gz`, + "embeddings-file": `${khojDefaultMdIndexDirectory}/${indexName}.pt`, + "compressed-jsonl": `${khojDefaultMdIndexDirectory}/${indexName}.jsonl.gz`, + }, + "pdf": { + "input-filter": [pdfInVault], + "input-files": null, + "embeddings-file": `${khojDefaultPdfIndexDirectory}/${indexName}.pt`, + "compressed-jsonl": `${khojDefaultPdfIndexDirectory}/${indexName}.jsonl.gz`, } } } @@ -59,8 +67,8 @@ export async function configureKhojBackend(vault: Vault, setting: KhojSetting, n data["content-type"]["markdown"] = { "input-filter": [mdInVault], "input-files": null, - "embeddings-file": `${khojDefaultIndexDirectory}/${indexName}.pt`, - "compressed-jsonl": `${khojDefaultIndexDirectory}/${indexName}.jsonl.gz`, + "embeddings-file": `${khojDefaultMdIndexDirectory}/${indexName}.pt`, + "compressed-jsonl": `${khojDefaultMdIndexDirectory}/${indexName}.jsonl.gz`, } } // Else if khoj is not configured to index markdown files in configured obsidian vault @@ -68,12 +76,37 @@ export async function configureKhojBackend(vault: Vault, setting: KhojSetting, n data["content-type"]["markdown"]["input-filter"][0] !== mdInVault) { // Update markdown config in khoj content-type config // Set markdown config to only index markdown files in configured obsidian vault - let khojIndexDirectory = getIndexDirectoryFromBackendConfig(data["content-type"]["markdown"]["embeddings-file"]); + let khojMdIndexDirectory = getIndexDirectoryFromBackendConfig(data["content-type"]["markdown"]["embeddings-file"]); data["content-type"]["markdown"] = { "input-filter": [mdInVault], "input-files": null, - "embeddings-file": `${khojIndexDirectory}/${indexName}.pt`, - "compressed-jsonl": `${khojIndexDirectory}/${indexName}.jsonl.gz`, + "embeddings-file": `${khojMdIndexDirectory}/${indexName}.pt`, + "compressed-jsonl": `${khojMdIndexDirectory}/${indexName}.jsonl.gz`, + } + } + + if (khoj_already_configured && !data["content-type"]["pdf"]) { + // Add pdf config to khoj content-type config + // Set pdf config to index pdf files in configured obsidian vault + data["content-type"]["pdf"] = { + "input-filter": [pdfInVault], + "input-files": null, + "embeddings-file": `${khojDefaultPdfIndexDirectory}/${indexName}.pt`, + "compressed-jsonl": `${khojDefaultPdfIndexDirectory}/${indexName}.jsonl.gz`, + } + } + // Else if khoj is not configured to index pdf files in configured obsidian vault + else if (khoj_already_configured && + (data["content-type"]["pdf"]["input-filter"].length != 1 || + data["content-type"]["pdf"]["input-filter"][0] !== pdfInVault)) { + // Update pdf config in khoj content-type config + // Set pdf config to only index pdf files in configured obsidian vault + let khojPdfIndexDirectory = getIndexDirectoryFromBackendConfig(data["content-type"]["pdf"]["embeddings-file"]); + data["content-type"]["pdf"] = { + "input-filter": [pdfInVault], + "input-files": null, + "embeddings-file": `${khojPdfIndexDirectory}/${indexName}.pt`, + "compressed-jsonl": `${khojPdfIndexDirectory}/${indexName}.jsonl.gz`, } } From 89fbfce20a8619037ecb5572d93c9642238e2df7 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 1 Jun 2023 20:38:44 +0530 Subject: [PATCH 15/16] Mention PDF are also supported in Khoj Readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3d2df029..a21ff201 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ - **General** - **Natural**: Advanced natural language understanding using Transformer based ML Models - **Pluggable**: Modular architecture makes it easy to plug in new data sources, frontends and ML models - - **Multiple Sources**: Index your Org-mode and Markdown notes, Beancount transactions and Photos + - **Multiple Sources**: Index your Org-mode and Markdown notes, Beancount transactions, PDF files and Photos - **Multiple Interfaces**: Interact from your [Web Browser](./src/khoj/interface/web/index.html), [Emacs](./src/interface/emacs/khoj.el) or [Obsidian](./src/interface/obsidian/) ## Demos @@ -75,7 +75,7 @@ https://github.com/debanjum/khoj/assets/6413477/3e33d8ea-25bb-46c8-a3bf-c92f78d0 - Install Khoj via `pip` and start Khoj backend in non-gui mode - Install Khoj plugin via Community Plugins settings pane on Obsidian app - Check the new Khoj plugin settings -- Let Khoj backend index the markdown files in the current Vault +- Let Khoj backend index the markdown, pdf files in the current Vault - Open Khoj plugin on Obsidian via Search button on Left Pane - Search \"*Announce plugin to folks*\" in the [Obsidian Plugin docs](https://marcus.se.net/obsidian-plugin-docs/) - Jump to the [search result](https://marcus.se.net/obsidian-plugin-docs/publishing/submit-your-plugin) @@ -396,7 +396,7 @@ git clone https://github.com/debanjum/khoj && cd khoj ##### 2. Configure -- **Required**: Update [docker-compose.yml](./docker-compose.yml) to mount your images, (org-mode or markdown) notes and beancount directories +- **Required**: Update [docker-compose.yml](./docker-compose.yml) to mount your images, (org-mode or markdown) notes, pdf and beancount directories - **Optional**: Edit application configuration in [khoj_docker.yml](./config/khoj_docker.yml) ##### 3. Run From e9ed7a19fd1dbee594eb9453c7b12028da4e6314 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Fri, 2 Jun 2023 10:06:03 +0530 Subject: [PATCH 16/16] Update search prompt to extract PDF search type. Fix extract_question prompt --- src/khoj/processor/conversation/prompts.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/khoj/processor/conversation/prompts.py b/src/khoj/processor/conversation/prompts.py index e6dd4844..f40ed171 100644 --- a/src/khoj/processor/conversation/prompts.py +++ b/src/khoj/processor/conversation/prompts.py @@ -78,7 +78,7 @@ Answer (in second person):""" ## -- extract_questions = PromptTemplate.from_template( """ -You are Khoj, an extremely smart and helpful search assistant with the ability to retrieve information from the users notes. +You are Khoj, an extremely smart and helpful search assistant with the ability to retrieve information from the user's notes. - The user will provide their questions and answers to you for context. - Add as much context from the previous questions and answers as required into your search queries. - Break messages into multiple search queries when required to retrieve the relevant information. @@ -143,11 +143,13 @@ search_type = """ Objective: Extract search type from user query and return information as JSON Allowed search types are listed below: - - search-type=["notes","ledger","image","music"] + - search-type=["notes","ledger","image","music", "pdf"] Some examples are given below for reference: Q:What fiction book was I reading last week about AI starship? A:{ "search-type": "notes" } +Q: What did the lease say about early termination +A: { "search-type": "pdf" } Q:Play some calm classical music? A:{ "search-type": "music" } Q:How much did I spend at Subway for dinner last time?