From 727eea2b62418672f6e2146eb2b7ca1a07636df3 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 12 Nov 2023 15:00:06 +0200 Subject: [PATCH 01/38] s1 --- pr_agent/algo/utils.py | 11 ++- pr_agent/settings/pr_description_prompts.toml | 80 ++++++++----------- pr_agent/tools/pr_description.py | 37 +++++---- 3 files changed, 60 insertions(+), 68 deletions(-) diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index 58f0ccb9..6a7d62cf 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -336,11 +336,14 @@ def set_custom_labels(variables): labels_list = f" - {labels_list}" if labels_list else "" variables["custom_labels"] = labels_list return - final_labels = "" + #final_labels = "" + #for k, v in labels.items(): + # final_labels += f" - {k} ({v['description']})\n" + #variables["custom_labels"] = final_labels + #variables["custom_labels_examples"] = f" - {list(labels.keys())[0]}" + variables["custom_labels_class"] = "class Labels(Enum):" for k, v in labels.items(): - final_labels += f" - {k} ({v['description']})\n" - variables["custom_labels"] = final_labels - variables["custom_labels_examples"] = f" - {list(labels.keys())[0]}" + variables["custom_labels_class"] += f"\n {k.lower().replace(' ','_')} = '{k}' # {v['description']}" def get_user_labels(current_labels: List[str] = None): diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index cfb42948..9b2cf861 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -13,67 +13,57 @@ Extra instructions from the user: ' {% endif %} -You must use the following YAML schema to format your answer: -```yaml -PR Title: - type: string - description: an informative title for the PR, describing its main theme -PR Type: - type: string - enum: - - Bug fix - - Tests - - Refactoring - - Enhancement - - Documentation - - Other + +The output must be a YAML object equivalent to type $PRDescription, according to the following Pydantic definitions: +' +Class PRType(Enum): + bug_fix = "Bug fix" + tests = "Tests" + refactoring = "Refactoring" + enhancement = "Enhancement" + documentation = "Documentation" + other = "Other" + {%- if enable_custom_labels %} -PR Labels: - type: array - description: One or more labels that describe the PR labels. Don't output the description in the parentheses. - items: - type: string - enum: -{{ custom_labels }} + +{{ custom_labels_class }} {%- endif %} -PR Description: - type: string - description: an informative and concise description of the PR. - {%- if use_bullet_points %} Use bullet points. {% endif %} -PR Main Files Walkthrough: - type: array - maxItems: 10 - description: |- - a walkthrough of the PR changes. Review main files, and shortly describe the changes in each file (up to 10 most important files). - items: - filename: - type: string - description: the relevant file full path - changes in file: - type: string - description: minimal and concise description of the changes in the relevant file -``` + +class FileWalkthrough(BaseModel): + filename: str = Field(description="the relevant file full path") + changes_in_file: str = Field(description="minimal and concise description of the changes in the relevant file") + +Class PRDescription(BaseModel): + title: str = Field(description="an informative title for the PR, describing its main theme") + type: List[PRType] = Field(description="one or more types that describe the PR type") + description: str = Field(description="an informative and concise description of the PR. {%- if use_bullet_points %} Use bullet points. {% endif %}") +{%- if enable_custom_labels %} + labels: List[Labels] = Field(description="one or more custom labels that describe the PR") +{%- endif %} + main_files_walkthrough: List[FileWalkthrough] = Field(max_items=10) +' Example output: ```yaml -PR Title: |- - ... -PR Type: +title: |- ... +type: +- ... +- ... {%- if enable_custom_labels %} -PR Labels: +labels: - ... - ... {%- endif %} -PR Description: |- +description: |- ... -PR Main Files Walkthrough: +main_files_walkthrough: - ... - ... ``` -Make sure to output a valid YAML. Don't repeat the prompt in the answer, and avoid outputting the 'type' and 'description' fields. +Answer should be a valid YAML, and nothing else. Each YAML output MUST be after a newline, with proper indent, and block scalar indicator ('|-') """ user="""PR Info: diff --git a/pr_agent/tools/pr_description.py b/pr_agent/tools/pr_description.py index 611523ea..f1757033 100644 --- a/pr_agent/tools/pr_description.py +++ b/pr_agent/tools/pr_description.py @@ -44,8 +44,7 @@ class PRDescription: "extra_instructions": get_settings().pr_description.extra_instructions, "commit_messages_str": self.git_provider.get_commit_messages(), "enable_custom_labels": get_settings().config.enable_custom_labels, - "custom_labels": "", - "custom_labels_examples": "", + "custom_labels_class": "", # will be filled if necessary in 'set_custom_labels' } self.user_description = self.git_provider.get_user_description() @@ -172,16 +171,16 @@ class PRDescription: pr_types = [] # If the 'PR Type' key is present in the dictionary, split its value by comma and assign it to 'pr_types' - if 'PR Labels' in self.data: - if type(self.data['PR Labels']) == list: - pr_types = self.data['PR Labels'] - elif type(self.data['PR Labels']) == str: - pr_types = self.data['PR Labels'].split(',') - elif 'PR Type' in self.data: - if type(self.data['PR Type']) == list: - pr_types = self.data['PR Type'] - elif type(self.data['PR Type']) == str: - pr_types = self.data['PR Type'].split(',') + if 'labels' in self.data: + if type(self.data['labels']) == list: + pr_types = self.data['labels'] + elif type(self.data['labels']) == str: + pr_types = self.data['labels'].split(',') + elif 'type' in self.data: + if type(self.data['type']) == list: + pr_types = self.data['type'] + elif type(self.data['type']) == str: + pr_types = self.data['type'].split(',') return pr_types def _prepare_pr_answer_with_markers(self) -> Tuple[str, str]: @@ -193,12 +192,12 @@ class PRDescription: else: ai_header = "" - ai_type = self.data.get('PR Type') + ai_type = self.data.get('type') if ai_type and not re.search(r'', body): pr_type = f"{ai_header}{ai_type}" body = body.replace('pr_agent:type', pr_type) - ai_summary = self.data.get('PR Description') + ai_summary = self.data.get('description') if ai_summary and not re.search(r'', body): summary = f"{ai_header}{ai_summary}" body = body.replace('pr_agent:summary', summary) @@ -228,16 +227,16 @@ class PRDescription: # Iterate over the dictionary items and append the key and value to 'markdown_text' in a markdown format markdown_text = "" # Don't display 'PR Labels' - if 'PR Labels' in self.data and self.git_provider.is_supported("get_labels"): - self.data.pop('PR Labels') + if 'labels' in self.data and self.git_provider.is_supported("get_labels"): + self.data.pop('labels') if not get_settings().pr_description.enable_pr_type: - self.data.pop('PR Type') + self.data.pop('type') for key, value in self.data.items(): markdown_text += f"## {key}\n\n" markdown_text += f"{value}\n\n" # Remove the 'PR Title' key from the dictionary - ai_title = self.data.pop('PR Title', self.vars["title"]) + ai_title = self.data.pop('title', self.vars["title"]) if get_settings().pr_description.keep_original_user_title: # Assign the original PR title to the 'title' variable title = self.vars["title"] @@ -256,7 +255,7 @@ class PRDescription: pr_body += "
files:\n\n" for file in value: filename = file['filename'].replace("'", "`") - description = file['changes in file'] + description = file['changes_in_file'] pr_body += f'- `{filename}`: {description}\n' if self.git_provider.is_supported("gfm_markdown"): pr_body +="
\n" From e9891fc5301bbf94877ceccbac41ff8195e087ad Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 12 Nov 2023 16:37:53 +0200 Subject: [PATCH 02/38] s1 --- pr_agent/algo/utils.py | 2 +- pr_agent/cli.py | 16 ++++--- pr_agent/settings/pr_custom_labels.toml | 45 +++++++++---------- pr_agent/settings/pr_description_prompts.toml | 2 +- pr_agent/tools/pr_description.py | 2 +- pr_agent/tools/pr_generate_labels.py | 15 +++---- 6 files changed, 41 insertions(+), 41 deletions(-) diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index 6a7d62cf..b4ed2b39 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -341,7 +341,7 @@ def set_custom_labels(variables): # final_labels += f" - {k} ({v['description']})\n" #variables["custom_labels"] = final_labels #variables["custom_labels_examples"] = f" - {list(labels.keys())[0]}" - variables["custom_labels_class"] = "class Labels(Enum):" + variables["custom_labels_class"] = "class Label(Enum):" for k, v in labels.items(): variables["custom_labels_class"] += f"\n {k.lower().replace(' ','_')} = '{k}' # {v['description']}" diff --git a/pr_agent/cli.py b/pr_agent/cli.py index 6728db9f..60948db5 100644 --- a/pr_agent/cli.py +++ b/pr_agent/cli.py @@ -21,18 +21,22 @@ For example: - cli.py --issue_url=... similar_issue Supported commands: --review / review_pr - Add a review that includes a summary of the PR and specific suggestions for improvement. +- review / review_pr - Add a review that includes a summary of the PR and specific suggestions for improvement. --ask / ask_question [question] - Ask a question about the PR. +- ask / ask_question [question] - Ask a question about the PR. --describe / describe_pr - Modify the PR title and description based on the PR's contents. +- describe / describe_pr - Modify the PR title and description based on the PR's contents. --improve / improve_code - Suggest improvements to the code in the PR as pull request comments ready to commit. +- improve / improve_code - Suggest improvements to the code in the PR as pull request comments ready to commit. Extended mode ('improve --extended') employs several calls, and provides a more thorough feedback --reflect - Ask the PR author questions about the PR. +- reflect - Ask the PR author questions about the PR. --update_changelog - Update the changelog based on the PR's contents. +- update_changelog - Update the changelog based on the PR's contents. + +- add_docs + +- generate_labels Configuration: diff --git a/pr_agent/settings/pr_custom_labels.toml b/pr_agent/settings/pr_custom_labels.toml index f295798a..bcc1c1ff 100644 --- a/pr_agent/settings/pr_custom_labels.toml +++ b/pr_agent/settings/pr_custom_labels.toml @@ -11,38 +11,35 @@ Extra instructions from the user: ' {% endif %} -You must use the following YAML schema to format your answer: -```yaml -PR Type: - type: array +The output must be a YAML object equivalent to type $Labels, according to the following Pydantic definitions: +' {%- if enable_custom_labels %} - description: One or more labels that describe the PR type. Don't output the description in the parentheses. -{%- endif %} - items: - type: string - enum: -{%- if enable_custom_labels %} -{{ custom_labels }} + +{{ custom_labels_class }} + {%- else %} - - Bug fix - - Tests - - Refactoring - - Enhancement - - Documentation - - Other +class Label(Enum): + bug_fix = "Bug fix" + tests = "Tests" + refactoring = "Refactoring" + enhancement = "Enhancement" + documentation = "Documentation" + other = "Other" {%- endif %} +class Labels(BaseModel): + labels: List[Label] +' + + Example output: ```yaml -PR Type: -{%- if enable_custom_labels %} -{{ custom_labels_examples }} -{%- else %} - - Bug fix -{%- endif %} +labels: +- ... +- ... ``` -Make sure to output a valid YAML. Don't repeat the prompt in the answer, and avoid outputting the 'type' and 'description' fields. +Answer should be a valid YAML, and nothing else. """ user="""PR Info: diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index 9b2cf861..bace848e 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -38,7 +38,7 @@ Class PRDescription(BaseModel): type: List[PRType] = Field(description="one or more types that describe the PR type") description: str = Field(description="an informative and concise description of the PR. {%- if use_bullet_points %} Use bullet points. {% endif %}") {%- if enable_custom_labels %} - labels: List[Labels] = Field(description="one or more custom labels that describe the PR") + labels: List[Label] = Field(description="one or more custom labels that describe the PR") {%- endif %} main_files_walkthrough: List[FileWalkthrough] = Field(max_items=10) ' diff --git a/pr_agent/tools/pr_description.py b/pr_agent/tools/pr_description.py index f1757033..c0eb6606 100644 --- a/pr_agent/tools/pr_description.py +++ b/pr_agent/tools/pr_description.py @@ -44,7 +44,7 @@ class PRDescription: "extra_instructions": get_settings().pr_description.extra_instructions, "commit_messages_str": self.git_provider.get_commit_messages(), "enable_custom_labels": get_settings().config.enable_custom_labels, - "custom_labels_class": "", # will be filled if necessary in 'set_custom_labels' + "custom_labels_class": "", # will be filled if necessary in 'set_custom_labels' function } self.user_description = self.git_provider.get_user_description() diff --git a/pr_agent/tools/pr_generate_labels.py b/pr_agent/tools/pr_generate_labels.py index e413e96f..45c504b3 100644 --- a/pr_agent/tools/pr_generate_labels.py +++ b/pr_agent/tools/pr_generate_labels.py @@ -43,9 +43,8 @@ class PRGenerateLabels: "use_bullet_points": get_settings().pr_description.use_bullet_points, "extra_instructions": get_settings().pr_description.extra_instructions, "commit_messages_str": self.git_provider.get_commit_messages(), - "custom_labels": "", - "custom_labels_examples": "", "enable_custom_labels": get_settings().config.enable_custom_labels, + "custom_labels_class": "", # will be filled if necessary in 'set_custom_labels' function } # Initialize the token handler @@ -159,11 +158,11 @@ class PRGenerateLabels: def _prepare_labels(self) -> List[str]: pr_types = [] - # If the 'PR Type' key is present in the dictionary, split its value by comma and assign it to 'pr_types' - if 'PR Type' in self.data: - if type(self.data['PR Type']) == list: - pr_types = self.data['PR Type'] - elif type(self.data['PR Type']) == str: - pr_types = self.data['PR Type'].split(',') + # If the 'labels' key is present in the dictionary, split its value by comma and assign it to 'pr_types' + if 'labels' in self.data: + if type(self.data['labels']) == list: + pr_types = self.data['labels'] + elif type(self.data['labels']) == str: + pr_types = self.data['labels'].split(',') return pr_types From 0e932af2e3202109c5b810efa197e67408e95c92 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Mon, 13 Nov 2023 12:01:08 +0200 Subject: [PATCH 03/38] multi line --- pr_agent/algo/utils.py | 4 ++-- pr_agent/settings/pr_description_prompts.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index b4ed2b39..8d74f48d 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -343,8 +343,8 @@ def set_custom_labels(variables): #variables["custom_labels_examples"] = f" - {list(labels.keys())[0]}" variables["custom_labels_class"] = "class Label(Enum):" for k, v in labels.items(): - variables["custom_labels_class"] += f"\n {k.lower().replace(' ','_')} = '{k}' # {v['description']}" - + description = v['description'].strip('\n').replace('\n', '\\n') + variables["custom_labels_class"] += f"\n {k.lower().replace(' ', '_')} = '{k}' # {description}" def get_user_labels(current_labels: List[str] = None): """ diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index bace848e..b9b8a8cd 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -59,8 +59,8 @@ labels: description: |- ... main_files_walkthrough: - - ... - - ... +- ... +- ... ``` Answer should be a valid YAML, and nothing else. Each YAML output MUST be after a newline, with proper indent, and block scalar indicator ('|-') From f5c6dd55b883261cffb1ecc89e98431cc11d91b5 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Mon, 13 Nov 2023 12:04:58 +0200 Subject: [PATCH 04/38] triple quote --- pr_agent/settings/custom_labels.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pr_agent/settings/custom_labels.toml b/pr_agent/settings/custom_labels.toml index 43e14b0e..9c751d0e 100644 --- a/pr_agent/settings/custom_labels.toml +++ b/pr_agent/settings/custom_labels.toml @@ -3,16 +3,16 @@ enable_custom_labels=false ## template for custom labels #[custom_labels."Bug fix"] -#description = "Fixes a bug in the code" +#description = """Fixes a bug in the code""" #[custom_labels."Tests"] -#description = "Adds or modifies tests" +#description = """Adds or modifies tests""" #[custom_labels."Bug fix with tests"] -#description = "Fixes a bug in the code and adds or modifies tests" +#description = """Fixes a bug in the code and adds or modifies tests""" #[custom_labels."Refactoring"] -#description = "Code refactoring without changing functionality" +#description = """Code refactoring without changing functionality""" #[custom_labels."Enhancement"] -#description = "Adds new features or functionality" +#description = """Adds new features or functionality""" #[custom_labels."Documentation"] -#description = "Adds or modifies documentation" +#description = """Adds or modifies documentation""" #[custom_labels."Other"] -#description = "Other changes that do not fit in any of the above categories" \ No newline at end of file +#description = """Other changes that do not fit in any of the above categories""" \ No newline at end of file From a8dddd199991c30f94715c0b52f9e8b897e1ea40 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Mon, 13 Nov 2023 12:14:18 +0200 Subject: [PATCH 05/38] prompt --- pr_agent/settings/pr_custom_labels.toml | 12 +++++++----- pr_agent/settings/pr_description_prompts.toml | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/pr_agent/settings/pr_custom_labels.toml b/pr_agent/settings/pr_custom_labels.toml index bcc1c1ff..821ec8d2 100644 --- a/pr_agent/settings/pr_custom_labels.toml +++ b/pr_agent/settings/pr_custom_labels.toml @@ -1,8 +1,10 @@ [pr_custom_labels_prompt] -system="""You are CodiumAI-PR-Reviewer, a language model designed to review git pull requests. -Your task is to label the type of the PR content. -- Make sure not to focus the new PR code (the '+' lines). -- If needed, each YAML output should be in block scalar format ('|-') +system="""You are CodiumAI-PR-Reviewer, a language model designed to review git Pull Requests (PR). +Your task is to provide labels that describe the PR content. +{%- if enable_custom_labels %} +Thoroughly read the labels name and the provided description, and decide whether the label is relevant to the PR. +{%- endif %} + {%- if extra_instructions %} Extra instructions from the user: @@ -28,7 +30,7 @@ class Label(Enum): {%- endif %} class Labels(BaseModel): - labels: List[Label] + labels: List[Label] = Field(min_items=0, description="custom labels that describe the PR") ' diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index b9b8a8cd..d59e585d 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -38,7 +38,7 @@ Class PRDescription(BaseModel): type: List[PRType] = Field(description="one or more types that describe the PR type") description: str = Field(description="an informative and concise description of the PR. {%- if use_bullet_points %} Use bullet points. {% endif %}") {%- if enable_custom_labels %} - labels: List[Label] = Field(description="one or more custom labels that describe the PR") + labels: List[Label] = Field(min_items=0, description="custom labels that describe the PR") {%- endif %} main_files_walkthrough: List[FileWalkthrough] = Field(max_items=10) ' From 0df054295828c8b1395a1b084a89b99688200d0b Mon Sep 17 00:00:00 2001 From: mrT23 Date: Mon, 13 Nov 2023 15:55:35 +0200 Subject: [PATCH 06/38] prompt --- pr_agent/algo/utils.py | 2 +- pr_agent/settings/pr_custom_labels.toml | 4 ++-- pr_agent/settings/pr_description_prompts.toml | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index 8d74f48d..bd91477c 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -341,7 +341,7 @@ def set_custom_labels(variables): # final_labels += f" - {k} ({v['description']})\n" #variables["custom_labels"] = final_labels #variables["custom_labels_examples"] = f" - {list(labels.keys())[0]}" - variables["custom_labels_class"] = "class Label(Enum):" + variables["custom_labels_class"] = "class Label(str, Enum):" for k, v in labels.items(): description = v['description'].strip('\n').replace('\n', '\\n') variables["custom_labels_class"] += f"\n {k.lower().replace(' ', '_')} = '{k}' # {description}" diff --git a/pr_agent/settings/pr_custom_labels.toml b/pr_agent/settings/pr_custom_labels.toml index 821ec8d2..f61a208c 100644 --- a/pr_agent/settings/pr_custom_labels.toml +++ b/pr_agent/settings/pr_custom_labels.toml @@ -20,7 +20,7 @@ The output must be a YAML object equivalent to type $Labels, according to the fo {{ custom_labels_class }} {%- else %} -class Label(Enum): +class Label(str, Enum): bug_fix = "Bug fix" tests = "Tests" refactoring = "Refactoring" @@ -30,7 +30,7 @@ class Label(Enum): {%- endif %} class Labels(BaseModel): - labels: List[Label] = Field(min_items=0, description="custom labels that describe the PR") + labels: List[Label] = Field(min_items=0, description="custom labels that describe the PR. Return the label value, not the name.") ' diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index d59e585d..514a1991 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -16,7 +16,7 @@ Extra instructions from the user: The output must be a YAML object equivalent to type $PRDescription, according to the following Pydantic definitions: ' -Class PRType(Enum): +class PRType(str, Enum): bug_fix = "Bug fix" tests = "Tests" refactoring = "Refactoring" @@ -35,10 +35,10 @@ class FileWalkthrough(BaseModel): Class PRDescription(BaseModel): title: str = Field(description="an informative title for the PR, describing its main theme") - type: List[PRType] = Field(description="one or more types that describe the PR type") + type: List[PRType] = Field(description="one or more types that describe the PR type. . Return the label value, not the name.") description: str = Field(description="an informative and concise description of the PR. {%- if use_bullet_points %} Use bullet points. {% endif %}") {%- if enable_custom_labels %} - labels: List[Label] = Field(min_items=0, description="custom labels that describe the PR") + labels: List[Label] = Field(min_items=0, description="custom labels that describe the PR. Return the label value, not the name.") {%- endif %} main_files_walkthrough: List[FileWalkthrough] = Field(max_items=10) ' From 3fae5cbd8dd42a89e817c910296f34511068bb32 Mon Sep 17 00:00:00 2001 From: Luca Simone Date: Wed, 15 Nov 2023 15:47:44 +0100 Subject: [PATCH 07/38] feat: Added BitBucket Server Signed-off-by: Luca Simone --- pr_agent/git_providers/__init__.py | 2 + .../bitbucket_server_provider.py | 353 ++++++++++++++++++ tests/unittest/test_bitbucket_provider.py | 8 + 3 files changed, 363 insertions(+) create mode 100644 pr_agent/git_providers/bitbucket_server_provider.py diff --git a/pr_agent/git_providers/__init__.py b/pr_agent/git_providers/__init__.py index 968f0dfc..14103a95 100644 --- a/pr_agent/git_providers/__init__.py +++ b/pr_agent/git_providers/__init__.py @@ -1,5 +1,6 @@ from pr_agent.config_loader import get_settings from pr_agent.git_providers.bitbucket_provider import BitbucketProvider +from pr_agent.git_providers.bitbucket_server_provider import BitbucketServerProvider from pr_agent.git_providers.codecommit_provider import CodeCommitProvider from pr_agent.git_providers.github_provider import GithubProvider from pr_agent.git_providers.gitlab_provider import GitLabProvider @@ -12,6 +13,7 @@ _GIT_PROVIDERS = { 'github': GithubProvider, 'gitlab': GitLabProvider, 'bitbucket': BitbucketProvider, + 'bitbucket_server': BitbucketServerProvider, 'azure': AzureDevopsProvider, 'codecommit': CodeCommitProvider, 'local' : LocalGitProvider, diff --git a/pr_agent/git_providers/bitbucket_server_provider.py b/pr_agent/git_providers/bitbucket_server_provider.py new file mode 100644 index 00000000..f1c2c314 --- /dev/null +++ b/pr_agent/git_providers/bitbucket_server_provider.py @@ -0,0 +1,353 @@ +import difflib +import json +import re +from typing import Optional, Tuple +from urllib.parse import urlparse + +import requests +from atlassian.bitbucket import Bitbucket +from starlette_context import context + +from .git_provider import FilePatchInfo, GitProvider, EDIT_TYPE +from ..algo.pr_processing import find_line_number_of_relevant_line_in_file +from ..algo.utils import load_large_diff +from ..config_loader import get_settings +from ..log import get_logger + + +class BitbucketServerProvider(GitProvider): + def __init__( + self, pr_url: Optional[str] = None, incremental: Optional[bool] = False + ): + s = requests.Session() + try: + bearer = context.get("bitbucket_bearer_token", None) + s.headers["Authorization"] = f"Bearer {bearer}" + except Exception: + s.headers[ + "Authorization" + ] = f'Bearer {get_settings().get("BITBUCKET.BEARER_TOKEN", None)}' + + s.headers["Content-Type"] = "application/json" + self.headers = s.headers + self.bitbucket_server_url = None + self.workspace_slug = None + self.repo_slug = None + self.repo = None + self.pr_num = None + self.pr = None + self.pr_url = pr_url + self.temp_comments = [] + self.incremental = incremental + self.diff_files = None + self.bitbucket_pull_request_api_url = pr_url + + self.bitbucket_server_url = self._parse_bitbucket_server(url=pr_url) + self.bitbucket_client = Bitbucket(url=self.bitbucket_server_url, + token=get_settings().get("BITBUCKET.BEARER_TOKEN", None)) + + if pr_url: + self.set_pr(pr_url) + + def get_repo_settings(self): + try: + url = (f"{self.bitbucket_server_url}/projects/{self.workspace_slug}/repos/{self.repo_slug}/src/" + f"{self.pr.destination_branch}/.pr_agent.toml") + response = requests.request("GET", url, headers=self.headers) + if response.status_code == 404: # not found + return "" + contents = response.text.encode('utf-8') + return contents + except Exception: + return "" + + def publish_code_suggestions(self, code_suggestions: list) -> bool: + """ + Publishes code suggestions as comments on the PR. + """ + post_parameters_list = [] + for suggestion in code_suggestions: + body = suggestion["body"] + relevant_file = suggestion["relevant_file"] + relevant_lines_start = suggestion["relevant_lines_start"] + relevant_lines_end = suggestion["relevant_lines_end"] + + if not relevant_lines_start or relevant_lines_start == -1: + if get_settings().config.verbosity_level >= 2: + get_logger().exception( + f"Failed to publish code suggestion, relevant_lines_start is {relevant_lines_start}" + ) + continue + + if relevant_lines_end < relevant_lines_start: + if get_settings().config.verbosity_level >= 2: + get_logger().exception( + f"Failed to publish code suggestion, " + f"relevant_lines_end is {relevant_lines_end} and " + f"relevant_lines_start is {relevant_lines_start}" + ) + continue + + if relevant_lines_end > relevant_lines_start: + post_parameters = { + "body": body, + "path": relevant_file, + "line": relevant_lines_end, + "start_line": relevant_lines_start, + "start_side": "RIGHT", + } + else: # API is different for single line comments + post_parameters = { + "body": body, + "path": relevant_file, + "line": relevant_lines_start, + "side": "RIGHT", + } + post_parameters_list.append(post_parameters) + + try: + self.publish_inline_comments(post_parameters_list) + return True + except Exception as e: + if get_settings().config.verbosity_level >= 2: + get_logger().error(f"Failed to publish code suggestion, error: {e}") + return False + + def is_supported(self, capability: str) -> bool: + if capability in ['get_issue_comments', 'publish_inline_comments', 'get_labels', 'gfm_markdown']: + return False + return True + + def set_pr(self, pr_url: str): + self.workspace_slug, self.repo_slug, self.pr_num = self._parse_pr_url(pr_url) + self.pr = self._get_pr() + + def get_file(self, path: str, commit_id: str): + file_content = "" + try: + file_content = self.bitbucket_client.get_content_of_file(self.workspace_slug, + self.repo_slug, + path, + commit_id) + except requests.HTTPError as e: + get_logger().debug(f"File {path} not found at commit id: {commit_id}") + return file_content + + def get_files(self): + changes = self.bitbucket_client.get_pull_requests_changes(self.workspace_slug, self.repo_slug, self.pr_num) + diffstat = [change["path"]['toString'] for change in changes] + return diffstat + + def get_diff_files(self) -> list[FilePatchInfo]: + if self.diff_files: + return self.diff_files + + commits_in_pr = self.bitbucket_client.get_pull_requests_commits( + self.workspace_slug, + self.repo_slug, + self.pr_num + ) + + commit_list = list(commits_in_pr) + base_sha, head_sha = commit_list[0]['parents'][0]['id'], commit_list[-1]['id'] + + diff_files = [] + original_file_content_str = "" + new_file_content_str = "" + + changes = self.bitbucket_client.get_pull_requests_changes(self.workspace_slug, self.repo_slug, self.pr_num) + for change in changes: + file_path = change['path']['toString'] + match change['type']: + case 'ADD': + edit_type = EDIT_TYPE.ADDED + new_file_content_str = self.get_file(file_path, head_sha) + if isinstance(new_file_content_str, (bytes, bytearray)): + new_file_content_str = new_file_content_str.decode("utf-8") + original_file_content_str = "" + case 'DELETE': + edit_type = EDIT_TYPE.DELETED + new_file_content_str = "" + original_file_content_str = self.get_file(file_path, base_sha) + if isinstance(original_file_content_str, (bytes, bytearray)): + original_file_content_str = original_file_content_str.decode("utf-8") + case 'RENAME': + edit_type = EDIT_TYPE.RENAMED + case _: + edit_type = EDIT_TYPE.MODIFIED + original_file_content_str = self.get_file(file_path, base_sha) + if isinstance(original_file_content_str, (bytes, bytearray)): + original_file_content_str = original_file_content_str.decode("utf-8") + new_file_content_str = self.get_file(file_path, head_sha) + if isinstance(new_file_content_str, (bytes, bytearray)): + new_file_content_str = new_file_content_str.decode("utf-8") + + patch = load_large_diff(file_path, new_file_content_str, original_file_content_str) + + diff_files.append( + FilePatchInfo( + original_file_content_str, + new_file_content_str, + patch, + file_path, + edit_type=edit_type, + ) + ) + + self.diff_files = diff_files + return diff_files + + def publish_comment(self, pr_comment: str, is_temporary: bool = False): + if not is_temporary: + self.bitbucket_client.add_pull_request_comment(self.workspace_slug, self.repo_slug, self.pr_num, pr_comment) + + def remove_initial_comment(self): + try: + for comment in self.temp_comments: + self.remove_comment(comment) + except Exception as e: + get_logger().exception(f"Failed to remove temp comments, error: {e}") + + def remove_comment(self, comment): + pass + + # funtion to create_inline_comment + def create_inline_comment(self, body: str, relevant_file: str, relevant_line_in_file: str): + position, absolute_position = find_line_number_of_relevant_line_in_file( + self.get_diff_files(), + relevant_file.strip('`'), + relevant_line_in_file + ) + if position == -1: + if get_settings().config.verbosity_level >= 2: + get_logger().info(f"Could not find position for {relevant_file} {relevant_line_in_file}") + subject_type = "FILE" + else: + subject_type = "LINE" + path = relevant_file.strip() + return dict(body=body, path=path, position=absolute_position) if subject_type == "LINE" else {} + + def publish_inline_comment(self, comment: str, from_line: int, file: str): + payload = { + "text": comment, + "severity": "NORMAL", + "anchor": { + "diffType": "EFFECTIVE", + "path": file, + "lineType": "ADDED", + "line": from_line, + "fileType": "TO" + } + } + + response = requests.post(url=self._get_pr_comments_url(), json=payload, headers=self.headers) + return response + + def generate_link_to_relevant_line_number(self, suggestion) -> str: + try: + relevant_file = suggestion['relevant file'].strip('`').strip("'") + relevant_line_str = suggestion['relevant line'] + if not relevant_line_str: + return "" + + diff_files = self.get_diff_files() + position, absolute_position = find_line_number_of_relevant_line_in_file \ + (diff_files, relevant_file, relevant_line_str) + + if absolute_position != -1 and self.pr_url: + link = f"{self.pr_url}/#L{relevant_file}T{absolute_position}" + return link + except Exception as e: + if get_settings().config.verbosity_level >= 2: + get_logger().info(f"Failed adding line link, error: {e}") + + return "" + + def publish_inline_comments(self, comments: list[dict]): + for comment in comments: + self.publish_inline_comment(comment['body'], comment['position'], comment['path']) + + def get_title(self): + return self.pr.title + + def get_languages(self): + return {"yaml": 0} # devops LOL + + def get_pr_branch(self): + return self.pr.fromRef['displayId'] + + def get_pr_description_full(self): + return self.pr.description + + def get_user_id(self): + return 0 + + def get_issue_comments(self): + raise NotImplementedError( + "Bitbucket provider does not support issue comments yet" + ) + + def add_eyes_reaction(self, issue_comment_id: int) -> Optional[int]: + return True + + def remove_reaction(self, issue_comment_id: int, reaction_id: int) -> bool: + return True + + @staticmethod + def _parse_bitbucket_server(url: str) -> str: + parsed_url = urlparse(url) + return f"{parsed_url.scheme}://{parsed_url.netloc}" + + @staticmethod + def _parse_pr_url(pr_url: str) -> Tuple[str, str, int]: + parsed_url = urlparse(pr_url) + path_parts = parsed_url.path.strip("/").split("/") + if len(path_parts) < 6 or path_parts[4] != "pull-requests": + raise ValueError( + "The provided URL does not appear to be a Bitbucket PR URL" + ) + + workspace_slug = path_parts[1] + repo_slug = path_parts[3] + try: + pr_number = int(path_parts[5]) + except ValueError as e: + raise ValueError("Unable to convert PR number to integer") from e + + return workspace_slug, repo_slug, pr_number + + def _get_repo(self): + if self.repo is None: + self.repo = self.bitbucket_client.get_repo(self.workspace_slug, self.repo_slug) + return self.repo + + def _get_pr(self): + pr = self.bitbucket_client.get_pull_request(self.workspace_slug, self.repo_slug, pull_request_id=self.pr_num) + return type('new_dict', (object,), pr) + + def _get_pr_file_content(self, remote_link: str): + return "" + + def get_commit_messages(self): + return "" # not implemented yet + + # bitbucket does not support labels + def publish_description(self, pr_title: str, description: str): + payload = json.dumps({ + "description": description, + "title": pr_title + }) + + response = requests.put(url=self.bitbucket_pull_request_api_url, headers=self.headers, data=payload) + return response + + # bitbucket does not support labels + def publish_labels(self, pr_types: list): + pass + + # bitbucket does not support labels + def get_labels(self): + pass + + def _get_pr_comments_url(self): + return f"{self.bitbucket_server_url}/rest/api/latest/projects/{self.workspace_slug}/repos/{self.repo_slug}/pull-requests/{self.pr_num}/comments" diff --git a/tests/unittest/test_bitbucket_provider.py b/tests/unittest/test_bitbucket_provider.py index 3bb64a0c..e17a26ce 100644 --- a/tests/unittest/test_bitbucket_provider.py +++ b/tests/unittest/test_bitbucket_provider.py @@ -1,3 +1,4 @@ +from pr_agent.git_providers import BitbucketServerProvider from pr_agent.git_providers.bitbucket_provider import BitbucketProvider @@ -8,3 +9,10 @@ class TestBitbucketProvider: assert workspace_slug == "WORKSPACE_XYZ" assert repo_slug == "MY_TEST_REPO" assert pr_number == 321 + + def test_bitbucket_server_pr_url(self): + url = "https://git.onpreminstance.com/projects/AAA/repos/my-repo/pull-requests/1" + workspace_slug, repo_slug, pr_number = BitbucketServerProvider._parse_pr_url(url) + assert workspace_slug == "AAA" + assert repo_slug == "my-repo" + assert pr_number == 1 From eae30c32a24e05da092ef5cfe22e5664e9c9283b Mon Sep 17 00:00:00 2001 From: Luca Simone Date: Thu, 16 Nov 2023 10:58:35 +0100 Subject: [PATCH 08/38] fix: Use checked exception for ValueError Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- pr_agent/git_providers/bitbucket_server_provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pr_agent/git_providers/bitbucket_server_provider.py b/pr_agent/git_providers/bitbucket_server_provider.py index f1c2c314..6ca99f66 100644 --- a/pr_agent/git_providers/bitbucket_server_provider.py +++ b/pr_agent/git_providers/bitbucket_server_provider.py @@ -205,7 +205,7 @@ class BitbucketServerProvider(GitProvider): try: for comment in self.temp_comments: self.remove_comment(comment) - except Exception as e: + except ValueError as e: get_logger().exception(f"Failed to remove temp comments, error: {e}") def remove_comment(self, comment): From d78a71184d253f13123fb7ce1ac380078ce42394 Mon Sep 17 00:00:00 2001 From: Luca Simone Date: Thu, 16 Nov 2023 10:59:01 +0100 Subject: [PATCH 09/38] fix: Use checked exception KeyError for missing key Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- pr_agent/git_providers/bitbucket_server_provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pr_agent/git_providers/bitbucket_server_provider.py b/pr_agent/git_providers/bitbucket_server_provider.py index 6ca99f66..21c9072b 100644 --- a/pr_agent/git_providers/bitbucket_server_provider.py +++ b/pr_agent/git_providers/bitbucket_server_provider.py @@ -23,7 +23,7 @@ class BitbucketServerProvider(GitProvider): try: bearer = context.get("bitbucket_bearer_token", None) s.headers["Authorization"] = f"Bearer {bearer}" - except Exception: + except KeyError: s.headers[ "Authorization" ] = f'Bearer {get_settings().get("BITBUCKET.BEARER_TOKEN", None)}' From 26dc2e9d217cc74753b26f1fec4ffb322e0fb757 Mon Sep 17 00:00:00 2001 From: Luca Simone Date: Thu, 16 Nov 2023 11:19:46 +0100 Subject: [PATCH 10/38] fix: raising exception instead of empty string Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- pr_agent/git_providers/bitbucket_server_provider.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pr_agent/git_providers/bitbucket_server_provider.py b/pr_agent/git_providers/bitbucket_server_provider.py index 21c9072b..b8212215 100644 --- a/pr_agent/git_providers/bitbucket_server_provider.py +++ b/pr_agent/git_providers/bitbucket_server_provider.py @@ -329,8 +329,8 @@ class BitbucketServerProvider(GitProvider): return "" def get_commit_messages(self): - return "" # not implemented yet - + def get_commit_messages(self): + raise NotImplementedError("Get commit messages function not implemented yet.") # bitbucket does not support labels def publish_description(self, pr_title: str, description: str): payload = json.dumps({ From b62e0967d5f4a32c160b9509b92b3646e0394792 Mon Sep 17 00:00:00 2001 From: Luca Simone Date: Fri, 17 Nov 2023 10:08:40 +0100 Subject: [PATCH 11/38] fix: Revert back to exception since context.get will not throw KeyError --- pr_agent/git_providers/bitbucket_server_provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pr_agent/git_providers/bitbucket_server_provider.py b/pr_agent/git_providers/bitbucket_server_provider.py index b8212215..ed0a7a19 100644 --- a/pr_agent/git_providers/bitbucket_server_provider.py +++ b/pr_agent/git_providers/bitbucket_server_provider.py @@ -23,7 +23,7 @@ class BitbucketServerProvider(GitProvider): try: bearer = context.get("bitbucket_bearer_token", None) s.headers["Authorization"] = f"Bearer {bearer}" - except KeyError: + except Exception: s.headers[ "Authorization" ] = f'Bearer {get_settings().get("BITBUCKET.BEARER_TOKEN", None)}' From 0f6564f42df70afbf1a8dd233d4e447c7af0f2d8 Mon Sep 17 00:00:00 2001 From: Luca Simone Date: Sat, 25 Nov 2023 17:37:44 +0100 Subject: [PATCH 12/38] feat: Added server and documentation --- INSTALL.md | 37 +++++++++++ docker/Dockerfile | 4 ++ .../bitbucket_server_provider.py | 8 +-- pr_agent/servers/bitbucket_server_webhook.py | 64 +++++++++++++++++++ 4 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 pr_agent/servers/bitbucket_server_webhook.py diff --git a/INSTALL.md b/INSTALL.md index d0298033..9efb4aa3 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -415,4 +415,41 @@ You can get a Bitbucket token for your repository by following Repository Settin Please contact if you're interested in a hosted BitBucket app solution that provides full functionality including PR reviews and comment handling. It's based on the [bitbucket_app.py](https://github.com/Codium-ai/pr-agent/blob/main/pr_agent/git_providers/bitbucket_provider.py) implmentation. +### Bitbucket Server and Data Center + +Login into your on-prem instance of Bitbucket with your service account username and password. +Navigate to `Manage account`, `HTTP Access tokens`, `Create Token`. +Generate the token and add it to .secret.toml under `bitbucket_server` section + +```toml +[bitbucket_server] +bearer_token = "" +``` + +#### Run it as CLI + +Modify `configuration.toml`: + +```toml +git_provider="bitbucket_server" +``` + +and pass the Pull request URL: +```shell +python cli.py --pr_url https://git.onpreminstanceofbitbucket.com/projects/PROJECT/repos/REPO/pull-requests/1 review +``` + +#### Run it as service + +To run pr-agent as webhook, build the docker image: +``` +docker build . -t codiumai/pr-agent:bitbucket_server_webhook --target bitbucket_server_webhook -f docker/Dockerfile +docker push codiumai/pr-agent:bitbucket_server_webhook # Push to your Docker repository +``` + +Navigate to `Projects` or `Repositories`, `Settings`, `Webhooks`, `Create Webhook`. +Fill the name and URL, Authentication None select the Pull Request Opened checkbox to receive that event as webhook. + +The url should be ends with `/webhook`, example: https://domain.com/webhook + ======= diff --git a/docker/Dockerfile b/docker/Dockerfile index 951f846c..0f669e89 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,6 +14,10 @@ FROM base as bitbucket_app ADD pr_agent pr_agent CMD ["python", "pr_agent/servers/bitbucket_app.py"] +FROM base as bitbucket_server_webhook +ADD pr_agent pr_agent +CMD ["python", "pr_agent/servers/bitbucket_server_webhook.py"] + FROM base as github_polling ADD pr_agent pr_agent CMD ["python", "pr_agent/servers/github_polling.py"] diff --git a/pr_agent/git_providers/bitbucket_server_provider.py b/pr_agent/git_providers/bitbucket_server_provider.py index ed0a7a19..44347850 100644 --- a/pr_agent/git_providers/bitbucket_server_provider.py +++ b/pr_agent/git_providers/bitbucket_server_provider.py @@ -1,6 +1,4 @@ -import difflib import json -import re from typing import Optional, Tuple from urllib.parse import urlparse @@ -26,7 +24,7 @@ class BitbucketServerProvider(GitProvider): except Exception: s.headers[ "Authorization" - ] = f'Bearer {get_settings().get("BITBUCKET.BEARER_TOKEN", None)}' + ] = f'Bearer {get_settings().get("BITBUCKET_SERVER.BEARER_TOKEN", None)}' s.headers["Content-Type"] = "application/json" self.headers = s.headers @@ -44,7 +42,7 @@ class BitbucketServerProvider(GitProvider): self.bitbucket_server_url = self._parse_bitbucket_server(url=pr_url) self.bitbucket_client = Bitbucket(url=self.bitbucket_server_url, - token=get_settings().get("BITBUCKET.BEARER_TOKEN", None)) + token=get_settings().get("BITBUCKET_SERVER.BEARER_TOKEN", None)) if pr_url: self.set_pr(pr_url) @@ -114,7 +112,7 @@ class BitbucketServerProvider(GitProvider): return False def is_supported(self, capability: str) -> bool: - if capability in ['get_issue_comments', 'publish_inline_comments', 'get_labels', 'gfm_markdown']: + if capability in ['get_issue_comments', 'get_labels', 'gfm_markdown']: return False return True diff --git a/pr_agent/servers/bitbucket_server_webhook.py b/pr_agent/servers/bitbucket_server_webhook.py new file mode 100644 index 00000000..c6ce8353 --- /dev/null +++ b/pr_agent/servers/bitbucket_server_webhook.py @@ -0,0 +1,64 @@ +import json + +import uvicorn +from fastapi import APIRouter, FastAPI +from fastapi.encoders import jsonable_encoder +from starlette import status +from starlette.background import BackgroundTasks +from starlette.middleware import Middleware +from starlette.requests import Request +from starlette.responses import JSONResponse +from starlette_context.middleware import RawContextMiddleware + +from pr_agent.agent.pr_agent import PRAgent +from pr_agent.config_loader import get_settings +from pr_agent.log import get_logger + +router = APIRouter() + + +def handle_request(background_tasks: BackgroundTasks, url: str, body: str, log_context: dict): + log_context["action"] = body + log_context["event"] = "pull_request" if body == "review" else "comment" + log_context["api_url"] = url + with get_logger().contextualize(**log_context): + background_tasks.add_task(PRAgent().handle_request, url, body) + + +@router.post("/webhook") +async def handle_webhook(background_tasks: BackgroundTasks, request: Request): + log_context = {"server_type": "bitbucket_server"} + data = await request.json() + get_logger().info(json.dumps(data)) + + pr_id = data['pullRequest']['id'] + repository_name = data['pullRequest']['toRef']['repository']['slug'] + project_name = data['pullRequest']['toRef']['repository']['project']['key'] + bitbucket_server = get_settings().get("BITBUCKET_SERVER.URL") + pr_url = f"{bitbucket_server}/projects/{project_name}/repos/{repository_name}/pull-requests/{pr_id}" + + log_context["api_url"] = pr_url + log_context["event"] = "pull_request" + + handle_request(background_tasks, pr_url, "review", log_context) + return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder({"message": "success"})) + + +@router.get("/") +async def root(): + return {"status": "ok"} + + +def start(): + bitbucket_server_url = get_settings().get("BITBUCKET_SERVER.URL", None) + if not bitbucket_server_url: + raise ValueError("BITBUCKET_SERVER.URL is not set") + get_settings().config.git_provider = "bitbucket_server" + middleware = [Middleware(RawContextMiddleware)] + app = FastAPI(middleware=middleware) + app.include_router(router) + uvicorn.run(app, host="0.0.0.0", port=3000) + + +if __name__ == '__main__': + start() From b3238e90f2d205c5920ea60ece5901e216f4d4eb Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 08:10:01 +0200 Subject: [PATCH 13/38] s --- pr_agent/git_providers/git_provider.py | 52 ++++++++++++------- pr_agent/settings/pr_add_docs.toml | 2 +- pr_agent/settings/pr_description_prompts.toml | 9 ++-- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/pr_agent/git_providers/git_provider.py b/pr_agent/git_providers/git_provider.py index 05122f9c..d929ed37 100644 --- a/pr_agent/git_providers/git_provider.py +++ b/pr_agent/git_providers/git_provider.py @@ -1,5 +1,6 @@ from abc import ABC, abstractmethod from dataclasses import dataclass +from pr_agent.algo.language_handler import language_extension_map # enum EDIT_TYPE (ADDED, DELETED, MODIFIED, RENAMED) from enum import Enum @@ -173,26 +174,39 @@ def get_main_pr_language(languages, files) -> str: extension_list.append(file.filename.rsplit('.')[-1]) # get the most common extension - most_common_extension = max(set(extension_list), key=extension_list.count) + most_common_extension = '.' + max(set(extension_list), key=extension_list.count) + try: + if top_language in language_extension_map and most_common_extension in language_extension_map[top_language]: + main_language_str = top_language + else: + for language, extensions in language_extension_map.items(): + if most_common_extension in extensions: + main_language_str = language + break + except Exception as e: + get_logger().exception(f"Failed to get main language: {e}") + pass - # look for a match. TBD: add more languages, do this systematically - if most_common_extension == 'py' and top_language == 'python' or \ - most_common_extension == 'js' and top_language == 'javascript' or \ - most_common_extension == 'ts' and top_language == 'typescript' or \ - most_common_extension == 'go' and top_language == 'go' or \ - most_common_extension == 'java' and top_language == 'java' or \ - most_common_extension == 'c' and top_language == 'c' or \ - most_common_extension == 'cpp' and top_language == 'c++' or \ - most_common_extension == 'cs' and top_language == 'c#' or \ - most_common_extension == 'swift' and top_language == 'swift' or \ - most_common_extension == 'php' and top_language == 'php' or \ - most_common_extension == 'rb' and top_language == 'ruby' or \ - most_common_extension == 'rs' and top_language == 'rust' or \ - most_common_extension == 'scala' and top_language == 'scala' or \ - most_common_extension == 'kt' and top_language == 'kotlin' or \ - most_common_extension == 'pl' and top_language == 'perl' or \ - most_common_extension == top_language: - main_language_str = top_language + ## old approach: + # most_common_extension = max(set(extension_list), key=extension_list.count) + # if most_common_extension == 'py' and top_language == 'python' or \ + # most_common_extension == 'js' and top_language == 'javascript' or \ + # most_common_extension == 'ts' and top_language == 'typescript' or \ + # most_common_extension == 'tsx' and top_language == 'typescript' or \ + # most_common_extension == 'go' and top_language == 'go' or \ + # most_common_extension == 'java' and top_language == 'java' or \ + # most_common_extension == 'c' and top_language == 'c' or \ + # most_common_extension == 'cpp' and top_language == 'c++' or \ + # most_common_extension == 'cs' and top_language == 'c#' or \ + # most_common_extension == 'swift' and top_language == 'swift' or \ + # most_common_extension == 'php' and top_language == 'php' or \ + # most_common_extension == 'rb' and top_language == 'ruby' or \ + # most_common_extension == 'rs' and top_language == 'rust' or \ + # most_common_extension == 'scala' and top_language == 'scala' or \ + # most_common_extension == 'kt' and top_language == 'kotlin' or \ + # most_common_extension == 'pl' and top_language == 'perl' or \ + # most_common_extension == top_language: + # main_language_str = top_language except Exception as e: get_logger().exception(e) diff --git a/pr_agent/settings/pr_add_docs.toml b/pr_agent/settings/pr_add_docs.toml index 31b7195c..ffb7d01d 100644 --- a/pr_agent/settings/pr_add_docs.toml +++ b/pr_agent/settings/pr_add_docs.toml @@ -103,7 +103,7 @@ Description: '{{description}}' {%- if language %} -Main language: {{language}} +Main PR language: '{{language}}' {%- endif %} diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index 2a51b324..f1633e46 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -2,8 +2,8 @@ system="""You are CodiumAI-PR-Reviewer, a language model designed to review git pull requests. Your task is to provide full description of a Pull Request (PR) content. - Make sure to focus on the new PR code (the '+' lines). -- Notice that the 'Previous title', 'Previous description' and 'Commit messages' sections may be partial, simplistic, non-informative or not up-to-date. Hence, compare them to the PR diff code, and use them only as a reference. -- Emphasize first the most important changes, and then the less important ones. +- Keep in mind that the 'Previous title', 'Previous description' and 'Commit messages' sections may be partial, simplistic, non-informative or out of date. Hence, compare them to the PR diff code, and use them only as a reference. +- Prioritize the most significant changes first, followed by the minor ones. - If needed, each YAML output should be in block scalar format ('|-') {%- if extra_instructions %} @@ -68,12 +68,15 @@ Answer should be a valid YAML, and nothing else. Each YAML output MUST be after """ user="""PR Info: + Previous title: '{{title}}' + Previous description: '{{description}}' + Branch: '{{branch}}' {%- if language %} -Main language: {{language}} +Main PR language: '{{ language }}' {%- endif %} {%- if commit_messages_str %} From d7df4287f8612e21a3ac63d1dbd4af21defc0ef8 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 08:17:16 +0200 Subject: [PATCH 14/38] feat: Update PR prompts in toml files to enhance readability and consistency --- pr_agent/settings/pr_code_suggestions_prompts.toml | 2 +- pr_agent/settings/pr_custom_labels.toml | 6 ++++-- pr_agent/settings/pr_description_prompts.toml | 4 +++- .../settings/pr_information_from_user_prompts.toml | 8 +++++++- pr_agent/settings/pr_questions_prompts.toml | 11 +++++++++-- pr_agent/settings/pr_reviewer_prompts.toml | 9 ++++++++- pr_agent/settings/pr_update_changelog_prompts.toml | 11 +++++++++-- 7 files changed, 41 insertions(+), 10 deletions(-) diff --git a/pr_agent/settings/pr_code_suggestions_prompts.toml b/pr_agent/settings/pr_code_suggestions_prompts.toml index 42ec7441..455d6612 100644 --- a/pr_agent/settings/pr_code_suggestions_prompts.toml +++ b/pr_agent/settings/pr_code_suggestions_prompts.toml @@ -120,7 +120,7 @@ Description: '{{description}}' {%- if language %} -Main language: {{language}} +Main PR language: '{{ language }}' {%- endif %} diff --git a/pr_agent/settings/pr_custom_labels.toml b/pr_agent/settings/pr_custom_labels.toml index 976258dc..dada1518 100644 --- a/pr_agent/settings/pr_custom_labels.toml +++ b/pr_agent/settings/pr_custom_labels.toml @@ -51,12 +51,14 @@ Previous description: '{{description}}' Branch: '{{branch}}' {%- if language %} -Main language: {{language}} +Main PR language: '{{ language }}' {%- endif %} {%- if commit_messages_str %} Commit messages: -{{commit_messages_str}} +' +{{ commit_messages_str }} +' {%- endif %} diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index f1633e46..931f92c3 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -81,7 +81,9 @@ Main PR language: '{{ language }}' {%- if commit_messages_str %} Commit messages: -{{commit_messages_str}} +' +{{ commit_messages_str }} +' {%- endif %} diff --git a/pr_agent/settings/pr_information_from_user_prompts.toml b/pr_agent/settings/pr_information_from_user_prompts.toml index 8d628f7a..7b1b6fdb 100644 --- a/pr_agent/settings/pr_information_from_user_prompts.toml +++ b/pr_agent/settings/pr_information_from_user_prompts.toml @@ -16,15 +16,21 @@ Questions to better understand the PR: user="""PR Info: Title: '{{title}}' + Branch: '{{branch}}' + Description: '{{description}}' + {%- if language %} -Main language: {{language}} + +Main PR language: '{{ language }}' {%- endif %} {%- if commit_messages_str %} Commit messages: +' {{commit_messages_str}} +' {%- endif %} diff --git a/pr_agent/settings/pr_questions_prompts.toml b/pr_agent/settings/pr_questions_prompts.toml index e306684d..dc7a313d 100644 --- a/pr_agent/settings/pr_questions_prompts.toml +++ b/pr_agent/settings/pr_questions_prompts.toml @@ -7,16 +7,23 @@ Make sure not to repeat modifications already implemented in the new PR code (th """ user="""PR Info: + Title: '{{title}}' + Branch: '{{branch}}' + Description: '{{description}}' + {%- if language %} -Main language: {{language}} + +Main PR language: '{{ language }}' {%- endif %} {%- if commit_messages_str %} Commit messages: -{{commit_messages_str}} +' +{{ commit_messages_str }} +' {%- endif %} diff --git a/pr_agent/settings/pr_reviewer_prompts.toml b/pr_agent/settings/pr_reviewer_prompts.toml index b75c296a..cece22f9 100644 --- a/pr_agent/settings/pr_reviewer_prompts.toml +++ b/pr_agent/settings/pr_reviewer_prompts.toml @@ -179,16 +179,23 @@ Don't repeat the prompt in the answer, and avoid outputting the 'type' and 'desc """ user="""PR Info: + Title: '{{title}}' + Branch: '{{branch}}' + Description: '{{description}}' + {%- if language %} -Main language: {{language}} + +Main PR language: '{{ language }}' {%- endif %} {%- if commit_messages_str %} Commit messages: +' {{commit_messages_str}} +' {%- endif %} {%- if question_str %} diff --git a/pr_agent/settings/pr_update_changelog_prompts.toml b/pr_agent/settings/pr_update_changelog_prompts.toml index e9133e34..9d00f251 100644 --- a/pr_agent/settings/pr_update_changelog_prompts.toml +++ b/pr_agent/settings/pr_update_changelog_prompts.toml @@ -15,16 +15,23 @@ Extra instructions from the user: """ user="""PR Info: + Title: '{{title}}' + Branch: '{{branch}}' + Description: '{{description}}' + {%- if language %} -Main language: {{language}} + +Main PR language: '{{ language }}' {%- endif %} {%- if commit_messages_str %} Commit messages: -{{commit_messages_str}} +' +{{ commit_messages_str }} +' {%- endif %} From 9465b7b577e90f93210205449a93aaf83b15da8e Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 08:29:47 +0200 Subject: [PATCH 15/38] refactor: Move clip_tokens function from pr_processing to utils module, and add tests --- pr_agent/algo/pr_processing.py | 31 +----------------- pr_agent/algo/utils.py | 32 +++++++++++++++++++ .../git_providers/azuredevops_provider.py | 3 +- pr_agent/git_providers/git_provider.py | 2 +- pr_agent/git_providers/github_provider.py | 4 +-- pr_agent/git_providers/gitlab_provider.py | 4 +-- tests/unittest/test_clip_tokens.py | 19 +++++++++++ 7 files changed, 58 insertions(+), 37 deletions(-) create mode 100644 tests/unittest/test_clip_tokens.py diff --git a/pr_agent/algo/pr_processing.py b/pr_agent/algo/pr_processing.py index 6063dece..4c1352f0 100644 --- a/pr_agent/algo/pr_processing.py +++ b/pr_agent/algo/pr_processing.py @@ -10,7 +10,7 @@ from github import RateLimitExceededException from pr_agent.algo.git_patch_processing import convert_to_hunks_with_lines_numbers, extend_patch, handle_patch_deletions from pr_agent.algo.language_handler import sort_files_by_main_languages from pr_agent.algo.file_filter import filter_ignored -from pr_agent.algo.token_handler import TokenHandler, get_token_encoder +from pr_agent.algo.token_handler import TokenHandler from pr_agent.algo.utils import get_max_tokens from pr_agent.config_loader import get_settings from pr_agent.git_providers.git_provider import FilePatchInfo, GitProvider, EDIT_TYPE @@ -326,35 +326,6 @@ def find_line_number_of_relevant_line_in_file(diff_files: List[FilePatchInfo], return position, absolute_position -def clip_tokens(text: str, max_tokens: int) -> str: - """ - Clip the number of tokens in a string to a maximum number of tokens. - - Args: - text (str): The string to clip. - max_tokens (int): The maximum number of tokens allowed in the string. - - Returns: - str: The clipped string. - """ - if not text: - return text - - try: - encoder = get_token_encoder() - num_input_tokens = len(encoder.encode(text)) - if num_input_tokens <= max_tokens: - return text - num_chars = len(text) - chars_per_token = num_chars / num_input_tokens - num_output_chars = int(chars_per_token * max_tokens) - clipped_text = text[:num_output_chars] - return clipped_text - except Exception as e: - get_logger().warning(f"Failed to clip tokens: {e}") - return text - - def get_pr_multi_diffs(git_provider: GitProvider, token_handler: TokenHandler, model: str, diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index b9aaee94..73074098 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -11,6 +11,7 @@ import yaml from starlette_context import context from pr_agent.algo import MAX_TOKENS +from pr_agent.algo.token_handler import get_token_encoder from pr_agent.config_loader import get_settings, global_settings from pr_agent.log import get_logger @@ -378,3 +379,34 @@ def get_max_tokens(model): max_tokens_model = min(settings.config.max_model_tokens, max_tokens_model) # get_logger().debug(f"limiting max tokens to {max_tokens_model}") return max_tokens_model + + +def clip_tokens(text: str, max_tokens: int, add_three_dots=True) -> str: + """ + Clip the number of tokens in a string to a maximum number of tokens. + + Args: + text (str): The string to clip. + max_tokens (int): The maximum number of tokens allowed in the string. + add_three_dots (bool, optional): A boolean indicating whether to add three dots at the end of the clipped + Returns: + str: The clipped string. + """ + if not text: + return text + + try: + encoder = get_token_encoder() + num_input_tokens = len(encoder.encode(text)) + if num_input_tokens <= max_tokens: + return text + num_chars = len(text) + chars_per_token = num_chars / num_input_tokens + num_output_chars = int(chars_per_token * max_tokens) + clipped_text = text[:num_output_chars] + if add_three_dots: + clipped_text += "...(truncated)" + return clipped_text + except Exception as e: + get_logger().warning(f"Failed to clip tokens: {e}") + return text diff --git a/pr_agent/git_providers/azuredevops_provider.py b/pr_agent/git_providers/azuredevops_provider.py index 6a404532..ca11b9d8 100644 --- a/pr_agent/git_providers/azuredevops_provider.py +++ b/pr_agent/git_providers/azuredevops_provider.py @@ -14,9 +14,8 @@ try: except ImportError: AZURE_DEVOPS_AVAILABLE = False -from ..algo.pr_processing import clip_tokens from ..config_loader import get_settings -from ..algo.utils import load_large_diff +from ..algo.utils import load_large_diff, clip_tokens from ..algo.language_handler import is_valid_file from .git_provider import EDIT_TYPE, FilePatchInfo diff --git a/pr_agent/git_providers/git_provider.py b/pr_agent/git_providers/git_provider.py index d929ed37..d0012b5e 100644 --- a/pr_agent/git_providers/git_provider.py +++ b/pr_agent/git_providers/git_provider.py @@ -63,7 +63,7 @@ class GitProvider(ABC): def get_pr_description(self, *, full: bool = True) -> str: from pr_agent.config_loader import get_settings - from pr_agent.algo.pr_processing import clip_tokens + from pr_agent.algo.utils import clip_tokens max_tokens_description = get_settings().get("CONFIG.MAX_DESCRIPTION_TOKENS", None) description = self.get_pr_description_full() if full else self.get_user_description() if max_tokens_description: diff --git a/pr_agent/git_providers/github_provider.py b/pr_agent/git_providers/github_provider.py index 634b8694..46afbad6 100644 --- a/pr_agent/git_providers/github_provider.py +++ b/pr_agent/git_providers/github_provider.py @@ -8,8 +8,8 @@ from retry import retry from starlette_context import context from ..algo.language_handler import is_valid_file -from ..algo.pr_processing import clip_tokens, find_line_number_of_relevant_line_in_file -from ..algo.utils import load_large_diff +from ..algo.pr_processing import find_line_number_of_relevant_line_in_file +from ..algo.utils import load_large_diff, clip_tokens from ..config_loader import get_settings from ..log import get_logger from ..servers.utils import RateLimitExceeded diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 078ca9dd..2eb00ce1 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -7,8 +7,8 @@ import gitlab from gitlab import GitlabGetError from ..algo.language_handler import is_valid_file -from ..algo.pr_processing import clip_tokens, find_line_number_of_relevant_line_in_file -from ..algo.utils import load_large_diff +from ..algo.pr_processing import find_line_number_of_relevant_line_in_file +from ..algo.utils import load_large_diff, clip_tokens from ..config_loader import get_settings from .git_provider import EDIT_TYPE, FilePatchInfo, GitProvider from ..log import get_logger diff --git a/tests/unittest/test_clip_tokens.py b/tests/unittest/test_clip_tokens.py new file mode 100644 index 00000000..cc52ab7e --- /dev/null +++ b/tests/unittest/test_clip_tokens.py @@ -0,0 +1,19 @@ + +# Generated by CodiumAI + +import pytest + +from pr_agent.algo.utils import clip_tokens + + +class TestClipTokens: + def test_clip(self): + text = "line1\nline2\nline3\nline4\nline5\nline6" + max_tokens = 25 + result = clip_tokens(text, max_tokens) + assert result == text + + max_tokens = 10 + result = clip_tokens(text, max_tokens) + expected_results = 'line1\nline2\nline3\nli...(truncated)' + assert result == expected_results From 8db2e3b2a0f76f654715c8c4d64c25fa335c9a8c Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 08:42:04 +0200 Subject: [PATCH 16/38] feat: Enhance readability in toml files and add verbosity level logging in pr_generate_labels.py --- pr_agent/settings/pr_custom_labels.toml | 10 +++++++--- pr_agent/settings/pr_description_prompts.toml | 11 ++++++++--- pr_agent/settings/pr_reviewer_prompts.toml | 2 ++ pr_agent/tools/pr_generate_labels.py | 3 +++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/pr_agent/settings/pr_custom_labels.toml b/pr_agent/settings/pr_custom_labels.toml index dada1518..01efa5a5 100644 --- a/pr_agent/settings/pr_custom_labels.toml +++ b/pr_agent/settings/pr_custom_labels.toml @@ -1,5 +1,5 @@ [pr_custom_labels_prompt] -system="""You are CodiumAI-PR-Reviewer, a language model designed to review git Pull Requests (PR). +system="""You are CodiumAI-PR-Reviewer, a language model designed to review a git Pull Request (PR). Your task is to provide labels that describe the PR content. {%- if enable_custom_labels %} Thoroughly read the labels name and the provided description, and decide whether the label is relevant to the PR. @@ -46,9 +46,13 @@ Answer should be a valid YAML, and nothing else. """ user="""PR Info: + Previous title: '{{title}}' -Previous description: '{{description}}' -Branch: '{{branch}}' + +Branch: '{{ branch }}' + +Description: '{{ description }}' + {%- if language %} Main PR language: '{{ language }}' diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index 931f92c3..96062ab2 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -1,6 +1,6 @@ [pr_description_prompt] -system="""You are CodiumAI-PR-Reviewer, a language model designed to review git pull requests. -Your task is to provide full description of a Pull Request (PR) content. +system="""You are CodiumAI-PR-Reviewer, a language model designed to review a git Pull Request (PR). +Your task is to provide full description of a Pr content. - Make sure to focus on the new PR code (the '+' lines). - Keep in mind that the 'Previous title', 'Previous description' and 'Commit messages' sections may be partial, simplistic, non-informative or out of date. Hence, compare them to the PR diff code, and use them only as a reference. - Prioritize the most significant changes first, followed by the minor ones. @@ -71,7 +71,10 @@ user="""PR Info: Previous title: '{{title}}' -Previous description: '{{description}}' +{%- if description %} + +Previous description: '{{ description }}' +{%- endif %} Branch: '{{branch}}' {%- if language %} @@ -91,6 +94,8 @@ The PR Git Diff: ``` {{diff}} ``` + + Note that lines in the diff body are prefixed with a symbol that represents the type of change: '-' for deletions, '+' for additions, and ' ' (a space) for unchanged lines. Response (should be a valid YAML, and nothing else): diff --git a/pr_agent/settings/pr_reviewer_prompts.toml b/pr_agent/settings/pr_reviewer_prompts.toml index cece22f9..e8722080 100644 --- a/pr_agent/settings/pr_reviewer_prompts.toml +++ b/pr_agent/settings/pr_reviewer_prompts.toml @@ -215,6 +215,8 @@ The PR Git Diff: ``` {{diff}} ``` + + Note that lines in the diff body are prefixed with a symbol that represents the type of change: '-' for deletions, '+' for additions. Focus on the '+' lines. Response (should be a valid YAML, and nothing else): diff --git a/pr_agent/tools/pr_generate_labels.py b/pr_agent/tools/pr_generate_labels.py index 45c504b3..6ea322a4 100644 --- a/pr_agent/tools/pr_generate_labels.py +++ b/pr_agent/tools/pr_generate_labels.py @@ -147,6 +147,9 @@ class PRGenerateLabels: user=user_prompt ) + if get_settings().config.verbosity_level >= 2: + get_logger().info(f"\nAI response:\n{response}") + return response def _prepare_data(self): From d8ae32fc55817a98ca35789056d1474c22b78229 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 08:52:55 +0200 Subject: [PATCH 17/38] language_extension_map --- pr_agent/algo/language_handler.py | 5 +++-- pr_agent/git_providers/codecommit_provider.py | 4 +++- pr_agent/git_providers/git_provider.py | 5 ++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pr_agent/algo/language_handler.py b/pr_agent/algo/language_handler.py index 66e85025..b4c02bee 100644 --- a/pr_agent/algo/language_handler.py +++ b/pr_agent/algo/language_handler.py @@ -3,8 +3,7 @@ from typing import Dict from pr_agent.config_loader import get_settings -language_extension_map_org = get_settings().language_extension_map_org -language_extension_map = {k.lower(): v for k, v in language_extension_map_org.items()} + # Bad Extensions, source: https://github.com/EleutherAI/github-downloader/blob/345e7c4cbb9e0dc8a0615fd995a08bf9d73b3fe6/download_repo_text.py # noqa: E501 bad_extensions = get_settings().bad_extensions.default @@ -29,6 +28,8 @@ def sort_files_by_main_languages(languages: Dict, files: list): # languages_sorted = sorted(languages, key=lambda x: x[1], reverse=True) # get all extensions for the languages main_extensions = [] + language_extension_map_org = get_settings().language_extension_map_org + language_extension_map = {k.lower(): v for k, v in language_extension_map_org.items()} for language in languages_sorted_list: if language.lower() in language_extension_map: main_extensions.append(language_extension_map[language.lower()]) diff --git a/pr_agent/git_providers/codecommit_provider.py b/pr_agent/git_providers/codecommit_provider.py index a4836849..399f0a94 100644 --- a/pr_agent/git_providers/codecommit_provider.py +++ b/pr_agent/git_providers/codecommit_provider.py @@ -6,9 +6,9 @@ from urllib.parse import urlparse from pr_agent.git_providers.codecommit_client import CodeCommitClient -from ..algo.language_handler import is_valid_file, language_extension_map from ..algo.utils import load_large_diff from .git_provider import EDIT_TYPE, FilePatchInfo, GitProvider +from ..config_loader import get_settings from ..log import get_logger @@ -269,6 +269,8 @@ class CodeCommitProvider(GitProvider): # where each dictionary item is a language name. # We build that language->extension dictionary here in main_extensions_flat. main_extensions_flat = {} + language_extension_map_org = get_settings().language_extension_map_org + language_extension_map = {k.lower(): v for k, v in language_extension_map_org.items()} for language, extensions in language_extension_map.items(): for ext in extensions: main_extensions_flat[ext] = language diff --git a/pr_agent/git_providers/git_provider.py b/pr_agent/git_providers/git_provider.py index d0012b5e..a341f43a 100644 --- a/pr_agent/git_providers/git_provider.py +++ b/pr_agent/git_providers/git_provider.py @@ -1,11 +1,11 @@ from abc import ABC, abstractmethod from dataclasses import dataclass -from pr_agent.algo.language_handler import language_extension_map # enum EDIT_TYPE (ADDED, DELETED, MODIFIED, RENAMED) from enum import Enum from typing import Optional +from pr_agent.config_loader import get_settings from pr_agent.log import get_logger @@ -176,6 +176,9 @@ def get_main_pr_language(languages, files) -> str: # get the most common extension most_common_extension = '.' + max(set(extension_list), key=extension_list.count) try: + language_extension_map_org = get_settings().language_extension_map_org + language_extension_map = {k.lower(): v for k, v in language_extension_map_org.items()} + if top_language in language_extension_map and most_common_extension in language_extension_map[top_language]: main_language_str = top_language else: From 0326b7e4acde31a9dc076622cc6559ffdd257014 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 09:05:45 +0200 Subject: [PATCH 18/38] refactor: Update PR prompts in toml files for clarity and consistency --- pr_agent/settings/pr_add_docs.toml | 2 +- pr_agent/settings/pr_code_suggestions_prompts.toml | 4 ++-- pr_agent/settings/pr_description_prompts.toml | 6 +++--- pr_agent/settings/pr_reviewer_prompts.toml | 2 +- pr_agent/settings/pr_sort_code_suggestions_prompts.toml | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pr_agent/settings/pr_add_docs.toml b/pr_agent/settings/pr_add_docs.toml index ffb7d01d..fbf4b475 100644 --- a/pr_agent/settings/pr_add_docs.toml +++ b/pr_agent/settings/pr_add_docs.toml @@ -1,6 +1,6 @@ [pr_add_docs_prompt] system="""You are a language model called PR-Code-Documentation Agent, that specializes in generating documentation for code. -Your task is to generate meaningfull {{ docs_for_language }} to a PR (the '+' lines). +Your task is to generate meaningfull {{ docs_for_language }} to a PR (lines starting with '+'). Example for a PR Diff input: ' diff --git a/pr_agent/settings/pr_code_suggestions_prompts.toml b/pr_agent/settings/pr_code_suggestions_prompts.toml index 455d6612..db5f95fe 100644 --- a/pr_agent/settings/pr_code_suggestions_prompts.toml +++ b/pr_agent/settings/pr_code_suggestions_prompts.toml @@ -1,6 +1,6 @@ [pr_code_suggestions_prompt] -system="""You are a language model called PR-Code-Reviewer, that specializes in suggesting code improvements for Pull Request (PR). -Your task is to provide meaningful and actionable code suggestions, to improve the new code presented in a PR (the '+' lines in the diff). +system="""You are a language model called PR-Reviewer, that specializes in suggesting code improvements for a Pull Request (PR). +Your task is to provide meaningful and actionable code suggestions, to improve the new code presented in a PR diff (lines starting with '+'). Example for a PR Diff input: ' diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index 96062ab2..e675575b 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -1,9 +1,9 @@ [pr_description_prompt] system="""You are CodiumAI-PR-Reviewer, a language model designed to review a git Pull Request (PR). -Your task is to provide full description of a Pr content. -- Make sure to focus on the new PR code (the '+' lines). +Your task is to provide full description the PR content. +- Make sure to focus on the new PR code (lines starting with '+'). - Keep in mind that the 'Previous title', 'Previous description' and 'Commit messages' sections may be partial, simplistic, non-informative or out of date. Hence, compare them to the PR diff code, and use them only as a reference. -- Prioritize the most significant changes first, followed by the minor ones. +- Prioritize the most significant PR changes first, followed by the minor ones. - If needed, each YAML output should be in block scalar format ('|-') {%- if extra_instructions %} diff --git a/pr_agent/settings/pr_reviewer_prompts.toml b/pr_agent/settings/pr_reviewer_prompts.toml index e8722080..d631d3d1 100644 --- a/pr_agent/settings/pr_reviewer_prompts.toml +++ b/pr_agent/settings/pr_reviewer_prompts.toml @@ -1,5 +1,5 @@ [pr_review_prompt] -system="""You are PR-Reviewer, a language model designed to review git pull requests. +system="""You are PR-Reviewer, a language model designed to review a git Pull Request (PR). Your task is to provide constructive and concise feedback for the PR, and also provide meaningful code suggestions. Example PR Diff input: diff --git a/pr_agent/settings/pr_sort_code_suggestions_prompts.toml b/pr_agent/settings/pr_sort_code_suggestions_prompts.toml index 16b6e861..f4a3f5bf 100644 --- a/pr_agent/settings/pr_sort_code_suggestions_prompts.toml +++ b/pr_agent/settings/pr_sort_code_suggestions_prompts.toml @@ -2,10 +2,10 @@ system=""" """ -user="""You are given a list of code suggestions to improve a PR: - +user="""You are given a list of code suggestions to improve a git Pull Request (PR): +' {{ suggestion_str|trim }} - +' Your task is to sort the code suggestions by their order of importance, and return a list with sorting order. The sorting order is a list of pairs, where each pair contains the index of the suggestion in the original list. From 1a28c7778325bf2c996a6da6d6c02ef1025f8651 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 09:08:33 +0200 Subject: [PATCH 19/38] Previous description --- pr_agent/settings/pr_description_prompts.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index e675575b..500f3187 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -73,7 +73,10 @@ Previous title: '{{title}}' {%- if description %} -Previous description: '{{ description }}' +Previous description: +' +{{ description }} +' {%- endif %} Branch: '{{branch}}' From 690c1136039d9af9987f3a8692f2e55ce397ed55 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 09:17:42 +0200 Subject: [PATCH 20/38] refactor: Improve clarity and consistency in pr_code_suggestions_prompts.toml and pr_reviewer_prompts.toml files --- .../settings/pr_code_suggestions_prompts.toml | 2 +- pr_agent/settings/pr_reviewer_prompts.toml | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pr_agent/settings/pr_code_suggestions_prompts.toml b/pr_agent/settings/pr_code_suggestions_prompts.toml index db5f95fe..4b752272 100644 --- a/pr_agent/settings/pr_code_suggestions_prompts.toml +++ b/pr_agent/settings/pr_code_suggestions_prompts.toml @@ -1,5 +1,5 @@ [pr_code_suggestions_prompt] -system="""You are a language model called PR-Reviewer, that specializes in suggesting code improvements for a Pull Request (PR). +system="""You are PR-Reviewer, a language model that specializes in suggesting code improvements for a Pull Request (PR). Your task is to provide meaningful and actionable code suggestions, to improve the new code presented in a PR diff (lines starting with '+'). Example for a PR Diff input: diff --git a/pr_agent/settings/pr_reviewer_prompts.toml b/pr_agent/settings/pr_reviewer_prompts.toml index d631d3d1..11170518 100644 --- a/pr_agent/settings/pr_reviewer_prompts.toml +++ b/pr_agent/settings/pr_reviewer_prompts.toml @@ -1,6 +1,7 @@ [pr_review_prompt] system="""You are PR-Reviewer, a language model designed to review a git Pull Request (PR). Your task is to provide constructive and concise feedback for the PR, and also provide meaningful code suggestions. +The review should focus on new code added in the PR diff (lines starting with '+') Example PR Diff input: ' @@ -22,14 +23,12 @@ code line that already existed in the file.... ... ' -The review should focus on new code added in the PR (lines starting with '+'), and not on code that already existed in the file (lines starting with '-', or without prefix). - {%- if num_code_suggestions > 0 %} - Provide up to {{ num_code_suggestions }} code suggestions. Try to provide diverse and insightful suggestions. - Focus on important suggestions like fixing code problems, issues and bugs. As a second priority, provide suggestions for meaningful code improvements, like performance, vulnerability, modularity, and best practices. - Avoid making suggestions that have already been implemented in the PR code. For example, if you want to add logs, or change a variable to const, or anything else, make sure it isn't already in the PR code. - Don't suggest to add docstring, type hints, or comments. -- Suggestions should focus on improving the new code added in the PR (lines starting with '+') +- Suggestions should focus on improving the new code added in the PR diff (lines starting with '+') {%- endif %} {%- if extra_instructions %} @@ -184,7 +183,13 @@ Title: '{{title}}' Branch: '{{branch}}' -Description: '{{description}}' +{%- if description %} + +Description: +' +{{description}} +' +{%- endif %} {%- if language %} @@ -217,8 +222,6 @@ The PR Git Diff: ``` -Note that lines in the diff body are prefixed with a symbol that represents the type of change: '-' for deletions, '+' for additions. Focus on the '+' lines. - Response (should be a valid YAML, and nothing else): ```yaml """ From 14d4ca8c7427d3f145c73d196fe29fde939dcb96 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 09:22:19 +0200 Subject: [PATCH 21/38] PR --- pr_agent/settings/pr_custom_labels.toml | 2 +- pr_agent/settings/pr_description_prompts.toml | 2 +- pr_agent/settings/pr_information_from_user_prompts.toml | 2 +- pr_agent/settings/pr_questions_prompts.toml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pr_agent/settings/pr_custom_labels.toml b/pr_agent/settings/pr_custom_labels.toml index 01efa5a5..ddcc8cb0 100644 --- a/pr_agent/settings/pr_custom_labels.toml +++ b/pr_agent/settings/pr_custom_labels.toml @@ -1,5 +1,5 @@ [pr_custom_labels_prompt] -system="""You are CodiumAI-PR-Reviewer, a language model designed to review a git Pull Request (PR). +system="""You are PR-Reviewer, a language model designed to review a git Pull Request (PR). Your task is to provide labels that describe the PR content. {%- if enable_custom_labels %} Thoroughly read the labels name and the provided description, and decide whether the label is relevant to the PR. diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index 500f3187..9e5000c9 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -1,5 +1,5 @@ [pr_description_prompt] -system="""You are CodiumAI-PR-Reviewer, a language model designed to review a git Pull Request (PR). +system="""You are PR-Reviewer, a language model designed to review a git Pull Request (PR). Your task is to provide full description the PR content. - Make sure to focus on the new PR code (lines starting with '+'). - Keep in mind that the 'Previous title', 'Previous description' and 'Commit messages' sections may be partial, simplistic, non-informative or out of date. Hence, compare them to the PR diff code, and use them only as a reference. diff --git a/pr_agent/settings/pr_information_from_user_prompts.toml b/pr_agent/settings/pr_information_from_user_prompts.toml index 7b1b6fdb..ca4cbe3c 100644 --- a/pr_agent/settings/pr_information_from_user_prompts.toml +++ b/pr_agent/settings/pr_information_from_user_prompts.toml @@ -1,5 +1,5 @@ [pr_information_from_user_prompt] -system="""You are CodiumAI-PR-Reviewer, a language model designed to review git pull requests. +system="""You are PR-Reviewer, a language model designed to review a git Pull Request (PR). Given the PR Info and the PR Git Diff, generate 3 short questions about the PR code for the PR author. The goal of the questions is to help the language model understand the PR better, so the questions should be insightful, informative, non-trivial, and relevant to the PR. You should prefer asking yes\\no questions, or multiple choice questions. Also add at least one open-ended question, but make sure they are not too difficult, and can be answered in a sentence or two. diff --git a/pr_agent/settings/pr_questions_prompts.toml b/pr_agent/settings/pr_questions_prompts.toml index dc7a313d..63569197 100644 --- a/pr_agent/settings/pr_questions_prompts.toml +++ b/pr_agent/settings/pr_questions_prompts.toml @@ -1,6 +1,6 @@ [pr_questions_prompt] -system="""You are CodiumAI-PR-Reviewer, a language model designed to review git pull requests. -Your task is to answer questions about the new PR code (the '+' lines), and provide feedback. +system="""You are PR-Reviewer, a language model designed to review a git Pull Request (PR). +Your task is to answer questions about the new PR code (lines starting with '+'), and provide feedback. Be informative, constructive, and give examples. Try to be as specific as possible. Don't avoid answering the questions. You must answer the questions, as best as you can, without adding unrelated content. Make sure not to repeat modifications already implemented in the new PR code (the '+' lines). From aa73eb2841c8fa6cadc40beacc1773fe651277f5 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 09:24:33 +0200 Subject: [PATCH 22/38] PR --- pr_agent/settings/pr_description_prompts.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index 9e5000c9..9aefe0da 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -1,6 +1,6 @@ [pr_description_prompt] system="""You are PR-Reviewer, a language model designed to review a git Pull Request (PR). -Your task is to provide full description the PR content. +Your task is to provide a full description for the PR content. - Make sure to focus on the new PR code (lines starting with '+'). - Keep in mind that the 'Previous title', 'Previous description' and 'Commit messages' sections may be partial, simplistic, non-informative or out of date. Hence, compare them to the PR diff code, and use them only as a reference. - Prioritize the most significant PR changes first, followed by the minor ones. From 668041c09fc28ebcfe3782b219900e82b2eef1b2 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 09:32:02 +0200 Subject: [PATCH 23/38] Code suggestions guidelines: --- pr_agent/settings/pr_reviewer_prompts.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pr_agent/settings/pr_reviewer_prompts.toml b/pr_agent/settings/pr_reviewer_prompts.toml index 11170518..b3e8f9b4 100644 --- a/pr_agent/settings/pr_reviewer_prompts.toml +++ b/pr_agent/settings/pr_reviewer_prompts.toml @@ -24,11 +24,13 @@ code line that already existed in the file.... ' {%- if num_code_suggestions > 0 %} + +Code suggestions guidelines: - Provide up to {{ num_code_suggestions }} code suggestions. Try to provide diverse and insightful suggestions. - Focus on important suggestions like fixing code problems, issues and bugs. As a second priority, provide suggestions for meaningful code improvements, like performance, vulnerability, modularity, and best practices. - Avoid making suggestions that have already been implemented in the PR code. For example, if you want to add logs, or change a variable to const, or anything else, make sure it isn't already in the PR code. - Don't suggest to add docstring, type hints, or comments. -- Suggestions should focus on improving the new code added in the PR diff (lines starting with '+') +- Suggestions should focus on the new code added in the PR diff (lines starting with '+') {%- endif %} {%- if extra_instructions %} From f104b70703a52f6f56a37da8d68a183c9dd8e081 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 10:38:49 +0200 Subject: [PATCH 24/38] Update INSTALL.md --- INSTALL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/INSTALL.md b/INSTALL.md index ee8b1dda..b766bdc8 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -25,6 +25,7 @@ There are several ways to use PR-Agent: **BitBucket specific methods** - [Run as a Bitbucket Pipeline](INSTALL.md#run-as-a-bitbucket-pipeline) - [Run on a hosted app](INSTALL.md#run-on-a-hosted-bitbucket-app) +- [Bitbucket server and data center](INSTALL.md#bitbucket-server-and-data-center) --- ### Use Docker image (no installation required) From f36b672eaaede6838720cf82610f0323639a9237 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 11:22:14 +0200 Subject: [PATCH 25/38] feat: Add option to summarize code suggestions in pr_code_suggestions.py --- pr_agent/tools/pr_code_suggestions.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index 9e8d7f15..3f4c3149 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -75,8 +75,30 @@ class PRCodeSuggestions: if get_settings().config.publish_output: get_logger().info('Pushing PR review...') self.git_provider.remove_initial_comment() - get_logger().info('Pushing inline code suggestions...') - self.push_inline_code_suggestions(data) + if get_settings().pr_code_suggestions.summarize: + get_logger().info('Pushing summarize code suggestions...') + data_markdown = "## Code suggestions\n\n" + for s in data['Code suggestions']: + import hashlib + relevant_file = s['relevant file'] + sha_file = hashlib.sha256(relevant_file.encode('utf-8')).hexdigest() + absolute_position_start = s['relevant lines start'] + absolute_position_end = s['relevant lines end'] + link = f"https://github.com/{self.git_provider.repo}/pull/{self.git_provider.pr_num}/files#diff-{sha_file}R{absolute_position_start}-R{absolute_position_end}" + + data_markdown += f"File:\n [{s['relevant file']}({absolute_position_start}-{absolute_position_end})]({link})\n" + data_markdown += f"\nSuggestion:\n**{s['suggestion content']}**\n" + data_markdown += "
Example code:\n" + data_markdown += f"Existing code:\n```suggestion\n{s['existing code']}\n```\n" + data_markdown += f"Improved code:\n```suggestion\n{s['improved code']}\n```\n" + data_markdown += "
\n" + data_markdown += "\n___\n\n" + # data_markdown = convert_to_markdown(data) + self.git_provider.publish_comment(data_markdown) + aaa = 3 + else: + get_logger().info('Pushing inline code suggestions...') + self.push_inline_code_suggestions(data) except Exception as e: get_logger().error(f"Failed to generate code suggestions for PR, error: {e}") From f96d4924e76e5b70c96d9ca40fc7e21d69143ab7 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 11:57:45 +0200 Subject: [PATCH 26/38] feat: Add line link generation in git providers and refactor code suggestions generation --- pr_agent/git_providers/git_provider.py | 3 ++ pr_agent/git_providers/github_provider.py | 10 +++++ pr_agent/settings/configuration.toml | 1 + pr_agent/tools/pr_code_suggestions.py | 50 ++++++++++++----------- 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/pr_agent/git_providers/git_provider.py b/pr_agent/git_providers/git_provider.py index a341f43a..3ad1b2e0 100644 --- a/pr_agent/git_providers/git_provider.py +++ b/pr_agent/git_providers/git_provider.py @@ -89,6 +89,9 @@ class GitProvider(ABC): def get_pr_id(self): return "" + def get_line_link(self, relevant_file: str, relevant_line_start: int, relevant_line_end: int = None) -> str: + return "" + #### comments operations #### @abstractmethod def publish_comment(self, pr_comment: str, is_temporary: bool = False): diff --git a/pr_agent/git_providers/github_provider.py b/pr_agent/git_providers/github_provider.py index 46afbad6..ea2476bc 100644 --- a/pr_agent/git_providers/github_provider.py +++ b/pr_agent/git_providers/github_provider.py @@ -501,6 +501,16 @@ class GithubProvider(GitProvider): return "" + + def get_line_link(self, relevant_file: str, relevant_line_start: int, relevant_line_end: int = None) -> str: + sha_file = hashlib.sha256(relevant_file.encode('utf-8')).hexdigest() + if relevant_line_end: + link = f"https://github.com/{self.repo}/pull/{self.pr_num}/files#diff-{sha_file}R{relevant_line_start}-R{relevant_line_end}" + else: + link = f"https://github.com/{self.repo}/pull/{self.pr_num}/files#diff-{sha_file}R{relevant_line_start}" + return link + + def get_pr_id(self): try: pr_id = f"{self.repo}/{self.pr_num}" diff --git a/pr_agent/settings/configuration.toml b/pr_agent/settings/configuration.toml index 38e96fd1..51de6693 100644 --- a/pr_agent/settings/configuration.toml +++ b/pr_agent/settings/configuration.toml @@ -57,6 +57,7 @@ include_generated_by_header=true [pr_code_suggestions] # /improve # num_code_suggestions=4 +summarize = false extra_instructions = "" rank_suggestions = false # params for '/improve --extended' mode diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index 3f4c3149..ab875a2c 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -1,7 +1,7 @@ import copy import textwrap from typing import Dict, List - +import difflib from jinja2 import Environment, StrictUndefined from pr_agent.algo.ai_handler import AiHandler @@ -55,9 +55,9 @@ class PRCodeSuggestions: try: get_logger().info('Generating code suggestions for PR...') if get_settings().config.publish_output: - self.git_provider.publish_comment("Preparing review...", is_temporary=True) + self.git_provider.publish_comment("Preparing suggestions...", is_temporary=True) - get_logger().info('Preparing PR review...') + get_logger().info('Preparing PR code suggestions...') if not self.is_extended: await retry_with_fallback_models(self._prepare_prediction) data = self._prepare_pr_code_suggestions() @@ -73,29 +73,11 @@ class PRCodeSuggestions: data['Code suggestions'] = await self.rank_suggestions(data['Code suggestions']) if get_settings().config.publish_output: - get_logger().info('Pushing PR review...') + get_logger().info('Pushing PR code suggestions...') self.git_provider.remove_initial_comment() if get_settings().pr_code_suggestions.summarize: get_logger().info('Pushing summarize code suggestions...') - data_markdown = "## Code suggestions\n\n" - for s in data['Code suggestions']: - import hashlib - relevant_file = s['relevant file'] - sha_file = hashlib.sha256(relevant_file.encode('utf-8')).hexdigest() - absolute_position_start = s['relevant lines start'] - absolute_position_end = s['relevant lines end'] - link = f"https://github.com/{self.git_provider.repo}/pull/{self.git_provider.pr_num}/files#diff-{sha_file}R{absolute_position_start}-R{absolute_position_end}" - - data_markdown += f"File:\n [{s['relevant file']}({absolute_position_start}-{absolute_position_end})]({link})\n" - data_markdown += f"\nSuggestion:\n**{s['suggestion content']}**\n" - data_markdown += "
Example code:\n" - data_markdown += f"Existing code:\n```suggestion\n{s['existing code']}\n```\n" - data_markdown += f"Improved code:\n```suggestion\n{s['improved code']}\n```\n" - data_markdown += "
\n" - data_markdown += "\n___\n\n" - # data_markdown = convert_to_markdown(data) - self.git_provider.publish_comment(data_markdown) - aaa = 3 + self.publish_summarizes_suggestions(data) else: get_logger().info('Pushing inline code suggestions...') self.push_inline_code_suggestions(data) @@ -266,4 +248,26 @@ class PRCodeSuggestions: return data_sorted + def publish_summarizes_suggestions(self, data: Dict): + try: + data_markdown = "## Code Suggestions\n\n" + for s in data['Code suggestions']: + code_snippet_link = self.git_provider.get_line_link(s['relevant file'], s['relevant lines start'], + s['relevant lines end']) + if code_snippet_link: + data_markdown += f"๐Ÿ“Œ File:\n[{s['relevant file']}({s['relevant lines start']}-{s['relevant lines end']})]({code_snippet_link})\n" + else: + data_markdown += f"๐Ÿ“Œ File:\n{s['relevant file']}({s['relevant lines start']}-{s['relevant lines end']})\n" + data_markdown += f"\nSuggestion:\n**{s['suggestion content']}**\n" + if self.git_provider.is_supported("gfm_markdown"): + data_markdown += "
Example code:\n\n___\n\n" + data_markdown += f"Existing code:\n```{self.main_language}\n{s['existing code']}\n```\n" + data_markdown += f"Improved code:\n```{self.main_language}\n{s['improved code']}\n```\n" + if self.git_provider.is_supported("gfm_markdown"): + data_markdown += "
\n" + data_markdown += "\n___\n\n" + self.git_provider.publish_comment(data_markdown) + except Exception as e: + get_logger().info(f"Failed to publish summarized code suggestions, error: {e}") + From 5cbbaf44c98432a04474959c8ca7b165899db331 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 13:42:57 +0200 Subject: [PATCH 27/38] feat: Add line link generation for GitLab and improve markdown formatting in pr_code_suggestions.py --- pr_agent/git_providers/gitlab_provider.py | 10 +++++++++- pr_agent/tools/pr_code_suggestions.py | 6 +++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 2eb00ce1..5d110359 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -43,7 +43,7 @@ class GitLabProvider(GitProvider): self.incremental = incremental def is_supported(self, capability: str) -> bool: - if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments', 'gfm_markdown']: + if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments']: # gfm_markdown is supported in gitlab ! return False return True @@ -422,6 +422,14 @@ class GitLabProvider(GitProvider): except: return "" + def get_line_link(self, relevant_file: str, relevant_line_start: int, relevant_line_end: int = None) -> str: + if relevant_line_end: + link = f"https://gitlab.com/codiumai/pr-agent/-/blob/{self.mr.source_branch}/{relevant_file}?ref_type=heads#L{relevant_line_start}-L{relevant_line_end}" + else: + link = f"https://gitlab.com/codiumai/pr-agent/-/blob/{self.mr.source_branch}/{relevant_file}?ref_type=heads#L{relevant_line_start}" + return link + + def generate_link_to_relevant_line_number(self, suggestion) -> str: try: relevant_file = suggestion['relevant file'].strip('`').strip("'") diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index ab875a2c..0bea080b 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -255,10 +255,10 @@ class PRCodeSuggestions: code_snippet_link = self.git_provider.get_line_link(s['relevant file'], s['relevant lines start'], s['relevant lines end']) if code_snippet_link: - data_markdown += f"๐Ÿ“Œ File:\n[{s['relevant file']}({s['relevant lines start']}-{s['relevant lines end']})]({code_snippet_link})\n" + data_markdown += f"๐Ÿ“Œ File:\n\n[{s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})]({code_snippet_link})\n" else: - data_markdown += f"๐Ÿ“Œ File:\n{s['relevant file']}({s['relevant lines start']}-{s['relevant lines end']})\n" - data_markdown += f"\nSuggestion:\n**{s['suggestion content']}**\n" + data_markdown += f"๐Ÿ“Œ File:\n\n{s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})\n" + data_markdown += f"\nSuggestion:\n\n**{s['suggestion content']}**\n\n" if self.git_provider.is_supported("gfm_markdown"): data_markdown += "
Example code:\n\n___\n\n" data_markdown += f"Existing code:\n```{self.main_language}\n{s['existing code']}\n```\n" From 8f615e17a3fe0146ea4502d9b1ecf111dc09036d Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 16:42:41 +0200 Subject: [PATCH 28/38] s --- pr_agent/algo/utils.py | 7 ++++--- pr_agent/tools/pr_code_suggestions.py | 3 ++- pr_agent/tools/pr_reviewer.py | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index 73074098..7a6e666c 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -58,7 +58,8 @@ def convert_to_markdown(output_data: dict, gfm_supported: bool=True) -> str: emoji = emojis.get(key, "") if key.lower() == 'code feedback': if gfm_supported: - markdown_text += f"\n\n- **
{ emoji } Code feedback:**\n\n" + markdown_text += f"\n\n- " + markdown_text += f"
{ emoji } Code feedback:\n\n" else: markdown_text += f"\n\n- **{emoji} Code feedback:**\n\n" else: @@ -99,9 +100,9 @@ def parse_code_suggestion(code_suggestions: dict, gfm_supported: bool=True) -> s markdown_text += f" - **{code_key}:**\n{code_str_indented}\n" else: if "relevant file" in sub_key.lower(): - markdown_text += f"\n - **{sub_key}:** {sub_value}\n" + markdown_text += f"\n - **{sub_key}:** {sub_value} \n" else: - markdown_text += f" **{sub_key}:** {sub_value}\n" + markdown_text += f" **{sub_key}:** {sub_value} \n" if not gfm_supported: if "relevant line" not in sub_key.lower(): # nicer presentation # markdown_text = markdown_text.rstrip('\n') + "\\\n" # works for gitlab diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index 0bea080b..757666df 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -260,7 +260,8 @@ class PRCodeSuggestions: data_markdown += f"๐Ÿ“Œ File:\n\n{s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})\n" data_markdown += f"\nSuggestion:\n\n**{s['suggestion content']}**\n\n" if self.git_provider.is_supported("gfm_markdown"): - data_markdown += "
Example code:\n\n___\n\n" + data_markdown += "
Example code:\n\n" + data_markdown += f"___\n\n" data_markdown += f"Existing code:\n```{self.main_language}\n{s['existing code']}\n```\n" data_markdown += f"Improved code:\n```{self.main_language}\n{s['improved code']}\n```\n" if self.git_provider.is_supported("gfm_markdown"): diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py index c3e35295..8e4be390 100644 --- a/pr_agent/tools/pr_reviewer.py +++ b/pr_agent/tools/pr_reviewer.py @@ -250,7 +250,7 @@ class PRReviewer: if not get_settings().get("CONFIG.CLI_MODE", False): markdown_text += "\n### How to use\n" if self.git_provider.is_supported("gfm_markdown"): - markdown_text += "\n**
Instructions**\n" + markdown_text += "\n
Instructions\n\n" bot_user = "[bot]" if get_settings().github_app.override_deployment_type else get_settings().github_app.bot_user if user and bot_user not in user: markdown_text += bot_help_text(user) From 20978402ea34d1d9bbfe649b00a1d5a77c7327cb Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 16:56:06 +0200 Subject: [PATCH 29/38] s --- pr_agent/tools/pr_code_suggestions.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index 757666df..7027fa2b 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -1,7 +1,6 @@ import copy import textwrap from typing import Dict, List -import difflib from jinja2 import Environment, StrictUndefined from pr_agent.algo.ai_handler import AiHandler @@ -250,15 +249,15 @@ class PRCodeSuggestions: def publish_summarizes_suggestions(self, data: Dict): try: - data_markdown = "## Code Suggestions\n\n" + data_markdown = "## PR Code Suggestions\n\n" for s in data['Code suggestions']: code_snippet_link = self.git_provider.get_line_link(s['relevant file'], s['relevant lines start'], s['relevant lines end']) + data_markdown += f"\n๐Ÿ’ก Suggestion:\n\n**{s['suggestion content']}**\n\n" if code_snippet_link: - data_markdown += f"๐Ÿ“Œ File:\n\n[{s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})]({code_snippet_link})\n" + data_markdown += f" File: [{s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})]({code_snippet_link})\n" else: - data_markdown += f"๐Ÿ“Œ File:\n\n{s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})\n" - data_markdown += f"\nSuggestion:\n\n**{s['suggestion content']}**\n\n" + data_markdown += f"File: {s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})\n" if self.git_provider.is_supported("gfm_markdown"): data_markdown += "
Example code:\n\n" data_markdown += f"___\n\n" From b1c374808d8f4816f39f4069adafdfbd257ef285 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 17:12:02 +0200 Subject: [PATCH 30/38] feat: Add line link generation in Bitbucket provider and improve markdown formatting in pr_code_suggestions.py and IMRPOVE.md --- docs/IMPROVE.md | 8 ++++++++ pics/improved_summerize_closed.png | Bin 0 -> 159778 bytes pics/improved_summerize_open.png | Bin 0 -> 138902 bytes pr_agent/git_providers/bitbucket_provider.py | 4 ++++ pr_agent/git_providers/github_provider.py | 1 - pr_agent/tools/pr_code_suggestions.py | 4 ++-- 6 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 pics/improved_summerize_closed.png create mode 100644 pics/improved_summerize_open.png diff --git a/docs/IMPROVE.md b/docs/IMPROVE.md index f60cec53..1501ea1d 100644 --- a/docs/IMPROVE.md +++ b/docs/IMPROVE.md @@ -33,6 +33,14 @@ Under the section 'pr_code_suggestions', the [configuration file](./../pr_agent/ - `max_number_of_calls`: maximum number of chunks. Default is 5. - `final_clip_factor`: factor to remove suggestions with low confidence. Default is 0.9. +#### summarize mode +- `summarize`: if set to true, the tool will summarize the PR code changes. Default is false. +In this mode, instead of presenting commitable suggestions, the different suggestions will be combined into a single compact instruction, with a significant smaller PR footprint. +For example: +`/improve --pr_code_suggestions.summarize=true` + + + #### A note on code suggestions quality diff --git a/pics/improved_summerize_closed.png b/pics/improved_summerize_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..f33d87d3feece002971451843c90600c9f7a99f8 GIT binary patch literal 159778 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�uDd4{E_uMGFl9Cj_XDNvdx}K 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≶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 mj&tS{ji{1DLv*Pyrz-m4 zE(!!1i>H8Ccb^wWH!xGvY8`ogPVm_DN5JFzxSgJ+w;8Kx!nDraS)^dHpKc;+pIWVP zT3pIYpQyJPFv_lMeN$c_QpMb-0z~;Agj+^-a9=pX>F6GJ|91LM{r6ZIwdRy|6C*>t zk95}_w$nATYt#JKta5Pwxt0KTy@W9fY#^W9&7!OwBZmavxzgV>4ef{=xVuf?)!eSX zt}|-$l#f-Uz(KfOR@z=?3yS{^jQSlWN<+IZ*!yg;&3>japvdh-rU))JPkS7Fg~k;x z@iM+KFr)7cm5S?%zklb}{>lsP60k)|OZ8y4L4uDk7Jvazp2I>C?hd-HGQ&Ok>s$&% zmVI&ThkSEQG@a88`ZKe|O_uCs2(VhUGmPoG)JQ{Bj<@9cY%$K)D%d=+ay|%VaKr^U z*eN1nYD({nt%!K%(XB}Fjy|&ZnEYi%px))24eI%BWqEGCfpUIjkqak$=GWB7xOF@X zvj87G-rd{wZfE<$;M9bSL!{d|KXE3+NuFhLpC!kYN`1%$%eC>;Au9-ZO~8Cu$KD9w zds`=NmA=8W7=5y4*zNkr6m^w1-3cR+RB*;Xpb4W-a0Bi_#P0i=k<<465wXpU6eQn? zCYhVGMv*=1OZ@Prb!#jau@TZ-o-2nBPGrY)feJql%{*wa^?&|+L34Nvodswt;&+a{eaw#wOUVrGZYR8 z30yx9Ra4;$+vZ>qU(CpFU zI&4&L8Y!;&9*q;(O#0{bs1QRuUIOTK5G{b{(~rQ0Lmv zf;pOVrPmM|FF2l;yRwrf)lkgC&!WO!tY6L31rshNzab9+`&t)y9K#_6Dp24zIUIH4 z=a;2Lg8A>iw|z&uJ@3jZjdB_`JGYP_A$~F52S;9)(~tu0(F{IWUYeX`NR8+GA4SF9f z{|Z4I8J3t&w&m_D^LEQu#jRy9eB$xMB_pO+~n2@*;=u2a)C=T}9H&=OmavNukNL4q;d1nc{o5`)e5C>E~G0RiX z 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 H=gEHo{MKW9 literal 0 HcmV?d00001 diff --git a/pics/improved_summerize_open.png b/pics/improved_summerize_open.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bd35c2f679c0ed5454390594532d166c312ea8 GIT binary patch literal 138902 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%0DFK2TMisT$0vS9^3`MGhc zHCzq`e<&SFe{ma<{w6X$HkWt?xb`*geCk0|S$X+*l4NwNs+f2uFqH>myEQOAF85lE zInw;wJR`Ywm+$zYZ`P+MwoahNiwgr^f_J83>#FyJ6!2KDwcQ#@)j8>$Zn(Ky_4~cx z;J_#4as}t#M}M$M$+l~_KCF%|>#mI3#9y;NnnT4VNOeKyo;28#nMwDVKy()b+&ZhF zhd3>TI?f)YbHxj7rwI*a@@`|A8^_9V4gw*Sbvg_7T~{s+o^Lxt+aHHcRD}K@BFE`F zvtmM=<^`1ax|EIFx|rD0O6&=0uOGjfgI2FLFCTk%E}IpMyH|G!P8U2d)ylGact@T+ zok;K@I|@Kx1zC|jgCZ(nykN7+>k5{US#&HKi7{Ay*g25!LaTM5wcQ#~a+E!^j_{M! ze}_CM|I9ry6v(_&FC|!Rf+!<2d*ZDHbeq_<`I_?_Xb6{{Jav666l<6FZ^UAs~Tg!uqp0BkI-d{Z(Nj? zh2G%O%ngg#;@e-IgciRI(}bZTU-K|@XL+{>7_xp@&~jbMXRJKyt+-oKHhpdcO}=ng z;{&LCpwrB2*X@};z5weLS8(JApYML}Al>WP2SA*QrO0{CZ>0IOjXSo~_BAFC>urIm z>y4j37ti>(I*FCQC41zh*@kK+U6Zh0e$IapQ}K7-y+v0_)dB}PdZzi(@$Gy z%cWgaxt;*!2@PdFP(8mQL+;9hE8gW+?Q5$3m2+HPmEk+B`W*$^*Mo)dyv2!tHRb>7I#c?@H4N;a2r*oAWD% zHU6zr!(}t#wMF}tpW4eJD*}52EE61`b9rZUcn{}muuvyfXKz|ow~A(E(mx3vl41SJFdld#q>6?yU}P|Ud_AWZ)I*%355VG6j|O*9 z)>5iHKibT}?OhEF11^?6SNKznB`iFkfnWI-5}3LNGny5gt$syiDa zH*asuRCj3!%rkN{CJaXOqY=OZ2yvN>h!>RR&kB`L)iX6>}GbPkc;yW z?j6US*K%12x3k`?Lsy2vjai`XBr%z-(=?kOJ~_p@8Og9m8s%MP(LftBFV3j5iW^f9 zlCQszfIK9LIx;;y2-FG*V1(4nJ^)WWzd8*g=4U7}JxilR1G?7KatGBB2L8@n9{Ro6 zIwUbyn#uFhBR6Wc67u9Pant`OBtVL~ zT6J|cZA)$)l{9(S+%>!4oOcja=)k9L`cQv&@j`tIFSFd>YujohYM`N#Vif@h&(kbcGl^uVyqCv^m#&=?aOCv#A-!wI$#+u90$L!-%+%qjGW^ z+uN69Yi}2{Xl8~IWEt_|mJ()dx9a9-YU?471_t7w)1EVpjuD2M+_}+_hIP)F6q^i!(tY^u8Y^NiN^1f& zD9vgvp?45C@?0RhSddC4APm_5<>^D(WZ0p@hYEIWBMf9NSQSNJeWV?M{?|EKb)rPw zrt33^Wa;Bx@O6Ol+3i^=kkD;G5cAKPS7Ag}tNXb!^?o|(m?s^}(LT|VW@=TK=w#Tb zOt0EZ;V8Iw_4rn_2SJlD=TQ6?0++?VR&N}{CO-@QxAh+L9|L7+Vv6tME_T8QZo(np zXne9j@Yg-VqEgXnQWijFj%x=4I<|m~2fXHKyWStLtn>TN*)nQC<@KN#j zIKcs&#=+)xpY7o(VTBy5^b&ya;H>-Y1Cy>1iuiM{!EagQT2~v(S8*JaItO?M&`GmX zocL8JS|jAVluxay;>>n}1BE)tE8*k6$3HGFT{s+A0X@{y`E+|W4*{}>B(?b47+@os zv^xm%@aCB1*dL=2-jYz_5r9fhlT*^{@3qYBT}y3S^H&Z0!ld$>nBs1HeZ@fA6SQ&) z4g)&~(fA6hR|?KFm+D^kX}?)XIvfuRf)Iap)YiTu@R-l4)+z_b2}ixQGj*?N3wK`~ zfK)v7crJy%J!RNb1t z#P=ss@Qzp9#(s0Hv(v(QW02Jjhd@Ty$HcCDnqH&o)~S=(ukgGYw1X0yvq>BM951nW z;l5SMZs%M~`IcALvXHF9ABAyfA1Tjg?S<;FNbkPe6kmk}i}}SDm{__Q23*UuB;y6g z$O!N3i7HEkG)20>h;qZe7Lgi>uxEbLa0iu$zuj^mlDjJ)EtF_PwMB6uHt~pvhuqQxF2<(MQ`mcpvGXe4kBz znMgueujbDWCLT**hkSb3tM$L4Gr)qdX0$PXICVcm>noZ@d1-bX5FVXfQ|JWbIVQH4 zX9m8z8*HKRgSCBS1GaUMj^?CU3?nig!$G9qEVaRNsz!7ElP@m#rL~`_oz^4Oa?Z6n z2g%&EMtMf@uffpCIWEziCL4JdgADr6uQ+1prp4;wR-YrT9p!n$MxQs8r4UKsqmK`k))8%2xoHZTwXNo6t>1gUFtrs+!oQ=VQqaPeDJ11po*HNia87uQVF;i zTyN-mO)VXqRbLiOnpnIQIcTujW{i1g^#z6&|nI+wm2vQe- zrMa*m5ek|)DztdF6B|P>LyC^nQtIv)yZ8qsrna{B)6s0zIqz(r()MX4RylVFN{ue0 z2yO2z2`}EPdfgRHu&M9{%~h=o=B`o=0Hcms6c7-ptM^evr zC5+|gFUnnt2DbKa9!W-Dh|D;noGYWLHeg+(f-l3#h!@R6HUhK(fc9gkLgPhU095k4 z@~7~c(#5@Az9IiSP0!3Y2g3vHKs+6cGhi0z;ld1I_497V$sH|3BTD3LV3tTA={k^v zQNRnN_P$%T{SI5t*bbEUbjg;QL5&P7?8 z00g2UPS>BoI&0$j#0KK#FxIv;J!PeGYIvKuvYFl^xG~egO80s766vg7@$4=Ievrt) ziSintl_#2e&4D0>1JA?w%1LYg(y#MuKxHQE<>V?JDO;GM~5QWi2`NfwB z<&C>b8{an8PCh@rJpJiBv4C0G9^Lr?k@evB?de)GYQ#eC!REsJy9dyBX4XKWo?R4J zU9;xw=P##b*O)rq_z4=zRyJDP`(CI7zPv%XWHj+apijUmASf_5Wv`b@gt+X@DCT?x}|h(HJlHW4M=>axAp>T z8nY{3^K8U6MYkB-%hD5UlAf+@)Qw=0n~E3cJTOq+xoNb13}NNFdUX-VmT1Q&KRD}X z%aH_u`-&RE{;|&)B4XAsFP{%l_6c2IyEi`8_6#bWi;>*CHWQ)dPoC48@}(O(-MtMm z{mG5J$C>9UC|eU|Jd6fjDH_rx8WsA{~4zGF@gZvsuO3MmJv$o8RirOk%mIzt&H{uoGA z?g?2D%BwEiM@)B};8mOD%CG@{n==4o;O5Th6@E?T%!NzvjJ0(``^oj1ip@r{H6$-u>_hD>uTnsrb)*$1?vPTK2tB zO5?$l(g_nXxq{Q1UPi?3qS|b-iD~eQhWhm1```lh|tSq%D766)+zDY#$E?l2O0S$YXhcU35MQ^=laHMr`e z=0R3iCclf{`w*&<lSCo#Dv0#@uSbYvw3wC?3Z@g`a{W-vS)QQG_eF8BOi8Y#JR! zgZ`{4EQs^_I)CJ4|ZA;0zuG&OaHs|a9ZyGE!E4#kMjok1! z(LQ1tgkvsP6+4ILB#Z$e{@w?7rR(^Iyil8Jp78Kb>*NtVa*zI(+uM#U=07Pb64WUb z|EsnGAOquoCr;ZrkbkRfYYI+VR#vNe=yrJZjkQz@<4t3hKkD%iVOHz=TN9r3 zg`qgK^M(ZJ`!mrTT45)uwL`f#gh^AnU_hJO) z@30F=mQG|MXyt!YbRyzGQyT4!6V@p&(pD5fCblQ{X|yj^9}N#*+uS(L0!Q#(AHI$K zGum0&g}*6U8E_hlzj42a!uZ~>rXiqG-ZP-_*|gT`aUZUdpzeJo|U;950nx^zpcWNm(%kJ5VIf- z=}&trpH$;<74)5*y#V$R>^-yLId-V6(N{p+Jfcg&LBV-}l$t8%pJSg=w*w4jre&TD zEdOuTsjJ=9|0utYM%{5RaJ;I1cC_^I;gkITp9pZYib`BbV-U#e)5on6s|jDwKD)6= z>4{HOjs28b#LoK7^8Rsd;7(VJFlKCAXkqe}!tZ*LjQ>XbuCYm|(1|28q)Ha@gcPWT zAXUV8kNP!bL$x8z4H>OYsXj9e^HXjlL%j?0bmJZ4V&`da4x{TGwXKu zaCxLAwoAF!2kWe&@~d_>Hjb_+0hK=6P4HJsdkva|(CfGvA*(>6iX;*{b@hinlF{=| znh$y++wrAepF>!{VDoL}VZ?2cZfT99Fb?k6_ndgb;Q#p!PPi|z>)rp5UT#w-O3qA; z&BjPq)9_TIapN<5TXE?4!h7wh6S=7}{H1b9?ii=E_q-}V-j^=yDH{2Rt227V#&X^f zOO&zz>%hQDC7*@s!*M9xk_`SG>|Px$xeR$xC7ldHwleO6&O7ZhnkSia_N5 z8iJ;|yXAyQpC1xYfRj(hwfjOS{ZS+G(5h&is55hBke3kOoPV(%MaHua*~Bf*Z2;}F z5W&qD5w$lS4?IF)c*0yRYZK*opzp(eK6r=sj}^N5n5*-7Eb_BWz3wfNRX+U5yBKdn zoNy_xI5!)}bS>ZD^T9Xx*>ULOG=k)qCZJyqJ%5Y@o9Bq!{EM z+JfPY`-`f3q7ZIjH*vy>H2T%DIR=<)o`o;SoPSEx)+0u&z>5u;-qB4P6}fl#=lpIL z;I6b2sZ6|l!iID<( zIKN9j2BU6jd?S&pf9aLmgXLpM<9#s@dAxJhlYn~AV~=4GM0oe!JqgBhHM?x@D0BGr0NrNY*> zR^v_{8X)W!7-aPEt&-no8_(%_a~fVySXMrR0E7ch_m=cO?&r{WTC(iM$P%ZLJZWd= zeuKBIU^0Jh@8r1k*vc%vRNprN$qSpTQgu7|vRqbM`p(2W$FkGlo!~8!%+N;%+Nijb zq${Io^ooTI^xVJDjE1mk-{c;;$n#r+HbAWIrP3(-U*8`|KYAQAf=Szzzm!1y3l7hC zRy6Afhn?5{eZ?(M{j@xix17er(E!M+70fm=W*k>pB|HTJ;!l@=lnNo}n$*$GdqUug z$(-z2%_X66XxgpnNCOHD3^kEZ0hxRL{=!4{huGFQ$#2sT-24@cZAn%8zJvkwSS1j; z)eIlc*Mw{G^3#B_PIaP2pX96W4Y^&feuU546m{ZZMEmmA^}ZR>5!whr_@YBKoC`&( zmQ7>t!n}x&msTIId=JRqlPA~whBh9po>IxxCo0OAgYIHYz4It}#feJ%0qvDrr20qi zv^9u#(5*bs&hOVUVvwnKAKYWb{xNGpVR$ocrr<}p9^Z+zr9$lbTg74n&V@0V4)a4`?*9b3ejUPqV7EuP#k26o~ddT&jXu z#X$$EK%djBPX!wG2C9eIx;#i@e);=NUNc2D5MPnbEA1VUWd?3Nq}b!>O!u(EHK}^q z(aAuANtPX?7Ym$;qSYwoe~nI;fYmti@=+>%{b34|B4(R{N9b<0a;{)?qaOa}>7hZ9 z)3%gd;KoLIHF}b!yrRxs<6{N% zm+s*KnEh6`J$_XpL<=UzytKO8>hAp@Xhx$q{s~zP^(?AqqXleRA6SHVki!8)Xd@#r z=BQP<`?#48ngtbjvH|hk-!mY*-|Rm>-4k9k#eMa&K+9cX?71Mrf@V%|P|I7B2`Fl9 z?PF=a7%&3X1*-VaMZ1f zn`nUax7pir*{ZOKik1~6>sQdksg7_&xseZ$xM6G?qLvtbq9qFHIC{1Z9{3NE+KP|F zbWwc<7+BTD%-~Y?R>{%SAe+5&fH&CR3%$GlZH^V`7`tmcE6L-337Rdj^MrU!6jHqy zSDK!HUxN6`qgKsu;XLxX->hPQs|jt2!6ZpWLE`_1doC+?C+&N(4*$v-Ox)N+IJ{uj zY3SJ)5kw~eg(;!Rtkj(0(M3&(bRj3hI9PklLgE%C%;d6^QP0W|~6^RP?1rq!bn zrmdpHd38%O8|-YruO`2x>Z&S(>aOFWOa=S*P;ck*kD{h!+#Jq^)rY5iJuf#UOknvd zgAwM>!;YDb<`)U$sg;(-riTMpvZWKL)l>q28hz2KxDbfqQ+t_|lvHLzV4Sooh0@$$ z;G+DG13hQdaZ`LoMuGEScI5%KB#1N^BlWsfHvHtR{$az{_tCBUwEem7io<7S z+}RiW|DFaPz6lg^eC)QxvNv>QrWppRkGL2ML69 zoNjEo01Kj>hBp2CH%8u`NZOd)Cm#~yn`35@upa*~d+G{{roy-wU@&Y` z=yRkRcUs|UNUc}rIwvMJY4rNSO>ai#f*N+k_Um@Rko3Y}Qt%bA#(51Gsh4`XCt>Rh zuJSC_2OTALso~TP5@_6P!~z-+VcG+iRswr~8I3~}DKwV$-$X1V_k*{x>#u|JrkqnV z4B1#G>YnASptA48kF!%1U2N6!5RMLTGc6eF;pF24tZdNYlFdxx&ID zPnWPT3mSB7HPwXIOm%ugL$I$vjq)d zRPHVTvcgWxRks+_@v&>2Ckoq;j~;*h8G-7dw&^=-dY%PZTkNuJUL(%{F6`h5nuGidQo& zc%%Sfxl7_xzvzO7G*5<4*QbrG3|S8KdEQ>?+G)*Ff&F|aq)yea4VKSc9_anGYibiZ zH&sCBav>Rqm%k4h#&l30FTpV>$_E+J;4`&ezrzoJx?a7_i7IxrpGSn*Nay09{qg{jzPH6fuIrJf& zjKf!#qak^08BM%?G6#aZ;<{dG-gafCJ7V0cS0(8feI%CP(%D(ri*!`@!bZAr5 zEN*j{w~zS8aLIVPQz>wf=-WV}g8sDac~8(Qy~%AgbhpfE-S6)@r7&|wIqllV?dOKa zl@hSji`Amr=XQ?1xvRVxRu@21Bl*`N@8nrJgYyU*uN4y4xn`~0X@tBRdN^kVegTEX zFg2F<9r%0J&hfgB4-2-=>8xnc1?Sk2sss-?$Ss=yg2-Q489a)l(fO<0V)qB@dslZ$ zg@t1d1pLG)|BjB2CuRNow#qqqP0o0xF(RC(YoRtpBbV~^HaE|f<0Mpp3VOB>oSO8C z>>}mo#-?}YUx}}>)tkub*wp@)GjsA(p1U$VMS!8CQ^xu~mX8znB+I>tBlpjJeWrRT zNj9-mhh<_jg>pPTaVn>KsQGBXraj8?L0JrpYX0;8!GmLMSG3DrekYjv=scnMpE891 z_e`+?@I>Wx->SN>)8UXfZdjyD&U~>tL3W%bT|<1~5@)>SI)Qe+tJ{P{X*l%|%(^yM zQQ0y{3bAtSqtb-D#5c zjrP4KDv%=xyDJTlwMX50#Q^&bs*)Wj{^%OKqT6=5YCL($-$lbu(XA1(4N#Ju?a_%F zmie4c{TwlWen=fg`2mKKR5h`a7FeQBPs2Ry^dGCzyo_u> zB*sP(=#30p!`85sE_{I9fyXO0AS-7S8 z*}{5+YfFaJFJJh^u)M;#DyINu*LH@vIfJIFxuu;+6Yme>QQQ&LhG~ z7lW2)Cuiz~;YQ1;g|jaM(4`p-JhL(FBBjVrtzVaxbjg+TWL|+=F(Gsxcn;qD7$)3Y zO&|w@UN}BUl9paNK1ELkjF(BYQyV7dTrknJsf$w`VH^tI*ol;@Yg-}55#E)x_7BT2 z>L1MMe#zpAqm!&>p9IP^CtyaIM({2Vnz-nrzOVZv6%Ezj+iLf!0@-L;Gpj29IJe|Q zlGFqlvlJm=ozDan8R)wV7bMcX8P;ZHX%}u&UW_{2U!VdcO=5Wyd%!C!y+flI7EYrG zKWX_VgJsER9cY8dp!Fyeyp0#|CG7p zf@<7bngNpsi3*I*AqP6m1!o2w4=!Gw_GgsIpz&{A6|y$-9?rn$cx8vLeA&OF3yXX$ zdDVN_cb=2ymZ^fyNZ*x_b0FJ_2hyzuqY6v@Gz3%>*VOogpf22hp^8O9nGXJk0k^!gpu$6mVc*c2gQzJGt(M^5T$7dzcLF>;x)@%kgwwUivZFq=Bq}Lw`X^RTm;o;es8*0bq>!gT(X!LFE1z`o$L*ad_7$s zJ%<|7-S?Q`bQ0)Y@!BKe{tIjG9o9s*wtb7-f(R19LMI|9AiX0kA}A_ds?r3cO9$zR zNbd?r?AOlO2Pki;O{tim}mYeKz8fYK#d_$iD!36!m~8bs!CKy-e4do~Fa zcZs}B%?*hdP+Ow~ED9(t|2ipfQm`yb)6vd6OZD5#%}w>p0FueMIiMPW`04jrCsmL# z@bS0bZwRM!ue#oN_M!Iw)FBAaGrnX@1G$o}IVLN6u{*zE8FvdM7j*u^Wa!C`_gmQO zS0>N7lT{STpIIy@8%T3k+tX9rQhLpTM)cSGe7;KDG+XRF)OyUdI`fOVV8J zysSSrXHr*E#{xkW!29N2*)Ix zq!Y!-ykFQ-eTOH7^{%80baoz9y2-KTL3YrrggFjSuiCb_;UsNSF7)YJwZDN^tuwh$ z3LUukl&P$|S2(l5fkG9>5#lPN`0Zpooq9Cp2odQ`xPokFe6u4ufTU$9ZJ{?>tmp7r%L(^Q7o6;3q|ik2D;dr?etb5xCPOn$c0gxF z37Kv>9QT(mFiIrlcI}%$C(7o=Wl8wB>t-a;zi`9>ycT+c*pHPfA04i%0yq~{<9qsl zVWWd85ad()s;As@IG)(#1ZBSR{k&mcNnP8B8ApYitN#!` zb4o)su1f|`!j;`$?y&s5+M251`>T1v_(7MSpuamQOhepq+XBj^6=jWC;QT&6s&Rmk#}Z1Mx{KxP zxQQj|>7@?LZmpe|%NnBCB?tuUN8(9P9N;xRb@ZAU=y>_t?y{8e0sLFJVbE=xp{#M5 z3LQ}IZrM5|&AJQut^(C_z6yYQ;k+$2U$H6pv|kppH-YNwMi8EVQ>r~h&QfKkM*2kS z9pFo*mx$_V`n%-11bjJ!Rp?$A2NQ&KL{h%s$L}9tPKgTnp9fEXoj4$@ zzrP4^))Wnh-&J~qs|W_uFRX4qDbS>c{}MMIDqv@OyF}k&>b93QqJ>yjEQwja5!n(KI6Ja zZ@sKc{}(A#Ms|i6f5g}a)*~_Z8-K{A*^%c>PrrZ=15RI73bUxuGJi!Q)54CHxS9RU zc6|wZ+-LZ=i>~cHZI50It^zhPzteKkl2q{T@j$NJMm8a^K5g2@TO0%fEP|?auO)p$;cdQn}r6j?>y@Wn7(sGk__+! zZ#H;tj-S3{-LP5T9KX!+!j4V44s3JWhfmpDJ8wQIATzH%Q#(RJ!FF@t2D2uxW5$wH zG3%4PIhVP<4G+IYFsxSLd5TY{!v)ovWat4MF`P_n4ENe$)4GcE7I(=v0XfjDQ1GC<8*vas*jl%?XyY6s^4XVu2 zwBQNgQph{80qHyb%VRIAeXmFJ`V+&9tq`A3C5125Zbv@vzcS-{ih-ahUH_+aB+@cL z{@YLm-wR6ceFUR>rTFG8?VYN3?H7wnI__9p3D#S8vt>Scd1j};zwo9q#RX&itdvB_ zBHE=$A-9MaE3o5fcQd>AO)VX#Fcc-CB}qo{hoa<FHv-M%FsCV0I+VaYBK=gZf z#^j}~xou4)mEqUeAkzS1E?a?}9bL-Mqh)EkaED);qU|+)Y{EF(7{(}NT%NL21~)n} z(XpIon7~LFpmIzD4kZrf8^OP}s!j=tu*=-c6@9>lskd<*v)>CVKSKeoH`5F`iG^}N zVz6u5dV>sWSrB>tO$}%vNesM^c!g_e`&<%;tPGEo+ZbRv32K_zYb>oE!{#bLH6+&_ z2Lu2f9>1K0Gw}(}Z!J!6gYqd6b*QWTJ~3VWXAkM@V+5XiF&qAAt*;$)Z^LLD*8Q)t zsPcC0LXW-3_Lq#(GfC&BX%oL5#>({6`Bum{d?^b(H{Hi$x@E)MOzps^X4xIBL+*I< zDvEr2bZ98B^6i~-B8@z!F+bK0!}qy0v)U1c3-_j83d$u+B2yl)ThqaDw~%TL3N_Ai zPSeU{H2v+I*us(X|fIQ6<$+BL6jAPa#Z9j8Mtl2u)fw{+|pP&?r4x(_|8ozWv}bycmK!>!8? z9v-S(ZJCkqr;MhuUZ?H`t#BBaluXYI9N;h@EMy-AQ=|j7-j8n+c!UUFGb6{S;9tY( zTVy}cLlYUG;~HHX!Djl(Kw-l(lP?5$yn3evlMP^XP4;P-T#nwk7)S^GfDpn40ej&W z(j|3@pGJ3VE_%*XSc;{;vOE4=ZH&9$nsaJaG5d!Lk>BmhC4Rsi`Emf+(ts5s>xP*S zQ8?)w>)BhEe-hk4sD&SkMO}Fd zJw5}W6`uEk6tnF7aX;uJpaiisYD|&T-4xhQ& z5H1%q*~Oj(o-+quM?6&Ef08=BqP~z>3%GcMNN3b$f5A-?k_1v%KSfqK{p~CAj;NzF zr6xk{f1}h`*tXqX7K-T+r}nd%9XhLaKvy%%*K3P@2E7 z>vOGB2jAWHa*vL)Vb8j)8%gIg`f!_`E>#Z4PE9tlhM9~0Tt3-Yc6<#L>hW865{(!UPEKz?7gciQz1tu9|(;M7n)f(e|Zx&2Pl``UA68VU;I zk+T!|qT*uhOt#EuFttD5+?==bahXY@uBDEW?mFn8=Vi;1nxEtkjo{1qGMVKivN-_x zXLPECG%9AZcbj!YvD#tPX>9UJOvIY;Uh_9|#Y})SX9sTAjBFnmy9kl#zHw&(XsFSR z+y2vGy9s#$9X+o%?5uNsKG~VmG4U3B`1IQ{>lZ_b1^2M5+XU(;czMA%WRvCmJWy_Z z)S}+UJ;vr0Y*LA7I%7vQSes>1ecj%&pQU9l2~n*xX_U>)q+3bOgp?>yE(tjd{5Oak zKx-SgUI!>*%@1)$TEhz5zptYHJVOaFb+=@VrfU2jJ6d2I*uL)`S7|`39u*DSNwUJ{ zx<7XXy)3G#M|l%x&{M;YKK`;a`)17i?zPw^YtnnAM$wiDO>w9Yz{5Lqcs3t=LIsi3 zfi0-$zgP#%S(Q-ro^&n9UwCD_7XF!)g=D;I{`^$Jzzi(8!fY#bvobE{-2`8GOQ6SVJD46z0sU=H?`+UBm03)oEeV8V7lh(Gn}M=SMQU5 z>0tl-LPu%es6b`#Oxa=gqxu*5i_BJcRnw0b-(3XLj&A4~=l{-?B}+22s79JRmE|eY z{tZA6;)WRw?@WTy%-}kFG zsr!FUw##q!bBGt^`46_;<=Ou&+pgZ{rN=;~41T1F2{x}$rKXH$awz&gEE!z?qNAgq z0p_fCSz_<@>>v`w&o=ch!tH>zuasO+k!b#~n~<@4iUesEUb;nARirlIyDC%ZBX#FR zo9+uH-u=ee{3tZdO9TuRn(m_dIT2eZBx75P`M(+s9h~`Hm{v zCIq~RN(B&1iP_nKWyME$i_~ei?3)`V;%m!)XKG8_TlxhF zKLi2vBQQ$>PsneICGacUUm-@_ZtKOhpWS=qC}sXg80EKu>$Nk6uE`n)*WyJ5Ccme@ z0WJE+^8$brz342)0Tm9^QQnex zLsiRnPX#{12nlQ#%QKKfv8+oU6zlmDu11cmGOp zMeC0i`%n8J)zkbX%D>G!00dGS2y0Wute@Y0inB{g*!78hirZ=ZD%pEi8!+=^1P{3D zwtG=pS3lQ}_{|;U^3Tc#0%PId44%=D&fkWIQI7v@a0N7XQ^m$A{g& zpB*9D{9GjySD=*P&3AU9^3vC?{z(rr=)6XIR8^XJ=!DNj$~~jXeif4a7^i*r&u65q z-xqjb5&-r6wtxI}=&c2nqFvYy0od;hWwnY(RETYZZ+jzrHgxVwgiSGrYGLu8WxqYukzIJ*zZBg5wr=%*sL}q@FPW!2CBTkV_q|AzToBCjWrYs=<;j?EI;H~ck9xqjr*(??f2k-1ri+=ME%PQq27 zsN$MJ-!2jGE=8okZc#jq0@D#m&iqkg5J(s;+auxdgKlYd4z2jxT5oeWQPUU5c z##r+n&jJ^%C)W!s;_|&7h z*rO)7W}rxuF!@qI!RWum?KfI#FQV9=POkzDLk%(b^*1hgf|(3Fvj4uroTG-J=?A68?s^ED>eILMO^0lb{9nX3& zIQ`!Z=fEvK|GNn4Mi<-_1|1UFPu|HF4ddyOGDf$z&4o=&iq9rru!+Mz=`N`h=eq{U zj2vWc*y5ggO8FPuMWA#`Ptjj`)_vz&KzaU7j}e-B|HQ8T-(&O;&27aCXw#^L6h&aE zJjyxmUfu=p%L((lCBN2nmCdhKd=a^vb9S=#lp|lO4WfL?rVja1rX+LU>Fkkb?e<70 z#n>Fs@?IMTr{-fmZc)$F!NoNV7i1J$FO?^oa+9-99_^{x1$r5EcqauoDWzSfxdM(bIA zKNBQ?w(7%gn6-QClb=jc>q8=*n>%tv8W`9^y=kacG4=~>mZlx&AA@r;AqL6709=Yh*Mt+ARcs=G;UK1sHvxv9dWoH>b{41h@o_7`SXRP!4g^jbW14 z2sqvLdg3@(zrx_P^^e%s^iT^V4q!0&!;kkEww>omMj+#lk+?8|U`3p7DDuorK3~d{a1!gW=31 zY=7Oh&w*ZMeq{>CYPy-3Y!S|G3gR7_S-gliz*D}mg%dMNE7dPQX-}ST#yyL}S^yy9 zgCBh1UWx)Xh(a0EQsF=3Z3EHAJz#G`r_f84%^3L`C=IyNdj}FQi;F4XoxmfvMwcL^ zQ3s0m-vQfrTR^`JZA;!=f%L=;>Aawo1fb`O?`F!_?kJS%+LUaJ*X)d(x=@@TE5?eY z2tcK}h6xmZeIpDQy*oSqmIosY6$*{_Fz?XnT0Rd!;dK<(yelaEjd;NNWbl_C~5`;GCHHy8YA zYu+ev{(>$@pn^9x>NJyx&kli_{Lx^WJ4FKuCJ}mwST?1CbiFV_mb_nwbdB?IW@{V; z${(BALLoNRNi|TcSE651Bk5IkeQc7(F(=^T$zoLXh8^2`&2$Bw?b(Xnj9@(juVk5_ z!R1~Js|olwNi1>3LX`NQ{(WFK(MJU-0*arN{%gL(UN-UU7oRo2#$OxEBfLNx;{m2V zD`sOTqHi^=MI6IEXb1APZEfF*FMb11@%84QGjjzw0gz!u5&jP?fT8ybFo;agp4Q@f zNoVBA!BXPlc}5NnB_{|JvFMDV1b%jwz2TK?mJ21Fl7<3zy6hJ_R|8NE<6rgQ4YtBZ zo@WwL9AN)AHhFY_)5z;@D3`Oo4Gipzd%r*}t9T=Bv_uwDN7<_dTg^QF0!UW+fRx($ z);ENWlE!%>aos)#Z4AX@#F+(8U-$ZSxk%?O8Z)7|e3MOCkdy2{UHcqBJ~O(Q<=niY!RFr{F!hu&#ZOo` zwDtRfGWql!HSZhb_LEgKqoo55vq2zE*f7`C`%>cVNL-iwn++N{wGn~H?v@|B58zIXB%tleI)khiLj#*F>X{G}b=)tK&HT+T z^(zOx9A|wkW||gZ#o*C_1DMu%+cVBBUHd?xAibwzeuKRG3N>M#w3fqWBAvw zf1$|Z3kkQduB-T8pnDQ&%I~U>P$a+EEc_D+*@W*qNELHNQ)LA;Rrt+sjw{3zjyW|t zI(lu@%uSoPK74q=;QoCpS2DUQbXF)meFmN*w&F;(OTZ6L@t5;0dr<>10YATUjCr`Qe*J;t~Af!&z*Z8YbyTHg{a7Lw1iZvbYr@ciKv$h3#9_|K)YV|jkT`cEwD ztV!Mc`?Js)li|8~uB|Haa?%icB?Ys^{vFjNZ#0e7eGs#F3eAGPce;FzdaVaM#*Hc8 zZ}i7dphm4za)QB&woQ{bl*)4wL%#SBIkr#{ecVPcO~Ge=P0ag8AK+NA9pr4-Rr$ec zqt|tecdLyN9OI9^IFgd{td4Dm8b~@rzApo%O(6yulaPn3C@~G@$(Zd#w&XRJjZxmT z4VnR==n=pe8b4oVB3n%+Z?rO!8UQ+&aRzZKUDc^N`;JNuElh0>*zcs;=kIXe+-${# za5&JcEp(tbp)T>q27VPBN(66r>h%CQ=sVF9tNEzqy}mZ3E}-z^^%SIWEqQSz`S6Yf zeWUGNUxu03##eLYjXQVJorGVuZg%S3)6<^!N=0NJ#enTkGks4QKG?MLMxH{#3}-Mf zFftod7_Q2%^0kkkIQkBcUAX2Nu@YXL3JHH93{%LsC0M~)A&I5brbZ8h>2%&s;vBao z-UR9>@Gg;coo<}~3r1O>2Nz@VHRo9=**0H^#2|$=SxupNkVuH)2UcOb@3ToVLrsof zq+3oohngJnY^U%Mw)1;gwsXfmIVg5mrMPlM0prN0fP3>-jG7t3qspSbR~Kjoxn zf#Fw7ytezQXqi%EtYnz#XKFEnMUikAob1)FVP;!i+*ns~WR`q(h1Iz*7El7B-Wf%_ zmMv|5iRoL4X^Z^|v*<>JD&YR#@ZSG4^YGMG=c;;R_o(Bpnfu|P%;yI>b!L(}bs?fT zLht1&t^4!52eJm@xu+DXx2J4Q2Ynr00!|QJh6Kdgmt@N0q>PHAQ^>>Lx0I{lN{hCE zdLAgd-hA+Z^(ApPB?|u%iZ)QuyheHJ+D|exD6T#Q^w*~}Mx-EMrt#GlZ&>&Qhi{fW zxDv-H<21X|`m^Ry1+3%BkRi5=0C~V##x6+vm4!d;NI>6bI&cVQL09n9iw+DE6?xn# zIJ&!~aP(v8n)5wqhUE0SHoLc(Rpy4wLa)^iZ$ut%&kSs|vd}1vX1AZMacaJ=Wqefs z;9;~kCcyDN{E6xL zS4oG|qE3E?8v;9U49A{(^U;Z(d>kknVU}n*_*o(g_5+A)q-8G^K(Uj>;F3-U! zfsS%6|J35Hy3lA>qTYFTv5gW;H`idI$i5M9csTwxt8@ZbdsuIQ4nFUbf~gWZzdm>W zQAv|2Q8MwY(F-$O^kygPv)o{T=Gh^t^=cgCA^y$NfDmBtJ>nOXA#ptTxt>8{tVqG1 zabizJDbXNHBsh%z8ds+U`Zx}W>172PT?EGZRO|hfs8ke06fWcrv~kitftzG!BNqz#&Uwslwo+E=@|zPq5@v{GZ%yQ42r^1-;*ahc4ExKahg=V>_LQQw<@ z&)Utz@&2M_5Ulc?Yc_IpxdCgZ9+|<^nfT-kLALS(S@|T zLu5_%pUBue_8wwaBQ+J6Id32{d6WD_4Aj!4HMUT-QaW!CIL%BsMHXubu&jO$YIxWJ zg1?quvG>jP-VG>>c{6jN&C${EdMIqbNuq1|+#`O4&xf%@u8#vCK}L*Y=_If0ioD*v z+ebTdd}(QEi8r;224m;!Gre3-hjx@=V(va0CW;QOHqu`=(?U9r=nB(%glE71A`Ax$ z3Wnl!UZ87v`WbI&n?oVS#x&T%Dx|Y^hKO=rI{{i($B5RnOGV{LTZSu#;LluKMIffo z)xbA|pVyoSX#m}k5Ybw41*)XSAeLMArMSy10t8{?wN_8RiAHAJRbZBVx`isC8F6pJ z?c&*#UgS) z@ld0^;4NJA-RIG@uIM;Dm@xqtt(TZr=#rkIUDX)#`8v;6MgD>AeCr=dBSRe)o#9?x zY_+I6?9g3>3i~cM*Pg9{09sr?5!K7I%9F2&Y0qLv6R1HGN5%rrZ%dNnQt1c%t6rZo zD^%i$_w`O$c8&a1wrgKP8Pv|xS@-~#ValcOYF`+B`A*=)3ON=Vs1Q9^)F%Z+k#IlQ zFe^q3&JY1gl|woQJ-PV+xQtX(RA-nPJG!=w>k3Db%@Pvxa8c>bz;RUe*5YG?Pma75 ztinS%_2J_L6)lq1-8Vb49Hzb%aVgS!SJU2Q+Q0hliz^`9WxP{U#mWE_zI=*-AB~Ph z=x8^P6<7%s71IMI?kj!P+}ku7$*5nA_HbY>MF0=`<*t`dY{Fwt;U`?eFmGfaeng7~ zEd`0trA$yh|94M`u51HCDPM5FDH>#+A(I8%sEW9PE)hT4c0X~Qy`}#6Hj^*}n{4;L zKO%wRArd+3vV)2l9_~7ImAmnJ!oyP9GK(q(M!gBc67VQ)W{wodB~jQp^l>b5fB^i{ z$V%)dAib0qhw^nf`L9}`wS^sWTqQ&DlBf4Hu^@>zEK9bg<=^12z{d(K{OtdNq8 zKQoMEHPA>>5lsFaYCr%a&0qc*5qt^eY3;tfEITM2%x=paci!d?c*-}fY=ovclyqfP z#zYuSEer>ty(rNGy+N%^fq0X*_yA$JtT4=!{g3{ONX&U8CI~+lh(dDjIm0gc-xr>k;p54- z|M02nkShO=cq@8;I;gPrq0>M(k@3EodZZrSYDJT#k-GMWe#un9cr|X6DRgtG|AD^ZtKBd>{ekcB6 zpK?VQ9wP>e75K;nj1C*3ArP0lG64~JDkQm`Fkde81n7+cLIn`lFNwBf6H-#y9PWZV zbbqF82!wd@KDf^^#_=egb+7Q!Hqckuc=r$2o`_x5 zJ=2MY{JCBZJbcFWlWn;?Mt+cf^|NnF$uu9YoS}D>U7q3v5<&T@Mv_wkKaCh%DE2TF zmCzkQ0bIe8`i&Iph{F^V1L6dUd9tKT4qWXgV^6ipPG2M@$}#|b{K+*B7!L!8g7JItT=8P0GPwoZeB27{ zg+*G?79dJJgx3KfBVIKx>pGT88b|)4$b?IjB zSeT+G-_~Fed?BnME+_XKP)g5lVK*)7U(g~k4?g?!(x;k%d&k^>b>VKGQPK~>iD6k1 zIkr*DZvMM6dII5A&66;JKR zZvV{*pDqNW0`gmYg7Nh3p~C9otLO3UqXRnOQJuQcJxCe_@da! zB_swaW{=E{9cG=H-Y`p&>U^yYF8 z&#No?(uJGJ9R$e?-Yk5;t81b!p^*0@R#2~3P?r8{0|W)pOH4q7^J85UE-MPZY!hh% z1v7=vq@X~{9;qm{R8%P6^xIh6K<{;3ol1#t@_WTccefR^*aUv*A66{n5ft{BkzjTu zp!YYgU@579;UQ?8h*B{H76QwQz{JUBLA)6V%(Nj<`=>t~fR%#AwFWq1jIO$dERREiSp^oo|3D8soc_5Sh(G**56XYY8rMpwe=M6S zCk$5*g}GD#=chmz?6?ys(Gx0YQ0xs?x%1f7TidVpUCM9{_O;!49+#xPPjwAvA#bFN zmdQ&8T+(yXbH7;UCW=0OCUYJQdH`Ile*8P2$Mm}ircYH`35wysr9OT3yUTh~P^#+} zQy>>bNKDwqa-Dn16je`YR()45jhK%VNOLIK46m8> z4(){iJCLs6G}B}~Zv3esxDyO3u>tn5J5x%)A9)k%%~*O~DNGOw*P5g=9Egnn`33(# zdN@kmWoa~2{QQD^+CbkS=Q2_$^G|IdFrnO}Q3IKA&j^_zqC!NtCK=Xvq)NLjhZmX| z4@<3Rnh!t7Tx3Pjl7N>;ebH<=*>KQI>!|GjZ(dvd60TP=G3=8r<<&wrRV5d>d>;Xn z!^e^y3kcTZ zp1ESxVRYP@FPoVBrMA6rXaeM5Ps(YQdogLJHqvQMkYPY!<}?EfGuqCUbi5O@M?9nW zxQsi(xes3h#>2*1#Nz$nTlZQC3nC0yVA(B?&Ela|=7}eV7(@SWbz$NI!%D}%EElPlv(R#!xso)%y5jus>rinaS;jz2f??D~qhb%Ww zj@fvCntnTcw$I7)DKJCi?>ej%vVKu`jDOJ4Qf`HNA@w@hFrxM+P>Mcab1xu+m&8B~ zj|at&cjZi=qOUu8Y>e7<#*zGvcP@L1=lK5YntNQRnayyu=cZfQw#rLDmj3MdqZ<5( zajfuIRdQw6DS7B{Vl^aLGYT%hjBB=K9NH^2^7`Rme&vwV(tK*s<(vu6-^RRIw>oKR zfJT2<0-v_2jMhB4TJVS6_8yQL2-=B|*7Q3XeeT2LMlcnRuIk8s1gHvZE0BaesW)3; z#bEA}Gse7pLj95ROifG=MhMeq&nlw_5%wEr^}DT;@cUKX_6B z%(;K1fV9=4|3cT;?Glcc{Ye=|y-bqbsZ$};pOzln9FB-yqwe}@!VmXH+ECUM2D|Cjzx%>mYu$^p>FaV5pw(Jescp?HU~EqT*L0`K zk^&tih#k3R|BBveooKK@Y6MuIJu>ZaOcWyp8Vpfz)4UP*%u%*FQH%*Tw~kRZn2I~L z@{qVhZ{b>YW(G5{im{NO#csp&=fhmi+Ja)Ai=1w327KnXaE*nGN8GlVCJ6`#h!Y3P zJ{%lBDq6q@E+5ajXMdCsXHB#uSZb^4jP%n&fZMk^4Kzd&h#&9)spQx&5pZ(9nzVcrpL&$kJ%`}+MFzz<2jg{1< z0JWwodz)2uOLs&bCE=s_Pdh5W5r7_|_w(6mN5zuW6nUqSvt5wsYB~f)=Gq?RfAIKf z#OBe~)r33hxl*_wie`@DB;5->G)I_nZp|D!2(d%fWqIj2^-H%QHi4Mq5 zsHkPh=@n#O?3vc7HBifvPQ_8sGV|k;>N~%Xq+U-x*4b~ZbePZ(@z^!W!<3wr9zB|( z#K0k;I23f#q{4CLXqg~n(x67;z3sWT(R^x<`h+h!vM)$+U3_<+-}F-B7W8MTEZR8 zT&Al9{5fT18fqERdUD+5l@lwIM$f9nZMkoi=zq@{3)l=natFqXwv)u{ITT)Re6`vFRw5Ln6$-oZFJ6vt*uRdHll42RPEjj{Bza;}^>&#<+Qp?vj4?7-^NGNK2m&Bw{f>CN-U zt6x%Ny%fd@vspE9Nxu#;T$4`W5MF@HShBgB?k+{8Qv)wL7T4V0~Mo_M{_USnSQHLO0YnGvFX8N=~?0vq;Gi*3SjYf-|A{I_f-m5#0*lSW=g*cr3|l)9&4skINs zqqS!A2^jABT4$6whTIu0k+E+%71jXjX>oAM#U3^h(u3WhTJzkm1(pYLyOkC#eT25g zHt+4thaY!w;H3iY!^SWr2I&lz8-&_0940PSSrH?}bCtE`?L}mE4-n=l6nrv$kKY!; z`n@E=8Hg|3_`~de-my5xzNTYgmQzH})>`uDp-;}9@T<$VnR|h!ev^>3Nx9WT0!eqk zbcZZ)-{W@B%S}l+IY1t43{Q7DiK=^B5K=;NS2&9v-p#R;Yw17*4Cwy>vi;=OGAuIN zGk9a411)gY`X<-EE=aq;%@i24x>>3AG1X;9xjjpm3E0~e(QU*Fx5c4tDFR|8C{rY7 z@8)qM>g>ZX4e;baobhdia+e}Us^I1Rll_OJD&CRTr{xKt(7`aeOaA*mJ3pP_Nb7~! zGX&w61ft4`)xo!^hlCe?Ifcx$&-LdNRx>5eNa$bY*Wk;^_P$tvu)tIWmiZ-eQ=|Os zS2ID%V0g&8IXyit0?4J$*Pt+@>wE_BwB2F%Na9KFX#=K`N{B9{wld>f09RUhnAq0P zqEMjTZAd-id;+%2eWHNNBMAY?#If7~>h2{z#JaAdzaK%`0=abioCk6ggJ9n*@@P8J z%#w@g(Py{yc3223yP7WPShEc$hVCrZ`TvO7~U;4iGku^F;LE*g7S zBYq?YjaGf|kjXO?eA24w>6X%B2NRZ^`e3z62*m35$xtAK@}7r}wyZ>h>HY z>3a9L&zC>IUDo6CyKYxgLPF!fl#`-bKuPlkASu`{A ztw+x2%@QYMpV$=pXrsD#2r8&XJ^(@JUG;kay9tD^Hp*jwtZ>&Yfh@Z;rX z&R}AL7pVkzB{}zED2vk&NZ#aOwLjxri(~o<$ptChQ)`1UU8DrdO(2Yn#*|v3EsO6+ zj%}Q7I3&SR{ZkHRQ2aC0n$>oY=#S4U(YBxiY!VoxO-@Ne&v3TIaI`?_d|>nMK6YzgRi#U&ht=Of$c`&=Mc7q=Yp~Oq=FT`u5@#4F zsv|7UkeL0mA)4`CB#lPL#P&0r`z8CI%?&8YU+i%T5m|z+b!QCu5h4nITz%C~PIKv8 zmZXkB6|B?mmw(0y#VWa}^EF79*!MP&=63nZ;GVF$Q;gsHo(D7PcwsF-1`B3SQzu!@ zmYP)S>rH+oTUgpvs z&$&Z<#$Ef>n#W5G(*1^BSOpNXy$QTSr}YYN2xm_;H?tpv)-l5X)=@r@5@H(uUgQtu zRgy*H9Ttk_`21`wL8kok-8W6=zZ{|bM@rqcngtP4q)I}}K68lFl~r;=?W{ka51-k# zRBH|FUU!4|YxPs-Gwim-3Xt76oS+0k6G`tqnpSGfRMBqTMl)Z$9{#4;?H6&D8GO)D z*z9Cn=T*0+6e1Y1V`&u2r(UhfL}l_L!FNC&Gzsk{aqP36Jsj@^ZjyV0@awapfh(pN z6mF$zpk*p5C*!xe8t-%sgKhGqQv}{;iRzO&drrd`uF%nZA7HR&O2N!qAvWW$wSl}i zYqCx$tK~Jzi41^G@0WrDY(W;MFickSvWV2S3T%mWP5_ax4)ZQCF{s1BPywLl#M;ni z^-6WM(>>9vGRFzAG9>5b!!pJ@F%L$Fz}p7j^+X~_zof$AKfJ=Z3XsWXzs(&BIr%f| zY1#dHv0Hwn_o4lr2Xe${*HAxX{B6}P{#1l9De6W5?~NaR3H8J_hz**x!t98%KV|_T z|2pt%2WqENUTsgR=QJ5c>NumEH(l* z@YfNY5@3jLkRUsV>7DZlD**#l;MG;tXwHB$`I`fFBNf)7rs}8ViN_pY7rGxs7o15y z2z{>Uy%*%mL(VKjwAPZ57AB$?qgxusYhd&Kp8b?P70%O#KRV)i{gzITSeGC~G;hkh z2M2e=LbnS~L~zATW>W57rma#Tw6`BV_b1`^m`ZpaYA#5M#9?A9!-KbgPFO?_9r9o^%v}7?dhDoB5P0 z<@p_}Yx1h8QdHB^Ge+}s4t0f2U9)=UHHM}lA+1^OEUg<&`9Chjr7_KjAK88_IkNm( zE@5f1`EqLkAmA}3lh7cGld4pU-lS6TkV%Z{I|UM>%^TK@qO6kE&j|h#<{Xh-qr+Q^ zxs>3aS)3!s!WTKh5ITnj1}|jJ4|-}iZa*C{xqf%quFDX3G2sm*7wDEm5Z3bKYt-R= zNU2TqeM+J8fmBzUHa&~>xh!j~6FrYnv&^=?Mt?@Kf==y%zTH+$TH6cAty|nj=_Ckm zwjKy<(2!3bkO0HO2ilVvZwZobiEoiD$93Vxwkp!cean_O~3SValbw-BxqTjGs;0nr=AwCix2%J6yigeDD%v9K@UwCXsfdfb?=E z9~l>8yESTv51VFmn*3ay0KF-mebUwuKHT`8*b3SIvD9;p;8{m?qtxuPp}@$dHg7b#ham^8j>|H0k0f=A`vBg4LQV&C~?5-5_eN$NdN zBR_muJY6*~gX=wjjDI<=M44V)Z1Oc0LL`Ho9PG&Zy=KW4ofosSJ!d~6*i7-lA)sPS zb>DXidejYRP8r0vI!m3#6L#IwiOzQSG`jEa5VGZp*b6Qbu+H7$>I>sHor@C>q5Wzq zlD(9=a59G<;d&F`XzH&&rMBbnLqwJ8Li){{eK@IAxKS-%r?Q>#iSR0TY5IWLbom_P zDjK*`)lzB-7n673Lro0-?k+F+XQ|R-3ggp?Q0CS{=MxfJ^Z3!m<-9X%`3AuCb?w+YJ-jVF!p&_WyPnAHFu)-Y^`1g}Tt1zc zE#Xk(27v`4xEm5`P=WE?@!OL_c5-4+TPXXIdBVV=}nsSUZqGU^xkVAlmtTZ z8}~WCd-vJroV~y2-uoA?2@^75X4YD>KF{-BmgX|1RBW0giH%S2DWWcI(!NGEOup6$ z>w8jUMA0OS!vvEF-N=dcxIM%8OpI>5d1y86m9$ogi^RhP zuQQ^t?%%!>hRm2Bm9_dRx*h&J)3SjDuZhA>T2tDXGKNXkv8F-qJM(|X&c(hy1sUqg zI5f;p4v~rXT#URdRl7K7SlMsM^COw2dyH$Zu&&NW+_F~i2cHaNX6F1z^qy4vwdm+( z-21qJM>qPxbZ`@&{j6^D!g~FB;!b`ePVXb%rz4)GRYXVHari!5@;W06u@l2e-6e~a z%EMccKix^IKYBz}?|5YM1)oBlz8&ckiY^pH7<4X|#^sfj?1a%m=oWD3_OUnZkxejp zL+7(uCLn+_|3su-gEtj|Y$v$(qm{BsWqqo~slxsa^XdI|ecat1qpiC?$14|h_f?52 zO9mwX6!jo=2|qe6QiICESPmr1Vl8&-TvmF0DM}GSr`aE;dWPs=O&QBjuNv_3dHu@o zdjB1;ZMq5`VN81V#9T%*<+z`$<@iR?VMK&SQ^4xg1ShiOuWG?0}(hrU=yXl5(J}c?g z;TeiL`=E0$k$`%F#O7O08h5J|s5BJ+6ur$8|GO=?95$a&WxpU3rT)#%L~gu+L<+=1}ki=vj71xQ}>s zVn`U^{f9v_p6Lq{j{7J6B+N2fdo|ux7FqQXjd1Tjp zy-l{*I)RL&KOx*=Ay1{*Jr1pMA~X}vVNW^*(TN5Nzx2OrD1!_#Y^gdWqyw#bosH#_ zFwl2DDJLM~lnkaITF@5?XX3q7oe%##?QF*EZN3bIPv>1mmA)?CuJze?HC(YFu-tf? z<;7*wWo2mXQg`LldX8zO+?Zt4H#j3(4 zN6y(xq%z9RLp@N=jb`RNCk8=5QpoEbiSgXpNn{!LrGcyc77~%t1(IocA{X@w+gqU{ zx1MhyWf*0nB_Df=CgQ-7W{*Dyl56wm4dM09iiPttx4&^sGiLq9vq&-1cAGWEag~&B zq&4tpyjC&ZS6U&~v}*>6gEM%c@m^oSdh0B_<;a-(UhSh5RYn?0UM=8>^sP!3`)om} zPRZLBjMMZm{c3v-&RI+|^~o1;t+Z$*n+e6!{bEUD-gNaY^LY7rEjpc)u}Od0vC4%A zsW2C@Q{HSk!ww&>9d-&+2i(UO9S7C$^26uqLSvXx{kr~C{I$?K>I*CSk4)u`AgmWO z2=T6;OWh1>cl$qBgz=2R_$S0|iRv=R7@cto9vcSJFQ$;XwnSi_t7MQAa13`JA>6UZ z?@lUWen;SK>Gt%dQmV_Xkz<`-@OJV!d;EeoOP2$!m@7EfliAT)yYE564m>2aEgUAG zS)+0>P;`x8C%sjX*kB#IVor&MbM|%Pt_-}NHAKl*9gfYN<*7b1uH)%N@5REuA1+Kz zD)4BwM3VOqz_BDeS;y%1y1CwbQlAroKF6`X{17W~&#_c^m_Q2{UV|rh-y=_)Gu@|3 zcm+(oX|56K*FV9O>0Zl;Arf!`Be1-aLv#&yeY@Q{g3q?HZH6xg-@+?fjbHd!x6I;c zpS-mS%w5R70>}T5WAbk525+>_;(z4RTj)l1Dl_=t+YM=C_HjYb-Awy^$mHEy36f3) zQur>SON#yc^YiXLP#uYDmol3RsN<$WMJkw)DbxGhD{Ce)rD4m_{o17mV-+|Fw0rw}4yzspRnWR;)U*djN{2FRXd^I56{j4pZQv%nGQG(3MIU z?rWT!uI$b~UMYRjJ-t`M748@0sn#?^RJ<@7O;~K^?oI%7rP6wfgbZCEVGlkKOOEv8 zn~v*m62~_*3GB$^KqC689x89M4qrdiB%VLNaOtuvfA5R z$9dkPwOJ|t?H;8~962qhvb89{!B@T$&5AVgnyV6-5ll2Gx;Xj@HRMQqllY53kXdIG zMrsSQ+YYQ-9yOUH==r|VJng3!P)suYs_dk(=pdS`POm~K*=^nu9LAk1ok;FrxQQzF zT#R*TI!h&KpuhS1VmU`HhuMmM_hjsS(Sgtg*jje}c%sA>oys)|Ymej=9=?L4XU;ma z6pK6ED+F!3RPU=g`s58JGQ(3 z$~|Uyk13iDR(E+$+UI!Ga!+{82%7;u{KkzkC&Zq)QIe2Yv{KLEmGMblqfTM6&OEVu z_&%sZb)7H01yaU;fnkWB5Uy&q;Wl83^Y_Q4R&LI93!FiG4PV_V<`TEm~0k@Vtp5|1Jw0&TPHm(3z9`H(qxy$2Vg4GOaOB+qXj1Oga&&mb#}Zcw6k z_yIAwN%wU5NM_qnTicPT$3LSRZKv;1d;B9n2@D6Nc;QdEvb?$g3u5zrw<`0df(Rs_ zemBy9?CSivPs?>Erc z&~u{5@c8uH2^r3Bn26n_uJ+}_?zD0cnwNO7HoaV`vg+rEC4{V*FGhLI7)j26Cf@s` zd=d|WPVP~sia-YssCFAdRN%^x7NoW#euX_FftZA;B1hxUSZOi4Sts??YODXYF0}UG z+Qr+hP~X#wok;?3IOF`yW51&&BiduHW6L(`h`Z7cm}~IHGq8q5-}?boPRL`1MU;dM z%lDFHRb8n3f;emGG{(U*H>GasjmK+skm{f!f$mtCCQN^0Vg3O``S}E*2p!iMOF=r!T0WQUw|FHOyi_XFQEY?wo2j(; zWoW_4PsipH;ZERz8@B-S68&Z6NO%ws?pTyBG(>aqF-uc)Z!Q^5#GlUEjN!Va28F6# zkSCxbzddo!ztY}2wgRj+qErH(HgAgFhP$s?Q}Gp-3Lk4GCw#ogw0rec@NdY+(cD2w z1hf#6GN!m^7g4tAwnX;&(e~4gqG(SHVf!@o*M_i>Zz@dT_d~X3F3;;&`9<+oRMHz} zw;~~QA8K%RsjqD4iG>R_^M?9pXT8EG?E6{A_>;OfnR5^ZeYobGi2ALWUot>fgG}(0 z4Ro>+24tFf*GC};O$(|r$U>2!9R1?KFDhV)5!zgdV7QbLv%{sX9>59aa*xphayYZg z2XsC&6BegOygVOysB>3+t|gh7-2Ju#-Z=P{o5}{0c*2SPeZt^0Q|va`z__}=c+9rv zpJ8s=?Gv*rU`&4T%E4Y(=A``0C7|l)yzA8_0((e2ys{*}bwGG>h&dPVE`QKhMYgt* z?GM3W--Y}^itp9NTlv3=OCA3gMDgEY$+!rBFZ~L->lDQA{EW!J9ynVqB&QlFY zjO|;?GR2aU@J-B3hGUHL_GjuCdQ`=9Q4~KE-<6Xb+qX!K+1vX z`s5iRuR~Whhgk$&Wj_?*FM%)CRh9$P)0i~ucOSp1&$0c^;8CI%c)=bfSRq?0`y@U> zJ=N0#`oY5lH?dNj`Q@BXSwiuQ*TbhO1^Hc!8pWx#nVc~7(jy$X8RWEMCHijY!i$n6 zzOQ>L4L(bBD5e07BWm(sN{tL*jt?T5+B#ZE^m7UuETgB7drH4@SHPR>M_=<)etq8Y z=o-)0e~EH8XJN;IsNm=WnU!0f=_!(=$+xj4ZC|~aA%LkNo4oU(75k(GE1dwO*Fbnc z0KUEM<_G4$dnH`UlG+48unF!3mOK(nI7`~g5rG8FWOAJ2m3245KX&7O3)aKqmM9B= zcw>jqu_WUCu_()SW}_Gn_%s}x3-&p)YO`Ne;u37{z{8S z^TA)ov|!iSuA;n**9Ut|A6oZA@38VVV{ZJ-5Un_(Q)EEJzqrxw2z$ocOnZthL?s1d z)Or)z_PR&kmGxZTb9~iZs1>aD8xSJ_(DoYyJ+Q?K=Nb-P11Lw@P=M+6Ur44vbyJ4_ zSGybptqfFsQ6{c*G>EYYASQI1BngOQ(FE|K5sv!@* zVTwOtPE-|fcmMFl5L(4A4+WZId7E+UztV^RIv)U4*}tw*93i@xtv;hPq!zUIVyT(A zB&P+3(?7ytnK#&8Rx92K{Px$8?z7G^X_VK9=rG^|K-hJeM!CwEQAzi9m-X-s>7?R9 zsXI)T;s#eSjpAZYd%#)$lHdk-_kFc{`@EEYlMcXrOr#x5a?j$g1K-EAR`&nL!~r7J z_Ryu^x&sv-kF%Z33X#R2O!$lKE^DN zpe#)St}*@{vi)Ek^oic*8lXzi3jqQpWv5;T){i%|E`i%c7)Gg2{&>R`|jJW@R<(2RUH;+y~CSOEAX&DnNGAKIuJRDFu`uzN>(CLcs@*0(6Lj zwig(mRUyC`3KX5eZuRem9LaPC6oTZcp?QAAITVwgj2(y9`QUQ;r2j~5w_wkEu&u)n zBIJ#5Z@;G~Gbcd7-yov;!2bPdp_S3Uh)_E$C=&TlQD(rE`Qpm&0Zf$&RlPA)7Y|^Z z+BLCOwYaHlgJ4dU4&bOQ5WD(Tj2`91&P0eJxepvIr{W)Ap3@Y@lg(m;yVrs3cVuP% zbIQ#753)Z1R_vz)d>Cd9k$?9Akv?mnbE9*>)(>mVEe9df}*^gBK z)yX>QkHJH00sE&fV5R;GvHgk72eqd>e@*-bE~Zzvx*H9bn?8}sWw`~RB zw}2MP`|nus1xuJIEoYvVt;|KQ4SA*CYu`QVNh4)rwTC3i`gxkkfPMmHl2X4L47>oG znst*ug46ggRj1$e7w>%mQvb>NU)W{kqTLbDZ_tA;%XRu4OgmpNbZB2+c6#0&J~MZJ zE%Hjhe+_R%mm=W^pxqJCqM(fngEK93N;lkoGz5z|2nErO@j-yk@eZ+ zqw@gxppBf|k+izccTlf(`#B9t9k6W;6c0-y)!G1a?O*%2U0A2bPoF;HvVh@x0P@xk z_|#r7OMcW#7VO+FOLyWn3@%OIg(aodW|*A6WdRKSuL4aD{fq zjNRmKzBGq{{xl~Cls>$0j+ckBOQo#c?-SyHDnJWS3gyKWmDo)JL!l903JZZi1uejx zprvicvU8)}P+O9H`5z0UYxNs$%vRlL%1d3PQ_s1&)2=s=E{SNl@KGs+l)p3o^nc)X z{#%h8Xn0Oozwq9{G99i6=%@qpRQ4uv!~4QwEmqLtifpuqQW9MGF6!{*(f6-pz-8a}k6RCUU`JXn z1eqo7N2-66WP+?0Z!f62Gg1=~MVr4LzM2SsAOdX0MA^{RN zd0t;*@u8Rcuo;yg=JPW_%rq`R%sDQBPc|@j@XO(p$yWK=_n*qlY2H}tGDk4KmoH|r8qWVrKLbGe;oyE90m zB;ukY2)aiF{^goRfu~K1P@}hXV@7E{Hyypf=knTrQ^KB>iE*{c^nLp~+=hJI=X%~8 zzlup5fnhnR-1(zk?0FF8+rqEt5y0f~ch9{25tDTfMS}iv_`ii!>!31+J@Mh%(SYSE zm}ckP5^CW?lKq{h;*L#x${+T}AUL`*cxiU}j$7O5F`)4u3nqBaTTZb2-ny}*==j&UCGb`T-@DIov zy3NyW^P8u#@bGPj(jC-K^7PyyHb_#nFIQV)0!(ULDts#s>uz zzMW#lc4rgfdJ?!}&e)_1dej~%7|@N6VrBK$pNf2e~mTq*=_z`md1{z1q z3u>C&D8+%`>kG0t6)*h`$S;z$8!t~KXnc~Zo4zpHA$CcnlgJco6!;ABn^8Y=Ci``a$OU> zk@XQ(7XLe60{m7A(jVb=<2cRUg`HdRPV8P zl)AMHykoO(|@glhO@|@61+_ zD4va01w9`<_qBQCZ)rRU)R0LhUaok?9 zgb<_k{fY@3m%={lbb9pPO)vaq>ltzfcHZFp2^F>MRd74ZVBDOhN9~$ky(_mzvgKeR z%h5DVnZ?P{x;~-2$WPKW639H30b)DV_M22?8k;HG6Xm!;W1J>TU`u8<#ey+fJ{Wt41CdQsNg_`trRu*h|!y z4u9;}Xx|p{degyJXXw8^w&iJ0V~h0VD*LW;`q^%@HHWH0(U2Vj){MM(x&L0P!;ht) z!KFU21KoM?t8Yp^HFQnTU^2Yf2|6B%6F3|47du|+)L`v#dPt5#thS>K+HE^7Zk~RY z;=SXdzpz!m=3nR4B7&AVom&Ar+_pc$YBc{sW<2uYXSF%43VvGQ`WXV6QD*iS+hB|2 zVgXeWZVS_H$WE*|md{&3CNdInSxxly;az>4?;GAi+_S8tGBgl-b~&!|r>7Q)p7lFM zq1=eYZ;{oX;XYd2<^)j{I;o(r=r?N^cT?AtNiX!(6Fi5H^iZ6*8G(5#FM~A-HOrr^DilwrJf=@fwS?L9IqZUvx+%9aZ-`p z7cjya48x1rwnUpjEU3}<<&y7fy@5XZqKsOsB>B%278n?>!MI*TaI*CQGfO0Yy!e-2 zR(gLO^{gEowl9_bwkt{TCSeE~BHCM3PnY#2VHmBj96XO%hVea;^x6JkZRU0xkm^|P zOAh^UYbJgQAI86NpiLPB+?D!Mxx>QH`p-AbzR3nPm@82oG>asXohU}<=mX^Fb%+;? zMrzXl-Oq7Y%8!ebirdalE)dS5ZIdaYq?N4Dz@oDHI^fMeG%DL#o>=1rt%I@cvNqx? zv8BcFk~aD)nJPiWzo(gcS^R^B@iUe*TW(ubA!s(9fNss$8Rxq>FLl4jZ?#!w8%A;r z?~MyB#|R(E^R)RNY8(dn?R3H=Ym<*}$@`Q!4JunBTSN&Eke>2GHJ_Rn9w`KscvtIt z2{>qV;kP4yRI^LtlijMXN2>Zc+d}7|KFi>2?{1v%u-o*j5&6be>l|zxVJg(USFLFQ z_9>-IKf}5^Av5GW%ib+qZGPxmA&9b>!<6+9KeN);Nzq7*=Cj_-kSu}=`F`<3xvkmu z=Fv62gH&19|E|zs;9r!N$df)#&bqrmH0O-f+3tR&+KU>t71}a550M0)7qq+cT}Gnt z3qBLKL_E&D^74yyDfHxB#mPfXN zRvPWF7w9ch&W^z}-4&9PocyNp65dCIt2yz!kz-Pnj2|i^Mg55 ziZ`%ucf>EhZ&ACLGR=soGzijI=GR3|X6v4o;UCY}a@#`%3w{kg#^XI4ve7_wMf{g7 zF?Q@pI6Wt0-tWg7@tbb+au;WJHHbIk8g0m+$gsM3VD&MF!--JaN(8I{{cM`(06{Dz zh8~rA2z@|)@FUVij~OQ$(YgS7C&z!@PhgKCx1u{*G|=#RPKGOb6_yNDt+<07rAt-p z_6KXa%4%}P0t4(`37;=^EOB50?xX9lh8omi%cj1KX5sW<*pND|LGpSskgRbn0hsNm zCqiwkJzWd~tonbO0tI3WdWo3UdtWV;#D*vev9yiZs9yc>iG)G32Cxnv6%@o3;9nMY zXn5FJtAlb!dwiSJ=!dQle>gBAKL$!0cW9I08G2$~q-U^q(f}P~4iq63& z=K*Mw;dnv_OnIzm=3?<>CsFPYQPvps3wIwv$=P;i=R!f77=%LB_eJbYUvv@= zE~qrbZ)>2a{`!($If5Tb0axn)JM~8q4PtJ7{2ob@{|02Kibsl zC~TJa^N8RO5`eldX4ElKJA}`0-kC{yoW|F0EtRJ`J-Xr+b?Dplkyb0zpXE2`X#b1L z6+G;++-PXm;O8ZQt6q*%xt51vETMsU&19lU^cy9gc^SQ<`Veb-T0kqFFb^^c z5juA+YslH09z`sG&86KlF5d@j4$Lol$4U!Cw_*fdk|iIeg;jpMS?CQ z2f?1{d_>E<;f@WwtrCREj{TV}?p?~11of__)1nsdB*k5C28>t2s55#Utu$5|)25y) zFV;yt#37>lHqYB{(tTgCGSoW$buUtgRZZ8dR;Tu;{Gbgtw#Jom(R0bugtWY0t3&zgg0pWgj^#&zNXRbo}P9% zAyZvdmCw|WT{f$Du&fd&8lfRx`%b z+wzn>qBLZcSlmYha8VzNS^6OTJLs41xEH7Qe z^AtUT9YwX@I+ixRs(R>ZJN6wg54F|xK2TY5 zO>QC#$GH$!?)Fs|zF>1CJyW;tXkD=(W3~ZBlyh5zONK$-f?*JUJj9&2sPxtEGLmRH zbF!HjvS2vEoM1hh=;YhP#rtUfm|=O?guncFA6pST=&mg=613=ld$i2JF!~6TqrXx| ze`ek&dY@Z9W(t+H_w*a`nXE%j&PpBMhN#=6@z1MdR>^PyA<3>S;IteaW^NL9WY0TO z{iJFZgFE4gYPx;lWFAqPAHs9qbz_5nLrX2R((!(7>wDRULAdrXvb$x^+XqA9?edcT zaJnn_XQQ*aGx2njC-~*~i9F%EW2QecrI|>Y1}6e5Xvq}f6nm;5aX@+#|6XM4KQHr5 zSGPb_G;3s^Yu3c_=e)Z(6nx9Y{|r^{Iv~#f!E&(ck%=5@zo`8*8GqE-zBZ_H@N~PF z+$uY$vX7@;qe#D2zsRsw4hL0P(&p3&os(EmDS8HLj?hbU7n|66ffc;=q5lq{xj?{- z@`+22pbl+hkcBdWNiz49w}G?XF2ws8_O!~SGLDjTvWEop^ zr^b7t)ThaI3kQP6)fs?vY)%lPFipEZ$GEEQ4PrsEj3&)tTAJwqM*9b#N?m*R&a``3 zPjB$iFnA|CDoI}*jpHmWJ#inYbTaq8((7AN&KMt{Z~@#G>hqiyOxf$u+TzcvRE1iA zcj+225n@AHFKG7j03@==K&0AW=WL(y)wEy>B3-F0DPhd0qWR)N*FnN&CK5#|dna%& zXU@jc!7j{bPhd5n4ZuG9a3ULR$w}G?8EQ^lyTC*PPupqf?DTWSE@LS!^pcO@UJ&2Q z4cRQ6gSTNP1*D$IMJ=NF)3X;tL*^G~T@F)&cQ`_%q^KunfIPPrj}bOrCMkbU z+cTu>=?f2-SIed*4}zfRThns}yP1<3PpUMtQC`G!klCirW?h4G%`~!?U_mV~;#*rd zJ93e(xkg&Fdp$X=D4n@rHnOLp*eP(Y8zYi>+^)jb(cFjnFp$I;10$gA-k%x*3-(>i ze#@l*9XnpMj+T6KXMJWlINBNmpOql)R}h)iRKQr1R_`*>O|-0LlWP%MM54D7?)&Z> zWOdr?KKN{*x5z*)%r9%wZ+ffm(mgqjmOkV1Uloy?rEu=f_79^8_ufo>*V~ce()?Pe zHT_*{*>rFEM9|#pw13L!Yv&mIXir}eFjh%yo7)@d)6V2N$_Vm|dOA0|?7C_%I&?2* zAb~wXaNETVh`bp&V5Z7jwh7@-F%~wY{5*(YddM@HcWt{hB}d^bs_S$0l;-P;9f|@H z+ba5KrOq5vB(FhHW6b6}Jgz}+a4HiaWum`!0DYq>=YL4ueoMw1C5?y((E`{0c*US= zLv-)xdnSxzOkDllSHeqPGOLrQdPO*qD;9BX4CQbL)Yb3hWt}F#@C{%#8g)ZfJPQOS z>~PGQUS2J}fn~W9MGtr+1A7F#n?eeuL%bed^SEXXZnwQ=+Ob%xiY%VwP;b<&I-`)- zo7^f2{4yu2;wW?(iPvimRlSX=t0tRM*x@e)mk%fXF4mIc`QQ>rLfQ3jqCum)WYnO& zY)d^hv5otk^mfmT^>32OAMr`zU>mNl_aoo`k|^zM<#9Dhy#}hjb9Y#?dA!Stmrgsa zUw_mHa~O*93*YG%ZN=oG?xSA44avtXVPu{Nuo&t33urA41a0WiJm|pi+X-t4v_vdf z@#N4E*+lwslx;-4sW_*f@ax0D;Z6GS`<^q7#nIR|>kL`^W^c;8#ElFs5@-pmAO-Y}-Bvm4f*mYwa9AsnLqGwva!3^jhjkJ@AGi0HN!MHc)F z%T6BC2TWeR;d_kB?*oN&j@xLKa$k&bk(wuP%JgyF=lu%wiF(a9E1nnhM0H(~2yjqm z8s?;jw1@f(D!4hGUVv9F-R2_@?ybJ4g|K)QEwg~>pgLpXz(_Ri05#f2e92^`P{ty) zyeXRoc1jLaJ*oah=-o+hsVq@MiyP+HIGX`yU&S^(BsAwzpaKT6|0$Xd&$8IvzpJO| zk)EYAq2T4&3undY4Oy52`Acz>RtYK{uqWiN?f5^bwzP0wf>pV4 zRj~wFclOvyKfh+1WR^iWmXqz~h0lE~OFeSCL}=1C4{6pAN)Gum5;HS@gwI>Ds$jZ^ z9!RQVh0&(K34m28 z81Z~B+(U|}q}c<}z^!VeZ>ST{G+%X_iT2IFTZ8;;&KK41C*b7-_=~P3-4I&-` zBfXF9MT$YguZZ(tzbZWIr`54vKtBt@lg-o{*>>;2=u{>Hn39Y$?%L@Qrv!E9g%_*+ z<{NvON2_cFaZL!!)iwYZT^{4Y+vkNLA*>%JUmyK}{BKnm+ij=$9_fVMN-yG(v&%K;HH0 zq+k`mCj8Nkg-hq}ze$*oGM{>?)Q)b~CAS(ROu_4x7Tpk*6HrLhZCg;k`g;0T+JAx5 zn5|b+t|K6<7-vyhY*iVF{&IuXpqsWAYXHg3NMV&2z3Nw9=@9L-G7a7kn~=Q3Hv0(~ zT`Qks?m5S7)i*x(!_AFau`epW>9OULIJy9t_MrhcXI6qGLoV- zs>T6H?3ovM|2R~-u+gzxY2~@s*(~)wsZ@;P?3}WMf@7ZTeGpF@Iz39oPf%J zTFHRtr3K_vF1EZ|@?ze5BknT4Z->16X(=xoihCQczv1%{_ zeo{g2r57lJkblvr7TgVKf;Tx0@+tXKln~W*nbAYGGR}8RJi?2owuH&DY?X8NBo}>j z6j!p@C5qVY&b!-9$k|p_We$^&^yawi8fLzJvdCD+vc5-!FJv=(mUm8;QXgbUdVIHf zJTAz3chUo&26nN{aEzYqa<=ci9O~bWYUy&K!%uD{4Yi&ool~T}kp~>x56SCoCH6HG zd^jvQ#Q-LVzvMepT3^%mlRN2TWYb7nicY^u#~U?gT(DTCpXB1NAWclMKDA=Wo{U8EPw@d)hwgYVo{9WaY^SM*F@C}l>vhACc}L=me6H3J z-OV>3qDu5%YP$NXTb;s4w_9oY#adLE~S8=@Pg8tb*vY1bI(&MT_>2+-#>(sgxx}{218(W#46XOx1UpW`iUu34d*sR-s`2@(*W7!ThEpo^5w;#gJ_vvk ze=27c1ZK2RhmRFBVf4X=;53W2C$oA7nEOowZ$7xOypFF8HGFG2=fpt-+H`35e$xl#$j4V=SO#>W0NVD;ATAI-u>>h7q6GCE5TM0*>OZh zQ*CaoK-BU7HS>qLgHAbHpGB2UPkhhikrsPUI#5rH@B6>pZ+i{xUj68 z(lZ7UULPz4Ib8!)CF$&-Z}y4F@A2rcbEiLi;mrb*c*V@GiH;ws>HIwY*m*ox!hee*9%ilm;Z%%r-(8F(o7@s;GjTl-$+~l00|vH? z29G{lx_w!K=9{6im4mz)eJs3dJq&8yh*)@VOUueLw*YZp{2a7l=?`9O-;raqz}#?p zs5w8is5;iPf!+4546faw7(O<1lm1QK9H}-Y4au1_o#Rr=JLNv&%=`4L%JEAx%U-F3 z`!lR=iw^$RR1M}`{rEnfJO1ls?UTKk_7$m6pCsOHLP9iRM$-|44c)cemvwYHWB2|f;Qn=<@gGxen>YcK?E>pSUKubIz({JCPyaEBGb`$;-coW2lma#L zF2{ZS?2CGjFXmF_RXk?y3&vhlQxbL2^VqBf3%i%whu!b_FT-w2tcb*yAw0TjDgzVu zC|2{P3o9>VTq=FvjCTkAuWVX?A}y8e2R{UAiS_>idhD25SGBazjUf?#^45p9?(!MA zosdh*#LT@2`CyE|$e(brf1XnNFL}rI+U3&xIfl>?_Sqf_+LvDZZ;UkRPZy8bwSH+2 z++Xbd^}iBoA*eTsqyVD&`kxYymi-4!uhwqS4{`7%@1$@l2jStT^Br$Omu)Uip`=Kk zZBLU4&#wvc-cS`mCkm&C3b`~<5*i@}HMQhxt+#33JyU;5-Eo74gqURYU4r_p7>~gE z`FU*v?fTRCxx10Rqb}SBB~sd#bqD@j+gdJe4UfL5*{JZBi6gT!B$2O+XoeHbu0WF( zo&5&wkk0?@=H*vR; zw{iuH9V(9!{FJ!-5ZO0zRMSENspNV{o{=MZ16y7t`2^Vt;=ZXUo5%j@O0ykz{r)2tw(?uQVS&EPvMmietFrJ)<32cI{0;@W zRipi*V|{_z4eUsCPa7db&qfbvuS>(>2lb?UExJhZlKf`VUcs~M%Yk^+r5w_q0TOQM z2)(t@+iYFqQBg~hUnSqi-bS{@$7#qu3vAusMoY$BgKhcoaAya8BJ&@7gY@9Ki5($= z>MN1opeIhNUPS5LL1*V;-d|DqjASURdl2V3YUn7OdWE)#0xT2!o`dKjVoKJWy2N4yJ*XWRvch@ znNNwVos%R(Gu(t}I0J884cgeC+3eSSQ?o?}eqeE^?VECosc&TW#Y^(onC{0c4;~XO zvVpx{lQvb3sVOdQutWx@lli83BhA^-BO0=-erb`C4?gk}z>Zquvlm|i@45<;J_^3x z+rks9T3SZ=&GV+)v5B$gbb_>Bmq3)$C~dsDupAf}olkb3Uc?9ajfF7_g#M)!7!{Tz zjqd*vK1_l&o_1^mGG)j^tR?c_so2G1j z{a4Kvz7hj7;`sCS6Vv7R13!xL1HXOB zfYZs}N}ItM6qg7McFhshksC~Wz!|cS?a#iQwev=NEZ3lWd{YQ=QIJWEZoAri3te;#2-RyHbP^IrFVZ#@JigY%+sboQ z+O`#+k79(HvdU++@qhpQ;UKT3MPpIKUCzD~`0D(A3ybtsjd#%IeOF=rmSd;-i}Bo4 zX!2C`8C&2#q5O|KPN;?*=%&9YZVd2xT1}Q8p(yQOU=;CsV@mLC)EA*=hKt=qs6IM0 z|A^%O!|lnzfCK0O*9QV~w35)b_xW{uSIJ_c#zSACvbo}DD$GxouYkSxtzUC-TJ&vq zUXw=8j+X1`^v8{d-tCVC{SdufZHz zs#gMrIsMYek+m&@h?F?}h!m$ch8U?njF8&7^1y_KBD1663AdSYQ z|K%4Dm1eUY|+yXII(xw)ZoY-TDng>p< zK$w;ObRz>bF};2Z>z=?Zk={H;TCrO(*TAGeIrLvOl zI}MoIy>B8NtEvS38u1ttK`xey@lFmHS5!?DoKo@h2=T(K>0&KMzHe(*-Mlk$?N?J^ z6A9e$ExtUvZ*Dc7t$uH&x-SONv>pV!l@|T-4$tAjVFc5Mh>NtrhV%Bf$YL_|ZV!vn zqCco9?2#W&H$n5e)@uI63YN&nejwbSuc}0axw)R-9k$wZTjP~l!TgpG=O_*9){SeC z()?W~dtOmHhz%n|_25(7=wLNTJqa@%Q%LU<;`A7$YNS_zFfJ6xKN<8|>y6d%OhaXB z)xGZu2OkVN&7FtKwWglB7pYL+R;);mUg3P7RTpZEri~gluQDH73vg!&HvsFhL6m-Y)Cm=oHDVWt|vLx z&IHaa#c>Mjn%*?gG4G!d_km(oaJL6BDZNQH5>+Lt09L9UK_fx(0-H1pi z-jC)sZ#h?NcrQCNS^of1X`VXt#vrzbKgxyOT{BD*o*PIJK#((v&yq8F)_YwH0Aq54 zdX0gO&vw`9aNl<4=bV71HKYEb#A{Y%e3C~ide=b08T+eW<#~${;Vl`GN~_cVOk1(^5P26Bm@Q+ zhed(!BD4S2sPLzb-`X#ues!&d1lm=>&?XhvmQR3Q>~q&4a~qw>|8ykVp=T-P_v)fs zB0Nk^>f~4eR`0R^W!gMH9-!JnXM9f8ZEuMjzO!F&P@oMJIa=`a3bYLKHi|jZEjHYv zz??YFVKxj_T@f3wH$t_nxG(b9sqW7{n+NChj!l?}4XF2h<@Xn7kP&jacLfs1XP1qT z<)$yG@UAV(dRg2~HH;sRMNv^Db%}0uL`&flnv)kVZU;R&c$nENdT0*m(k)yjt#o$N zp@K1_{oa@?0IL|{Ve7S>9TNFX#EA*rP`PBE2~1P=PO`{BsFvrM!I|g($KHDeG_|K| z--=>mD=H#e5VCEcARq#wl*9@mLR6}>sHimQO&}y9A|g#eK|={rr3UE`NI;rM2_31S z2MCZr2j%retW*TvR2e2tK9eRx~}^VPHwraCru_3bVx^$ZeH9K z+kCn8zJ$)?@ys@#=fzS2>uG3YVM^p{3UX|?3`cOx=8w4$%RB7n6LvM?r`GaFNz` z_&iNPGzGj|=7{iw;&=Sk{aPhRV2}1m8TkSXx)iMU5*i4ZZnnX=5hzvEyX0}l9=Th| zgt9?v3i+V2uqc>WFjgO9=%r8I1Uv-zgm*C9cFmJ6lXJK8il`5YK6XZT)-w3*0aMm) zV_Ax$L82R0iHhLCWAv?>`86`X%E;=D)F}wsl<_xwyrF6ZGR8G9;ufC#7atThZ|6EN z^nI*!kVq|K5J6^jysg!e3Cg`OhcA5hsxTEBNR7tM!9uJB4bhQ>=sFqXD9jkt6R()a z`;o2-ndjAnYTcX%W?|VPdB6&j-clMaJ6z~T_+^9Rb-Le4GG;@f-d-g59k{?bFWd+I z`ml?goYB)*UnMP4k_fLcah<)c!DIZKAv`#A>zdWqaFBT_RCD!!-(;u+b~nAMn^Zyo z(};pb(gG>IT2da#&&}U)Mo;|vt!4E+hlLSf$ww0-(em$(P$N=rgMcdfUvEQhgU7&D zTeaZADB=EtuAkP{OTDwE3$ZIN1NKYHekGa3Rlm_c@yLq&R!@eJSAh`mE0E!d40 zEgJ|?=OWSNhp+OfyPC(24MEM+9_DD_-VzT8{aimZd2FL!+69|Y% z)=mq&Q<|>mmttquc@GgrFz{Fj5E`o^mN{o@&CaOy%rGPTX~wRrQzyW_J>ha3#Ss{M zHFTsV+$>!5CgWZU=lS&U1YP94na^idGY)z0mhv8pLUj;1w>^W8mma;z zb3LTpuDA9>A*f${3x+1v2aFu$Q0{LmUHDW0rr}>PRKv(I8!zl(R6BUpQA~9k1uX*~ zzzgQ&Nt=4<3zg7=g}P1cjn?)oK|usiP{cl0^>iQQ9bRix0B39p7+VMxV<+{mvo zaHaIRz0A=fr+R`*D}(l+9#SXiQ2+c|D75%ipymSi`C^fbwo_k7bh!s{opPiqte*6m zaS`)Sq3f%`GX{fd4@vv1f8nP*>d7;gGRa;~b6Bo?ArW?v^QOq)I0Svhq1Snl_Cg?k#s0(2&X)*)F6$@ksKV zhBI!J5rBb7zFU{-c2a`Cj;K+6t&{hlTLhpNS&M6WLxv;u8rjr>ON9 zMQX%W=7c>q2a;g(1<4Aq_m#`P*jC>llFra}FwyK7zD|;E;zB?{)&Xli?`FJ0WV_T( zW$authU!dLIQH6eEA6>?>DOsTxXW{lE>ELR=q;%@+w7#@PjUGG_EK?CfX(-;Wp6Q5}$` zFDjPqF)uTl*`M)IHZ9EDKldZ^s{voeLo&fB1-%zdwLyfJ^4PHkN;LI#oAxBuCv4CU zX@0`CV~g1_n7btd(gT7Wen0N(RokPJCu~1*ou0;SVD=c{wNta?y1B-qH@D(sG!}94fB)6Pp z5>YHD0fLOLt4PxEejtQ*tydmCz916pb|G-SaVui%IjmH_M?#3`xzQEAlUpr}cZkbS z-in)D`XtuNpHiN;J$@xXM8n5G!=S`M@>cR#$~$svnz>3@)U6`|>i<|@cNP3r3=8Ev)r?npH!@BcZb=AU5g{1M2)7H8ortK^X7WUvHTund*n7$IOBaJY@X`#f?l@bVfC0oWG%AT z|2HG#w2NPlzFam1Ez5Jm?Hi9WL{Ud+DYV5rW8<57TvqR=n(8~NmQr>^8Ue)gT)#6x zNx+vge)q^jI_4<$pzP$e2o&ebt@Ks|>%5bDH z@O$=7R)PX9pIw~o5=Gpv`M)i^{|*_ z9gBWY@M_?=7;|_lS_J+$1a0?6o8*M{Y;lLy3iDL5`GqpOE9JGa24)&I-X71}{{u); z6u~ZoS$?-D`kdE9+qnNB#uOr!m(9Fdj_rqBLnKLT4}F5VNSks8)*r0doM?L7_-Gnx zD&vEKGb)f<$wHogC);(!voKo2nX=}h-lPwprCAT)TXnd5UGlP_$9@1U`CCtffGiKj zzPx3ev=tyzG61y*ix15>(sw}aCz)yy=EsDhWsWv8w|_27W|n@LJCZ(g>HyB$38I9x zcf_5Mq}xsOa&iU>ZOA&|r;~yjN&gPmJV7;p9u?Wny_a*pzQV@zb19y+2225~FLx*H zS(nU%Yfd#*O71_Kq!+7Kcvc7u@I9yN-_9^=gwZX%_%*?(wZ|+n5MZhtS0A>o% zzMLaR8YXB5;WBLia#e#FrJmYnYiDZS*yB1(?r1iic-}v`Wyfu!=F;PM-xq(!G=&jk zPA66Cp?cJhKx52Jnh}Dvlp^H0uJ|JBxxOon*Gq*8>a}mBo9qrxetFKRcgf<$`)7pZ zx%+j47SuSDR{Wh46JA*VU#aQ`xfyfOnI=1#qpmXB;8DVmoGQChrb6I~#IVgUyLzb8 z3h-7gm0Kf}%yJUZkeNG#3nE~?fc=Tq$3uaB;7eYA-?6QXPY;9W`iom}|L zzJ2dDQ{zN&r-fmbPM?ocX>awe-r80N1v85ez#V~i0VRmczDtLg!mA7FW=D6cGi_Wb@uz8!ir*D z%0r(c5+be{+6F&v;y!i^Rx^F@M4SZEbv8ax3t)7E31@>{+^4s?hfVaA0gS$%IUEa6 z9Fx*>radA6M&F7n&!~&pE?!{xe*Gs#55_2-qE27B_VewCo7^>>u1gy_T{dZ5G9z~Z zw%PYdU@8CT23ueA)3KKTxhc4lm4VI>(|oW4n0Eee?%<-2!=S0Wz*G_9pruu%;TP{S z*Mhu*48qu@v3S|{aYb5O!eSS98{zYE8Sv3%sZ!eM<%7Vd`dH^ijU2WGKJOzTe7&kupdz&` ze&^pG$PQoS?JE6TR^hHZAAh7@rM0C%q+Nxqo%mAZY_aY)5$@A_h(lXox~Q=K#cfU% zl}Anv-IMwYEJxN@$+RN*S@8bi01rppyZ>U9Ap{-8h(}FN?$!bl2s+U6VB6~<;0T~? zVwCQwJDQv`D)7RKvSt9(xGS2vS32?5^KOo4z$?0!~m%HiIRY zRhx;g!^G!{6RJY7Sb3A|Q_lhh3WXLP_F3p&yewT%qs9~716-6Z%ILDxDTW`!r&@3#}n4haEZJ<#`S-% zgMUp(gfZIuB?%)mGC^B1y%59sd2;;a3<2=e^k4n}IfwXQ++6i2>F&l8{-Gu}muUL- zZ-|Ts7!9d!Ck^jh@CRp-XYF*K1N4#j+92mJ)1^>?xq53C@PKh^&NSJ>JvRva-Y12@ zCG{H9|BZ!45+6aXMk*ZWJ?OgPjJNRMfSydP+hPW z04boUJ9jfo*XegysB2r8v+*!Am34YV!nY*s70U#CDo9^5ZARq_Vl&A0Ro|G||G}#1*N!oe;9E9-So)z_&V}ip zPpN^GiI%LY44-H5ky`+2XoU>{CCe!EMw4OWzj&=QwAkGWWqI{a19 zBqb%j^V{_eMScnZ3@rb>_V_gQTIyZMf!}M9ugvbWDuW-U#<~0=3Qo9vZwK7fqHKb6 zko!=oA%yVgz^_7RDKkZ8l`v$enL6QhNcd$P>7}U%!nGdio1Jn|gui*+Cs~Vk*=vTw0uCcV+@*Y~B`_J+<$)p~s!}_v#%wLdd!HkFGs!m`eS) zT!Mk|=uASk3ICx+)!JZz6^3nLS+?j50H7^nEuf&Khf!l8CboFc^mpexmB*PM%#4%z zuw-TV*rC3>Q%2vpr;M|z2@tgT)v^s~;%ldWw-N?3KNP6J-tz-c^7{))&4R}r8Y|`Z{VH93p-e5+ae6zJQfJjYc|Q1-)WVNIi!uJtuVB$&m`ZW+tN z7%F-y#ADpCew28d*oRNutnoR3(LiHWl%;N%N;zG8n-c=t^^b;w?YPo+KpFoF*sY%Q zAP{M#k|t9T#Mx7U7}Lb3afj^D*{|L3He{K=^_?0H zUHCCz>ija8HDe4y^HvZ0jbD&p?_9^^h0iTFyu`X#RaBLc2e2bA#}~jH?MM~>o`;P2 zhM21N3g*=+{pSZ^0yjpxs@P~}vX%}cMS!A6=SvUPVbgbzvSiYiF zdF5ahZsp}KxTf7Q@VrD#m+Fz)2;^pIfFEJTUhGt^B>;iE6{dbD=8o+r}acx#U88x3vEZ zdhE6yh#U=B!K`TD`ED>|N8P0+dT(R38}Too+glIh6A5Afz{{tFJNv@IBzF-T#4%zp zR0;HHXTR$$%1pzlN@%u)!?uXvH%FH`PAHiImz5CuCbyatu%yzR@0Xyl&PMnNR+}w*nDG*ammP%R&>QSC2e62owIXv-`{G4%?p&6#vMx`+uq4j#?R#<}{vX z%uL&j#hDuXWT)5PkCeMH;@Z=5cP_GbON~zUUyYG{4_rKJ;%cnS))P8UBiEO_#JI;j zHu8rMzn~7-B3S*dqjA$gi0;@E{V&$n2z~)&Id&rM-s1BVEH~Ry-)~At`zuw8v`B&@%+YuFeE7YoKBN2 zAPKQ(*y_;4of^i&_;9Y zPbu9PakD{x|H+<4T~UY4*=Y~LG=5<&@h52I@glvf*>;PG@D(nXF-O235cxBn zoK4Ku?XdXg%8KeHJt?epNrksL74CY<2eY!H7Q`I1w*ZD5k3)~_)?0%`$YHO#cX`5J zSy(siF8lORgCYVswZ~_B*z&v&g0=PtC+dQg?RZME8N{H}_8dCf4zaOXlK?~^GAz)? z>4qXqSE0*)KiFZfVXCMn)_0CmBnL%JvCxS9<^Dk8uVziu7wg+y?t16fD6{mK3v(}; z$sp>W@hG50nq>GsAx@ri{YA{nDV#^W5_2%fz5_MQqSR{ja!Su4R<9*!@_E2ozwLvg zDqJH_5U0Se2I99Ohp-k571i5tV~}jq`7E!SfKP}3Pgh~jT(mQM_djST z0)^KDL`msIl)Os$YnpQUPZNaxeVT4JERJncJF_fFSaTh zI=EFky6dPwx}eQy89_cChAMr!x*sMOcJ>!qHc!n9zkt37@@VY#IcL(5#0n-63T2Bk z0J(_3^Qp^OWII{~0L5M*lGJI#uX#!I@VhQC^qVBwX*__uthqmT07IN-c`K`q1sW=J zc!SP^UYLDyoYgM82szI_0x`q0B@V3aB;g9!z2AM~W*Ba*_9iId4Jxgo1h_K)U1X4h z-hzjVdcO%0^-efh+Tv?=S??F0d3^khkBePb8uNFSp7wT~{cd{yGH~M_zgO*cL4Fhu zf0M{vQxHbWY}(+8h>^`7NiVrdN!l)76?4D~bpZHDeEw84GX%J$K}Ju%*3I0h*595Y zE!(v|p=8-Kd#w>NS-BZN6ZD+hXeqbKq3WBMYo(WM4P9Y~Q~96cKEEsX5<^ZkCcq|o)zVhUMDheR~M%be9&K3rQS?A?2r61rls){J{TP$^4 zU^_mz!8qL8P#@b!hXu4gLZ}BdyexW@*jIKh7@zgXAc2+b(L2MOLRwo=LH^#6B<1;C z6bz1ebogb^hmp!0M4GS9(}hg^6p&mOtUZx}$B<;Hl=SH=D6*~NqpC)zFMxi1n_5em z{I(K%*B8~}0&&}6fF5P9&gmHC7J<8o#E{C4wKni-bSR{403E|jH4G| zU#4w!LG0&7zGAY0n)=v3d{`7~S3ckz|cew5BHfg)pOiAR>US&{) z(wUZg+7n5o>-Nf3uVnqUb9PD_Zgaer@Fd{;pcDoQ9f@~TKlgds{08&_>lX$YCa6G) zuC0l~vUaNNJLfh&1;}YU+S+%rEj`{+;m05MS~2lWi*KYKAyL<5UJRrX$~`&!$&Juq;b zM0?$H`QVIzk5FWSS4M1kI zn{}EAizF;&xZk%Rk(Lc>^bk(K2?m*#Vc8@98|QPS*e+p!LJ!Y zzwa6LgBJn|TmiPlZA|M4(l)r3E#P=$4sAk?qWsGWpn1{pt~NY4K}?Z+9k>%%^$30OEh4SIJ|7M+rD(ni4)vgiCLOSQVGMz|(PW zgx)JLd%C8BVeHGf|AQ^w4ii5=lJ_Ll5w>y`0??l0K_Z!@BT*S zW9u8Ub#7j@bunRgCRC;1s!Exj6BSi}_w~vt>cPc zIvdxMka6q=&hAR5BSK{lP^%Hs7GC`{2`Z=SPqeAjDgUFBk?FDKXkVWHi$d4baS3n5 zC)x?J;uaoz?#L@LtM3s2<1AHC&mglNx{pe}Vt_ONfGKX)AxDjQN(d3;u;8{6fL0ZU z72mHM!CMtxG}pX1xSHv7?#|G0m3$*zpLs}1WO=pENXreW-=Tef&M26!PkV3|dC_B+ zkJ$=6J{gzyn!l9fnL1=yF=@F;9-a_ z(_(&cRC1I~J@Gfh@T%yozxO%m-rd&)7>{>jJSI+3Y27Ec5PeNP{Spk@8pZzY&u{aJ zxWXcf6~@thGeMg+J=>&z^^(b#VA?Jm%d-oPfD`5+af$+1_tQ@#zuiZDFO1uv z1_-~U8LDT6aK&{J!H)qCf4sM@Zk_o-=FzUxz`q^a`E3XDyAW(EihgBvy5<9orqiXr z3P^=@y6T%ww4FR-l2T;a*0T8@>0h~uHq%-+_z1P?e*bf{)$agAzr~%U6QFy$OYhaE zeU-cWStr>WajC2_SStxy{71HmKR|{#wH0_v8>?IR>AD z(&*uOxKVjE7JW0~4rWOSx#B%0;a^OXkcWOs-f8nwCk!0+Ro~{I2>*9l`6660el7<1 zyd#a7OM$7_tDkhrOZIC%_M<6{GBiF^(=?bMd7buQqS!jMp16SiRuLKSISV!5?NIEH9I{Z zJomvT#jrv6{ay0hat5!?ZI?fgC23c-19BiV_e;71JN}op*Ddq@Bbl_^rS1JTvS(|x zalT31Df=ZAm%l3Qz%tcS1J})hPUT4qrm+4UdHoNvMulhy8jru5N8+B}M^d57I5>S5 zpFb?2i)joyr8jjrW#LsOjYl9wEzxa+5$EbiLJ*CKk=3vB@Bg?yZZhtg}~NSB7%Jrdl>J+fDzXsUmOL9ol!wbTg2Q`WG)CFf91& zhZB~W^0^oPT97NN<}-5vWgcc=<{^AnK8fa}-JD?cUH>n|_KM$()g5~1fzRIc2`^QU%K+^Y4=0k1feNk-t(5ImK z!GBZ82SQDExvsvV-a8VdlVyr#@{+rf1B5#4hj6!Q{Vt$Q?tYBX{;R6*?I0xGNeY|t zip?)Q`UmNw|D*Tw!f8MSKdJy9{-~(Xu&eZZ>!!#@I>!I0@GFZjjr&lg$}F9I|BxE` z$0}c7H`~Tam&Ao}pDL&fZmu@MY2+22Og#RwzxDGTUQ1lJS%oXd!f}w)`|Jnke_Y!G zAt1&J;#iqGhUzFIPZm9C^r`cE?RasopJ_Kb*?7-8_$lC$ryLD64)#U-w*sDWd!)jR zQSddV4mYU>7gN!ivY7n~JT%HgugK$X-Dhj$hjfW6?D$JbDML_x7Ko+RkX?Dzc8vY9JDB za$<=YgW32=J`hS-S;4L>tD|Lo$b*;|qp{p#o!koUWzI9aV{ewzTD8LV;cesFxt}YD z0WH!&eP32uTUx4YutO~O&Jq&^P3kzJz^<|7D2Y|VzM<8DVSjbn3X?a1sqFhbo<$5e1n%c6(pWn zIOaF_`P9m6j@M{~v&Kg*1H9ymhxit8&|=%LidGeg++;1^s^t-1wKe-r%cYbQCe8|r zD7pEFKEZ|s(o`9JB9tm=EU=L5ttK>QXg|ZGDNR%b7T{8DRs5vPe>^mx?mto+D`V?6 zi%_H|b{f`sCldd3^#M{Eh-Z|j{WsGsHukszX({;CXND@D@8yy1o zjiZq8^j2%`VOGT_MA|79>@@THpiIzWvg^o3@=>Yw=}z28%oi_n|J`3E789GXM3Cwa zMT^QivLCIXxzF6$ykz2t4gm?3HA40=%vC%7nzFbnp(q zjr_f?LfZ7??{CkyG%1(6#|5;)ihiTKh;{*Nke8gB67sZl6qDb+U9y7baBUY;Yg>t5 zyb?If>ANfGq7YwTb-~X9z0>H6R>O(h6l?qe654%02jO{v9lqddtDb{pMN8BmoA52U zG8xHOUk93n1?H%;SaO^hU}R;3VmqeK~Sn8rVas z5(mVIVanGOK8Epec&iH6kZ<0jHU2d2@r`CFSMS7gF5W~qElP_q>IHn;XKVdwbCh;i zWf2zjg5iU?iMW;(gqTp@Vk2naa3IcrxImDTNp7g|M@y82c3(kQefsGL3jB&(XiDJv zE8nf|<8Yo6hsHc4te<`naO}r4hcmnKgX-O|h*STq*9Rg<|L7p%B%oz+`nA(7{wgF= zU~1fyab?c4D5p&~;&0#ktbIQ(K1S?`K*qt2nXG>9Pt11TCcZ75`QK? zz31Kient$*7(qoMdsvNrG20)FoYd7hGn^dQ8M@NbR_IO8;nZ**cU0tGrWscbG#id^ z0ZTz|SaxH);s`f){!l{X4IfMmKOD=RTjhK8cTA5)RTzG5yMk6WFWAijuDph5Q3ag& zm|FSkDB7yuW8V`irUDrf0y%nbu-5$qM7#z1M%IvmsO;KZ%Q)dT0MWzVj)D4#94t7U zYXpYeOeOgQEx3YIT9aA$^iiHD)JMzlQB`4$SKmXVl3Oj~+9GqPW;O+RLw$3M-EPT^ zd<@UM^QhmlA{1Mq9N49^x)eDjA)KK>T=vv38AObWi&jk@lf@RUC>uw2h7<~N!aYX3 zn0&`jG%hUM_%Ulk2~PSR+_iu?((+L zWlVrsqu7-msT6OLE&mOc@+oI!q|77HeFCD%cOjrP1O^)LnTLMOP3fa9{fshyW83?( zE@RbA7_jIePlbrbI<$6G#C~QImv!Wp4}#XAF$zRFD04w7%Kf`#xFEpqk-F%WEb!*| z75Vkd0vYXM0?c!@31PYssoLotQYcDij0d`XF1V`D#p5ub)3J{`P|KW1DXoEo0vNtC zMx7V6u(FVi_LZ>lejDh%ezL-;KQ|!h%)x^FKyLIJERgjm0jpxyT&dWf0kIW?fr92) zrSd7rJ^l3B)hvowvsb?$L3Px}bd2sDG`QO{U5_NtE7o*vjXi;=p%Ea2sDe(P(aJA~ zvY=Cjsl72((TQDP_|a>E&z+q5Zu&t=J6g^04n1hk244HuvkzZkr(P?JTDjq8 z1<^YmapmSm-<`s+@W^o_@^P}k83FONIIOx&xptUGnzP~#u!=SETyB4t&M%ITuM> z1YsZId1m8tY(NOjMQ#Pn?71*gu~Oruysq$kJ!a~yXrz(4vl()l-Q~Zo^CQ_~cxdH^ zT{MH_vvHS{DS3*#3&;bL)_a>CxYK-c~?~-Z{vG$c;~dS@0?X#-^f)Bq|_xxpS^4T6$zN$*MRie@qmIYCfXm z5}q)K_aSe1^WJ5X1+>s~i+MX+ z6jQMnhMs?k*9y5zzO8}&F%Ge_-?6l?a&&>%iw!;n~>7krld+2 zt4i3@?zB*_ui%v@>DyiVws>s?O8Rc$m||55;r)v|Tsm{BlHQQkjp3vl4n=*~Qg}+hZZImJ4k|1EjQ$fQhM5*dW%r#&p z!01yNAVD`QQqZK7pd*jtK2HIcsUcEu+Vbj1D~&MNGtTBDJT!j>E6)T%0p)ed`+;hG zIg4-YE6jXkwTru#V%t?~&iuO=Ty^B|b)wa~_0Z!m-2w>Nnl|V~4Y#5A2iPIs zmGht085c|VxPsl5Jn-z-eXe7`64Pkzur-m?Lr(dukPN%D@r8_DA8Eo$godlQ91%?u zpErjuv06b@ru}6-yHpF5jF$!iVMcbmmC7^S$hpjz8bObvcy35^j51nT&c=Hj(mi_Ilcd|E<7ws$BkmhQqq(ttV_BIiRtC5 z^epH9P{6SV80oNIubxr&A|dYZs58y0l?XxT1up4ae#x%)zb!TOM+ zb`(2A^f9{?mUPiT(YmsWNYwUUQ&?o@L@9Iub&StQF2n#3**)!35HCSqh}vCz`XDS2 zEt|cntTnvfXd1!wVBYOvy@lpgyj67_Jx{ckO&smL!AA4Fy{UPdTyAH70p=>E2%eoy zzH10~?14@#5FngUnyk?;aTb~w;$hEMAm@eRGr?J2NBM8+Ck2j+&^WK*Jy3=A)xgw# z`$Y}bEF68_Fl}Mnx$qkd?^+AgJMHN)B@P4Ci}rd*4ImTvkd3=Oz<^z6U%saKuTzF% zOdrm%SwBBT`7M`qX8#&Ej0fp_UU}&B{80@VseN;pnLX z3s}7 zJ34p6(C7PjlP`{(k`RW=&zvjU=Ep@VtlCF5D;n-0jH8!G(9d&j?ELK2_K>_Z+ z?!I!YTc^uA1y*RC$i9`b;>P#2VJdNVmBRMLi0;iRB!5WE!yOxCN8R@{O8erdegUC@ z&D~jye#kFCJv388!Q+tZ6Qak#Iu{a~)5WQuclKXRwkXX^S|8wuXbVtIN1p@<1SE`F zuoCjnrD{heErqe7N8cdbQ2UtmWkJT_bq#m;2>~C}_)yRmea!&pD+WuPbuI+4pGcBN z6=dWo7cfkF*v1<{=4O}L7!;>f4w2oE=!Sd$;8HMD%mKCDecWYcizqW(+VFs*FwY_QfJ6$gu zK?H(y9N=z!Y#gla|55+$E1gA2zpxaIZ7HphvN=e&r_@Fo<|DStbe!{+Q^b zUBPGdeqUXnZ$(AOcEz%o~>c7S>BDq}VQ#)b|)S0aGa z<=sR;+An0gf?khkyd2l;i+L1|P|-sQBK;#}yY3D!h+eY+2%e$5h1p+~BS5xQ1S<5% zV8U5|`h?O&W+WIu`V@iCGL8RmG3;U0;D}^?`LufLi#yJ-;r%MOs<7lG8LFF6xeBUdXt4Dzb~YSLEci|oaJ#8 z9m_xRpr4Mj!d!&V*0zrmh+@2{V{j;9wnheMb{k%E7W?lHZV7cPHdI)!B5yCc{bVHx z%0IOQXCZzF?$#C^*05xe5zPb53rBy3}&Cn zziuqNyf|-e(-y=Cg?Zn8vJjieXHPxkJ{M7Q(wM+h%qg?Yvw;WaCAe zwKuks@1$rkP<%n}zaAP03Bp$s&yimH8KAYeLk{ZTZTg0v7EORnLEiX3EbkBpM!y}_HK%H5P;Z$VG`5iWqY z8%5_M#=VpRi@tUF&Uy+Z;|q$GEuic)?yhx@$y1}c!)}vV?|Unc$~zxazPmis!sh|7 z<3?V+)VU}0xKU%J_P7Xq_bzXr6{&M`fw~0T`X!j20y#rVH%xKVt#R}=wHIm2VpNG)#CnZwBx@_ozRuTp>7_r{k4-V{vNl!0X8&cCCY_pjb|mVAKtiX zVw`lq>ye>Xj8Rpn){BfI@1_abv?N%66)B~XJ+unUT{K-Fp|iKEG&!h$`k+2IxTkvK z<$;(%sOYZrok}j<(GA9tW@!YV1F}>L{YoE|$IiAjY{|=lCIS?ffv9+J z4I$olMHDjUJb&b2CJK)XsG!`J>j5Gh8Sh80A%p@;q}=&IRVm>s!CBxnY=rHoW$ihg zZ@Dv^z|@#e+3vKkSC4A>8xko{XmjTmfBxYG1n~!HMr4Ji5}+;~zOn_FP9HR-Gw31A zHiQHZ41#t`W?Kg<5h83gWPkMLa1%ezTu~uzl>)eSr{8@6mTOdJq>{$GE>Mfb!f4m z60x7x^OC=08@QV{)DKAj9E>deiBd;n^7R%S=EN0nx%=eNeqg?YhwyMU|3pLrQ-4N8 zxiR~Vm(N${d^Si)Oev-}M>Zvoyi+akb9`5>sRC~oC5X{|W%~K!8r5{Rpb(vS_JsD8 z-(IJ58pgQn@My6UE@^NLaFCd(?3eL8)951L zOvOmjFWOweN}OZj)+5T#4^Pxz>Dj8O0K-T2G&IcHpZ7Bw_ci*+tn)b^-SSuz^qlRV49U}Ztbs=J0kx<`mZO~7G$^&&cdEA;6&4wreT&(X!>e3M z$z*+X0KDr^ra^)tgYmLwhOyR$@in*cFF=3pc}+1BG>(o&$UMF3vmWyU$XayS0MZZ<7fyFH+BwH$KE^M) z)&{0wXHYF;CkAyU5q`h8aRuI9wwMWAbr#o7W(mspHD=-a+O|spObG-G4*j4q3wNDnMs zKrLKyTDK)1+x83H2Mte=yAQa9@&>>8X|+L)NDD}b{3pE!UHp086a;{qNB8M*yQ6|U zlLF^IZ67;=zmS2Nk(op8yOP$rXgrPfgzC`WNog*bL8@wJmj|}4l0oA@)t&#^>=Df(oC+P0bJkSk<)p^_Cmq)Ju+wWKVMkxQypuR zSX=ah;*r%LW^Q6LNB>|!Qcp(IO2sVl79ZX$jo5D>hI@*3ft#8J-0?B|^q!PR`7jSs zJ4k^c94&Fkr14|Yvbf2dp87p@K{S^ikGVa4LkqS}?8v7}J_NexzPt-^Fy=Et6mpWs z7B|u0nA>*qYL8bhV)c3z(jA0{Q!chBzhokF3U9vsjOa_{nIHJX(7e~VUF zTg{d+OWlrDC(aer>rY*l04%hE)4WV}NvAo?ZfNO(*J!sMuNAt@(UkGd*l3j@)sjm^ zu@7v(}S!*f-^;kg`n@ZDL7SNybuKmjTz| zB!BQH%olJ)zE+u%F2|V%oJZFn_S=XhYvCm>#3$cP2ItLdq{8^LbpcT3GVgCel&mo2kg&r@Y(ie$AN)wv$NTRmvu^ zK)@JJmrD;LonQtwMv>)OsVU4$j~b^G{v-YOoM3l%B0=Ww#(LDEMez}kt4o2@*{!Jk zlj>$Z*G^|L-ma}4sJ!RH+;sU}oQh&ACiyrnl*6HFxDC$?6o@bqJeR`>-}uZ9RN0e= z@{a87(goHmQ+1Cv(bm{B^P}C66pbf4;?h&r{FT-mPX~0Fu%r%t_aF}V)gmI$ad(|@ zV-voaVQ*spI$oRmk%Ogtnl5-KX9sYjBdJfob(?h{Q{?~FzBhpQ;;!( z4$s9S4~|;~pM$;}@=QJLD>?kxu*B|^Sz5(A3JkaB8S&>-Wh|1FhqGOl383C*tTUg2 z*!)>?+ct>4capkuxl{nzg+D%b*=Z@L!R^nCX>N~+foX?ge@-*`O5FCI^_Sr#IxTBg zi!J_cO!NBDC3o;$P69?N7>1f?IR;q2|7I5R-{ii2$JfP)hHB+9wm~otNx4O#S^;0q z=(wDg_%3+@Wxkb|2OA0pJgGySP7QkP=40`5z=>yD>HoiWEn+}`uN(89 z&vmXhhF$DKOlj{C-(%YQc@aD75ST4D0pjx#WNlst}eRVDDI$g$Aj=C z;s0apJ)@cozIRa-0g)0E=_MipiqfRlfC#97h)7YIfbBUq&{1hY zdXW&2-V#V4A?@UM?z&&j`k%J${rFBMZzi*6_UzgF+0Ry<>MBvpkQM=mZ)X@9E$QtF zQXviyDvtaABG=@*%@rF1D!5({Qb@UB;XHZ zRUxL6${DknDNRMO2e;l7a*O`|=eb@2Z+h3(jeCJ*OpEi^9fLxZ!T+#74+%`oGH~4y ztme$z)bpPa^-O*{lSySjIrswp-|;;EkNFe-1-R=Re}X6EG=+?(vUv*_A4QavSw@U| z+hU%EW%=A5M}A2$S4L3&&sm}WL!EM;jH*5A2i$`@Ncu7c2AWhnGroZRW<~qwS4Dl& z`x~|IEn1;>AWZKjEdM*T>lwXV#|LLeZB+H?G`q%c^vVSGt6Zh-6I(;`2XqY zjB{uL{8_AT8NSXPrVdE{pU|qjM|dn>rY1>*egqHxFX>eNOKR!*3m#pj!DoN*=vS7O zc8q~{sHC6ER8-a-x~a)3TTzpzLs7ufx{+M|Mb5DQfkFCzmtoOzu=!!|$ni`gu5Mv+ z=b|2&Vt+Ii)hYJF-^i2VEp!-qlp1Qi{N8t6dwFLtkxkNiIdCnYw`=j}okEIu_<(bL z(~@V0MF*{u2Ys%WGy8M8Ee;QdmqzYi-qLZuOn7ze%MIFuVy?FWZ)1yBGbLf4RbFZ>qS)KYVwV&U0xfQue457a*{1?X%}-qM6Z$UjD?{r)SpC{lINlN31AUe-qX=ZiKawYj){461Wk#- zXAX9vcWJVyamy2qp~Um_=edj!iIjtwf+zN+F(^jpiyDTh`}KJ!UvGCwqCU?(@n{=d znvX%2WBfsML85&q(&>-6iy*PDAlzkQ%6|8T=Hny{kC5`bt*s^q3Q2)lA|TA zU4fy7eNwM`H++N(U!wjo^FyOsp7Ph*AKj$R;)vSQfiazjnOC|I#9pUwZu*XTg6e}0kjB8ZUNGVxryt-B^GEj%ALL9Mc2gEKJyd!HV8R$modeK!Vnr8;Nh zCQ;o~4lGxS;j7vR!WvisJ zBSq0AdZo~)<_*IarL-1TUQ+jZD3~!3u$m3C;{$M;hAo0U3S^5+ONS)Nk|^3`B#jr)%Lz@^LTO^rAuW z;i>q%^*y*UWRKGq0-|5+t?6T?F?Ef-`R_N^TUJv=r;!n9?{gNvGMw+Ap>0_Za_cA8 z+nYqyPYvu4;8j?nQvxR>B}tR6Z$e1P0(n-1>InL;I)Npi0gwFe;qY^X-?Td{HFvVm z^L>$Nr6^!UiilUvd27%sNaFG_l5Q&&_|xJFlq;6HOC+gdze8Qj;hpzEx+@QH{Zi3X zX6in-Og_hAJ^Bh#Mr*PJwp+bUdbg)IU6I*FkCq_~@29TWkfX2%{sC_g)Hor13~cnjcx(YA-k6 zHN9O?_4Z9b5=bSMAMHCZAxOM0L9{mgTwL`@6E{_X^1T8|WQ1j!lv2B~l4Zq+e0>vZ zeMb%^cdNv>qe016LAq|Zbrz)0%Pn1i-)O;6L=9qfZ9{5tS6-mr|5ZuURSw(mvOQJt zdS$!44Aj=OOmqJFCKUY>dgR2g@qn+P6+tSW| zV73o7IQ0S z57T{D`wi{a114Agco#oj@(fH(2PLFS+zP0{joc*Kij^^4?*rRCsqZT=6p3Ys2I&u` zYd*vo+`nszJNY#r6@iMY%zE(n3M^iD@G4aO3zrCWZ0yE#3`m9guk%MBkSWrWksQSC zX+MC7eWdfKHH*OZvsq{WnVmM;MS5# z^LvbM+c2cl{fYsJhvmb)`iz=Rx{9al=Z zx7K_4+r#qx^6Py~c;@aQ=jL8H{*qgjR-DR&yKxEx>E1wKu5F24PIaDg|PZ(JS(@TKlp z$9kw%m$Ltlog{oJP_Zz@9l^1EzY1-Udlzb5J>Bl_ze}YJH~!o4_uKF9;{qTr^(DX+ zC{LmwF(B>nf8G{WfHRcMf3BOt7yng0dtxbrSb2^i8kavaJ6N)*aD{{k#(=x<0q#Dg z`1RA&pmp(??oHA2z@pv4{z~Jr0%I~C$MK`DTerDQPAY;C#DBPn{U?NMGSI_0}d9`IIfrT zKOC&#SDBf1IWktl<*E8VfUCU4(F{~69()jM{ny|`U(tK8Sa}A;Gm4mqZ-SSh8q6~r zOk^XKCbwVZ`s>X13=DRs(K`OS(|5}xH5u_~ei5`MoPV?&=);Y8r0s71daAD_n+84I z2TXr`l7^|z{VKBOHTavo$f_)fM9)$IP``6*kpJ~`e}OGWHU}n4{n-~!==z{5_|yW$ z8nN=H-|W3}10J(i-lmx)FEluH__8At*zZj}Tx-;-dMwQCTp~FaR!ODd_mK13e%|DT zd}s!&2C$a%Cl&8Rcc13U&MiKeDoZn{^4%Ig51F*~AceU7ACb@jT5Q-DjYoZ4~J3<9s{iV}sBWY}iN4 z2mh=BWgNfpU>2W~SVJSS6}^9$Rmr+>IQ0OFi>Z_mmDE@gn+XgOE@-q%4c!Yad@Lb4 zFlg}}4^s!-7ztgAW~d5}J9X8dTr9fvkSZc}V({05m!EoH{R6GcCpmq%4mn2*Q2sp% zRm*iJD;Q5*s=W32Eh{?8ei7s13NO@j{YC~NDhq^Y(mArlp6xa(?1n$T>;3r3YdJ_? z&`eP{z1*7%pn}eB*Z)WG<^+on$_~bmvwDvb6xB`FRj!jNQ2nevpk^ibao6dSE@iL# zJjq-_ixdVsliXRZHoFEM3_3*4`AHWK@fV#*hpoadnX;;YaZ4+N_wJ;wfaoyPzQ0Un zQ{g|dp$6ONuxL?WwQ#}xqP^Rsj4aglUlxm)HHS+xW+w19Y zee$zBi5KAn?8zm@A?WV(lNnO1=k6Z~tLd7&j!R8i_weD3xd?YL*9^!TcN_bfyUnDI z0CvDAHyOPyI;k~BWdvz0gAY&okY_qhtAW^pZ!4C~lfTkt9dILc9((fbAL`TUPlKy>*It}i0lp?LTmsDcr zzu38BD0arIs`Owu;LkujhFI@GIISWo7ARYPohTPX;%`VbM}joiA-s(k@>J#2V3iH5 zPh<`1feyizK#Zr)!7MT7V#JGLAMf{r(Kgn(m5bQCV)Exrx4FQocJDPOvAfc11@hs_ zcv`Q*w#6b^;^i{=$z3AOR>iyTcDp(Y&x5Ro#Mo`O?N!aF8LCfo!+@PkLpV$8`UQH# z{D-PKMzl(9b?m&u5>4~dtt(f^1Ay=I)Jx>oH{;R~rPpU=-ihBc7UBF}n`&m{CM26i zv23J#HnT3J|7^%e-!4pSy>jblLSm;_9Ul}=Wd!uawvqG1_H2JB(jV03RvgRM2oulW z4n0TZilgEK3X$LFSui{B>*PDGshp?&)!sai&R;{UMQP>P+hy{rU&482A<`sY7@TSC`V3|J!t+Oi;5HMU-*ZpvyBRd=Uh|Umd-VR#69&+QOGNve1Q2> z5%f;Uf;gNC6wL=&2J&MY-#qq*b(40Az%x}QC$pA51G~KR;?NwnbG8(aTTq8ec3ql`miy1pRt9@qmyEh^mOD1v>g$^ z;uoz6oJ-T{fY=~43Rs-rkfeVu$_|j#&Un7<-7I;J*qw+KXTEJ2B#2EvSJ8-C+2|!A z>e(b2`FT@OzsB>>JA@HUIp;`Z(XM zFmq$~m1(YK#hAfLfFeE7;nu@@crz%Low>5LWjM-}dSK0r&`_R=p1trXOcs`KKI&44 z*gtGLv6c(NUEvYnD2!}DTigXt&;woMp|5ROjS|1Kau zox@>%+Sl-PiGbg7ofJ}=!PpQj#i7Vx|0;BA15xKl$U^7f;0o9*uEoQl^o|^CSZ#nB z&Y8Q_oO$)0W$A?mYf|Z&&_rGnquFP6goy#D48llVGX> zk5;Mz4lTp;VdaP21W)YHUTt-rN`H=IZZ52wn9z=$U8?AuXeycN2$XEP#Hl|ES4Jwg+YaLbt^N4+e!c9p1}+N&^@{l*MX;X1}{3qeiKmcuhc){_;swK>2biNg}z z)Ux%|kZ|%K=k6e<&DS_4H#(Naczdd;aj4_z{SR(Ss*{P_J=xL)3VZU13@^f<6bMfS zp-`P8@Go8z+pNCT>^bOV8+GP1T1fg^q6^p!AHYZYNs@Rmi*6ZD9nPNJe%+2S{vC?C zAi$AyeHdm|YdvW3R;a(O$LQRamC&%I1*mk&4~`Z1^ML8!dv&dYac4#2u}TIvZp-TK(SDR`9te9%#FOu@F;q{K@TR?k<9)526Dg^AkvPZpXc{!ilic^lIWWKP*PFA z(bqUX7Vs0T)=8Q!HHt5 zgqZ$3IC~v9a{SX-=GKL&pjak>uSaA3J0XCMnQGYWh1tG{=2sxA_H^=@w?Rdof&#ZP z$l>>mrbjkHXjly83-uq_c<34m^xy(_D7D<@Q0}wzCv2kC{%&(Y4!kYEt@lb3-iN0~ zz;Mj92IIHNu49_m=i0d!i}GZgQrh)w zRO%5|W%`i)aWlM&@twMR0yA?a`k#LYF}(ZR5onyVIgwL)cBZoXEL@zDLq;rjv}Ey= zGG;5SheNHtyVQEZ=S)!R6p~!H)dm4L2UPqXxa>k!K>v~8KeqCw9+?p$Mwe89r+b8? zknP?$Z18p1s_P2+Kj?T9-SEFn#?Rl;3$)r;eRbey-CD=3cMf5R&%&)VC(u;PW@4n+ z?O}Bs=?G%jH4oTv%j#Mw+L|)QpH!LwOZ3J?9}X&M&zHAyK$~U#SV08$yBju5$G*zs zy8gsOd#+2C=@(a_`&78v%kXoI(b>+4=k9bRhAD3$Z>*i-w;NOsAtSq{t?}6bg_HM) zz2|wm$XC_dAwg%2?7KN@JVUAdbrU?>A!jEooRtvYxr(UXIUMBcvTaDYf1!-{+y5+#OKvd3xCbkq7tR(02OEL~hOSS=FDPaa%2~dIiH)waS(q}6aeN&?2_MnA0Yu%5bv0_lJWKC8(4Wdu~b^LQ< z?J?ednw@>(b9w{dOh2HU(uXke&Nl_%I{$m6Es;r$kTnm7G8BRDYP4u0+ zCjpSS&>H*(2j9rtivyEBFz2LjT7Bi=;R)0HjS6V5FqZ24dAx=U9C+V?IWow$Unte% z40#-ET#op24Cfx3X?8dmrcw3WZ&?nhJ|`WGjUCS}c^c1I`Z6nB3Hnux35pR)?I zLOmyvF=tOwl>buko>eCk5=HGG^Z?s99pIibjJE2M6K?>AZYsaoU-0%bk64+xu8#Qr zUz_56i8Rv;fP6!2c)}v0sT#DkB7o=E7_9$+-CgO**`58~(LJlGBac_R5!-X;;4++M z#S;;#m7MnW_P)L&=r)~dTKDZWsx{Q##6p2unz48q z6|HEZCZ<@DJ|8TdF=K!ByEM&Kj7(rCY^O*P*Mj#)rL7OZo{^jTBcA7RE*y2bi)618 zdN1-T?i5g~p{zW|{dX>uM9EH#c0I|Cq;VnT7Qg(V_2imoisfif3PS6=ms7rCYTWLz z;yX9`&n2}qTp6CRce0xYLq}A<&Rxc@lay?Ux5E+m_{E}HA!NR6&{|1tg;U#lUEA*L zlaU!H#9IXWKCEe}5oU9cSw(UKRzkTHb7H+Hz=?@MS%_KcdDhd11WL1=%m(31a?~$` zDXx=vFxZQ3!L@HkPC1ql6|D4G#Imc2qA|$7jAmJ^0JC<5qZTx-1 z0?^!XAtGRPF)EbRUHbOIfp7RYB4~=)Phzdxn}mgaRqSIE?X*WFR@eB(-ksjl#4`s{>{>0}tLmnp zGBb1Ji@&j)Lt7foXJ*W%)UG;MS}*TCFK=%gDR6%u4O9(! z?n6f6kUVjxh=4th^Y*}N=ymOm!OKkSVDN4<=k#fIe5j~yt+n9?K1ub%t_ePsbOXr_ z2JsF`PlOJ@?=Y(;Vn}Wup)O>end%qVeh56G zaD5QB=(a={kIG#K@xmHM*j@iE9SyzW3W^s=u_d<-y?T`boVZ^L0M^8^a98QEe&U04QWpW;z<-sK|K$Dg|E6#*FRc$k}kyx99j5h95r3B&PGN zwY4A;>bYE7AQ#>p;GpLW4OJCo>$=#Ztg0@&j!*j8cXBbD``unT~2+cSj;-NU;)Wk^~YaKgXi_%05DN%zimA&44eKUQd_ zs{I#|7Zm~gsufi5gI2=Poe)>_CclCjfsWr`fTq7`j(zLlpdy98k@d* zOByf~^U$U+ZV5QMKj!DPwJpHw22B60R5}f_@9U9{N@T_OgJF+8!6L85qD`C8?s6Qd>eA&DscDxOXT`AH& zjAiECR@ItFirWI5F=Y~dW=Ri44AJDrco(WXV!?d&<744deC&dGCWP=JtpbmrjSHhE zl3Ti9G*yv4(sHt(xj%b_9PGQLltEh5?3FI3?;r%?OI~D`MUp*D+H2`N9bA*X{ugO z9jQh6jnr8;;_0#o!cj;^wM~Ou+gAkiy#$Un`yVBqS|kmx865-z{DP**>sm!uXOeyTgIoUa4r^(+E%() z-5i1K3}&Q`XJ=108K6)FBBOO?4njy%f*f@1)^Xtl1I0R>j$yFN*ZLyyj6WwyA&EP* z__f5D@rV`EFuAp$b?@x*IBF18(z5P@z!iMrZJ#81=GpPGozH)du^b0{fEOp56TXeq zT(jHVH168&s?Oc`p&SV-=1y)~y&#pTQw6#F!V@5iAya2qKlbvR!UX^fN7?ZP1DqOs zHpG<8Y@qARLh!*p^f2Bj)|w~(9@IAXDdCdqRt-M}ifZq+o=^IlKq#}S_>E8)Yl2LP zGz|6Y`l=WEe1I-C?o8(-QDCoH4^2k(q)<>?Fa1jiI1E@*EqB=7?rlu7aTNB%>1n?w zrot%wXhaep8S>O){sMiQ)()#@((|AJGT3x9(gHL^$(eI?l3AggQlN8(cK_HwUh-v2 zl#~GLSSFq-mVJe}xv2=wD4g2aatS1qna_EGT55M5r`#d={G-O&OUoHZhj| zxw?uL@k#3F?s~l7O%Hw5n!g>YmP5DPk>6 zSyhgRtkab%TD7xgKRPFSxvwh`73#0MtUSVk8{8#=@Iq3|Rc6^}S~I z0e4Be)loBLV;0k!$vIdWNr69-(<}oG1F*me>yU-|H%PmKXv;!R*nz~;+S=;!G&)~K zAL5r;;m7x1Pm*bvng30X2dKe0*yY+z44({x3}S5Ox8psP!)_xBLJ1zO@YF^clEWko z|D^a1$w@4AQ^SHk#;Ken2O?9QV-!~tPsYM6*pxPB1(XK^`a|9B(T3cOP z9#E8QZo(F}9sCeqjw;sN>dnC^0mq6sY3TVL*sRF4ba6G%6Wo?Wf*2 z*^d*b!Q&GJHOxCZS-RmF82NMiy)1ht4S>{wlCw^aL)!`H`VHH8$Zo{!)^B3)NiNeC z-|iT{(LR)qm)`2PGkFLZa!?6+TE-bYyC7* z;&O?xKoESIfru+oD5VNJRciT0Z)uAb8ew{+E7au< zdft1zB5;YBR-N%6jwX3!p;s$Gz}XSybYO1fXEgi{*!3r<(hWZ;kvkDI-&6{mCcLSK z1nH>U_Y&`1KUKK|!4OxlX%tU#%G*?Mynhmlc6OVyu36In(jR(Uu3vA`+t1)u(@JOKpoUNPSSfq346e zGIX{*Q|&22Wt7q0(ohLB7BSn*RsSLxwll!+8!#+NmjX&r8fKhOGu$d5{TPjA*i^bK z`BEIl&u<1+xxfhNY#hW$?1MW8da%%|WfqT|$4SEyw=$L}&GaD)vv%2~rk!13LIzg& zw~4_;N@g|))C;fN?&eqfia|-oYD&YMAHFQr#f6l5lN#oOSF>E_pj9D1X6L;imQZm1 z04H#>2tn~GtfUWNvxqCc>~IkHOP?U5*$0;P{&P8m!I|?ygWKayD^;6|KchGwaf$y3 zIC$OUIrdu4|J<*gyb6sxv3I>)109b@!39r98^6@HE28zsGONGhQlz>ArZ6}W?aPk? z8Fk^8QXlPOsl_lr0xwu@pI*FPEVb~E%y*q|fx+m*KH`j9`J;=cVML~lyl>%m8nxg* zH(H9DcV3;s)Wgr|hyj}H*)#?fAEDchTy9%i9Pm+q{I$TidAYd)Bb zPkuQXZQ6xy<>r1j11;i};Zc*x2k$l4x_s8YkaEF&Q#y{mM5Yc_W~iVB4^pxX9tCuo zyR??g18K7-AwIkQ{0C9rXa$JwwO2d`R&^yG{d9{{%>L1n8hpU=I%%axQ~=t?@Qr3{ z2?5mrkx&bhrP8qboAtyXsk$Db`mU1rV(JM1u!@et#)im@25#!h0O1wcfkbhgWce`I&tk0YmiDK2CVK|m)Uv_!SyO0HEb|9G=ghAsl|%W4I+U?)uroB}EsN|a zB`y5CRrXy`IoH)IUXW=O%SZPoKrca5YF)%GayydJ-~i#02&qJaXmm#}sZu>rWvv^- zAD&<=Emj5lECWaJ;0aD9-PCFa-D_{AwSRyTNgx40mE4Zl@~i+LmMcG*UV}g&%^ObF zXl>ITJJ?;T2kyl6T|1BXlh_4$OZ9iU=Y-?FRScCGyZ-I&$Kb2Ef}H#A6h2wd9ylfx zBuYEopiH#}dXhqTKgZc3J!jS(^PvIPq%EUXnQo=vzi@>xZ?W{y+!Wy2TSye{)X)Ye zB^xnexj%GO+dc*qw9VvCdFQ5{= zw1>94A>^SdhPlqVRWzs~r27X;>Cs$X>dH&~qG%;4u*;1)TCuO?B)=}`ATPRg?L-`E zbiEFk?3rk!3CFDpo>Ov^2bUG-m_x=kHqLD3S9t(E3-6frSj-EDc~6hJ%)a$Mf74Ib z@jk1oCYIo}L9O$WeRU4l@1Tg(7$yMEfJDmCVqW+1B|8G^uLzbjcZ$6Mvm(5+bIT^^ z*^(pX-%VgweHmicM?gLpsN6(in}Bt2pQeVZ?*YxtL4eJzU1|Iqd2cm=>A)F#3?5( z_E@Z!7o}gRuh#dUM#B#SfGn_&|Cmtwl-5o_$%An5Fzz)Wz+3$$*WTFG-&xAH+o|{U zPZ~dxA`^SS98Z5`Q(NT!P5iRI-7ZEX5xD8k6K8Cc2YWKV(U9)Oml@YI0e zcM1^vwWYJRlX%sNRVwMaVD3|ut>lEeI2RUKX5=`H=}LseWu_;jmwSrewIo(J$`J`)|(7>B}@6=<*w7d^cW(Twnpw`|9+kZXrerZ)YIbCOkpiy4fA=j^dgG>UKllL| zs0JrynT)Olt`0XLe*ZGsUghVwp!V0CDXw1`o^iNaU0aqZi+lM+yVknPrREKjq9cxy z7+M%SBdrRM^g(Kf5?U`t4 zc5zuXd0O!^&*^}_(01EjU7&A}4x8_x-m@b#FG%(brAX9hUuD5udA)RLuka0*!b4*B zU28?V{uwGmgPB_9~;L*-%caGx*1Yf{!Cb9A3EPFxOrxi?m*GyF82 zeRI#-5YX=ErFyd8FwOF#5@%@au`@4Ot7mMJvQbD-|9a`)qcqs@4u z{9d3kMBhGQ-NQq1RU>D@T>6m;-;+5StI>#*CGbZ#%Gw}s>NS_&_r|%=VqbvqlQg>r zM2^PyS?VG)I5a3>#qqW8*NXm6!g|RxW3&4gRyEe4O6D;+pA(DbxU;K>65}Z_tHeYh zo<5Hx>FAvDsi3x>SO3a8^^39J%E)Qt?ibiQE^g>87#h(YLjq-Z`Xwb_maJe?XkugE z9R4_nuqM%lJe7beh)%7)i<279JBb&$9u z5cqPdNT^iQ)h_X2%UXYbH!Jzn zyu9>iTH&u3o4ECw3I22fUy%{3ejL-zWVhZ(GT-0^-0&*=F7!kV&bX=(_?$}1C8F{g zrw5X11An~t?GG^qvO2&TYRrK>-6eL%2~R-Bz_mtmmM6R+sGdQ#E|;GQ9#u!|QiNmq zOnLy8kyD~@qD}a5$`|dJ-RJ-=dSwrghVS8GPH-m&SBhe7fPh-(#X6llaQBX*Q-j0E zT;oxG5VbUXKc9o@`i@S-Tc zQG)tsmYFhJyr+b<5=el@i&+1joqmjQj<|iTK?5w3(uRPQ#r^xGZm7(gJ{DSte#N>E zJ$k-A1udUuH}hi#{z;TyFdUzs*-gtUMe#dh)O#bIZLRcn+8mfokMza-cQ@`tfP}Bn zzg;W(9ZjE~pO{k$*7H7l6^arBoG-O7p1{SHaV&lh=-b067KMROc%dL>Rl%G>$ISEk zE4^{3+Hd^#pUUungmJ_QDdz`5xKv>Ks_8H#R)DVlS>!J>BOBZB58Fimwcj=Li(FN< z{jndlJn^CixsN2LfA-$1iry=>T9)vH9_aeIlzOUQX5Pzq2oCsA*Z3PB9o&bdhy14+ zytbg%SL#a|dKvF6Q=GfKdsBURg&K%++@tS5$Av6jW5<(H2l-uE0|fghcMd_D-LJe8 z-x~oi_3QtfzX&eJ?NGqGH)NuDjm_aA_dmQ$eQ*?8jR7xOJ!+Jk)Dlbi|7{Fq1))?*J5 zUJ%*bkCEVtP~ft2{|D?9iYQ$hIUP&rG9%()jO|Km zhD1@wSK_uG6FgxLxc2Mu_EV%r+_MWD2gjnhcl*u68Zj0UPc*po{KPf@zbktpJeke>`BRlqu4c9M-D+oKZ40>{`W#3^zW(H4;~cy8Y}Y+^ zqs(5HpBi+i|79Ddg2O9Rk2n`bz^yl9x z7~o@y?HQ=5Jup%5i&GKlC^@H4a+dSY@wtFbXkF0!(Av!gC#Z%(;J0Ij1*-WQ$5KG< z8N*XaH>MO0+GOK66{;B6NX48P1*R3A;8?$uQ1E^1&+Lf_T>FZjkZIRjtqk$vQ=4hD z-3SEhA4W#HBg@K;^pUQY|ZL8RV^SeQo^e$=f=qp!16{j3a94fEYo7_iT(h<&>^!al+6YDfW^ zbpiiL&r+RH2H4rvPNh$%fK;f2c;Fy>6an&?M4^CigOe&NW!TJdie~v<;@%AXUZQ|A zscx?ZKzM{Phet ze}qFv(yGC89dJ|&YxDfdUG!k7+Y=KNwo6mqJYo#x!PT~Tb&uUhip`Z)8yUXzzG;^dK?&LC*#H}|crKnBRmIx`V ze+|=eq`+iR!eWdz4>bs5;SF67DTOlwMfhWT?^{WjK0NFt$jk^Jn~N-_57}aA&{(L2 zVDFuWvCmF#|JitP{yNs`9lMZ{ms;%j@zS33X8wu1Sz}s~oIVPcNI{=93Y1Lf522vG zH35G-&Ofa}r|Q0uuM0USS1ft9nVcjQt-s?8CqA~#@{6wc|8Y^BTEJ6Dt$wg6_T9JQyN(z}n1L?&b_KqWqV6Al8mDM#^DU|9KkN@)ZQKQEv2 zG8Dxil(>K?UXV~Po8~yc*aBC==l(Ws(vI~Xy@~Z*7mm}`I|Sj*wP0jNvAj$krt_e# zoT1~Yly&7ZaKV=v@>X42FPVx#hHBh%0)4IhY&c<2OQn!r|XG=%e`XD-6ZWQ zT>Wh~7xyn|x9{M@rHU`kDVL9YR38n$_C+0n|dKBLwZk$`+Xr9z&XG?3s62i zpTr^l`jKQII+x~K?Gh_$_$QkF*RAA_3-zTt5so_ZJP+MwRWCOh@!Q?reGigft*-ct zbU#+07vBKN260*8Rv#lmC!%CkId_B$Ae+bQf<>V%IXhp6S!D*C#xPyCIhL9|MTgHd zRiZn%iB8p|;nPFGa_$rR;{yMmkW`f`{SJ~h9O6;#4&1Q8V z7>OlAD?vUyfMV7Mvs<;9uArQzra;Lw5ccOOUxU9pL+$O;`pO5rh@0bIbk*`D^aeYb zyT0PwnI#szTK8`;GzW!+)&osRU)z-AFjCT7S{9fnz0p)grEb{!XnbQ3aX}oj1x%9;D6Un%bI8phAo^?Kqa4-;Z!_d6@3V;bTlu(TvoL5C&(1!jMPay z?e8r-q64aKC&aPE5;qMX{^VF@=IPLgBWKUW_e!1oKR-71h?eQsDr_qH-`rvaEA=Oq zXujwa8Vu{`@>5+~iQx(jI5KHj3Ai^yqc+PGAU|@-!Ew3cbpJuY+?~Z#WLA)Kn57Cl zmy-AK2#!{eWKf1Dj1Q-N5sc=jHmxZ>=@)=@W|>=Hb9R!elIhI9uS$S7+52 z^syc9XlapjFxImC&u@q2H%)cadN23Ea6RlvX52>(RS@=$+Wyw|r6*|GyCDIGxT(BN z%0<{I#K9(!3cQ{g8Oi~-3w@w>5Voel98?zXYqxJ%N<}qcnkM1&|~;g7-aG; z4WC8W^;8t z5H4=&4k{!cMF8Osm2gNl2?Yc5G8TStg27B<)6z^#)Rv;f00Xu9w231N#>Z-9Ck0r? zp7`GON+6oM`sRqsv8d})uJ}aLUla9jE_TzXMaRCs#TXJx4|q`R0$xIfZh8IHs=b

$87?W0Dx!`gxu$p_FR*1e#()Mk#8U?Ku+WBUU2!n6Q zU^VF3nKaMFx=D$YYL;EGJbK9tm+)&b+5_@ac-Ui#;d)RH3)MlplX$)^oFy($9X0hE zF^Go(YO1-AW?Ua+RwBfi%A^+Q)!_WoRQjGp?gl#C z0;rlsB+9Mi<}<^Q@y48%>+wx>bi10lC=IyNjt0;+TOtKB4Lhr%QXa;pE=;7naCpjVDh% z=H!FE;P+)F=nz%04XGqM7&JMomC~DE7RK?pmtr}0Z?wG03os=5uLo2b6uN_q#|+txHow<*r;C1 zIiOFerc`=-(@JsM@2lWT97FJx9(x(Yh{uK)lEwJAFHl32%;>;E@w=&Xbmh7qHe~T= zh6mlvx+%cD=+#$KVL!l9$*29>7cD_&Z)a)EJ3RT5&!bnYp{e`|TVDGhk(m+H)-JgG zx^JW2!P=1{JBRIRkF#;9HZ9cBW&PK*$EO%{vAXb$tw?G{HbDjno~Fn3XsTE$P2+=N zV&nM5_U#g6kXwJa=ZM*x!iMJygChG$aAJlULDm7kze9E{4!Bx>A*&u=nQcBlPCNjQ zzefl)GcIu~<@m+_=qWoZ-wUzX-%FM!@0TlwOV3bH&EI!XryivTx*;b?XO;J#MFdB{ z&V{=X;Spb;`N&}dmc$z-ZlIMyeDFm5-!CmdpOMtNmnx37rOSqIjr}<#dMz57;=H`w z=9S3|gK%R-E@{xg$QqkE3p-QVUu5@iBG}lj=o2rB`QO9Xqc&yxeChs)h_+PEidWz6 z*MX1JXXfAX*=5rlm?BRPhWmlBA~E-5%ZUVRlp-a?YZ>xxTuFY8_1JX_NZ-wSc>0mx zU#@g;WlOst^&uqePtqo2IObL3JJ9{h=sJ%pbv?QMZ}IZRS(*$K+wkSn!{qVL595$w zj=eQkv6i+DZnaoNHnREET=*8l<~EN8ZwCKTCVJf%sGBg!AdUoZOGSrXQuF&8a>Bp6 zLiOXn0)`D>@_{Ef)XmI{@^LDA6mRz~r^d@B8?G ztgJfcTw{(g<{1Adu%H3Ff{rN#WN4d!6d@fG5wH{$7J?Z@!BbgEMT@3_^}>TB{HJE4 z26{*1V5N^z>C=*a?7vp(>DtXYST%9SLd4Y*qF^lk{PdFI$UK`?PjEhPngQ5P`}4Z5KHY}w8qbDYLB0K+$-MdTer6Qkh1mE22&_n z?=p2a@@Y!x%?X~tD-bqR`PTUAW$)cRtm+J&yx{c_>KSnX*+zGA&|1q$pYH9|gOU=O z4zH@&c4^G9H;c*0=uiX)^Fk9z`D4e`+GUTDbgurgIRYv#WbU8e?g~$m0+0aDeHLIMt}zvR z%_n!9y&?-;e@P;sxJ=efyd24lMo1jFWZPbVthC6K%i-Glt?&)Zn?Xjk7c?DnuAos6 zVyU+LJQ1Qu^2lSiWyM|djDka29md?##5dkWzQNS>Hiv{ZHr!|5$Fsj+g^XwU$;9KK z`?QvI-%e$^Z&FFJ$l*qX0IjDjbM0tX82CK!Q|oFT$5;N{oDQYo!3-sl{K;-nKBC*i zO|(SjT&R;AS)E0F{mr#Q0&v=%}Gw6l}9$*$wcO-zn#JfIP_(G5A$~FM)M^ksot1l z0Vlr0m;B*(27y$f>C!$0OQ-{Neii=DL0=af$_l%EG>omt$ynBEfHFB63^r2Qw!$#6tE0uV&ixBp%a_-TM@5$$_$>f9A*?|9}@H@ zj>fjxMMColu$TToETA}%t0o}lDMph6RNy||M%{VvZv=yWDhY!?!I`jfvcBk0q2O

QNMZN6^CAqP2Di%PwPrayFn+i!8?ODE9~8S$*nNaN;Tzcc=MT{NY8lc3p7Ug zTsRDWomZcvtnhyaH1J@0LlBN^5EPpuo@7|gqZbkP2Z@K~=I+|i6Y7G=qdKMMIEUmw*+Su0q}thF9!X zb}VaUlnxZ0wGy7sZIcwTk5v6?fC{>a5z6DYKuL??GZBIk*PeyLB0Kk1{?$(HEtol~ z>8kG=mZ2Z%cRjDYv+1=VA<;_jgoul0e{tPfU9m$8dJaXhykP-fcL%c285L3C&?q8E z0f1#VJ@|-W^&^2(bWsBQjE5R1Jb*$1P0U!|=r;|NL~YN^G!a2$#9FQW3syTv2#T~V z%felhsXWd`xU^KF&^As#@xHM-` z{|3GQJb_m7#jvtnc26sxs}&SNY#43x65Ta7+=+Vd)W5W!mL_ZjD#uO)eoxzQMXc z^nJMVp$&1YnDkTcx0-$l>QZ3~Q7fupV$x%tSmY8IF3CyL^P14kQvpD4WUK&P|DSG< zdVzhj%CeA}){S0Lb?k)+4Vctc#HTShQ5kZo_C<5Kwl3Y%#opBY6gAtjA{_efSPMq* zQ9hcks{k~?dhj|YhBuw|HU@2LoeA9A6Ah*tVX*FGYbXw56y7R`TGem1>WFxLMv96{ ztI>KQngH+w_iyTk~(pQ83mSL-n)hX-_V2Ei9s2Dgpf>XtW^461T-`! z2y^-1V`}lp!qIX1R#uwZ@DCpksaJw4I!U4~nF~CkLNX8$$cLQ;?u*;Q6TL1-Gr|~) z0Zz<&fp7p~qdr*Jx!2e^3Q%(X*o+zq0>>1!VBCc6O!CA=UEU1&Y7o)0`by5|&V(w} zh&^eC#sug3MmmU&5aK7=nLj}cRr2eljE>$%zWhs{u^-T(`prY)5vm%fnF2Y8SQv|` z?1ofz6amc#Vk?&HU#amt52aCJibV2ZfCTVxLr-dSawvzx+`{vfeq$B@(2iingHEIC z7$HGS?fd<{+Txo4rN>k#I;>U!Wp0A9(F5=m0Mo%Ck%PN@;T7!EHsH2+*g{F=TT|Cz zmfpKW0Dpn)4mYWoU)-f*{)XD9^*OI?6#ri$D>%U&qNV!RsK5-GTvWh$1Tg|s1X*&O zdxdH@6a_|0!t;4nuBWJ=%q5~90OviTNXf^{-Ti*L{t^WQTn+O*Qb{!qlkmHGO!4la zgbsDt$_|+#xkFBVr1U=_6@YwF#C435K*aunCYNAgbTYsQ$qd~ut!3dkO?jA4h;y`B(2X zB|bK(5!dpUoA;+okbv{=@=rMcVPMXECv3b^&|JByu3eeM_8{4JO?whf)v#KnZ67y^ zwGZ4a*xkk2$+T6evd_6d|Nb#x|M54>4Lo^y!5=rtwGqWaAajd9^M%IK_hHARPlpCm z2Oe&3Z%;?l@J&VYp1a7wR|)58_@gDIvos0(O$}`HbS=1J^BtW96w_5ucmbmwtH7D9 zWX4FKY5>40Z@;d7pMi6T8xzvD@!bPx0TH&%a9D9Th=1>_J721ue&h(`8slHUy?~)~ zYu{;l7!js$_$GAMuEjr{&Vkao7BAbeFAMLBFRc%FGTNFzZ~mv0a2-J?M{4ipr7(g| zqHDossP|@WE-0Yo!(pZI7kHG_7{wS8h!L2Q7`m_G4=?p>se;o03JB0-K4u0C5dB** zrTvb#_mxQId)&jD!^#m>3%>>OpJRZrFH5{qRb?IzD9@Tv7-k=i;Ye*W^ zZ?Lu5p~^4yMyeXDz4bK0`ZYWRn<@*=aa(@5{XZ^_V_S^`H3Xu?8eVK@d73z(>d9?z z6+|+K&G}_34lZGec-92rIZ65h-XnS?OR4#8z3zpmd|~V~Gj0;Ugg|CEjjhwXhD=F3 zjk3fdfa`gh+Tft7^>Y&0u$*PB&D>Yf@P;0u5IlFSu$AIkzLa}Eh}$N|iR`pG73eXD zABRENgMCDj?s>BO0Bb88mhro395rQxR8^vO{SXQ{QRQWf4H_x`A zuS5~9a8kgcTAe-QoVVH&Wwn{yW<^NT09g8GV`8{T;;k)~z>gx&$t8SWjM)Atj=Ch> zG|LTm@u_QP_|`?io&|GX%^II&$@3qnJ$|F{gMyDnO9Y||59?6d)E01Yn7BEb>-g(x zMU|k|M?b{XlM?{z0zh>7J}+urV8Oy+{l5oKDj#O?YjHSkp$}?yX6*CQOKOK%%f$x1 z6XA&r4SnVxn~N8h|KeGZ#YUlAj9yJ0_71(44-249s2js3{L@E}AVJiWy$ej}E5TKp zHskwDdXWzpX81IyRnv8zQ=zuKgN7Mj)`{lxZN%>l(f+#5u&RNGsQOEnf-k8(xc`K+-hM<$fn}OgxiA4`gJ%++)8;qZV$)iv zzaEo9>aMXk5YFKx1&^T_$(KMlJlh@U)zVE~pb@G+bqB}L=>PXS495j@@6l6nt4yC+ zex37f8ys%wp&$u-y=q$QYJ{nD{r;38Hh5gb)wB6L>8JSmM#XbH!DEo1NSc&#>r{fT zeqD0smyq!i^;lwT^F(jT`-K}Mt0nS{t?ajJtq82MyaRikFONhDY2o`!%+d4=o)d*y z3g$kMqFQqHHG+TLGINBqKdTJefPEVlJOtj302a8gSLfc^MNhkX|E<4quB&|?Tv33< z+UXaeXL_`+jAihRuwmI)o6q~Myk>LTeL-6<_vvk~1$SxWbp1jUw4MB3U#+E6Cjym! zml!0`=+4mmCHyY?Hk*Sp|0_(TmIdWupW|$Ev=3pv1pD5Nc0C&w-=rjjyX4K9Amn9f z;Zmu`nh2%ki|gm71FAtD`hwgCdh{EDwcq*~_`)HB16!nY8>4+&3!!_vJ&JLNRd&n` z^YUG45$&@4#;*7iouA7M3p+{5V3C;6FOxn5b!@IXRtu^&h*h>{zG8z2v|_Gw|KA>z zV;-0_7(C#Ul_ z@zb>E2=w*0;EYg0WnlykO1C2$hH>?T{~AjO9~>i_ZwP3bulEpd zBT`^9XFT89-sbNvcY4VbJhsUk6DU(Dyb|teVu9y9clH@IJ;~P|26EVgTs-XGe=gqQ zHDH1SwPJvBuUrtSgy$;;jh(owUpNSF1KfKeooHu~5~jv0f7rr+efL)(g#W@OPC)hm zw#wJN4F%aJ#7c}Gbj7c78unff{m?0GYLW0Kl)=A%A~Yl>kXdohxJ|gUA?o?0w4xrT z;5`-Z_S@nGaDts25u8Bl#%Asl5ChW@hw#wo>n4EsMheW~mH<2PF@R4y16YL#pThw) zFsc!utzvJeLE&X4)mtT5`k2IUgllEXm8z7x8^h$JPY9tRhEU3M{~+wlfAofzCUl?S z?LNUBo8 zvJyflfnM=VrtREoGS1o;*L-mub6*3Puheue;F5NoqY?mylt2{jeh1_&pn~~VjKNM0 zmE_cY@&Cw}1=#}2(tQ}9Uhgk5Aq(=NDz{ZC(~LVZW!Ga%qaIZz%$flB)X@EnRsI#~ z3hqXF?DZelG3b{u%@_7(BAURpA>%Rx*(^YM z3cb&jyZ;0dR01A0OoLX1D|O&9;Fd6p`G453y3hrPRU6E1awT2sypi8)dJno+UTmdU$I5QLHQb_G=NbV!yg*9pJSw3xxbMTZT0HK2uDpP8OhzS1&1#V zm4V)cF&?Qmt!st(mp#L%0nPU>TcH1i2)wnP$mV!+*rAe`#Kk1BcKN?!0l8v`p$o*I z&45h7FHRsP7zHfdsp|b-1mL6Fk4-}V zjsX0BMEd=2h9`6Zvj(8<+X=FnkOLD`cJ!Q@?Dx-=oTxNYuL6US6##MeP=Z_4iZ9I0 zFc9el_>W!*wafdOe*A&j1?duic^Z+zn{pnQJfPvZ5BORLE=YV~FgNOplZ3g`TzEG_ zF|3=P`b8`o2l)Y$kq)C@8>jE_2UZObSpWal8?SHW(wFDFiA+&UW8+cUl4|QEw zTOH8ZDJG&H62cP;J2@0k#y2rAZ|uaVQ4ddt2rbVYSC*?}fbisbALm*D_!0ZB|L6Z6 zu&tJ|Z}#5>g#`o!38;(7B+1Pv2oFuyRZ4}%-R0&2?C=j>H-YsZU5hvOm2;@5fR;0o zNhN{^@C$#vUNjO#2$=2yY=dE-^i&3iq;dNPSK&=8>Ew0*<#{kx{DKVfYJY+3QKT3= zk!QV!$+n(}>ON{W;+@jmX?VW;9_w2+iO;3X!!o#(UcT_$%xlF~r>7V|PtWVP0Ks54s{66yf*J(hGClUhw z#xn&J^6>h^tv~(v!gCUj4KYX#ubzoeyTjc%<)VGHT1?HDNiD7$@Zje2(fsBzYv&YK z#@$f11}3%96kxFfxb0HSi&RbS+KVR`_yg-a$;*G6JNmT|A+)^0eSe_yi}cu=UX66E z7{a8A^uH%SQQ=DSh4cZi;fo*L@(PNyyrvx-+_e-*l;Hyg`y6u5ACJ6*q|dk5MC$bY zktIcpjc1Xh!U3*=IGM)3?boNegLmVBl`d*k)g*5}@&{pbP;l5y4d9Je8=?W60i3^2 zs0L5ucJc!}fZTs1T=8Q(ZU}0ly1c^vxH2F#ir0xCnFjDbwXa^UL(hH&Os{9)Vw@Cj z^wf(&1QK6w&Syf*&2!7&qocDW-7io2Uwnbf6kUzN1^cYMP>pf2!5Xo1j}t)}ZU6&= zH|)ak>##0Lox5-Nh#DAeiWeYWh`~SaBDGpGB+S)o^*5KTg3LX?rGC=@1+BdeHEetM0A8$5ry9 z_S#AAjX}M#v&8LxBWPGyn4jRlqh%MB39HQOBD}=wf7bT-S2)z~AV&>lf#l883I43|otA#|?MRsvX1^1`?K-UMWy-%(vS`gxpMUR9-Uqg+Jr zOR*vUSb^gk8WAWFd2$Yvqbg1h{MgN)_jIQE-em~+h%}Z-v+>;c0-XyH@TSBzlL87$ zXZ|E1Xu(tM%7rLQd`I5Nk#VrQ*4Mu?J8`6-l4fSv^tN8ej?l44rdxH23gTQab>B$ zLAR^7tLL{5Wi36kd~|(v0scC|#CtsrO1=fPA2InDuwC^!b@`Jw%QOuJ;LGlyfLfhv zsF|7R6jHO9w+S*heM4--#B{`S;hS4C*glX>({dm|1Ba_ooljNW+4k+4@%B$^$&cPw ze}|rbYn_TNQ8xTq&p#Q>;RnIBf`9}^LSG=z>eE55DL<|O+G>$86F$f$=UCQ5X5M4VR}l`v8=zXn+(<0Wq<}72AzE}kpEkA`5Q!E z?GE-=Gl5BwxpQA@xv|>+2($1=X+QfK;6&Ioee(01R@#9>Sh>dG;qF{rpLFhX-4OkJ zh}I7(_s^Od-$LAKa%UpqH;=2ziuw}hv{tmI0N|FI{b0L-W~Rva0ia`DAe3s=15O?%jB$n3p&g4Q5CkVO@6jdzY*Q{D{1(oY&82$&YS&kBm)&xWhfCsD>Zw9yndg@o*K+jVr(r7 z-&mQoKxIi7m;i&CZ#`RNgnEGp#L#!rIa*vh0ZbJj{+TeR^jR%bi&P_y^Po#O;a}AW z!0$d?oK`X)Pdip{;bYL^g|PufRxk%@Kyb=YAhyheu3o)_OC8XQhE@{zk9YR0t@R!+ z)Udg%3fw*(9IBxP0MESkIyy}-pNy@D^O6z7*IaE(h2dGorT(SuX!&mUfP#x*TQ0lz zxzw?X)7uEQzjDd1R4eP};XLL(7u6dqDxc`Tmoxx|sZEPYbn_gr$baFc7dX9$GWcUQ zOmY5L%iO}mey4(~|Ax0hubMddc7 zu>*bapgQ`bvcIq4TSe!lw;ti$ZpEkMa6#jWK7<g^1%$1rv-mTFs0EO0K?Ko24Y9`Dx}+ZZ%sH;bfi0MXJj`Ih>$)*^l@v>)dh zU0X-gGv#-Kl5M0UKRgflL4>tEpgw+*e|ah;9^HAV{T=DT<@0>b$d~Jf`p(xn>GJh{ zed!3b#RKw1o*b?CgSX2T*f(E7H5Jb#_8O}eLQh^iwQ3mpi7)&5dUloAcu zo-u99?fnA%tbrkj(Qk&^+Tdyme?>y8OdIXd_Y|=L?RFcMaepn)0T(d90VbILLIy`n zys=99*y-uhIFfnoRcd}$%ug-?X00kJUEzb#A^(DVpoqt(KIBIRo>yvcU7A~K@AV#5 z6AK1jLnAazRe^Q*5y?_P+_Pst zr3K^W;3b}C`7d_{6t84T_aZlhAM-J5KL$^|Q%TGV|8}WstV27$c5uf?41Lfo?(c5A1-u6|z-MZ#LT0Vx zg*z#e2qOQQv6l-@5yljN2gFUpW&O!6g~%ZQe0|`3%izOBn1(H(Z`cQaejv)?;0G&& zTq3M>(<4I7{YarsdOX;>z>lhg;1_=kR_|~5u>tR&^YUkO`DjXzek2F(fox9E71Ka2;@gI+O>XA7EAjp= zR}D(q705Pm0wWb*-1*!S6{(_lqxyhI1r(J*0;I_^wj(i!<0aio0d7 ziBb6?Z6D5iUS-DDNl7xS^bds0g$!wUHFWFjzZyt-LF1npR7t!j)xMisd`<|SYH0Ln z|5S5x=176#24a0EL+|Wo^RC8s-;hS@kX%i=>Y6UVOg749{u{1i& z+9y9A!NO0<#s*eJl)llpw(RnSedehz+Rk*ssGGFuB0i z$N_r<-Wj(zLJN?-Xn&G%-pj)MS(D0bzCLU4nlGtQ+d*$mIe;aut1f^QWTjBgyK5z0zPPcpGCR@V`JN~r{hbZLd6?G1fhoTu2pJDB#A4?Ft%yo>;Zdiq)6SU5}1M9)OJK$VE&Qts0u{`A;8BVXV# z13yD>g!Tm-K^ntIQb!hwWL)V_5V9gM@Qw%+9XFT>8+=cc35ym5Axo1fhu!6i#1KuM z&Q}n=*2ANi_cyL0bF?k(m$mG^GmYJvJU&j)Pw)25$HZOo6Bjh{rwHcQla>eXNVV|x z9Xv(vks>IHhTTKaRZ>V6V~d#2S-_*ki9yK_O)JChwtoDF_9joUB7>N_nXnjf=z6AR=olJ$SfD#;!hP#MEQ#3j-2QLYsy_o%m zESOpe$`mo-SIyy3lw+Eg-x1DMW)3$()dh#ctoUfsKy`DlH|XiQY3fbvlBy2HK@@{HaW_xb#E{2?Jj5bSk7%)B)ul4uu_YAv74!aMLX2LW@p&TSh zui>#-F!C%|IumeFYcPoZI&h3QluZmODE<^INq2aLFCjMNQb|o#WkPJ}UeO*r3m=@L zd#R8oOae#p5eW}se()hpftGRrr#OY8m5d1y+MP*LF=CKk0~mUsHL_r~^G~sl=~p&7 zE!Am;+$=ssGX^tlCe6~{coIVX^bU92jd92O3?anGg@YaEOi-~MmUix%`PEy)?tOI? zR@kI;w4N=47gZS`MMkS5&`Kr9XI&ZkCuyBiaCN!2!cVahBbfGE$g|pla#~<`yGHXJT^r6X$$}Z$ z0T2Hq?G<{YRPZ3IJs3SHfjlc8-s^i+t_!>x^*niF3>db9)jI|jS}UDZdM2Vvt^&^# z>`4OsBzC>K$hhn>LGk!h6zy`^_Tbxag4bfh`O2YD1eWZY;?T7HP*o;`cG3OrP~k-2 zV(O^-#iYp6@#`xc87h;*?mU?5x)JC}N6LfmLq$%ACTcJxe;39{BI@P-`uNdkPX3Oy zcHgjq>EMaAQ=%Ag1}}N(d9_3|e%4ilZxX9Fx?5PKygccV$u_W;jCr z;x1uO9x&k9CO)_`#*=6L*^O$5kcVn*AGo#A!%6vIl)YX_g@+^60ipF46H<@ zeeA#tyO%0Uu*U=SZ@vRvXnISe-% z4!!ZQ#b=-0@#;^~`qu%kO**Q3s|FCYFEU}|7+qfygd`QBsRP6N6x+NQJw-h1&UGQe zHNRjyT4>(WWx^h0!tjwf!Dt)LJ9xY4F`u4isP`0Pv0FJd5WK1vy>Ctxov3gz9ctlw zg#@Fs^5tKB;-cmV`F&TUn^%C51PZ$9{qTnTl?&l1%QSZF3h?(A;Z}@l;8o^fVRiK( zO)(u+GRGWc!F2NS=aeq#A(MEa3eOHhe*sb}fbfXz>I1iA^tq}L2eQ?PBBVVuxL;EY z%0aYk1D4$79P_25Y*9m;a$5xr@0HxU`iuMum*fBje4{cEy;L8m0K2cS#tTTpuwzkZ z&I#qFEMe5*+Gr}wV!ra2<6!7=LQRvt&VxG-lQx?AG^thT2R=LmnpdW}$wM?; z0|L@i=^U_Siz-RL@?r8tCktInV2~$2x%+LffofNf+Y}7L?mdFoWE8LU-BdBN=3Otw zQFb5ru$wIV0WlxpV=k zdJC4ot8?s-vVw`UG>7iDN_2%!e6GqCT2e_P-j&bt>_o?&Q-o~VE}o&Z z^sbrjUw7r_zF+N_a7}JGU}X#Aj!cXOl*y1t7HKTXf7m@XCeaTixRJ95F=5|m=uTVvM7 zmB1>^+wHoKIxZip5iaX4XYr}6!9`7m-I!q=Q}iD>R6{5^1?!jk=zGmMwbuLJYl={i2s3Nv>B$%Qm*U%aklW&`XFjCfcEi*1xk zT(A%&aKmSwp`;%1RAbj(Sqg!6lxGw9e}+Ko>xW*uzL$$@6nMTlX5|4w!A*WvJTz;jv2?#hJEY(LmFkwb z`vEg6Wh_W!^I@LnmmnbIUseUUU2(|r%5Y8Sv$W52YXelkgAM05Ng=ndoAS6{^YgrV zF@81#zhY$i4F*i_=dn`l+vL{A&L1rJlzmk*Z+3Ok7*}($y4!lpr1Rn`CzLE|@y;A? z)Q{VXme}iQ#!~^_R)kC3R{C!7{?8tf{{!*HrSV3kB=S>?-6qU0_2T6w=_)8)58Zwd};)k3-+P z59ptPy_5(PHG;w#`V>30uc;#oc4b(=*pqn?w~KJZnj<7Rk);Q!$HVU2g_M_(3$HVUkU2@{$(P0ch$bqXs9^N2 zszwG{vmfImryHb+E@Gc<_+IKShgGqr3zuJQkBHEu@BAD(WcsCQKBc#A(51VP!tkXO zM&YlR8X#oOO9MX^kNA87$d8VRvrZ0w`;95mddn7ntE1f8)2gknA55&4z)SC;0LgH2 z#f60;8>jUYd&3sYrvYpgfe3g+DgyH&Q5K9y59LHL%<*XPZPGP_wj#o}lNLOWhwP*F zy=fbQPDw)NiiGE%>_6HN7UcK6#_l`_`B1;e5H7TM6LA(-Q7&fUtHKx*vu>>^{=6Be z(G-W$?%V7C3#P?rSsc3RO?EIk7jQ`JRhqXGfRR48@J53TvZ`x*D?i?-K3j9R3K$6; z6LqK}`JE`x4KNEJXtQAbhq`Mc^==?vx`dh}Xy@(MCi=VCH5c!Q1?5PrC< zK{Cvt4D^^Q>YNDvY;B{Dw0@K$KSW6I(dyje7PL2M;BKXsESW~h4+ zs8M|M`-sbcMria~2Ot)F&2f;#LjdSFHvBB7Upd4BgK{ggpJAtH=2w6;p6toicss-Q zaLEp}v*;UDrAuUrVBzGJ=-IB7(JRPS{`?6w5opY{X)%Z#(@lKf%IkVELQK6H|L8dN&E}nsphtMZ~GiW#EJ!(QVPQ_xAtMR0*9f7ryS(?CEojJ!xY| z5rt9X3g7KK*V{K89^P9A%v(T`V25dIz zzf!mQ?y4PX@=(OU(j)Agdm$@Rexf!%4Gzx79$NoQW?NYduXvlMQ3DHnEO*?uymDG| zL_bpvi#vpU(ie1FY)&gy!p55p^%T#sbce?pPRc2U32V4mX$e@gsA%LhblhS7EGFw~ z7&VYgg8Tla?qzG4l$n#{(3gydlMx{52ZM|uHFe+@PM!i#uLL_{;kKX|tGUEuTd%Wj z@Dl&wK7r~Qz=5IjCT3?ihAb#lnzt?wjIO)IYUbRHe$A~C1ytsWz1KSJ$6nD21Q&eF zyHX33Rg@f>Xz@dqGz&sOmgLVCKj;i+it1rU3vla022q29lWIRhw;|YiYIZpzE}*Oo zH}gGMlx>zbA10EVje63KL&&n7b;}WT=x9Qc@)#e;$fc{1bW(=Rsc_WO&D5AuG_gO% zxq?lZ)2*-)%n#&%9kbC@VH^(zMIg*%TH~+E{=8!u6<&%%+(E zC?Y6E;LeDAm~?+EuS1-!EVT3v-={WOD>FLW;)0pnHn?8j}H!t~7b zr*G{deYZq)Fa`(?0og27=NTNRL8!RVqLrO_oB2Fa=z4Xj#g-s=!6^LL?$^0iQO}5} z{(B2ol%Nwea5*sU&IyN{P@Y!8y7&1P&M`66r{{Su)laNON`uY6#|M|{(<94w5nZHy+yx-DOY>r^@!OaI4s_SHvi-9^63iw#*~V zF=(JTRwB+pitl$8?>=k z=1#gIDbD7?TGvmDuLvy`sU*BTaQIFUP8F}JLvlJ;Q+S^@1d!YK2nri{z^uIbyLB(b zG~f+GgrbjCu512nmk6jgb_z`TaW4TD#FnlYNLIfm##Uq6Ee06j(ip%u@bT42G2u2~ zgd1V>_4R?0#je&v->R(FqQ)g?B=!kx6kN`wE)4h%^AnJ2X@9igvH||y2ab%Ckj2$j z<5V{s`l@Bt<8UU}!W>4p=~oEpz0G$Yp2&hlUz5T@?MfHpuD-o-<^56bS!l87qRPnf zFV$N=Kwg~3c1PXQ)_p&_3SS=FJ(ynrQQ}U!7+4;XyuI=2%nMWT0X&_8c8Ui-M3xD= zSSi5xz@XK5-jNyKy>`(bek%F0BqZ1)3bGFcYI$`xx$m_TOyHVtylR!h_SD5bG@tv~r4ooI zQwew%SPRug2ENR1=Shn&xo6<(@S@W-Fu z#_cXh*E&tw9{^11*l&A{R7J`ORKSy_mZD!w?3>lO<)X^>Bn$132898q!rjRaAN7pn zWKv0-!Qg$ynTpE#rLseJ_|^ofdHd{$>IB}x$*Q5V z@18J%$iQbD4qBQkMjTN%gqN|!G zV^}SzN`pNtOiHRYgIZ!5V5A3H3sfr$9mt*#v3fNt$NQxvKNxNEF zLznM`)A_vMR?H}29W51rRW~6(sc4%h1)ixV=;fGV?V>jM5@)7wOTJl!?EdmTEZm$d zty z%9V+}>ncwP5SJM;ge}F;)JVivnzr?WZoE+WAph7Cw)ycmuy>ljlwD9zSU3s&B&yD; zOPOaMj00F_47>B*v~B)iwbeND`<}&dU$l7pIB-r=gIceT{>)K_!-E^rd;qk~*|*a7 z@OG!yDy4a^0uH({?}uCU4+$Qfn@>5DFFHy(O=wJo=lFE24w{={p<|ng6ND`#smU@k zH46ocH{V@m+s1XPO%VD$N$cwceX5?W_*R?^)J^3yZsP-UF9)3B>EPbur?ShuG%9~_ zGHg7}ZfrP2U-e)W^!b+i7za(&vcKeX^ugJc)vYlwr;%DO*?;LTT z*L-0G_wmGz7V4dp&I7RF8}G5i!wP(#g3ikC!Y?ZVL31~;$|<~Gne7=zlZxc!o;%L& zOK;(TV%O9kABYkiuvu4T%Da{<6+f{$oO1es(z5{fkC)ML!Jx`;*%jmM8eJCEJ@J24EZK*8kC*PKKz;Y-9Nh2Sl*c)Y6oncK9G z)DiHbFx$!Gvt#t8gzs`-EZ^%jQg?Kk)?Y_ECw2CaqYl~;ar9+r_v)e2)-6Zb%{va3og`L># zd$JpUT8saw2~~XdvK(58p?zoRdfZn2fDz9hDDJm1^&?h-WwCts`O2Q`^XhWd@^9L4 zD^4#Y_56P(=iWH0pRuh{JnvNs*=?nGw7S#Cc*pNf+KoG);VCI9XrF#ud1Pd9JN2ktDk#FAFf-8SIm(afP_;U;rr3>PV= zeFh(Fs95_H5BaP$p&k5&2i+6*G!du z{{7PXT=^%oF62@6MM}T;&^&dmiF!I)MYkyRn4x)XjB} z?+Izz*~x1J-+r2fp5A zjrL@uS3jGrUA6AOgb##X>7u~^|5&rbM4 zYVB;VT;}7PsN?kB^_Eo27Vp!yOh!+GB?@Y_WR_F~ey|(~ndvU$-HgdH-w~*eC$48Z zcb_fhaN5lJ1&sX4sIV*^@LRMbKQ7MCGzyo))lls_5<$HZ$w`Xpn3Rrw5jM5WIsL zK)%;t8M|%hjHjjK^d&fgM3Qv#tx`nNWx`c*c)7lFkw}qXe{ipWpwDC@0RNg0vr`z& z*^>{OK-Ir+n719?e=1&kMbx`oCOufJfTVluZI|v`3kid&@6=6it-aZHB`ojuAZ+1d zDsE@4&ekiDRaz{~%E2S`w&rL34@gOr@9un-WXWa!Ru#SKp8Zjm3+Z?z!FJ}UG3A3N~Uh8I~{wgH0c@SfBF_{)#Mp&CiBAeDauO0 z2E!!VE9a=o?3T%Mu~gKX+XrJb)Sy?X{JoMbOUKnqm(oLZ`(mLRrWGFL(PQh;tqyok z5lwoW)@Gu{thKs#!D!6MS&q`w8%vgzMuC?U5?6fj=lk1KtDYLJezQf+N=v(MVSb{{ zg3fb;1CCByx0Gc#KrPQFg%$ySt&^e7xQJMw=%Xi137+q|arvh8>J1dEQa73JI9DE0 z=SGm>uBQv@i-(r&Zl&EWJPzPUK8W{!Y}v+#ZDqV7xu=Q)qNXP!-~rJjrhi!chk9LPI2I3dgF+c|>~bm=Ma z0AaoFhltxUW~tix<(jF#C`=WU9TrCWV)r5iXuEo=3Jg808W-{Bk&1QLglBzuUDh+$ zBH9`$6EzHn@7cI?oCuhu9f;0qz8UYi4?5-JIop;LkAh6&*SXEgJHxvO!`*^Pb)k1a zV>Oi9Eh9pUda;r^xNSb!*zG-1O#X?wSs>4{6X;EXrQJIV%N%YSmb$ec+r3vwHtg`}S=4ChN)lHL-a^?qm79N{zH2;H#7H$k}0W_~6f+J^Y~iQ(OY zEj`e{6IwjZt5iYHI+8*K8TWkdlonqm0}tO^0AftoG|fk5+>KOrXFvKqGWoFeP4JeX zW6Lv}AhCIIAgW2d$!$qyse3p=tKr$WuEY!b0{yT3RNMobZJrNn9*&L+ElS{-hcIov znf(C1cd$)>_i`-w_B5=}l1cQPy7b`JVB~ zbaonr;r;OMmKRquhTPq;-ohAX{CPn-Z@5re%zg2Dony`vSDkErFCR8W_`s{lAkZ2p zkCHdiex16!yQ#-@r(kEv%!T3SeLMmJLAn3K+FOQ2)xUqcA_^)oD$=D=D&3MpC`gM4 zh;&FwcMgbvG)RMVcegO~(A_n3cg+A3d)@c%+57+O&-5*3R*1%7!|Sq>W=)NEREXRA$W$Ig)flVyFb{ibaQA4hN#HBs zN)I!_-gSci0TiXSM}V(;e+)wgrMbmQDj1??7NyNU{k~jTPyL(mde3OU!WJjH`hLWa zRmmcrGv=V$grxES4o&teQ%G^T9{tt^N>iFve7o2|@Mte2>*c0u#y=b3_#HNT6m3$Q zoVyXYlMcQVz%AUP+rV8Mp0ppDFc@gSYc|Y?+qCw}VO5Wl$Q*c~s#CmLeJ1vxphWaN z`bDS6i-RQsybBUl428?#ywdu}qR>@w`%^a<9E(A(+jh8NkAMDe=f|_WFbx^KdsLr3 zzC3oHFv*Id8g&tz3bXwf;6H1~ZRcU|_?ME;$Mo*w=2%?6R$OU5=RGGLwjFd)Fa^+$ z#zR=By=1AgU64F0({08_!(i8H$B!8I^OWDr#7Ylx z_6a{j2%9LM zee7JaFjbwmddf1hm*5fNcx5w6#)YedS5xa>8~&{r@dP61Ag$pn6{t0BT6%f3wIw#% z-FGzYR$i@V8|F%ujkQ}1d?AllgMWJ~>siqkpK2A9sDzK5sDcZU7*q7HBehwMj+?|A zRI{uu5*ZE@p(Kxe3+BEbzJ?M=c#_765Wb+M0YOX?j)RP9Mx$)1UUPvw;<$?bG zA2$LviywH4sRh0^|JHs5{;XVGQEgg8yQI6(WtN(Yv$SHNfAEt_yd7-c(dDa;z<$nB zdu#qNxfa+_rTQ^ng6(S!R~*i4s`ii+h^f;HE?yl>)4m4V(x3e}Xi_)`6vh)_2%vd0 zE;^W(y$tLQpLaWWO6+rDuJapDu)oOleQ}cq;%IYN0$)FLmls*-PSM&4+|_yLdO!HB zA1>3{hFrsW&@~=Tbjsk0>*Lk>C;!g&8P9K{E5x^4C+O~a;{(4l@c}=bhM{ccr8AD7 zKX-^3JeKYFpTL5%<1qMN_5LRd(G{%^pw>Z_Xjznl@A|&A`ZHCfCmYv?_A&Q z1gXFf+U9-FJ$U68-`C1p0aL$)+Qa976cc9iX&-z^Xl-Lc-Ze<3Qq-`q3sbsQP~usVETy^Truw8jBoDmezl^Jy(RrxP&I<+ z2I?db!fN}AvO4U{Wb^*s%*5GSgG0xG$UtW2Wd2d$QACDa&Y|BmWT>SNWY3zj+c}sm zHWl`(k5QU1kTAQXm(UAxN!_6l{`l$X1$J<*`fgd@Y}cb^gGdT)DbW|Ha=oe=9QfyI^$d7x7uJ%@s78Bq3qapA%J@Kp!jSo- zGkzm$*dV)3I-1fPivsrO&h*lHeKd@w0G9ojUwAR_D6+B+$+*Ar$N#jU!M?C`qP4It zy~(ND6noX|-O?5wOXgv(}Q0VOH9S(|!N`egAuEtBk$?Z5-Yum41Qt zP0zmHOlzeYr5`|6nfx#GbaRPzzF_6zO>~+)bnC7`S(5%{-Qg)c{BR7K^Gn0eR(MmS z_*Tgn-j5qG$tX@8A8O2LWFK()2GcnK96Hh$w`8pw5HMf-Yag>bQ~Z{WVQFg!{;b-JG++3U3qC_?+{+UGDH&^Yk0o!Z z?W66`g`Bb*IC8`-;3;8)xJg+1tEoVzZIgUU-PLOX&G+TUrYyV*mbx4+W78-%gng5# zpnL99^Z;_MIbPnhEpPh{*mNxj+wk&rc4jR2poETZ<;#s# zJ9Yg*`W$vxtTMZPd>{O5zb$U~HdSV<$KWkye@ARoetYM%+H##Q7VyHR-s)@)eP7%hDT>Xj0R#$qx=5IHkgV{>8zt4%5fBd-1^B_gQde2Sr`*O)* z-PD%8r9ZcI)XTKibfNZneyiPD%^U`z)p`sne)Q+;yD-xX2K|&HY!a_!{&xzvT;N#c zxY2V9fX1-1{=QL#K`mQsuVhj7u;|u%{fgKWrzhuxv=wGTH-d)Z%1Lbo1xqjNm zbVgyyz*nlT9?L!@w^edzX|T$8xQuk&bIL{LSmRT1 zo=}P6YICwom&0Gd(qP>&DyYE4Nn>>VH5!xOFmNguW)=!G&{Ibei2(}kUh5wKw*CGD zz|YPpCk%b`f43!Id61Q#rzP31aaDG7j3gE`1YYAE>k5QB@B^6TLy7ymXYYECCu96^ zO6MKRQD4&CR)Z{>YBlTS@IU8H}J}5{f7T~X>Qx*o;%X@XrAd2ojNti+NBFl zC=9Z?#$;bCKlG8hQ05Nkg5qsr2E$nn`!d`p{=XAhP-avv z(>Fu_y-UIWAg~aZR|HG!f6g>g!rC?wPqhDf3j)lQqz~pl^wd9ypuSDii!$!JO%lM6 z{&;|hr;A@kg8ZKWj(4Nv{|?cDe)rkt*Fdz1Cc&rB1*BO(xGdS$R87B@)+P zZ{s!oq8Wyw%JF|8ssNH>1mzye3ni{nKhua}`Cp+d94JqQ^&~J41l36GbyzDHhbYSv zRL_-;{7PncaBVHIQPw9Qsi?n-Im0g;3;_sNFPX_iaN2`s-cQa&I)1g@{qI3oJKKH7 z4R*M-8(_ClH>v$mfI{w=4J#+AcYgr@R7T_6KJ;5HlaD|taQy#wsA}-|A;73?@dk3i z61X6bjeS(2h_(dNxqk|^{=D{|7($eZ#f3*tJft0%bj z{~*KUz<)z7>^hYYIDaG~Z)_RL+EF$DX`BQO=7z@ngXFGhZCZEn`_Q3s@fD5+{LCbZ6=!Bd zG_;=1c%Sj!1t2SfT`iOB8dCS175LMr zA$kQrY@6THu}Wj|vA?@18WEBBu=M`_JFEp&z-T+r{B^l3N-$e*KZ8@g!2X%*&QfkS z&Kk~+RDEmIWuATZ7>TX|+UHp=lcnd0ucEAz#jJ*oWXUI7>W`?q{4?^AT#u7T`uf1~!*i>}5sdB8gu*lN zvtNmbpl#g4=2fWk?$aqXWU*}5Za8(SPN`#all*6R!wZLcTb8Hf2q4Z#xkRs4=9z)P zZ!Cjs_$evPWFVwHE5HcYP-C<;n8X9@lCp-IZr<>}(TNol3MFIDazKI|Wl~jIU6hav zb7cRQ|FULy3U6>%+bHUU_jj(%p!FL*rmgc%HHKhI7Y2pWpf>;7Fo=UCR+&f|COi-w zn?|`F`-Mm0`~?)~5~+GGgw=8{78O0c+y^t+{@wcp@D90Xgeo;AS;C55$SX18+$oH8 zVu~B6Fq`tt)`010!urCxQSZtsFpTUo8YvTt*jhT#Z&qirS%3+Bn%zd=V1h}QLnUzu zEEZD*ob$?`2Ega%&!`J@bR1{O^*N7|i1UQDN77m5)b|bh{MSbQ5rE+A*cyw8cR<(S z9k6!t&*BGCRe;SKp#PV~JH+pXs6`alGa#O~x`bivx(#o1_fGAa2!U!Bszm;;{j-2V zqRGk0LnZz3f`en2`#eY0(p(6A!XNF3MEGf8i&m^u;ive$-I2?+_I&JJFS6*gkwF}qMj{T7!YRub4y zieSN@ur4g{a?R-*ieiOb*~iLi0%A?hTCh0jTNk&)5A(oj$c>iqeiY6olyR<;dhk?e zCP4c?s*xQ61?*#qw4dg4roJ3Hm<)_TS_U%(L}MJ;8=A+Y(AE8_-L7OQy;#`yCz)e5yt?sN1!S(=^~zK z5$BFTcQ$;onpuU_Bx?&5PR0KlZtVA}KrNwTxy7S6>;u-1h+5!-SZ-(vEr4mjk9HP` zpi+OadjEwkED*9(|}_zL*4l7f&M?M(|FT zidqq9;gt=taXatvsXi}%&7zXV)$#S@Sln9+6+~Cv^^1Kocw_knf|`9u1u;{Mq#T{A zP5SG(J`+84=AriG%R7)!%~*vef$D0J;0_FBU5cz3(8J`r2p8k<1?BK5rV6u1d{3!)2=R0e5~TIN{D3 z>fbBg8%)WYH^A-qI6NgFAmACXe1}^8WGA&YxCe6D@xCa#;6t3W*ur=aJqKj)P7A(TlnG=Tta9UT)(PF9S_no1Dq)TF7{B{jmniC`K^6HUA?R~ zr2P1%kRq09RBsEtg5b))g7|L3j7uLMLy`;bgImFFPZr~`4M5&=vo;TlIA(*S=~ZgH z;Leo#RDa8_2Uai$3lim%@Ei=)DhbpA)ElcP%bxo62= z7Df+FixBD|(4LAYpxlAw;CS<>k2O$ZQdu}dWIcw-7zEb0hK52}&JkFk$;yXOPR}FS zL7{}bp^?}kb*>D162T8NY-(jcnq7~{0{jgm=mnEOzu?N(x-S2b_7IWKn!jw^8QU`< z^fP;VMH}@(tFSKLI-e9eFCPHCH8}y=8Gqck2nd$FJrQb6m$%1_Ay2xHr)@-=Drpt4 z(C_V32r1Y*p7xqU;R6gJ~1&yCxLp~7h_-}K}B*M#c^U&q-q)SbyBT)DN3t8MQLLN4+ zmCFcSLy#wiRFL|4x?~OegAVKS<^p#tTDKw7u+c8%u3LDV5Y4h*Wi%iYDk)*|i8PJQ z6W*#kX8RfU*z2_AEU4+>Kag%11d-;Qr3M@6lBKUB1@@Mb!Mz22Z9ZQR@_n(-=Ka?H zd8~56ENkc%0)R0QkGDDhs8}i#{}v>1qrxVd!|Srym7lC5oW1&5E+7l_=&mYPxH1O* zq&bL?xpC-k?y+Vp#ARE#vd&mU6@`KZm+B)(rvz;ozY5vg9E%rD$g_E?OyQzgSt4Hl z&MAtcug&}`hb@&LjK{lJ1dDRUGcS75EZ;5wzVGrgPEo9^zM?NCfPlRBvPrkuWvykp zw0o92yL-&oym=r}%eaBN<$QP{3qS@ho@sA3qqxGnap!Gk)3xhzv^bzGh-&OVdtLpF zJAOV~i-CHv0ljXfkpaWW5nYj~&U>YitzO_2&(kZB<6nAWo>2=CLm=0401pZVx}XE+ zURCB3dEpcS-zg{s1h8>dn%#G_REjl9yL^xFqcZ&+7V76Y4yC>;Mlc~4jSD}C7kkz^Owo=21ngeTD^+uyL1f>tr1<5?xUGBRkJUn1 zsX4n4ER524F@R}nIEAIjb^nbx>O}g?(){%Z`2{H!7ay}S8Fz`c`aWMH=X5-;q|;=Q zR=0jDtIML2l)^&sbbXWi%Zo^}=BvZ*1b{&DzD2y>8;pKYG;+#@0aX9~$`b}|i?!I< zgbyd(dCV{R`-#Vimb>I)CQ!Ke#G^wK7rPT`bD9ob9aRqpXY1m&T@pBSH)l%{A`SY6 zIQGCdp($H|MAZGp#pAl0+^r6qk9Jp)u5mmxuCyBJngQ0af{*R8-?^jWd%|cL!aWXTHmBQmTv@{wvorjE{EAKtebz_)8tcDr%dh)=j-q@L0;>L$K`dcIE z3c^iF$kg$MH!ydxvNdLH1hndm@A4n!oG-1;M_+FMh%z!8NmF7?60{XR^=525@w6PP zdM{i?O!c-`2txsBLmYXQS}ek96=_)zNR=oU?RrR(AF+LNQF2(Li?vAKc~@9tYwOT4 z1WPOIlwn`rG_R=ab=JqS7VM$ISomkQ#+}z2>&C_Rf$9x~CYPgEY7fhOFIx(%9x&Px z(t9>akryd>`bS7kNh)H2NOcs2SD7wZiN zIYiw))#z8Kp`Z?;-_`yq{ZY|rx{Q{6YclbI>KNmFK{e)hEl#!l-Jpg}UU|P^!Rq7!w zu6K7b1JPoG^cCtnyf^#+*S+%HO&`nt7-3Tn`M5zjtGk~2HL1Jf_^0V>#>Rrqs8LvY z#5YOWwf0Izn`$biU8%y`R(j3@ z&By*y+P5WIEtlNC)Ym;w2L^!4Jwlp6Hlk4En&Te0m81lEUnY`H3H0SeR}ut!v}-z) z96Fo|E*?Xa-I$X_#rBCg3ewnGeNZ{ zv(hwgA@v?TD$pNFc@d5!yLgTlviWT@%RQ8g5r&8qu8Zzr<9(! zyA?7hVVsBfy!KnpNTGE9_tF~Ji(5^U+oaK)-@6zIza7fgN^FTM!ivQokvikClVY!% z1DqVMp%8y;=6}YjbkTN7`&84msYf{Jr6Qse@L&MSpgW?r)To(hV4J@ zXMI>c(d>iI+qg#nB<7c*(8{6@{aoifIuSFyu*C3vKO6DI)@ZOvuK~9zRrF}ka^tz1 zd0DKo{CZ=79arP0bx9hhcBu3I^auTQG$Ps-g*|FMe#aa31Q-x(_h(2g1Zcl@!Ca{I zcYcAldV9LFrDvWy;E3ux)%|nsW`HlIBbY2;EpPv`-lnjU4rN#9ebg9uaciZr-c7=X zp<`18J^Z-zyBlEr)Qr8!$8+~hwS;y*f2LvfiM5`oqfN!G{8)`RK|XZmFfQpiu9Aot zJKS(?(&FhEr--cqmb^QxVRg~@?*QXslYdXT3B&KDtiSJIbWxycspBmdSv)e<;ENqj zPtJX@SFgo#ZSA7G7_|SPQwJ?@xE^^-UpCoFAn46(*`SiY=@Du4y0fI$H8r$XXC?De zp=!x@3+68z2BwTMZDDtmD&8PO*-E|9OQEn?)w;%?>&C2pF&*N4Fy7vv!Yx5RSB)ZK`xySUN zSb)x^49h&3SFC-CN!Edwb%All{Txa5MV&Z1JZ_!4YB#1RGu8t1iNetzOqd zAFN|=snlImWbf z#>GBc> z4G3rNEEbQZE2qY~-XEbJ{AP6x4WYSZeE_gV zTnLZP^r$^@X!Ti+;Y-_R6%PkCS@&dC68~!9V;{R4mtG?dm-2@j{d>N=H+9!~z5Bb^ zknD%F34sG&F(GE6kJwkC0@V`#^!oXNOi%5IP&tF<7-eB8xaLc}Vg6oYkyH?CD?Fn|ix?n0_Ki$0wPJt> z0zBUMIIW-ET?uv_c{Pj17luqH4NG4<>_|EDxewh0fstIVQ%M%;kDsTmb_V9(w|5LX zA1MJcv_5g_evG--!2H8?=OeH2)Mu*m5#vEcQM-y=(!FV8^a~5$)thD@?9U@A;55I% zEux^LBnJ-vVG@1@XlK9RVa0o^Oz0!dLVHr)g_WSpJZ>LUB;!J8kOf(Pf4}+n_AtSA z5e%={(6dzGwfe#<#Y}h}-nqm=PjKnEqFq?ZhGlR1VG z>wZPyt=>=y-G2WIXzI5z4SppCj zXrnTxXyRlB;YCLV{p7MMo@DoJ@M;NhqKeRpAv>}_ZwgSnld~|Q5;bhUG(-7j;@`-#Ebjt}WGexvhl=MVL!RG=NI1)jA zA!vbDjwoDm8?QZnn2$6eo8Q!PucjjA+?0FXw7L3NOGNS4LgZF~6r^Tay#bA5*PaK|B;a|Jb7uO56P)=Jt zh25Wi)afk@mnvgeh0Sj!lN>hlj4SCc@ZTL2dGotdh5dPmRiRC`E|a(UYVFftB8~Mj zlF0vnoN+~m_0#EFgTiD+wn2tBEApa-FWWjFH7r^Apo1Y4-fk}exnib!JXfL5w=w>} zskj(m^Oarr50%P%ST>&99dy~B*6=kf+f4P3y}x&Pxo1qc^Nb9fMw}8F7QIlJ!TMT} zUMHCK&qLg=dW&WKDM%u&1B1uCDXfd4s~zshUmox8ny%=(Uo$1Y&T8#@tg@7u?HUBu zEex9i4tg$QqILVwNP%khhbjo%XHDB=NauK=K7pe(aW&wnDEr4evvR#I|0H^v2{S5D zB^$Ve(k?`Tz-VP{Zo6PHYzpu@#0d0TjE_&88Z?J`q(;VZ}&*h;f?J|?$pNXIEq z02A7oWh^k`)d*o)JT4fs70=i6NW73r=@QroS`vW3$#St-x|=O7yT74|*jGv(71De; zB1G|s$^|>n|GUG%@VHldxYj*n#MUViZ1O?V4K@uc}A&0 z;dZ5oZCEEen^gk|m=KSK9)jlqyE^QGI$c-Q+|zkSuz}>V+$gA_swq5VF^`$>5>B~Ey3M4uwhxR`AJH?&doAEfv;F`%Wx!2 zuexi6=$p~dYIW9G(UM?x{rY4#z;hyp789^#4>dB@bUXDl->Oc z6!d=MQ8~qP=*E9=$TB}M@ZbW_zZd>NQQW!QE`t=@id2Jd!NYyn>N7fnvkf_u3S*@e z|2?ovGVJn^XheKi#{^DK&`@M0T~8R^O#nRgYfp|Ze!105ncC5)oE$|D1?L@IO`xpI zp?sIoR1{K%|D`CqM~WXK&QP9W+jma$?WBT0XMbZzD2y{q%`P2Q!r%j`HXF%n3Y@rs zH=X$)3_Q@?9Fu%yHcLf&!k;C*D31B;93yY~xUyx6;^X7vRMA`QIYP?9cEgO=g0s4`5A+Qi_!C}D;rf30&A4l+vzek=bqoHd z@=O{rt{(diT)F0h*g`cq&2aKL;KfV*2|gX$oDi}L0Y^rLEA8s=uyS15r~2RF9bExS z43Nh%yKuoy>%%!#E(&ALzSw4LKH)VT&bb1V3f8f)g1O6Wxn#fTfnuk$Pamx^%!1ir zBe_Z0bsD4o?as2Xgw5ZKY5vpJ<&8cP;4n6LT!e%05QFR_9;w|DumBw$w2(4?O^)|7*-yk|1}3-NvUjSI(- zZ9|{P#cw6@cO zz`j77SLM)X*7b>&N+=jnxMtDn@u7c@%PZPM?BF4e+R{ zIkY2E#KdhDi^%YY^~h#yn2x_r^}lS~YWJPC%J8p)jpt#%@Om8V*n6x5&V8Q@;&WjX z{HDkx4h>v>cW_fnZ9@1m;xfsSg!|IY4f^+*mFBaF`;U#@b3$QYMy^==GxVh%d7RW4 zh?3`L&&yI?hprE64=~@*>hS~xaAhbq`uV4x2VBKr=MSu}aEu$Ra%KGH42wH2QbgwtvhTRNC-Ic*9^$oEcG)^w@rW1i zXS8DWgS1^Jzv`(P2p|Vg5qv;yLutTP8{|Zi`t*02pK_N;N&nUEI>;X%_F(2)sXwL8 z&PryKuFKx%zpEK#^}&h5f+$O`VrkzLTYfs0B$BK{=Rf zys}I;oqpFo;l<#s4fF7i_&lY?>+~Lm-a6cdgdIu$4C&> zr#Z}&pqZg2`Zy={18+kHPn0QAu>I5>1FN*6Jv4ij#7Qv%Q-@vyI6IzW&B$|DRO*2&W zEhRipuK$xfp@lBTe#Si=!?z54Q;bb~_=c60gjKWj*`bJ220>4nSpT7d?kqvCE;YHF zsJhy!Me>u0QGW4N&=FY;@$@>7{u6XN1xfacC;vb(%7+^sN=0biz%qa_$EDgAtlSE} z`RtyICw38z2mPtgYu%~zNm)8%6~za{$hgr{9L z#f7cY1HIN`LJ;9(pzWjct)X1UHkYI<>b0vw8XsJRCG&JI zoO5vF?5w=rqiSV@2Yio8<5IyiU$9UK`b5)>&)Rs*PKMcxw`>VTtYqs>b$5WO7l)37pwbA&uxTEt$)9+fJ-<3OVcjmVMX z>t!^5O*snmB0^O}Ao2?82R9zOLB0=VA}OV3z_n@G3>%PD_W|F)SpwVfFZv0KwU-p- zF!=fQ6dOIE`Ji$Kdu&;?a}4ErcK2L}@KL92nuldlnja(AZ=|g|ZDaVV4bQ4-t6Cx7Tkl6cPr(jw zLUY!0_$ED!bs!Op%ir$MNdO(CmNyxtggadU3qMB6bsA26xsv?q0G+TiC88_%`$~r7 zg;*QOU0=X9^Ndj}X#~o|lP)Rk3MV|ogO544!NQ4t0%@#2sq`RRxQEoE7SuDeIotQrP_XWZ+ld=t#{W>z+9UFsW+G`{gGC#R)^Oojnxd8h9v z5Lbo;5Ss_4i^5ImNcD5MrT337)AHXWwzMelQ0G{CL-Tg@^5ri-AeV*mtXZv`b6^W5 zQ^b|%dfeU;>X6iP`D8uPR$_mX*G+;{+7gU6G_W-@`swG(Ky z?T&;1o_I}~hUB-M{L@6gvWM8tJ#2SKmv0YY4N)N<+7+5fx&CIqdlzt;ab|~1T1*}l zLPhOYHGqys*u4}FAIVGFWGfD*qy`WgvVABp{>w+W0RQ!1nW3iX;#-Rq(?__10uJM- z5q>WYXYRZzp^|WI2A90@o^eV`Z{q3X`;>rSbl7AEs{~XfZtHo%`Dd(;piqsk<$gWH z?fcWE3LKW|CKBsEfVY0bkI#>jFVSm83RaQ7F`Z&Wu%AF4G#yyL%zbk+p*u4~x+aip zKhuunKDi|k#Z%jQ4-s~Gn8T3e`Oig}v}1bSj}2p;N>-0lE+-3Px@^k_n!R>^f2s6p zEO=W&_xui5!?M@JV$?d`J@nz3RzfVjRczm{c2k{)6{qAnvwU1?iZ%h$_t#EV8BFeV z5It=Z5|m1Fye;LAgQQ$+Nk>MqVbX3}(%u^9A~vRxKo=w5(ScupGy=Mv1MBgqp4i*&V@g=MX%0!-?Hwr5CUf$0Aq>}ao8hrR$vHpJ23Gz4l8iUQ zF$;FqVst~d9`P${7P%$Zxx^pXtOAHu0o47Ue5j4<={4{!?5pbp1JcQEhDe~q(-N|u zaSi;F{rn%jUu|nQiu!wC_xBGn{SNG4CS`Sh&3O@otUnQH1l7~K!J9KO9 z6+JhbIf=8?wxGD`8SHNyG3%yIS>92S!7n+B^fAuk!7p2(VtvkIwtH2%1G_J9^(JCo zI-qEgT0-j`rD89~3H^qY!3u=tYO#OK)A;cC&^;TCfh|0ISU?Ea5d^6)hs%WPWrRa% z+z#8X31_zX81kS1du+9VlS;l-B1C<1>bV^`_yvSa703E{=xMx`Ecd34T zyG9Fxoj55mF%gmD0>Sw;UEttC#ziTHF3qFuCDgSvZ8OYD7GqBEKw6PORKV zoByyBzsK6jN#Eri=1SgfMcy5H6?u~Y$)v3$=l9g5(a+Uk;l>r)(MTV=Wqn{PrQYv3rDxXN-Uq)zXS zWa)08Sh0Ac13S5(RvF;Wn0q;QIP)Yga~IMAL9-8K;I|Y@Vo#}PYu2fB8fGlWkKVX5 z1QS(p;R2Bl4La*m0sPsaqtR!C3vya22Y>qY}L~?Z%P6%e{21ISsCD zzNpCTEJ$ro?b(mg^F*uP_%wS>$DOI(TDs##7@th1*hVja^^)#l{BZH}P#%s#gU@zm zC=7?_39Zq-YgwovUtox-$B<11$9M6?hk86WzJW9g%L@J-8KD0CkfdjVO1@-sP#DAg zN6axWg45!nekGK zOcr4_8Sk{4d7z6*9Jz=0YLFqX`?!g4kF~g4`i-C=>fU&Y_0;8!Rr$pA&-GtPcA{=> zXTdCgFfj!6Vz{Y**-tx;F_s~KJ}KG!`9fm%Zp*{po+#Ht)uRKqU$WM*SOp7HaYW8#o(lPL8*-}IY`2dQsX$K2V$MN#W#fa=qj<|Je}ppJbBhc4 zx?m>o#DDo@wR2-u_rvWygAy3CM}PyHCNJy}1xp?t$D(v9eps{1aaI#dL7J8$bT%nb z;1z>0#{t-Ma1X07LJZf%I!;ZUiKa?z7wJ{`&Ai>+2hnxma0yqq2I*3z(5!iBkQ(OS zR`X$`ZBdcyg(@oG35m4rk^J)JA9V56NRCDElYX`^D{ttY0(xdf=|G;CMp#F3x7KR9 zh;sif#VB<*Fu!REQ~Kf;vw@>7p+`Nd^Js>o1_XUgrRiw5s?pP+$8pa<6c6mfNoD?e z*&@`QGLUZCi$NdE)gwD&qx%ao-X%AA#Ie-$6w)M_%Gr;;s z*e}S>QpWCdE%zl-#+e5_-gyjQHl&kyqFy~`B~TxX&}BkA9TQByS-}|9e)(+s?()ac z6^qN!uFpv%vXy`3BfztN6vI7ZEO-?*mWI_sqQY16cr93|B92UAA8(K24?3gz9R)e8aJV zs=aim2~0H27?>igfkPh9X!RU(2FzeHWFqwu^tQ^+$&WsB`*nlLO911t_t5Kjx#i+{ z5}hJhyRY(*C&{It+q7t&wo_`{#2-Hs)fR&G9A)ec}#xttR_SlDL z>YFTYP13uhoR3Q%pA^MqfbYFyCw(5~`;y491it>(>3wa`rJX{aGpl4#|gXf~W>5fNf zE&GkU+cc@GJ(-Saega~JRuM7phE!c&9I@`GHSKH(sY@P>e~p5$M_|iDj^(g88K5?8 z?Aff{?P0o{izl&DnpWO6(ZqND?&a&U>`sW-xT)6{YrLCm0lrczI}~)b;Wu6tpIzSE zhECnhp0|6_hO|XpBVmR@x;vgQD5LNFNKl^ekZ7@km-nh5q(w5+2c?4L`hz@#7yXq5 zdlf5<&3B(p{1)(d_6P`5VF$y-65ivQ`Ftm8F>kxP9;t_IMD3_5S>(l+jZk6}MT9482CUl{_Tr`XEb14TiL^1karCBT8)lKG*MPxr9$%BJ7Z1Xo$6-UTy5)fv!>8F_SJ-u3G)m-=8UTQ&QEJv9f}vF*6pG<~^Zhwb|$C@KCSn z6hq{q7$V0bqIUnJK#%@bz@?F!myE00 zPP;#LxpRk(UGAOa=b;hCA=lw)4`lG=D!;2w{#NT&#PLSk>^2nrc0@uA(#^Cn0(K?3 z;NjU$pLFpe)5jee;T=|}-pzaKnwRv1tn}mc8aec{S^jQMu;`sl@m-($C^mEvq1VDIUCXv#M*@|YPiJwv&3${WFv z@cj0a9`(F5ISUTGaW(!wI=k|CsM@|Sid(j)joXqbLJ?EKG-O7lBq2+7rbM!gNwzQs zsf1A3%F>9Cb+U)djO-@c2w7*Ou_TQB%ox0;e5^Vd1_BP8qG4iw6L8P{S>M%1{bsFAl(fHv_#B5}>m+`e|LETL#A-m7-bVwzpRfhUARxw)tr6|1fDAGxF>*YWwa2DW8N~sb0@K zjVH1zKA18ZH`lYzo*FD)VvN9pU-CxtwqRkt?b+A%zwwzcUu0Q!WiM?*SmwXgOsH<7 z1LkHOQZ3v-uQQ$%jb&+F4B2i~a7mkK+szW7VvU~$^~OxJtKz)3piAotT{^RJBZXSq z3drW~Yi3haMJby{hWH32F~Zvq23^~ZKwVe*Wz_GcTNutn)uUeHnKXPXoTN2*mD8Fl zeFa|fUMabXVcA&*{u3+I6E(yrNCCZEfcP0U#%^)7 z0O}W4D_}%o0?T*u6y8WkdV6I~QK5;(d{nZ<9+$*~xX<6#CtCbX$WC8CYP(5~_-bvn z;Oh$_JLeXO*_#_7)?&E;%&dNv-L~Gi*%P9;{VmQ@db;OE3qTQQ$W6_$%hqdeeOfYu z+?f`CK+1!D*@g}bWp8l$gIJN zwQ6o6Hd~IPAnsWm7pBZ=A0=(dgc!lQM7pBn0;Ce_cpn_85q(;mmAgZpgq%q!2iHyT z-)IT>G^4_hT=g>USzLI4|5=M_7d#qewW|g5LB= zy6o!tnrZL?;X~1Tv`$(G58&Ed@Daa{+;VU7S8O574k@tIj`po9Ki;p)BNi^)RK)(UFV;0$LNcsVf|ydT2ftlU1VR z8aa_mqljhF7W2XQUP|4rN+hP`*@R-|%<;fRd@;_@%i{#GDB!V_X|aDDyQ@cTg8;z z*z(>4kgY0 zRxx*k9Ts@~fks-6s@WF#kTPc}hzw%SjJp_X_i1l!G!Ga{w{?wq*4?TDmQjKth!rMt zJ!GIb?{k!mzWv5T@>;Nh^d(51wj8|(gq6yOMUZsmO+!=y4 ziU9-m{+}@ltklaj&psXW?-s%>d3b(C`4m2bCV4jT+@2Yp2V^b2MIWemPUUPL+?G8? zYRY!b_8)l(fuE(kx!1p8vp6AWzlJTzv@ku1Pf}VEs+IZU_$Zd?9;KxwuttW}ee5=1o?~_%Mx)NpxAR^J`Ji7Zsw%K`0yN82(MG{v~TkNXF0NYWz4G#@K+2 z*+zy--9W{J3m8>0@&|{|z1mEm#vK|q#x+L$DpqTP<~OX+H`N6VKcH_DM8PjLrNo6$ z7W6j)Ie?y7UUD`n2p%%g+<>2RYh;>p%7x;xX+iWp z>561MBV(FZKjx--QE9Xor9kHaRhvgpfnm2?Zjv}ujQD{y;0Xlq+EndMzSGsLTb0T? ztvA2`BR*(RQe?mUib*k{YU0Dw_Ppu6f!j-Trpp^Q(N_ODC3}5N6LE3$#u7yhjc0 zA6>h(lcsV^p&Bd4N9{YfB>QXU8nbA8g9kMbV@G_>GouLfGdIHsvlmrRZDBqKuIF5x1@0PhbKX&YP7}SG#o|G6J zhP-CTjfdIL1tdA$7=|O=_*y)9Dn=Ce$ctRDt$uN*o9ZqG@#~xl^3s1PHv)f|bca$? zwV~qIk4}*FyG&twYZGo%m3;A42FB)V!5E>lq?kpyt?c@^IidiT*{9LIgBBQ72;qGB zUv8zZU5(%fw}To|*oc$`i*sERE}Pg=v&^9RyTixQ2P>%)2@-ye;Zp^;Nwv_<4ezU1 z{nD4uTKKWd`l>NSCK^I7Py|eNVoMUG6`1vWw7>##Rd6UFe*hkWUgf-Ex;j^Od^*() zPH^(HS2X@(O7Oe8HyWz=msH%e?G3hMxFJ|(R#dV;I7*wI+@ZU1i5@P3Ghe)WgIU1G zDSdex0v05qM2m&kuL~@(Oda!N5nTvafzx#6c#Yq{ZHM2J4a zSmwh4UTb>z0=pv{*l1Thl;LA@gqf;7=%@G_?pSWGOc;LQW1SebrhG7G zm%)3A&BEuSQMXoQ&kGxApy)z-u&@k>{Lr(t7mz%NIGGQ^X`7^b_ZYwYaa~3=R0ILU zchpa1;#CLhb)C4t+oO;g-gN=#TpAwPN(TbClq;lANIuO1mGPvpqb7Y{26Lm)PjjSR zK`*ET8~Q0_atiAhwKi2ZMFF(rn=pu_U8ZjsA?+;gFWB~YY{i4r@*^SWqM`?rr5!o~ zE@~4>+5TM=y~5l+S>m-I72kf`auFFbdU{b zFi>XJLq!2aE(FjqUy&Sjs#s*p16`?rC8-9za>+nXvBG+W{oC^+OrEfbB_5-#OGU82 z(2CC$lNbf20Y6c(z+?0`&f8K$*~9;yIel@e%K~~kq9>D6F}Q1X$>4q7OZ!u=YQO&& zt#o6xrRdf6zp=W&f_L+^SR$Agoc4qfjx*~C(op8G#!47eCi*w5bC?Kj^aY zwT&pZ!U_4;=q;7Wb6z$YlGtlS+{ns0kDmw73)~I>C3DU}X-OTtsA~n}I5c#4qTE9R z$hX;r^9UN0&UG$B8DRsX;yWB3bxnLNlq%x6{j!h%pA;ZpxTvmtzi&DIbdEP$dD4}C zoz2d^u}NiH73VH3u^HcLu`jX7wuQjJpt0X7K_vODVSYSv8$!IHeA!4u?QDbMZQ-&(8^1&z{s5~`-V!Vb8rXr0J>u^M2F%QNrU>&X_C z-9AydRJDIKMv6Awu{4f*LIS#~mCwZLu0Wqs=5wei)i1@7Mzjz#D~oEOIL)Y>Nx>`yMs}ORnQ4(+47cC_|QA4W)ALkk2z|0S$*HvfaR>Cqk&EM1x-xPb5YFo92 zPlY45pg?(MAZ)@|W9W(>rQP6tb#vsZ=S>{f$SBXO$n4|^pFQPm!b5m=^ApUM375`< zc%2VM)JPoycIn$bCA^ffgQIG0np#oJkN9O@BQ1VsmA@mx8wK{~CO|y;f*c2rco8zW z*h0B(DR^bJurvTor6;*Oaee7~?81i*nJT#f*E>Z+t%%{mWlzBMOl|a{i)w_biUu6b zYjcDWoh_uA(A;RcL8xo;see;GQKlNI(#wf^g-FMdXCz;k`Ea-HlO2{afFkrq+6Iie z151B^PPSB19rJ-9!&-rf4LJ#QgP9wnnU zS!SPPkMU%r-mgC0C7m3`bYN!Hx-2+x+I*3rMqObRt7oXfNp~Xlj(enFi*uf9uqSU8 zuYbg>+EHM8+%fIoD8(iIL?d~`VI#)AsP@FWGLiQ*XDr$)xSEUuSWd?k%w}?5J3!tYEE)?_FO9M%>2{VJ80rEAUq@s6tNnGhA z+q|o!7Ou>*0?yrIEh;EUJf7N7J`=gO!r-%%uh>`OeMGi9TEiVP2ILeH2vzZyKT!1# ze3*XIdQww-SwF{^+=DlgAI%w3nrlo@CPX(F`RBPH3U%vhz)kLUWTRX&G$s;zdSHVo=s56)dm z6)bOyNxnlF#+7kjGF{T+`7s&2RyJUt6ibyngmE{*v@D`a8M*YKR2At(!9^EnJ!x`<%5; zt4|Ol3}6dxu#K;&{`wG+M~n=sP6P$vZGG#xGggdqZNvQ7&7fU9@R;*ZE2vP$lv_^9 z6)i`+1Q*}Ythb2?Q?~Z+f%uh}aQ2SR&xv&>dO3{5fiG3Cy9L_IQjrv{bckM*RBM7*7gMV`>{b?-MR?!ffkSNmXN6Qxs|Fb1ZK9CjXzL{|7&B zjZgIgB{A};CDTBB^ckKa+lL14U2bMd%1dTIDzx-Q#eeEMY9Z^6FLqzCU7e zseH%w)x{8o=Ogs2gUU^x!cLWPH~qIfx8a{U#0+Xx5;AXi#Y>!p{gQ&mLkf}0pAyHv zHbuKevc3;_yolL=OQQ2<2aX5x>&R^!#Z+nzO{Bi7418Vg?)4oyShi%7jkt_+g@Sri zgt-1+9&sXDXPHn3tYVCq>rzF`VZ-Y9#i^s;Q=3?N9$L?BW|cK}n-Qp#J5x^VHJ$#tQU8)M&n&4DGn;-9oX5I7J)BT!A`JAKIc?Hg z{AjxnfSV*E6r+9Nf4dEAJ9We?rFAGKewWiaoDyNKvm$LlX{HTE9!zYX2v8x6(_Q}W z5{|C7huLHinD!IOvqjvrHLugGa@FBmlj66_;@u0TYB#9=5OnMO!=S#Zk5hC|5yY*A zqBQo+$^IlWlP1bTu(Qad+{z3-0@4~X|6VooKDK6T==_TQ{@gYDTDGsjg^48i-0+gEUImqXS5k|?7UwpE&)Wg5WK zMZxTeVP*R6`>6Jr@=LJ2colS|YyIB&(ta)Vs7&k4)~Dg|9b)&+lXGKMEmmcDzy}p_ zPztNUJ{EuQiY_l0$Bul3@wAPCAWCvRr;bS@yg;+;|UeXr+C%-(A;>A^K$ zcwO7aS*CQp3eT3~V2Aw@53=~Z?kqP79?tm-wx-qAkWGMQ;`Dn^isjmVM8Elm6x;IS zCZT0nk5@w%jx%Gjeu{$UaaJNgCpYah`~Prh9!11O%aQDP?3=(I=*}K@uI|D^ho6p( zAGKWL!BvFM*C+4Z%N+)dIV#4nxR0942x4a6f1pD*kZs>ZN~BwAO-p0*4juj*Kz)3- z9wP_zy-MCuJ`Rc0w6U$t`2Oa%iczB~KJ!$8_sd)6wF3@{|EAa?4`lZ{EN`~|2zV7% znLfpL5kosxFn{ahcU;*|sl~JKh76Sh@(W9SWtmy+8Zi(4lDQU5(x|;|kK>1_7l;`M zpys;gM*aTOSkL}0p1^ig&;p8CpM$3&ZKs(~7dUPidR-ep``a*~OQ!^0$PsG&2e<6aU2Gf6AvcLfEavU0-CfQbg;& zv-G8U;hUmhUe92>^pQ!IF*hpN#Bev3>3z(u{{-l!&#LC@gR)ZPAw}Y%Hj*D}e^LDy zv%V|)j&;M^DTOcs<*mH$Jz!Pd@qS37diwHcGuyuOhss;FRlwIs1?p^@LZ^^%n&g}U zUaB)a==NE%l3ubpkNw$8sY@JG8-p$`Ku8tNeZM=KJGEFT09>{6fjw z_s)~)%uifV4!e-TFZ!frP}o%iPxM#m-7H3uXjmL4`q&j#9p_LAUG`zt|7yuNOODyAw?& zDD`8;@dAWw|Q{t={KAFjfj?WIJuIh+P4(`HZ}tbO89^HRf1zoqFTz?39knCer!tSH&}nS(;qnOaFqA KZt=P6_x}UscR str: + link = f"{self.pr_url}/#L{relevant_file}T{relevant_line_start}" + return link + def generate_link_to_relevant_line_number(self, suggestion) -> str: try: relevant_file = suggestion['relevant file'].strip('`').strip("'") diff --git a/pr_agent/git_providers/github_provider.py b/pr_agent/git_providers/github_provider.py index ea2476bc..1fb85164 100644 --- a/pr_agent/git_providers/github_provider.py +++ b/pr_agent/git_providers/github_provider.py @@ -501,7 +501,6 @@ class GithubProvider(GitProvider): return "" - def get_line_link(self, relevant_file: str, relevant_line_start: int, relevant_line_end: int = None) -> str: sha_file = hashlib.sha256(relevant_file.encode('utf-8')).hexdigest() if relevant_line_end: diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index 7027fa2b..a65659d3 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -255,9 +255,9 @@ class PRCodeSuggestions: s['relevant lines end']) data_markdown += f"\n๐Ÿ’ก Suggestion:\n\n**{s['suggestion content']}**\n\n" if code_snippet_link: - data_markdown += f" File: [{s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})]({code_snippet_link})\n" + data_markdown += f" File: [{s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})]({code_snippet_link})\n\n" else: - data_markdown += f"File: {s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})\n" + data_markdown += f"File: {s['relevant file']} ({s['relevant lines start']}-{s['relevant lines end']})\n\n" if self.git_provider.is_supported("gfm_markdown"): data_markdown += "

Example code:\n\n" data_markdown += f"___\n\n" From 2022018d4cb18303c28de9d2be35d5b61b8072ab Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 17:16:04 +0200 Subject: [PATCH 31/38] update tests --- tests/unittest/test_parse_code_suggestion.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unittest/test_parse_code_suggestion.py b/tests/unittest/test_parse_code_suggestion.py index aaa03f72..a7a5ecc2 100644 --- a/tests/unittest/test_parse_code_suggestion.py +++ b/tests/unittest/test_parse_code_suggestion.py @@ -61,7 +61,7 @@ class TestParseCodeSuggestion: 'before': 'Before 1', 'after': 'After 1' } - expected_output = " **suggestion:** Suggestion 1\n **description:** Description 1\n **before:** Before 1\n **after:** After 1\n\n" # noqa: E501 + expected_output = ' **suggestion:** Suggestion 1 \n **description:** Description 1 \n **before:** Before 1 \n **after:** After 1 \n\n' # noqa: E501 assert parse_code_suggestion(code_suggestions) == expected_output # Tests that function returns correct output when input dictionary has 'code example' key @@ -74,5 +74,5 @@ class TestParseCodeSuggestion: 'after': 'After 2' } } - expected_output = " **suggestion:** Suggestion 2\n **description:** Description 2\n - **code example:**\n - **before:**\n ```\n Before 2\n ```\n - **after:**\n ```\n After 2\n ```\n\n" # noqa: E501 + expected_output = ' **suggestion:** Suggestion 2 \n **description:** Description 2 \n - **code example:**\n - **before:**\n ```\n Before 2\n ```\n - **after:**\n ```\n After 2\n ```\n\n' # noqa: E501 assert parse_code_suggestion(code_suggestions) == expected_output From 2202ff1cdf192a6ef596c7adbc650bce5c286bbb Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 17:17:36 +0200 Subject: [PATCH 32/38] s --- docs/IMPROVE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/IMPROVE.md b/docs/IMPROVE.md index 1501ea1d..a4043ec2 100644 --- a/docs/IMPROVE.md +++ b/docs/IMPROVE.md @@ -35,12 +35,12 @@ Under the section 'pr_code_suggestions', the [configuration file](./../pr_agent/ #### summarize mode - `summarize`: if set to true, the tool will summarize the PR code changes. Default is false. + In this mode, instead of presenting commitable suggestions, the different suggestions will be combined into a single compact instruction, with a significant smaller PR footprint. For example: `/improve --pr_code_suggestions.summarize=true` - - + #### A note on code suggestions quality From 466af37675b04a4e0698d7af62935610b32cc676 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 17:21:02 +0200 Subject: [PATCH 33/38] s --- docs/IMPROVE.md | 4 +++- tests/unittest/test_convert_to_markdown.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/IMPROVE.md b/docs/IMPROVE.md index a4043ec2..5eb190f1 100644 --- a/docs/IMPROVE.md +++ b/docs/IMPROVE.md @@ -36,8 +36,10 @@ Under the section 'pr_code_suggestions', the [configuration file](./../pr_agent/ #### summarize mode - `summarize`: if set to true, the tool will summarize the PR code changes. Default is false. -In this mode, instead of presenting commitable suggestions, the different suggestions will be combined into a single compact instruction, with a significant smaller PR footprint. +In this mode, instead of presenting commitable suggestions, the different suggestions will be combined into a single compact comment, with a significant smaller PR footprint. + For example: + `/improve --pr_code_suggestions.summarize=true` diff --git a/tests/unittest/test_convert_to_markdown.py b/tests/unittest/test_convert_to_markdown.py index bb6f2268..b03c4fde 100644 --- a/tests/unittest/test_convert_to_markdown.py +++ b/tests/unittest/test_convert_to_markdown.py @@ -71,7 +71,7 @@ class TestConvertToMarkdown: - ๐Ÿ“Œ **Type of PR:** Test type\n\ - ๐Ÿงช **Relevant tests added:** no\n\ - โœจ **Focused PR:** Yes\n\ -- **General PR suggestions:** general suggestion...\n\n\n- **
๐Ÿค– Code feedback:**\n\n - **Code example:**\n - **Before:**\n ```\n Code before\n ```\n - **After:**\n ```\n Code after\n ```\n\n - **Code example:**\n - **Before:**\n ```\n Code before 2\n ```\n - **After:**\n ```\n Code after 2\n ```\n\n
\ +- **General PR suggestions:** general suggestion...\n\n\n-
๐Ÿค– Code feedback:\n\n - **Code example:**\n - **Before:**\n ```\n Code before\n ```\n - **After:**\n ```\n Code after\n ```\n\n - **Code example:**\n - **Before:**\n ```\n Code before 2\n ```\n - **After:**\n ```\n Code after 2\n ```\n\n
\ """ assert convert_to_markdown(input_data).strip() == expected_output.strip() From 5ff9aaedfd22078917b1e296226075e1bdc7927f Mon Sep 17 00:00:00 2001 From: mrT23 Date: Sun, 26 Nov 2023 17:41:20 +0200 Subject: [PATCH 34/38] Update IMPROVE.md --- docs/IMPROVE.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/IMPROVE.md b/docs/IMPROVE.md index 5eb190f1..81be15e5 100644 --- a/docs/IMPROVE.md +++ b/docs/IMPROVE.md @@ -1,6 +1,6 @@ # Improve Tool -The `improve` tool scans the PR code changes, and automatically generate committable suggestions for improving the PR code. +The `improve` tool scans the PR code changes, and automatically generates committable suggestions for improving the PR code. It can be invoked manually by commenting on any PR: ``` /improve @@ -17,7 +17,7 @@ An extended mode, which does not involve PR Compression and provides more compre /improve --extended ``` Note that the extended mode divides the PR code changes into chunks, up to the token limits, where each chunk is handled separately (multiple calls to GPT-4). -Hence, the total number of suggestions is proportional to the number of chunks, i.e. the size of the PR. +Hence, the total number of suggestions is proportional to the number of chunks, i.e., the size of the PR. ### Configuration options @@ -34,9 +34,9 @@ Under the section 'pr_code_suggestions', the [configuration file](./../pr_agent/ - `final_clip_factor`: factor to remove suggestions with low confidence. Default is 0.9. #### summarize mode -- `summarize`: if set to true, the tool will summarize the PR code changes. Default is false. +- `summarize`: if set to true, the tool will present the code suggestions in a compact way. Default is false. -In this mode, instead of presenting commitable suggestions, the different suggestions will be combined into a single compact comment, with a significant smaller PR footprint. +In this mode, instead of presenting committable suggestions, the different suggestions will be combined into a single compact comment, with significantly smaller PR footprint. For example: @@ -46,10 +46,10 @@ For example: #### A note on code suggestions quality -- With current level of AI for code (GPT-4), mistakes can happen. Not all the suggestions will be perfect, and a user should not accept all of them automatically. +- With the current level of AI for code (GPT-4), mistakes can happen. Not all the suggestions will be perfect, and a user should not accept all of them automatically. - Suggestions are not meant to be [simplistic](./../pr_agent/settings/pr_code_suggestions_prompts.toml#L34). Instead, they aim to give deep feedback and raise questions, ideas and thoughts to the user, who can then use his judgment, experience, and understanding of the code base. - Recommended to use the 'extra_instructions' field to guide the model to suggestions that are more relevant to the specific needs of the project. -- Best quality will be obtained by using 'improve --extended' mode. \ No newline at end of file +- Best quality will be obtained by using 'improve --extended' mode. From 70a957caf05f2df4e2f486bb0b65eba26ca9edf4 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Mon, 27 Nov 2023 07:35:17 +0200 Subject: [PATCH 35/38] AUTO_IMPROVE --- .github/workflows/pr-agent-review.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr-agent-review.yaml b/.github/workflows/pr-agent-review.yaml index 166e83de..8bc1e3a1 100644 --- a/.github/workflows/pr-agent-review.yaml +++ b/.github/workflows/pr-agent-review.yaml @@ -26,6 +26,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PINECONE.API_KEY: ${{ secrets.PINECONE_API_KEY }} PINECONE.ENVIRONMENT: ${{ secrets.PINECONE_ENVIRONMENT }} - GITHUB_ACTION.AUTO_REVIEW: true + GITHUB_ACTION.AUTO_REVIEW: 'true' + GITHUB_ACTION.AUTO_IMPROVE: 'true' From b8e4d10b9dfb37d4e862d85b7dcee1798aa4f8a9 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Mon, 27 Nov 2023 07:36:02 +0200 Subject: [PATCH 36/38] summarize=true --- .pr_agent.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.pr_agent.toml b/.pr_agent.toml index 6937b547..7fc8ea8a 100644 --- a/.pr_agent.toml +++ b/.pr_agent.toml @@ -1,2 +1,6 @@ [pr_reviewer] -enable_review_labels_effort = true \ No newline at end of file +enable_review_labels_effort = true + + +[pr_code_suggestions] +summarize=true From c6cc676275e53e3657690c51e90399c755de8613 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Mon, 27 Nov 2023 08:22:58 +0200 Subject: [PATCH 37/38] Update pr-agent-review.yaml --- .github/workflows/pr-agent-review.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-agent-review.yaml b/.github/workflows/pr-agent-review.yaml index 8bc1e3a1..46653c3a 100644 --- a/.github/workflows/pr-agent-review.yaml +++ b/.github/workflows/pr-agent-review.yaml @@ -26,7 +26,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PINECONE.API_KEY: ${{ secrets.PINECONE_API_KEY }} PINECONE.ENVIRONMENT: ${{ secrets.PINECONE_ENVIRONMENT }} - GITHUB_ACTION.AUTO_REVIEW: 'true' - GITHUB_ACTION.AUTO_IMPROVE: 'true' + github_action.auto_review: 'true' + github_action.auto_improve: 'true' From 5f6fa5a082ab731bea204966b1acbec041290b13 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Mon, 27 Nov 2023 16:18:02 +0200 Subject: [PATCH 38/38] Update Usage.md --- Usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Usage.md b/Usage.md index d4a7b230..95707773 100644 --- a/Usage.md +++ b/Usage.md @@ -117,7 +117,7 @@ Any configuration value in [configuration file](pr_agent/settings/configuration. ### Working with GitHub App When running PR-Agent from GitHub App, the default [configuration file](pr_agent/settings/configuration.toml) from a pre-built docker will be initially loaded. -By uploading a local `.pr_agent.toml` file to the root of the repo's main branch, you can edit and customize any configuration parameter. +By uploading a local `.pr_agent.toml` file to the root of the repo's main branch, you can edit and customize any configuration parameter. Note that you need to upload `.pr_agent.toml` prior to creating a PR, in order for the configuration to take effect. For example, if you set in `.pr_agent.toml`: