From 590d12eba07cad88cd98361dd7b55dd1dc194773 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Mon, 5 Feb 2024 16:07:55 +0100 Subject: [PATCH 01/19] Self test maintenance --- test/component_test.py | 4 +-- test/testconfig/TestConfig.py | 28 ++++++++++++++++-- test/testfiles/jpp-test_config_1002.jsonp | 3 -- test/testfiles/jpp-test_config_1003.jsonp | 35 +++++++++++++++++++++++ 4 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 test/testfiles/jpp-test_config_1003.jsonp diff --git a/test/component_test.py b/test/component_test.py index 522f072a..c2cac44b 100644 --- a/test/component_test.py +++ b/test/component_test.py @@ -22,8 +22,8 @@ # # -------------------------------------------------------------------------------------------------------------- # -VERSION = "0.25.0" -VERSION_DATE = "24.01.2024" +VERSION = "0.26.0" +VERSION_DATE = "05.02.2024" # # -------------------------------------------------------------------------------------------------------------- #TM*** diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 809c2af7..47f725c9 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -22,7 +22,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -# 24.01.2024 +# 02.02.2024 # # !!! Temporarily tests are deactivated by the following line commented out: # # # listofdictUsecases.append(dictUsecase) @@ -2309,10 +2309,34 @@ [DICT] (5/4) > {testdict_2} [DICT] (1/1) > {subKey} [DICT] (1/1) > {subKey} [DICT] (1/1) > {paramA} [DICT] (3/1) > {B} [INT] : 2 [DICT] (5/4) > {testdict_2} [DICT] (1/1) > {subKey} [DICT] (1/1) > {subKey} [DICT] (1/1) > {paramA} [DICT] (3/2) > {paramB} [DICT] (1/1) > {C} [INT] : 3 [DICT] (5/4) > {testdict_2} [DICT] (1/1) > {subKey} [DICT] (1/1) > {subKey} [DICT] (1/1) > {paramA} [DICT] (3/3) > {paramC} [DICT] (1/1) > {D} [INT] : 4 -[DICT] (5/5) > {testdict_3} [DICT] (1/1) > {paramD} [DICT] (1/1) > {paramE} [DICT] (1/1) > {paramD} [DICT] (1/1) > {E} [DICT] (1/1) > {F} [INT] : 6""" +[DICT] (5/5) > {testdict_3} [DICT] (1/1) > {paramD} [DICT] (1/1) > {paramE} [DICT] (1/1) > {paramD} [DICT] (1/1) > {E} [DICT] (1/1) > {F} [INT] : 6 +""" listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +# >>>>>>>>>>>>>>>>>>>>>>>>> currently fail +dictUsecase['TESTID'] = "JPP_1003" +dictUsecase['DESCRIPTION'] = "JSON file with combinations of implicit and explicit creation / access to implicitly created keys by parameters" +dictUsecase['EXPECTATION'] = "JsonPreprocessor returns values" +dictUsecase['SECTION'] = "IMPLICIT_CREATION" +dictUsecase['SUBSECTION'] = "GOODCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1003.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = None +dictUsecase['EXPECTEDRETURN'] = """ +[DICT] (7/1) > {testdict2} [DICT] (1/1) > {subKey1} [DICT] (1/1) > {subKey2} [DICT] (1/1) > {subKey3} [DICT] (1/1) > {subKey4} [INT] : 3 +[DICT] (7/2) > {param1} [STR] : 'subKey1' +[DICT] (7/3) > {param2} [STR] : 'subKey2' +[DICT] (7/4) > {param3} [STR] : 'subKey3' +[DICT] (7/5) > {param4} [STR] : 'subKey4' +[DICT] (7/6) > {param5} [INT] : 3 +[DICT] (7/7) > {testdict1} [DICT] (1/1) > {subKey1} [DICT] (1/1) > {subKey2} [DICT] (1/1) > {subKey3} [DICT] (1/1) > {subKey4} [INT] : 2 +""" +# # # listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} dictUsecase['TESTID'] = "JPP_1050" diff --git a/test/testfiles/jpp-test_config_1002.jsonp b/test/testfiles/jpp-test_config_1002.jsonp index 079052fb..bb9b14a1 100644 --- a/test/testfiles/jpp-test_config_1002.jsonp +++ b/test/testfiles/jpp-test_config_1002.jsonp @@ -33,9 +33,6 @@ ${testdict_3.paramD.paramE.paramD} : {"E" : 5}, // // usage of parameters allowed only in case of a key with this name already exists - - - ${testdict_3.paramD.paramE.paramD}[${paramE}] : {"F" : 6} // ${paramE} is accepted because the value is "E" and a key with this name already exists } diff --git a/test/testfiles/jpp-test_config_1003.jsonp b/test/testfiles/jpp-test_config_1003.jsonp new file mode 100644 index 00000000..fffc84a2 --- /dev/null +++ b/test/testfiles/jpp-test_config_1003.jsonp @@ -0,0 +1,35 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** + +{ + // implicitly created data structure + ${testdict1.subKey1.subKey2.subKey3} : {"subKey4" : 1}, + "testdict2" : ${testdict1}, // by value + // + // parameters containing names of existing keys + "param1" : "subKey1", + "param2" : "subKey2", + "param3" : "subKey3", + "param4" : "subKey4", + // + // access to implicitly created keys by parameters (standard notation); all are strings, therefore single quotes do not matter + ${testdict1}[${param1}]['${param2}']['subKey3'][${param4}] : 2, + // access to implicitly created keys by parameters (dotdict notation) + ${testdict2.${param1}.subKey2.${param3}.subKey4} : 3, + // assign modified values to new parameters + "param5" : ${testdict1}[${param1}]['${param2}']['subKey3'][${param4}] + // "param6" : ${testdict2.${param1}.subKey2.${param3}.subKey4} // 'Invalid nested parameter format: ${testdict2.${param1}.subKey2.${param3}.subKey4} - The double quotes are missing!!!'! +} + From 6a25b1ae4af16469c7618b986f2ea1b92b98544b Mon Sep 17 00:00:00 2001 From: mas2hc Date: Mon, 19 Feb 2024 16:40:39 +0700 Subject: [PATCH 02/19] Fix bug 211 - Problems while accessing dictionary keys --- JsonPreprocessor/CJsonPreprocessor.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index a2039d8c..f7e60e7d 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -878,7 +878,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: if re.search("\[[0-9\s]*[A-Za-z_]+[0-9\s]*\]", sInputStr): self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid syntax! A sub-element in {sInputStr.strip()} has to enclosed in quotes.") - if re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr.lower()): + if re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr): sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) self.lNestedParams.append(nestedParam) @@ -886,8 +886,10 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) self.lNestedParams.append(nestedParam) sInputStr = sInputStr.replace(nestedParam, nestedParam + CNameMangling.STRINGCONVERT.value) - elif re.match("\s*{*\[*\".+\"\s*", sInputStr.lower()) and sInputStr.count("\"")==2 \ - and re.search("(" + nestedPattern + ")*", sInputStr.lower()): + elif ((re.match("\s*{*\[*\".+\"\s*", sInputStr) and sInputStr.count("\"")==2) \ + or (re.match("^\s*\${.+}[,\s]*$", sInputStr) and sInputStr.count("{")==sInputStr.count("}") \ + and not re.search("(? str: self.lNestedParams.append(nestedBase) sInputStr = __recursiveNestedHandling(sInputStr, tmpList) + if re.match("^\s*\${.+}[,\s]*$", sInputStr): + sInputStr = "\"" + sInputStr + "\"" + else: + re.sub("\"(\${.+})\"", "\"str(\\1)\"", sInputStr) elif "," in sInputStr: if not re.match("^\s*\".+\"\s*$", sInputStr): self.__reset(bCleanGlobalVars=True) @@ -946,7 +952,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: lNestedParam = re.findall("(" + nestedPattern + ")", sInputStr) for nestedParam in lNestedParam: self.lNestedParams.append(nestedParam[0]) - if re.match(listPattern, sInputStr.lower()): + if re.match(listPattern, sInputStr): items = sInputStr.split(",") newInputStr = '' for item in items: From 76d73d7c7563cb85807c44007e63169ab6c3eb96 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Mon, 19 Feb 2024 21:31:22 +0700 Subject: [PATCH 03/19] Optimize regular expression patterns --- JsonPreprocessor/CJsonPreprocessor.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index f7e60e7d..d25bdfe7 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -878,15 +878,15 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: if re.search("\[[0-9\s]*[A-Za-z_]+[0-9\s]*\]", sInputStr): self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid syntax! A sub-element in {sInputStr.strip()} has to enclosed in quotes.") - if re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr): + if re.match("^\s*" + nestedPattern + "[\s,\]}]*$", sInputStr): sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) - nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) + nestedParam = re.sub("^\s*\"(.+)\".*$", "\\1", sInputStr) self.lNestedParams.append(nestedParam) - elif re.match("^\s*\"\s*" + nestedPattern + "\"\s*,*\]*}*\s*$", sInputStr.lower()): - nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) + elif re.match("^\s*\"\s*" + nestedPattern + "\"[\s,\]}]*$", sInputStr.lower()): + nestedParam = re.sub("^\s*\"(.+)\".*$", "\\1", sInputStr) self.lNestedParams.append(nestedParam) sInputStr = sInputStr.replace(nestedParam, nestedParam + CNameMangling.STRINGCONVERT.value) - elif ((re.match("\s*{*\[*\".+\"\s*", sInputStr) and sInputStr.count("\"")==2) \ + elif ((re.match("[\s{\[]*\".+\"\s*", sInputStr) and sInputStr.count("\"")==2) \ or (re.match("^\s*\${.+}[,\s]*$", sInputStr) and sInputStr.count("{")==sInputStr.count("}") \ and not re.search("(? str: if nestedParam.count("${") > 1: tmpNested = nestedParam if "[" in tmpNested: - pattern = "\[\s*'*\s*(\${\s*[0-9A-Za-z\.\-_${}\[\]]*\s*})\s*'*\s*\]" + pattern = "\[[\s']*(\${\s*[0-9A-Za-z\.\-_${}\[\]]*\s*})[\s']*\]" lNestedBase.append(re.findall(pattern, tmpNested)[0]) for item in re.findall(pattern, tmpNested): tmpItem = item @@ -948,7 +948,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") listPattern = "^\s*(\"*" + nestedPattern + "\"*\s*,+\s*|" + valueStrPattern + "\s*,+\s*|" + valueNumberPattern + "\s*,+\s*)+" + \ - "(\"*" + nestedPattern + "\"*\s*,*\s*|" + valueStrPattern + "\s*,*\s*|" + valueNumberPattern + "\s*,*\s*)*\]*}*\s*$" + "(\"*" + nestedPattern + "\"*\s*,*\s*|" + valueStrPattern + "\s*,*\s*|" + valueNumberPattern + "[\s,]*)*[\]}\s]*$" lNestedParam = re.findall("(" + nestedPattern + ")", sInputStr) for nestedParam in lNestedParam: self.lNestedParams.append(nestedParam[0]) @@ -958,7 +958,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: for item in items: tmpItem = item if "${" in item: - if not re.match("^\s*\"*" + nestedPattern + "\"*\]*}*\s*$", item): + if not re.match("^[\s\"]*" + nestedPattern + "[\"\]}\s]*$", item): self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid nested parameter format: {item}") elif re.match("^\s*\".*" + nestedPattern + ".*\"\s*$", item): @@ -967,9 +967,9 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: for subItem in re.findall("(str\(" + nestedPattern + "\))", item): tmpList.append(subItem[0]) item = __recursiveNestedHandling(item, tmpList) - elif re.match("^\s*" + nestedPattern + "\s*\]*}*\s*$", item): + elif re.match("^\s*" + nestedPattern + "[\s\]}]*$", item): item = re.sub("(" + nestedPattern + ")", "\"\\1\"", item) - nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", item) + nestedParam = re.sub("^\s*\"(.+)\".*$", "\\1", item) self.lNestedParams.append(nestedParam) newInputStr = newInputStr + item if tmpItem==items[len(items)-1] else newInputStr + item + "," sInputStr = newInputStr @@ -1170,13 +1170,13 @@ def __checkKeynameFormat(oJson : dict): indexList.pop(0) i+=1 newSubItem = "" - if re.search("^\s*\[.+\]\s*,*\s*$", item) and item.count('[')==item.count(']'): + if re.search("^\s*\[.+\][\s,]*$", item) and item.count('[')==item.count(']'): item = item.strip() bLastElement = True if item.endswith(","): bLastElement = False item = re.sub("^\[", "", item) - item = re.sub("\s*\]\s*,*$", "", item) + item = re.sub("\s*\][\s,]*$", "", item) newSubItem = __handleListElements(item) newSubItem = "[" + newSubItem + "]" if bLastElement else "[" + newSubItem + "]," elif re.search("^\s*\[.*\${.+", item): @@ -1189,7 +1189,7 @@ def __checkKeynameFormat(oJson : dict): bLastElement = True if item.endswith(","): bLastElement = False - item = re.sub("\s*\]\s*,*$", "", item) + item = re.sub("\s*\][\s,]*$", "", item) newSubItem = __handleListElements(item) newSubItem = newSubItem + "]" if bLastElement else newSubItem + "]," else: From 6c699e1be1c8be736543055e278434d0c5095fd3 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 21 Feb 2024 22:31:49 +0700 Subject: [PATCH 04/19] Bug fix 209 - Value change of dictionary key does not work --- JsonPreprocessor/CJsonPreprocessor.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index d25bdfe7..31686d5d 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -828,6 +828,13 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): __jsonUpdated(k, v, oJson, bNested, keyNested) if keyNested != '' and not bStrConvert: + transTable = str.maketrans({"[":"\[", "]":"\]"}) + tmpList = [] + for key in self.dUpdatedParams: + if re.match("^" + k.translate(transTable) + "\['.+$", key): + tmpList.append(key) + for item in tmpList: + self.dUpdatedParams.pop(item) self.dUpdatedParams.update({k:v}) del tmpJson return oJson, bNested From 926feca62e367407aa46b680d9d6726669f428d3 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 28 Feb 2024 14:05:06 +0700 Subject: [PATCH 05/19] Ticket 210 - Improvement duplicated keys handling --- JsonPreprocessor/CJsonPreprocessor.py | 180 +++++++++++++------------- 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 31686d5d..e1c63696 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -49,7 +49,6 @@ import json import re import sys -import platform import copy import shlex @@ -64,9 +63,7 @@ class CSyntaxType(): class CNameMangling(Enum): AVOIDDATATYPE = "JPavoidDataType_" COLONS = "__handleColonsInLine__" - DUPLICATEDKEY_00 = "__rootDuplicatedKey__" DUPLICATEDKEY_01 = "__handleDuplicatedKey__" - DUPLICATEDKEY_02 = "__RecursiveInitialValue__" STRINGCONVERT = "__ConvertParameterToString__" LISTINDEX = "__IndexOfList__" @@ -258,7 +255,7 @@ def __processImportFiles(self, input_data : dict) -> dict: Dictionary as output, dictionary is extended if ``"[import]"`` found and properly imported. ''' out_dict = {} - + i=1 for key, value in input_data: if re.match('^\s*\[\s*import\s*\]\s*', key.lower()): currJsonPath = self.jsonPath @@ -314,6 +311,14 @@ def __processImportFiles(self, input_data : dict) -> dict: if bCheck: key = k1 if k1 == key: + listKeys = list(out_dict.keys()) + index = listKeys.index(key) + newKey = key + CNameMangling.DUPLICATEDKEY_01.value + str(i) + listKeys.insert(index, newKey) + tmpDict = {} + for k in listKeys: + tmpDict[k] = index if k==newKey else out_dict[k] + out_dict = tmpDict if isinstance(out_dict[key], list): if out_dict[key][0] != CNameMangling.DUPLICATEDKEY_01.value: tmpValue = [CNameMangling.DUPLICATEDKEY_01.value, out_dict[key], value] @@ -329,6 +334,7 @@ def __processImportFiles(self, input_data : dict) -> dict: out_dict[key] = value del tmpOutdict out_dict[key] = value + i+=1 return out_dict def __load_and_removeComments(self, jsonFile : str) -> str: @@ -350,7 +356,6 @@ def __load_and_removeComments(self, jsonFile : str) -> str: String version of json file after removing all comments. """ - def replacer(match): s = match.group(0) if s.startswith('/'): @@ -380,7 +385,6 @@ def __checkParamName(self, sInput: str) -> str: **sInput** (*string*) """ - pattern = "\${\s*([0-9A-Za-z_]+[0-9A-Za-z\.\-_]*)\s*}" lParams = re.findall(pattern, sInput) for param in lParams: @@ -597,7 +601,7 @@ def __checkAndCreateNewElement(self, sKey: str, value, bCheck=False, keyNested=' continue return True - def __updateAndReplaceNestedParam(self, oJson : dict, bNested : bool = False, recursive : bool = False): + def __updateAndReplaceNestedParam(self, oJson : dict, bNested : bool = False, recursive : bool = False, parentParams : str = ''): ''' This method replaces all nested parameters in key and value of a json object . @@ -614,10 +618,10 @@ def __updateAndReplaceNestedParam(self, oJson : dict, bNested : bool = False, re Output Json object as dictionary with all variables resolved. ''' - - def __jsonUpdated(k, v, oJson, bNested, keyNested = ''): + def __jsonUpdated(k, v, oJson, bNested, keyNested = '', bDuplicatedHandle=False): if keyNested != '': - del oJson[keyNested] + if not bDuplicatedHandle: + del oJson[keyNested] rootKey = re.sub("\[.*\]", "", k) if re.search("^[0-9]+.*$", rootKey): oJson[f"{rootKey}"] = {} @@ -658,8 +662,8 @@ def __jsonUpdated(k, v, oJson, bNested, keyNested = ''): if bNested: if CNameMangling.AVOIDDATATYPE.value in k: k = re.sub(CNameMangling.AVOIDDATATYPE.value, "", k) - oJson[k] = v - globals().update({k:v}) + oJson[k] = v + globals().update({k:v}) def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): varPattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}" @@ -720,10 +724,6 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): sInputStr = str(ldict['value']) if bValueConvertString else ldict['value'] except: self.__reset(bCleanGlobalVars=True) - if CNameMangling.DUPLICATEDKEY_00.value in valueProcessed: - valueProcessed = valueProcessed.replace(CNameMangling.DUPLICATEDKEY_00.value, '') - elif CNameMangling.DUPLICATEDKEY_02.value in valueProcessed: - valueProcessed = re.sub("(" + CNameMangling.DUPLICATEDKEY_02.value + "[0-9]*)", "", valueProcessed) raise Exception(f"The variable '{valueProcessed}' is not available!") if bKey and type(ldict['value']) in [list, dict]: if CNameMangling.AVOIDDATATYPE.value in valueProcessed: @@ -748,13 +748,29 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): tmpJson = copy.deepcopy(oJson) pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\$\{\}\-_]*\s*}(\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${.+\s*\]+)*" for k, v in tmpJson.items(): + if "${" not in k and CNameMangling.DUPLICATEDKEY_01.value not in k: + parentParams = k if parentParams=='' else parentParams + "['" + k + "']" keyNested = '' bStrConvert = False bImplicitCreation = False - if CNameMangling.DUPLICATEDKEY_00.value in k: + bDuplicatedHandle = False + if re.match("^.+" + CNameMangling.DUPLICATEDKEY_01.value + "\d+$", k): del oJson[k] - k = k.replace(CNameMangling.DUPLICATEDKEY_00.value, '') - oJson[k] = v + dupKey = k + k = re.sub(CNameMangling.DUPLICATEDKEY_01.value + "\d+$", "", k) + value = tmpJson[k].pop(1) + if "${" not in dupKey and "${" not in str(value): + if parentParams != "": + sExec = parentParams + "['" + k + "'] = \"" + value + "\"" if isinstance(value, str) else \ + parentParams + "['" + k + "'] = " + str(value) + else: + sExec = k + " = \"" + value + "\"" if isinstance(value, str) else \ + k + " = " + str(value) + try: + exec(sExec, globals()) + except: + pass + bDuplicatedHandle = True if re.search("(str\(" + pattern + "\))", k.lower()): bStrConvert = True keyNested = k @@ -789,10 +805,9 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): self.__reset(bCleanGlobalVars=True) raise Exception(f"Could not overwrite parameter {k} due to wrong format.\n \ Please check key '{k}' in config file!!!") - + if isinstance(v, dict): - v, bNested = self.__updateAndReplaceNestedParam(v, bNested, recursive=True) - + v, bNested = self.__updateAndReplaceNestedParam(v, bNested, recursive=True, parentParams=parentParams) elif isinstance(v, list): if v[0] != CNameMangling.DUPLICATEDKEY_01.value: tmpValue = [] @@ -807,17 +822,24 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): v = tmpValue del tmpValue else: - i=1 - while i str: items = re.split("\s*,\s*", sInput) j=0 @@ -1044,68 +1080,27 @@ def __handleListElements(sInput : str) -> str: return newItem def __handleDuplicatedKey(dInput : dict) -> dict: - pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}(\[+\s*'[0-9A-Za-z\._]+'\s*\]+|\[+\s*\d+\s*\]+)*" tmpDict = copy.deepcopy(dInput) + listKeys = list(tmpDict.keys()) + dictValues = {} + for key in listKeys: + if CNameMangling.DUPLICATEDKEY_01.value in key: + origKey = re.sub(CNameMangling.DUPLICATEDKEY_01.value + "\d+\s*$", "", key) + dictValues[origKey] = copy.deepcopy(tmpDict[origKey]) for k, v in tmpDict.items(): - if isinstance(v, list) and v[0]==CNameMangling.DUPLICATEDKEY_01.value: - i=1 - dupKey = '' - if re.search(pattern, k): - varPattern = "[0-9A-Za-z_]+[0-9A-Za-z\-_]*" - dupKey = re.search("\.(" + varPattern + ")\s*}\s*$|\['(" + varPattern + ")'\]\s*$", k)[1] - if dupKey != '' and dupKey is not None: - tmpKey = dupKey - else: - tmpKey = k - tmpPattern = "\${\s*" + tmpKey + "\s*}|\${\s*" + tmpKey + "\.|\[\s*'"+ tmpKey + "'\s*\]|\." + tmpKey + "\.*" - if not re.search(pattern, str(v[-1])) or not re.search(tmpPattern, str(v[-1])): - dInput[k] = v[-1] - continue - while i < len(v): - bRecursiveKey = False - if re.search(pattern, str(v[i])) and i>1: - if isinstance(v[i], str): - if re.search(tmpPattern, v[i]) or tmpKey in v[i]: - v[i] = re.sub(tmpKey, tmpKey + CNameMangling.DUPLICATEDKEY_02.value + str(i-1), v[i]) - bRecursiveKey = True - if isinstance(v[i], list): - newList = [] - for item in v[i]: - if re.search(tmpPattern, item) or tmpKey in item: - item = re.sub(tmpKey, tmpKey + CNameMangling.DUPLICATEDKEY_02.value + str(i-1), item) - bRecursiveKey = True - newList.append(item) - v[i] = newList - del newList - if bRecursiveKey: - if dupKey == '': - k1 = k + CNameMangling.DUPLICATEDKEY_02.value + str(i) - else: - k1 = re.sub(dupKey, dupKey + CNameMangling.DUPLICATEDKEY_02.value + str(i), k) - dInput[k1] = v[i] - else: - if dupKey == '': - k1 = k + CNameMangling.DUPLICATEDKEY_02.value + str(i) - else: - k1 = re.sub(dupKey, dupKey + CNameMangling.DUPLICATEDKEY_02.value + str(i), k) - dInput[k1] = v[i] - i+=1 - if dupKey != '' and CNameMangling.DUPLICATEDKEY_02.value in str(v): - del dInput[k] - k = re.sub(dupKey, dupKey + CNameMangling.DUPLICATEDKEY_00.value, k) - dInput[k] = v[1] if len(v)==2 else v + if CNameMangling.DUPLICATEDKEY_01.value in k: + origK = re.sub(CNameMangling.DUPLICATEDKEY_01.value + "\d+\s*$", "", k) + dInput[k] = dictValues[origK].pop(1) if isinstance(v, dict): dInput[k] = __handleDuplicatedKey(v) del tmpDict + del dictValues return dInput def __removeDuplicatedKey(dInput : dict) -> dict: if isinstance(dInput, dict): for k, v in list(dInput.items()): - if CNameMangling.DUPLICATEDKEY_02.value in k: - del dInput[k] - else: - __removeDuplicatedKey(v) + __removeDuplicatedKey(v) elif isinstance(dInput, list): for item in dInput: __removeDuplicatedKey(item) @@ -1199,6 +1194,11 @@ def __checkKeynameFormat(oJson : dict): item = re.sub("\s*\][\s,]*$", "", item) newSubItem = __handleListElements(item) newSubItem = newSubItem + "]" if bLastElement else newSubItem + "]," + elif re.match("^[\s\"]*\${.+[}\]]+[\"\s]*,[\s\"]*\${.+[}\]]+[\"\s]*$", item): + subItems = re.split("\s*,\s*", item) + subItem1 = self.__checkAndUpdateKeyValue(subItems[0], nestedKey) + subItem2 = self.__checkAndUpdateKeyValue(subItems[1], nestedKey=True) + newSubItem = subItem1 + ", " + subItem2 else: newSubItem = self.__checkAndUpdateKeyValue(item, nestedKey) if i str: Normalized path and name of the JSON output file. ''' - outFile = CString.NormalizePath(outFile, sReferencePathAbs=os.path.dirname(os.path.abspath(sys.argv[0]))) jsonObject = json.dumps(oJson, ensure_ascii=False, indent=4) try: From b39e6023f67fc3e2024b7254c211509eeafc047d Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 1 Mar 2024 16:38:40 +0700 Subject: [PATCH 06/19] Tiny change regarding to ticket 211 --- JsonPreprocessor/CJsonPreprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index e1c63696..a8e5894e 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -986,7 +986,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: if re.match("^\s*\${.+}[,\s]*$", sInputStr): sInputStr = "\"" + sInputStr + "\"" else: - re.sub("\"(\${.+})\"", "\"str(\\1)\"", sInputStr) + sInputStr = re.sub("\"(\${.+})\"", "\"str(\\1)\"", sInputStr) elif "," in sInputStr: if not re.match("^\s*\".+\"\s*$", sInputStr): self.__reset(bCleanGlobalVars=True) From aa467aa2bcf82f2e0563a700fe8757d674ea1bd6 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Mon, 4 Mar 2024 15:49:20 +0100 Subject: [PATCH 07/19] Test cases added (but commented out because they belong to current issues) --- test/component_test_single.bat | 40 ++++++++++++++++ test/testconfig/TestConfig.py | 58 ++++++++++++++++++++++- test/testfiles/jpp-test_config_0514.jsonp | 22 +++++++++ test/testfiles/jpp-test_config_0515.jsonp | 25 ++++++++++ test/testfiles/jpp-test_config_0554.jsonp | 19 ++++++++ test/testfiles/jpp-test_config_0555.jsonp | 19 ++++++++ 6 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 test/component_test_single.bat create mode 100644 test/testfiles/jpp-test_config_0514.jsonp create mode 100644 test/testfiles/jpp-test_config_0515.jsonp create mode 100644 test/testfiles/jpp-test_config_0554.jsonp create mode 100644 test/testfiles/jpp-test_config_0555.jsonp diff --git a/test/component_test_single.bat b/test/component_test_single.bat new file mode 100644 index 00000000..4e0db40c --- /dev/null +++ b/test/component_test_single.bat @@ -0,0 +1,40 @@ +@echo off + +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0353;JPP_0354;JPP_0355;JPP_0356;JPP_0357;JPP_0358;JPP_0359;JPP_0360" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0361;JPP_0362;JPP_0363;JPP_0364;JPP_0365;JPP_0366" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0367;JPP_0368;JPP_0369;JPP_0370;JPP_0371" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0450;JPP_0451;JPP_0452;JPP_0453;JPP_0454;JPP_0455;JPP_0456;JPP_0457;JPP_0458" + +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0550;JPP_0900" --recreateinstance + + +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0004" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0268" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0450" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0504" + +"%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0515" + + + +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0507" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0508" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0509" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_1150" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0201;JPP_0900" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0201;JPP_0900" --recreateinstance + +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0457;JPP_0458;JPP_0500;JPP_0501" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --testid="JPP_0450;JPP_0457;JPP_0458;JPP_0500;JPP_0501" + + + + +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --codedump +REM "%RobotPythonPath%/python.exe" "D:/ROBFW/components/python-jsonpreprocessor/test/component_test.py" --configdump + +echo --------------------------------------- +echo component_test returned ERRORLEVEL : %ERRORLEVEL% +echo --------------------------------------- + diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 47f725c9..10422148 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -22,7 +22,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -# 02.02.2024 +# 04.03.2024 # # !!! Temporarily tests are deactivated by the following line commented out: # # # listofdictUsecases.append(dictUsecase) @@ -2075,6 +2075,34 @@ listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_0514" +dictUsecase['DESCRIPTION'] = "JSON file containing nested dollar operator expressions" +dictUsecase['EXPECTATION'] = "JsonPreprocessor returns expected value" +dictUsecase['SECTION'] = "COMPOSITE_EXPRESSIONS" +dictUsecase['SUBSECTION'] = "GOODCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0514.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = None +dictUsecase['EXPECTEDRETURN'] = None # list index out of range +# # # listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_0515" +dictUsecase['DESCRIPTION'] = "JSON file containing nested dollar operator expressions" +dictUsecase['EXPECTATION'] = "JsonPreprocessor returns expected value" +dictUsecase['SECTION'] = "COMPOSITE_EXPRESSIONS" +dictUsecase['SUBSECTION'] = "GOODCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0515.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = None +dictUsecase['EXPECTEDRETURN'] = None # freeze +# # # listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} dictUsecase['TESTID'] = "JPP_0550" @@ -2132,6 +2160,34 @@ listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_0554" +dictUsecase['DESCRIPTION'] = "JSON file containing a dictionary; the dictionary key is defined by a parameter and placed inside the curly brackets (invalid syntax)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "COMPOSITE_EXPRESSIONS" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0554.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = None +dictUsecase['EXPECTEDRETURN'] = None +# # # listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_0555" +dictUsecase['DESCRIPTION'] = "JSON file containing a dictionary; the dictionary key is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "COMPOSITE_EXPRESSIONS" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0555.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = None # !!! currently freeze pf JPP !!! https://github.com/test-fullautomation/python-jsonpreprocessor/issues/226 +dictUsecase['EXPECTEDRETURN'] = None +# # # listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} dictUsecase['TESTID'] = "JPP_0600" diff --git a/test/testfiles/jpp-test_config_0514.jsonp b/test/testfiles/jpp-test_config_0514.jsonp new file mode 100644 index 00000000..da90182c --- /dev/null +++ b/test/testfiles/jpp-test_config_0514.jsonp @@ -0,0 +1,22 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** +{ + "keyP" : "A", + "B" : 1, + "dictP" : {"A" : "B", "C" : 2}, + "newparam_1" : "${${dictP}[${keyP}]}", + "newparam_2" : "${${dictP}['${keyP}']}" +} + diff --git a/test/testfiles/jpp-test_config_0515.jsonp b/test/testfiles/jpp-test_config_0515.jsonp new file mode 100644 index 00000000..a3835990 --- /dev/null +++ b/test/testfiles/jpp-test_config_0515.jsonp @@ -0,0 +1,25 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** +{ + "keyP" : "A", + "B" : "keyP", + "dictP" : {"A" : "B"}, + // + "newparam_1" : "${dictP}['${keyP}']", // => "${dictP}['A']" -> 'B' + "newparam_2" : "${${dictP}['${keyP}']}", // => "${B}" -> 'keyP' + "newparam_3" : "${${${dictP}['${keyP}']}}", // => "${keyP}" -> 'A' + "newparam_4" : "${dictP}['${${${dictP}['${keyP}']}}']" // => "${dictP}['A']" -> !!! freeze !!! +} + diff --git a/test/testfiles/jpp-test_config_0554.jsonp b/test/testfiles/jpp-test_config_0554.jsonp new file mode 100644 index 00000000..06271955 --- /dev/null +++ b/test/testfiles/jpp-test_config_0554.jsonp @@ -0,0 +1,19 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** +{ + "keyP" : "A", + "dictP" : {"A" : "B", "C" : 2}, + "newparam" : "${dictP[${keyP}]}" +} diff --git a/test/testfiles/jpp-test_config_0555.jsonp b/test/testfiles/jpp-test_config_0555.jsonp new file mode 100644 index 00000000..b634cb51 --- /dev/null +++ b/test/testfiles/jpp-test_config_0555.jsonp @@ -0,0 +1,19 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** +{ + "keyP" : "A", + "dictP" : {"A" : "B", "C" : 2}, + "newparam" : "${dictP['${keyP}']}" +} From b8c705d5d86419de99de8d25f368bbb9f7f4ef5f Mon Sep 17 00:00:00 2001 From: mas2hc Date: Tue, 5 Mar 2024 11:02:05 +0700 Subject: [PATCH 08/19] Optimize JsonPreprocessor code --- JsonPreprocessor/CJsonPreprocessor.py | 37 +++++++++++++++++++-------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index a8e5894e..75177c2e 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -288,8 +288,8 @@ def __processImportFiles(self, input_data : dict) -> dict: pattern2 = "\${\s*[0-9A-Za-z\.\-_]*\.*" + k1 + "\s*}$|\[\s*'" + k1 + "'\s*\]$" if re.search(pattern2, key): bCheck = True - tmpKey = key.replace("${", "") - tmpKey = tmpKey.replace("}", "") + dReplacements = {"${" : "", "}" : ""} + tmpKey = self.__multipleReplace(key, dReplacements) items = [] if "." in tmpKey: items = tmpKey.split(".") @@ -393,6 +393,22 @@ def __checkParamName(self, sInput: str) -> str: if "." in param and CNameMangling.AVOIDDATATYPE.value + param.split('.')[0] in globals(): sInput = re.sub(param, CNameMangling.AVOIDDATATYPE.value + param, sInput, count=1) return sInput + + def __multipleReplace(self, sInput : str, dReplacements : str) -> str: + ''' + Replaces multiple parts in a string. + +**Args:** + + **sInput** (*string*) + +**Returns:** + + **sOutput** (*string*) + ''' + pattern = re.compile('|'.join(re.escape(key) for key in dReplacements.keys())) + sOutput = pattern.sub(lambda x: dReplacements[x.group()], sInput) + return sOutput def __nestedParamHandler(self, sInputStr : str, bKey = False) -> list: ''' @@ -464,8 +480,8 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: subPattern = "(" + tmpVar + "(\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" var = re.sub("\$", "\\$", re.search(subPattern, sInputStr).group(1)) if re.search("\[.+\]", var): - var = var.replace("[", "\[") - var = var.replace("]", "\]") + dReplacements = {"[" : "\[", "]" : "\]"} + var = self.__multipleReplace(var, dReplacements) sInputStr = re.sub(var, tmpValue, sInputStr) if isinstance(tmpValue, str) else \ re.sub(var, str(tmpValue), sInputStr) referVars = re.findall("(" + pattern + ")", sInputStr) @@ -694,8 +710,8 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): if re.search("'\${\s*(.*?)\s*}'", valueProcessed): tmpNestedList = re.findall("'(\${\s*.*?\s*})'", valueProcessed) for elem in tmpNestedList: - tmpVar = elem.replace('${', '') - tmpVar = tmpVar.replace('}', '') + dReplacements = {"${" : "", "}" : ""} + tmpVar = self.__multipleReplace(elem, dReplacements) tmpValue = None try: ldict = {} @@ -975,8 +991,8 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: else: tmpList.append("str(" + nestedParam + ")") nestedBasePattern = re.sub(r'([$()\[\]])', r'\\\1', nestedParam) - nestedBasePattern = nestedBasePattern.replace("{", "\{") - nestedBasePattern = nestedBasePattern.replace("}", "\}") + dReplacements = {"{" : "\{", "}" : "\}"} + nestedBasePattern = self.__multipleReplace(nestedBasePattern, dReplacements) sInputStr = re.sub("(" + nestedBasePattern + ")", "str(\\1)", sInputStr) lNestedBase.append(nestedParam) for nestedBase in lNestedBase: @@ -1206,9 +1222,8 @@ def __checkKeynameFormat(oJson : dict): else: newLine = newLine + newSubItem for nestedParam in self.lNestedParams: - tmpNestedParam = nestedParam.replace("$", "\$") - tmpNestedParam = tmpNestedParam.replace("[", "\[") - tmpNestedParam = tmpNestedParam.replace("]", "\]") + dReplacements = {"$" : "\$", "[" : "\[", "]" : "\]"} + tmpNestedParam = self.__multipleReplace(nestedParam, dReplacements) if re.search("(\s*\"str\(" + tmpNestedParam + "\)\"\s*:)", newLine.replace(CNameMangling.STRINGCONVERT.value, '')) \ or re.search("(\s*\"" + tmpNestedParam + "\"\s*:)", newLine.replace(CNameMangling.STRINGCONVERT.value, '')): self.lNestedParams.remove(nestedParam) From 6981301156bf385c12a8133e82301594b88079fd Mon Sep 17 00:00:00 2001 From: qth2hi Date: Tue, 5 Mar 2024 14:59:16 +0100 Subject: [PATCH 09/19] Resolved merge conflict caused by HolQue/task/documentation_maintenance (includes the documentation maintenance) --- JsonPreprocessor/CJsonPreprocessor.py | 312 ++++++++++++++------------ JsonPreprocessor/JsonPreprocessor.pdf | Bin 446907 -> 328888 bytes 2 files changed, 171 insertions(+), 141 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 75177c2e..eb7e9f5d 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -69,13 +69,15 @@ class CNameMangling(Enum): class CPythonJSONDecoder(json.JSONDecoder): """ - Add python data types and syntax to json. ``True``, ``False`` and ``None`` will be a accepted as json syntax elements. +Extends the JSON syntax by the Python keywords ``True``, ``False`` and ``None``. -**Args:** +**Arguments:** - **json.JSONDecoder** (*object*) +* ``json.JSONDecoder`` - Decoder object provided by ``json.loads`` + / *Type*: object / + + Decoder object provided by ``json.loads`` """ NUMBER_RE = re.compile( @@ -137,61 +139,43 @@ def custom_scan_once(self, string : str, idx : int) -> any: class CJsonPreprocessor(): """ - CJsonPreprocessor extends the syntax of json. - - Features are - - - Allow c/c++-style comments within json files. - - // single line or part of single line and /\* \*/ multline comments are possible - - - Allow to import json files into json files - - ``"[import]" : "relative/absolute path"``, imports another json file to exactly this location. - - - Allow use of the defined paramaters within json files - - In any place the syntax ``${basenode.subnode. ... nodename}`` allows to reference an already existing parameter. - - * Example: +CJsonPreprocessor extends the JSON syntax by the following features: - .. code:: - - { - "basenode" : { - subnode : { - "myparam" : 5 - }, - - }, - - "myVar" : ${basenode.subnode.myparam} - } - - - Allow Python data types ``True``, ``False`` and ``None`` +* Allow c/c++-style comments within JSON files +* Allow to import JSON files into JSON files +* Allow to define and use parameters within JSON files +* Allow Python keywords ``True``, ``False`` and ``None`` """ def getVersion(self): + """ +Returns the version of JsonPreprocessor as string. + """ return VERSION def getVersionDate(self): + """ +Returns the version date of JsonPreprocessor as string. + """ return VERSION_DATE def __init__(self, syntax: CSyntaxType = CSyntaxType.python , currentCfg : dict = {}) -> None: """ - Constructor +Constructor -**Args:** +**Arguments:** - **syntax** (*CSyntaxType*) optional +* ``syntax`` (*CSyntaxType*) optional - default: `json` , `python` + / *Condition*: optional / *Type*: CSyntaxType / *Default*: python / - If set to `python`, then python data types are allowed as part of json file. + If set to ``python``, then Python data types are allowed as part of JSON file. - **currentCfg** (*dict*) optional +* ``currentCfg`` (*dict*) optional - Internally used to aggregate imported json files. + / *Condition*: optional / *Type*: dict / *Default*: {} / + + Internally used to aggregate imported json files. """ import builtins import keyword @@ -209,9 +193,9 @@ def __init__(self, syntax: CSyntaxType = CSyntaxType.python , currentCfg : dict self.jsonCheck = {} def __reset(self, bCleanGlobalVars : bool = False) -> None: - ''' - Reset initial variables which are set in constructor method after master Json file is loaded. - ''' + """ +Reset initial variables which are set in constructor method after master JSON file is loaded. + """ self.jsonPath = '' self.lImportedFiles = [] self.recursive_level = 0 @@ -237,23 +221,27 @@ def __reset(self, bCleanGlobalVars : bool = False) -> None: pass def __processImportFiles(self, input_data : dict) -> dict: - ''' - This is a custom decorder of ``json.loads object_pairs_hook`` function. + """ +This is a custom decoder of ``json.loads object_pairs_hook`` function. + +This method helps to import JSON files which are provided in ``"[import]"`` keyword into the current json file. - This method helps to import json files which are provided in ``"[import]"`` keyword into the current json file. +**Arguments:** -**Args:** +* ``input_data`` - **input_data** (*dict*) + / *Condition*: required / *Type*: (* / - Dictionary from json file as input + Dictionary from JSON file as input **Returns:** - **out_dict** (*dict*) +* ``out_dict`` - Dictionary as output, dictionary is extended if ``"[import]"`` found and properly imported. - ''' + / *Type*: dict / + + Dictionary with resolved content from imported JSON file + """ out_dict = {} i=1 for key, value in input_data: @@ -339,22 +327,23 @@ def __processImportFiles(self, input_data : dict) -> dict: def __load_and_removeComments(self, jsonFile : str) -> str: """ - Loads a given json file and filters all C/C++ style comments. +Loads a given json file and filters all C/C++ style comments. -**Args:** +**Arguments:** - **jsonFile** (*string*) +* ``jsonFile`` - Path (absolute/relative/) file to be processed. - The path can contain windows/linux style environment variables. + / *Condition*: required / *Type*: str / - !ATTENTION! This is dangerous + Path of file to be processed. **Returns:** - **sContentCleaned** (*string*) +* ``sContentCleaned`` - String version of json file after removing all comments. + / *Type*: str / + + String version of JSON file after removing all comments. """ def replacer(match): s = match.group(0) @@ -373,18 +362,23 @@ def replacer(match): def __checkParamName(self, sInput: str) -> str: """ - Checks a parameter name, in case the name is conflict with Python keywords, the temporary prefix - will be added to avoid any potential issues. This temporary prefix is removed when updating returned - Json object. +Checks a parameter name, in case the name is conflict with Python keywords, the temporary prefix +will be added to avoid any potential issues. This temporary prefix is removed when updating returned +Json object. + +**Arguments:** -**Args:** +* ``sInput`` - **sInput** (*string*) + / *Condition*: required / *Type*: str / **Returns:** - **sInput** (*string*) +* ``sInput`` + + / *Type*: str / """ + pattern = "\${\s*([0-9A-Za-z_]+[0-9A-Za-z\.\-_]*)\s*}" lParams = re.findall(pattern, sInput) for param in lParams: @@ -395,37 +389,46 @@ def __checkParamName(self, sInput: str) -> str: return sInput def __multipleReplace(self, sInput : str, dReplacements : str) -> str: - ''' + """ Replaces multiple parts in a string. -**Args:** +**Arguments:** + +* ``sInput`` - **sInput** (*string*) + / *Condition*: required / *Type*: str / **Returns:** - **sOutput** (*string*) - ''' +* ``sOutput`` + + / *Type*: str / + + """ pattern = re.compile('|'.join(re.escape(key) for key in dReplacements.keys())) sOutput = pattern.sub(lambda x: dReplacements[x.group()], sInput) return sOutput def __nestedParamHandler(self, sInputStr : str, bKey = False) -> list: - ''' - This method handles nested variables in parameter names or values. Variable syntax is ${Variable_Name}. + """ +This method handles nested variables in parameter names or values. Variable syntax is ${Variable_Name}. -**Args:** +**Arguments:** - **sInputStr** (*string*) +* ``sInputStr`` - Parameter name or value which contains a nested variable. + / *Condition*: required / *Type*: str / + + Parameter name or value which contains a nested variable. **Returns:** - **lNestedParam** (*list*) +* ``lNestedParam`` + + / *Type*: list / - List of resolved variables which contains in the sInputStr. - ''' + List of resolved variables which contains in the ``sInputStr``. + """ def __referVarHandle(referVar : str, sInputStr : str) -> str: if "." in referVar: dotdictVariable = re.sub('\$\${\s*(.*?)\s*}', '\\1', referVar) @@ -540,24 +543,29 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: return lNestedParam def __handleDotdictFormat(self, lInputListParams : list, lParams: list = []) -> list: - ''' - This method checks the availability of param names contained "." in dotdict format element in JSON config file. + """ +This method checks the availability of param names contained "." in dotdict format element in JSON config file. + +**Arguments:** -**Args:** +* ``lInputListParams`` - **lInputListParams** (*list*) + / *Condition*: required / *Type*: list / - List of items which separated by "." of dotdict format element. + List of items separated by "." of dotdict format. - **lParams** (*list*) +* ``lParams`` - List of param names in dotdict format element. + / *Type*: list / + + List of parameter names in dotdict format. **Returns:** - **lParams** (*list*) +* ``lParams`` - ''' + / *Type*: list / + """ checkParam = lInputListParams[0] i = 0 bDotdictParam = False @@ -579,9 +587,9 @@ def __handleDotdictFormat(self, lInputListParams : list, lParams: list = []) -> return self.__handleDotdictFormat(lInputListParams, lParams) def __checkAndCreateNewElement(self, sKey: str, value, bCheck=False, keyNested=''): - ''' - This method check and create new elements if they are not exist. - ''' + """ +This method checks and creates new elements if they are not already existing. + """ rootKey = re.sub("\[.*\]", "", sKey) subElements = re.findall("\[\s*'([0-9A-Za-z_]+[0-9A-Za-z\.\-_]*)'\s*\]", sKey) if len(subElements) < 1: @@ -618,22 +626,27 @@ def __checkAndCreateNewElement(self, sKey: str, value, bCheck=False, keyNested=' return True def __updateAndReplaceNestedParam(self, oJson : dict, bNested : bool = False, recursive : bool = False, parentParams : str = ''): - ''' - This method replaces all nested parameters in key and value of a json object . + """ +This method replaces all nested parameters in key and value of a JSON object . + +**Arguments:** -**Args:** +* ``oJson`` - **oJson** (*dict*) + / *Condition*: required / *Type*: dict / - Input Json object as dictionary. This dictionary will be searched for all ``${variable}`` occurences. - If found it will be replaced with it's current value. + Input JSON object as dictionary. This dictionary will be searched for all ``${variable}`` occurences. + If found it will be replaced with it's current value. **Returns:** - **oJsonOut** (*dict*) +* ``oJsonOut`` + + / *Type*: dict / + + Output JSON object as dictionary with all variables resolved. + """ - Output Json object as dictionary with all variables resolved. - ''' def __jsonUpdated(k, v, oJson, bNested, keyNested = '', bDuplicatedHandle=False): if keyNested != '': if not bDuplicatedHandle: @@ -893,12 +906,16 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): return oJson, bNested def __checkAndUpdateKeyValue(self, sInputStr: str, nestedKey = False) -> str: - ''' - This function checks and makes up all nested parameters in json configuration files. + """ +This function checks and makes up all nested parameters in JSON configuration files. + +**Arguments:** + +* ``sInputStr*`` -**Args:** - **sInputStr** (*string*) - Key or value which is parsed from json configuration file. + / *Condition*: required / *Type*: str / + + Key or value which is parsed from JSON configuration file. **Returns:** The string after nested parameters are made up. @@ -908,11 +925,11 @@ def __checkAndUpdateKeyValue(self, sInputStr: str, nestedKey = False) -> str: Nested param ${abc}['xyz'] -> "${abc}['xyz']" Nested param "${abc}['xyz']" -> "str(${abc}['xyz'])" - ''' + """ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: - ''' - This method handles nested parameters are called recursively in a string value. - ''' + """ +This method handles nested parameters are called recursively in a string value. + """ tmpList = [] for item in lNestedParam: item = re.sub(r'([$()\[\]])', r'\\\1', item) @@ -1047,16 +1064,21 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: return sOutput def __checkDotInParamName(self, oJson : dict): - ''' - This is recrusive funtion collects all parameters which contain "." in the name. + """ +This is recrusive funtion collects all parameters which contain "." in the name. + +**Arguments:** + +* ``oJson`` -**Args:** - **oJson** (*dict*) - Json object which want to collect all parameter's name contained "." + / *Condition*: required / *Type*: dict / + + Json object which want to collect all parameter's name contained "." **Returns:** - **None** - ''' + + *no return values* + """ for k, v in oJson.items(): if "." in k and k not in self.lDotInParamName: self.lDotInParamName.append(k) @@ -1064,25 +1086,28 @@ def __checkDotInParamName(self, oJson : dict): self.__checkDotInParamName(v) def jsonLoad(self, jFile : str, masterFile : bool = True): - ''' - This function is the entry point of JsonPreprocessor. + """ +This method is the entry point of JsonPreprocessor. - It loads the json file, preprocesses it and returns the preprocessed result as data structure. +``jsonLoad`` loads the JSON file, preprocesses it and returns the preprocessed result as Python dictionary. -**Args:** +**Arguments:** - **jFile** (*string*) +* ``jFile`` - Relative/absolute path to main json file. + / *Condition*: required / *Type*: str / - ``%envvariable%`` and ``${envvariable}`` can be used, too in order to access environment variables. + Path and name of main JSON file. The path can be absolute or relative and is also allowed to contain environment variables. **Returns:** - **oJson** (*dict*) +* ``oJson`` - Preprocessed json file(s) as dictionary data structure - ''' + / *Type*: dict / + + Preprocessed JSON file(s) as Python dictionary + """ + def __handleListElements(sInput : str) -> str: items = re.split("\s*,\s*", sInput) j=0 @@ -1122,9 +1147,9 @@ def __removeDuplicatedKey(dInput : dict) -> dict: __removeDuplicatedKey(item) def __checkKeynameFormat(oJson : dict): - ''' - This function checks a validation of key name in Json configuration file. - ''' + """ +This function checks key names in JSON configuration files. + """ pattern1 = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\['*.+'*\]\s*}" for k, v in oJson.items(): if re.search(pattern1, k): @@ -1326,25 +1351,30 @@ def __checkKeynameFormat(oJson : dict): return oJson def jsonDump(self, oJson : dict, outFile : str) -> str: - ''' - This function writes the content of a Python dictionary to a file in JSON format and returns a normalized path to this JSON file. + """ +This method writes the content of a Python dictionary to a file in JSON format and returns a normalized path to this JSON file. -**Args:** +**Arguments:** - **oJson** (*dictionary*) +* ``oJson`` - Json/Dictionary object. + / *Condition*: required / *Type*: dict / - **outFile** (*string*) +* ``outFile`` (*string*) - Path and name of the JSON output file. The path can be absolute or relative and is also allowed to contain environment variables. + / *Condition*: required / *Type*: str / + + Path and name of the JSON output file. The path can be absolute or relative and is also allowed to contain environment variables. **Returns:** - **outFile** (*string*) +* ``outFile`` (*string*) + + / *Type*: str / + + Normalized path and name of the JSON output file. + """ - Normalized path and name of the JSON output file. - ''' outFile = CString.NormalizePath(outFile, sReferencePathAbs=os.path.dirname(os.path.abspath(sys.argv[0]))) jsonObject = json.dumps(oJson, ensure_ascii=False, indent=4) try: diff --git a/JsonPreprocessor/JsonPreprocessor.pdf b/JsonPreprocessor/JsonPreprocessor.pdf index fd5849bdbaed427740d9dcac50d6e6cfbf128ddb..e5259fc448cf18d76b225a39658dee49da7d3d98 100644 GIT binary patch delta 125158 zcma&Nb97{1x9{DtZM$RJX2*6?v2Aq4Haa#twr$&X(ox68o8LL-p640kJ@<_J&mMd4 zwdShYYkulmbFMXadjVccI65kYqL>6dGXpy;#mvIs3M?}-OT7s?CTxu3^4|2`9Pe1OzrX4~&Cm%^#F}rJfWbvS;=9xJ zd?={=Bq_rTCEHJmaa%+ZsAL<0wwbjjKGNg$mbrvw4K;evqwN_eS{&)+jxx2yEf_ox zLmi3R%lMyP`DMumr*L8F2%yk@PmsIVS%0sLWrC`Ypvzi!K;Za^(tB;rh#{02429 zQ)zW}hDy4c;;md$l~){hoZ>4@K){b8dOoPXqmlYSAJk?Br*od83(18b%NqnMB88EZ z<=1Z=T%gDxbHr;E@afNHomF;4TCHn>iWIDE%tsE zr226n6OMs*00Nprpys&lPy_LEE&P7SOl=R;w)*m?%-!rwW@^`rmnORtD5)yE@!R=| zD)JQM9k3@!{;`5!2f{o5wN5p&x||8G2kQH@g$AtEl$8pyLUFXX6NBCML1Y>l`a9eC5nq%5bJuUHN!?SodHU?b0Ut-%MsUAS>@2rzN)Zm#PPeS*>wK-~`&p4dj7yOh zyi1MVl+$rQ!|ij(q@UsGAsO^B7cIROYjFR*>gkOE?gWai#3 zkxe3eSFMT)(w04l=5CKS5gX`xjtM?M$3qoJ;|>|D63J zam?(j^`7(~@E{y1yC9Gl^>F;tpq&4%f2y7iro@a2Mph~=wy=!y#LP@gu#6IxPR=gG zT&&Fht&c3MEbRa2BNcE{Th1Ae6SebJW5QA#|S?QzR9sD2zi$n`{=k*Oq02YatLI?tzh6D?pPPkjB1(Fq79lNguq!>9! zG{`cS)apnw+yWQ`(}M+Y@?&N~2mA^aNl+hN(y`#M&yLkG6Zi3zp z)(O9kXpijASTvKBo2(}$&zxn*h>HnHj|xeB*P#6Zf@X}c3&R^_h^S&u;Ei3?n5|_- z8PdaID0h>4MMxD&)_^51`GBnZBR$7Y`i_XI$2A6k?Eu7G8Fy%jjLE?UF?)vbH-j{z z^LRK1P<8}!CIg0qQ&=2=p*&%o1aMguWvfg84*_NX5h@%+@F!|yzI;RFnr~BtNHM*E z={vjlP}AS&`;mG@(fv{L^Zo12>DXYEa40tNYzDCQdPGisxJVR+j||b2To2a6XIl); zf9r(jode>aR2t!UY>IPp@t_{2Q2|r4ro}u-v!km*Z>>707M!o&9|O&aqTHXJkg!!8 zZ-o;M&hYGtH&i$1TGAYyM<)q53+~Ry-+6qyoW(l%^SAJ?gEE*o#|wSq8>W%)Y`6*4 z5?32$Y$2EWF?5PQQqeyepIc;NmldoW9{;RUF$0w%W7=m<7}#(Sx}BVdCd)H#rExFa zRDPxrPOGr~*idVK2Q-nS$qgQF=u%oQ$8LZ3>2|nf)O{7QzH#f*Ri1Mn%yP3@1J<>P46VvbQfyF;LrLEZg z+ki6}40l@Ke2_b~RzsfpC-~uQ68V)j&g+=n8Orqsb%DOTqn3YztlM|iltOG@Y*$UD#OE+6WsJTWN#v<6-7eW9kP zp`pC2vc0=hY?&}$m78)~vd?zrpQwM&=La56&)dgZFVsN*N{&Uaq<5)FIHbW0Y>Prn zl{-5%eF*OLI0hLqjE3pDM++Q>8*mOgkaDnb60DKD==%C`+QcN|6?+!c4 zI~yN)TC!V(R}II}DaVFxUgkChC#_-4X*~0J;@=MbQsp-#x>*pERoUlz=h;?)RsycC zNncnWYxKOfQsi}wV=b2R?Ws?<`K2@D9)$}jpsA>pRS^~x*s}AEj!zCdIV59h)3v-d z0L0w6&P!{y4$J3U1+F41S3OgX6NV#p!J3pkg}ap=*}D1D1=sNS7EIy!XDNNB=J_vI zSb6_sY&s@Ke!Pe))e4p$TigRI?ty{<9Frk{<6pGRJ@{t+p7{_tI!4DOE;?YH804`DQa z+zV)2wSc?Gf-a0e7DUXo1i?UdZ}eatJ38rp{~!`xQ4&KT$56&$?rd*;UI~NEZAqh_ zI_jU*OjV1W2SA7vi&Wcvx*EJYs3VlumXd@EKjZd5WW1&$?W41s;SNeB-y4C+lCg^#*fO<%k8R) zTa}#~Cl}e5C35WU{z&9l-lhGI2O{>D(pgDbUjru1b#AKZO98d}cZI}1K&Zp<)jg+< z(zFDkaiVd~!*V#aZKh^2u3$EifFMzz1@X-4OP@Gprkc1aq0w;uYe$s^dPKwymyb^# zA5rmI-}p+n$YW^VOJ9I*=(*YRNh)azQ%h`c?Lx%fcz>sW<4SJiB1{=AY5tIeibW?> z$mJ&WQizCj&o?@O>ZU2@mlKzWKRNK(J3hDsHJ$zF4eFR%!SWmv+q>vNh5NU_iyc@K zKI_t&^oO1kK?(Zd!u@8HysHsc^_~= z9gGc!%K(SOSZ{}w4@a&8#KFHju<|^pUv_*C^f!MUbQ8w;7s@@vB)(@%5pn zvPJLH7=fiVrL@VzPX06_Pk#56-c>W(aWV*2@RN)}%o>$!J;7?KtNdIq(?vroBKfED zu2wOdgf%E)L$oxf3cLZ0Ko7gv(Yla)EFYWBEi|<^TS9z2&D8cU z6<7K7r!I2!TQ$nLiZOH+5W9}YulZ8!vu7y_jj8p1$=8|4z}{cPIZ%(~L39!UD_i~N zJmPkGB|+EwQUPK)=hGa!!N%x%RJHAF*1{!nW0)P+9kCLb63BC)SkZ8hdT3aJBpbo^ z@Q%^o6OepJXRZF{&@ij2W5jqd`WT*#Pa^P&NF9)~H%>z7)+4DAAiJbU6*sC=)qYqB zJy@@Lo-*X#i#*LPN--i020mT^=9UDx=~fFTccr}L;q|N%zmTUc<>5`m+v6+eo2Q$e z+U;RvU8dj!<)DqD+7wp(GUsbH*8^lwhgIcD zl6EI=#igNJl{e_}WGCQwGZS=>XGM=T9JzQcZ%2plAymI5C&s;@xda#=C6%VeLvfA9 zWTZm?UX-d=?O_P`u|TX@m9%ZWfvRAzEphnEa~iVm*G=6`1$Ykdm}lvc-;xtl(Rj@f zvTDBi=G0`5y`eT)@A|>uZ2(tIVdeI1fwqK=QmS~)-}|lNKZbU#C?=zbjwV^Fli93Q zNBiehAdErXZsrc9IhuX2>_8TdKIm)2su8z+muwu-?izxVZI0RM)(+?sp%0q z~J@?e7{G z&DY!diqykPXwOxfYMhrnp-f96#_;PYvY&qw@f03G7|49GOanpKuDm4bJSo@0oC@~e zy$5O;LujI)v;l|;_^8n+X7#>1H6ffAw;_aH3O6l)VFFg4HHRt?mG8R;DErk)65G@6^oWICQ z`xzc#SBgIAB>7)MAfh-Uq(_ue#-^jB^M^oJp=c}^hane)gc13Ngk?8!#`37%RdjhS zkQ9`4bKm35Lx&Pm?xnPp?U`^A&SmaK%xT2!@ScO79+g?64F8R904iHZ9u~0J%QaI z!vfch%cN_HBwxHQ9j8Wy>p_soO0pCs!Q@}l?MJDC4IvAtAY!5~^b4P1C#OTlmtf_< z#%D@9!~jQ+-M|wE-zdVmT6^#enCtsF$={Tbzq5}>rFoU)qXzk{TpisDietrV?A+67}Ep;3=f1* z*}0qq4S;esvgDcuQk3C_N(kt5B^qV|T_qeiD+MYa64EI?Aa0oY9g}S!K`|p2`}}kU zStmbm#XkTVNSqH(i$-350zna;cn+D6cml?%EUyVyD-6*~6{*3DChTAeZ3bNh?dONc zONVdB=LQkLjr$OY27|zi=3>n3x)TH`>i)*X6R$EuOf`am;E2ZtKyB_7gJ&m)gm-p; zhLvdOC1a?RA@wcv!cLgYB!sO%a5`AEmM{U$*z%LaKxstjx_VYC zdBG{|`E&UaJwdB%*V{<9k0BC-O|4sJ=M_FlsB0e%tC)3Z`>mdFj$W5lh;c=%JR4T{ z6yF91RtL)QTSAr$gQ{X6M>{WXKkVdXVfShAr1b6Cb>17H-ov}iwaR=)=P6^#vD@4x zn{PYtBvHee?d!!vtMsvL)s_pOS_;K~g04a8LHIIOffY^L&4++Mh>(Hhh+Hx|3YEkG{M)={2WaPcuZBcl%v~ z@}`Ch=kD`c=jW+r22=oU|hOv}*2-WNs={oxzxFCS=%c@4YnVn|qyDB*b2XBT_tEy%d2iZ%v z2I)A=$b7Mw{trj&<@(p+iYgzH6ia?(~LXsA*Yeif=7^?tS^KyOCMEy9XK6^CGWH z0RF{a1)SVCifJOLtev;bh2I8=JR}vT$J>yBocuF6Ks6~A|Pf?n| z2wV?K2<*OOO~f`LvjFD?1~mc>f3Hr&F+ zTy8p9Kwl@W`sYvNGlXQU(6Vq~ zeN3{ZMrAoqb^O9u=@>g{llX5?l0V%hbDxyFM;@UB_1g&qpP-uM@ODoB$^lXgGC(ll z{%fa+mFquunrKoYB0(^L7d&UB97xhM;yOu_df_fqV^!zsAFmHP*nY$m-w+%imG8um z@nwN0`xymzhAhua(%-i;GYv93-n9ROQ>Zhux3;81%NJ&0Pld_u3>+RD|Jm;1f8E`? zUtgs@_8A*JSG8vCe0p$o+j}M2e%ps~rz$p>PEG6be0{7>+ntXDu2L`RLbr$f7UN^IXX&9bwe8&BKiLi`V^!KEbaX zHPm)MW&ITW&!*Oc$Rn_xI3hfFv`t<7S z^%Hf^jaP8LbDkbAyzVWJ54I?kYdbr`1C%QVpZdBatsKh5+^Yj8f=*5HPRcMTlxBSW;64@*XjC>$XEVt%DHT+zG>+{X`W(Os0&w5fF6Zq zbWt_hX(0D&O38=@fuRaa(a|2%X@qSqHd;aV-K-cyuqIZRB044R^vN*`BHL3ZfVS@0 zI2THphz6koGEJ%NwHuUhZyAAye{U%fb~3NhB6r^a*vuj2Atl%HM8^*7=+BGZbgF>< zMNYR+bl?$rXC$y;`Rzx~>ya@9@>9BHD-9Ii1|l&cD#k*@oo7ytEaNzAn(*a0b~x3z}`U*n2rIg)E<<8P?D>3@gb=l zV^>^-g5J*J&;xHzSO|6mfWCoFX!h4F21uvmk!6EjK(J?U@PR7$F`DcxUI&;M9` zQ~|%t-u^M8!~IV)POxOkd@NwS`Nt*q=ZEu2Q22Pb)4K=icM5%zzMwXfywi9l%gbEx zKJe(iVIN8Hjg<9`=}S}NhPnuHfYV_(u@UfLl|rK`*B>>OLQOwEI*Gb^ZE1e*Sw$+z z-7SdU-i2SW7jiODlF zij6Ei+PzVu7t5_N6oqfZs@g6drRqWAj7A7P z)-q}Ff1lLLbyt~Dm*ktw@1Ntvz|mxIYL||Ni(Lq_i%X|ak_$cOsQ7xxQ>JV#QEzyC zrhu9v;_$`Nx3TBcoBiWyw9Br6NqT0dfeF1mIN43;-hK!7Nm66-zh9(K&i+FROF;Lg zIxA=A)0e9rM{f2b+7HNm`O*?l8Cg_73GQT)*z~ta6#@noA$>UMU4Zg2?FYPEa=2&P zw&o?WCx2d_X?Q(SzCU5ErmPQ=3U6>ko^pGpo#(bL^#W=?W26K(m}U`N4p%+q|sa zi`Q`iY5~Q><>j1`R&o~r3ShH9-bH}QM17GuCw9f^gU#Qh>MVCqC>lpHz2Z^l#bC0l z2?A*afvDXJh6G|r9HL{pUP$?uEx6!Z_`lByum`l&{DLL-7O^{|AwcE_met&Ek_1L`z z7R)WR3OGmonR5Q4oO!b^y8q@5z_J5Ft8IhXy-m+)nMQfXH7&r9(gW^OOFd9XDL7r2 zS-k%J&+`4^6h$krX!xi4-V$bj98lX%kO9Emy4FfsLcm4y%bl-t+2{A}<kRtsEY+wb`v;g0j5y{D~uFFtU{ae_?nhU3& zop1I{bm;SpmjddZl+VZhho-e=LEb6zk)3w856#Wv?$2W^dLXbysnw>B$abuwMMO!B zEqw}DKUiC>HpDO;=t&P59 zm#o*JBkQqPs!ht%rcb!2NUd_WwhM3GM09qpz%p#;R~Y`Hnm1-``qHuXS`YL=HyaIc zmu3DrZ$mp0DxWYYxMIT|}vKTkCF|?`{jVuix;59FPYK5`|&*pLG2agMkGB z>0V?k!ZxB@eHterzwf% z6ocO2^>KFsDfw&fXL=rst?}Uks;trsQbM{)j@Q7r{{tIfI@uC=kmahEc#`d1vkrO|e?()V zGCAPddiu-a3i4}gPOGo6@xCm`xc?a&*_yJLZdcWny72T(A$ORz*vsS-4A;|@oI*M& zdOGcEt}_2&V&aPlC$ldmFya1#33D0ImIaR~lj%(EOH$SEbMOF{;yWf#ATosvW&)-A zB3|NmGQ720b?6@j!R%%WX)}NB1J!a^?81%;$|Gn1yAk;t_rLb7^V6&C8Nx-3uP*21 zVD!%9ae}?+-N<4U-N#aCVe0u$<#Cd8jjuIN@50}vZS~#PHottI0GrkQ-JhnjdZju_2TLm+^TTJgLguC;kRCOv42lh4_V9ZnY)X(FyYU zN_KUiCLSaG)XB`65@hxRjWoJBb3_BRW?05kteUC=xFJy{Q=!Tt8-Aj%5#IW(F!C2| zgMb|1QVa{ztJI@p%^MZO@o}t?F9Ry6<{OmS*9SNd%VW^x$pfQ;rs?>Kjzdm)(`%7iSg!*nNK4;rs_Rdso0OJDyKx z377cDzAHiRBj7>cx87%9ju{2g>~r_mqR<(mrBsZKg;5nKZY!&sZ!_NvEVH zZ{jFaTi15}xclS5qj9rVJ(rCQi{*}&lFmv7k4MSznE5-yb^YpJ%aK$W%+lJRs9BNx zQQuUf5`s@!;rF9p-;GY7dYDu4DdXke-Z)HLc*qq z+DF3X(rN)IDBcPKllW3ae8PWJQK`vRn|HKknnv?S6yX)naijfajB-fwc1ITm?r{fS zm(h!lW7)&=R@7M&TmZJsa%YQD=63r1vzcPF9|*SVLsB~@Dyx^EM&w|oj!JVk!0$hC z6I{57gM`|<|AAD-RMz`%32uBN2xiLJUl5q)xk8Xtq!g)05QG%MJWxoA|GBb=^WTj= zOP?qp_{vV)d#4i{aB(uo=TP7g_|6=Ow=}KpLj%lK<-xu>m;)r1B=t5i9fcUbH?Y8* zm89UjDqL9$8wME8*Dx{rJ?Dy(?<_)tJ&{H4!uJn;$8MpUYlvf8`O^~?%*teeYPjO4 zh!Q}6Bp6N#83A(c@)x^jDmOJC3lQQDU^*r}2rf2q59oz?4Bk;kJ12Cs2xB)(yDIlX zO$7GClNrIw_oW&|Q$OMMBA<_wc0rS+2VB9C`QW->zp?$(3H>QK~QN7jHE?uJj~;aAYppsPn8+I;v6#P-ma`wjRs zKfO}dx20GHRx><}ghZ6WY5$N{C!Dbqa`QvTy8w5X8{}T#Oel#(5m{)|JeQ+|lmw?x zMNL%>w2Y@LrW(RfH8Sd?!dDrQwg3@70sR;6P4a<|KBXn%dWHOtK}=Tz0w_LXOv?PG zBW}8EId4STPKjYTz^XO04D1heYH1+IVwiklpNI;L4ukbfBko$_2soU4;X(emks6x@ z{ER=10l!7HWgRAPU8sF5(r`(Jg8QR& z{B44}d&&IEou)p$&!f}J$B~P>Hk_>>UFg~V{%>8qr7VGf!fG%K{P#jF3 z%TJuV*oT(@Ka`}?H&AZUusvFM>laV78r}|Xo~`YQ5+^tr`|9!C{ud`2AkXveqk^@= zyQ|(#|GuR!AAdm@r_T89`-{)pn@hKVeL(B`UH{9tz56!4!I-U$-F(xpE|{UWu+7VC zLsBc#z)y^^mT7XeBUG<1i1FqS1y_Yz@<3DaFky&wF?gQtK;IcYrj^Mbv;;!HpKad)(nQ9_Lr)0*9AXzNRW?2p?8q)y0%Nyx7j@F@WDdiPmwTHI1 zlqxOjxb-yFNCn3n?lvBsi_tjhu66HeN1^F~U>c}Fe%rs>AnlqP^JYKRf`i8Ht;f>)(q4{}38o{nfM9{n|3??iT45D#w`&1^ql1(O6Z#T49U9GPfmaEZ75R@GFfas| znlM}}OQvwcShl`zu;BLL?S?bV(30srKHuTd!2)Y1VWl&$h3cpnLF=W=M*K}MMo6TV zK)At2hrqz3I6{>JOeDVr5wBu6K_^JA1U9pY?Xvb5M~Pct+5wR03`>Xon1y76y#a5A z#MqiZpSeDQ^k9^|s@gGTzim)BP4XUODp9OIl{H4+cS06(YoQ+h!UdQGX!LbvBg zRw;Vo&RKin_`Li`JpFV)p!l>f{Xh8-WFThkuXxcPi)$2nkVsBZpM_JUJ${g(LaO$8 z!S@jGCc&1TLi-6h{$0XSDijsdLr>U`6(fZPreXz~1k-~yx0C+NkFyC25_04WRSq^O z`6j7tKaGbB^qSI1zT$YsNbOT|W~_ zr#aAHv_sm0MP49Qfl-Shm>QtATM2z&dsC}W-JWl!J)b1l1BS*m;X zbnk5MeDd&Yq>CogjZqM-L=B3SWj%;fnyTs3< zG?{Y*eNZgTq09}BQyLx(Q(b0ETq%nIIss;mCNC~ejoKOi0tU}+>pYt~w^Kely&nG# z+onD~y7{kizFtgzFeFg_V$5h>Z{I9gFTdE#D@CgQx&CoKeW=j>dLxi@2ClK=3%$rJ zD71b^FGf6$81IGMK1(zZL!0ne18oLGJCd9sR3z$5UuT_}j)MP_ZNNvGJl+!3O&nQLR3GeW3l5Q({+J9@{##9$*lV8m2j!{x-J zci%3I>7cISwt`ISswH2Lh2G62>YcWnfdtY^;^ke=*S z_Fwv&QjHCY*~|k2iirrq_D?B2TJtLjC@p+SD?cbgvmi4l3LGaB>%Wy`{jciF`tRzS z0`l_p+EJ&boV^}9^5(X|uEEana|6A&o)8ReVc8$hu(q&1G?9n|8qegu?&Aqx>ce~OYmcexC;|di?b%*&i0Gu*Sql=92K7=rZAMu%TgGz`JaO$EGnD@G)d*QV z7o!;XsAmgD8D_Tz?Fy)=h{XK+y^!bnl&!s2Dxlu}D;+@-!gk1&QS?rX@q{UhgPkdl z4f~Tg{Juj#Dngcj%gV16+B8;Yj-VAl?a>Jwxh;-RQW zXb&bEibs^{FE2M2yF%d(oAG;x5Zek|4yr_W2-0$J6_MxKus4d6D9?_?nU8{(Ysfw zA%d;E0>Hopg3z)ju~bg&QrEM1AEr5LglJfBhF+)_QTjSmMkFQlrK>i^_tR*|$w&sB zMpjhLn(nS8qKLYcRdMe!HJ_4M0-Gn-xQD?fmD-O}b7#*ixWAWr6L^h@t@?VqJG%p~ zcTc?x4!8~{7k6vAyXk%Ke?EFVee5~7u3%{k(zV~VuZw<3e7kcY^;}8vR6$&BES1exS0~HwpbGX# zuj~C_^5<;_b>8j3mRAp8Cs0%6<>gQ4J7c$=uk)iOgRx_OuThv6)gtq@abvl6Diz6= z9}rO!eRmpUe`b>Bx8U(PdYeqe_<+_iR<0y2kJDC&181I;XMB{3W+C5kA)J)wWkMg1 zvc5exkbt_n+?@0%pkW6nT|XC>P8V9#nwHK{Yiml7e06;%s>u+Hs z$JQ^1JhLjw#B|Bk_O>%_L0|agtd6j_mY~^S`+XBb)p}G~180%vHy(uv>K!ifnbI6>@D02z z0)w%jOebE@|L53t3(ykrwB@I5(F=XWu5gX3ep5}E)J{Tw#L^O7sOj$u`@y$Ql*O=5 zshMS!)Mj(o`s-jIY<-&g3e25{UV~ETDBMg*J8m5(_hHS*)&^Io_=B0;OOJ=M-KY=T z4-eUF*K@S5ufo=^_ z3;Rzl74nKdE67~)-{IQ%p=)v39%(GFKl)ieltLv**?HKL3+EG{C#9U{CRDu(^nN4$ zXp^x*SSb6gRbu-)MR;9hS%&sEJ9>Y{S5|j&}J)6t~r%Avk=R`FIaiycz8i><28-N{%g;Of!k{^fE(rIyF;R@Fn8)7uiZMwiWBmca-z6SF#n9#4H#$bW+)x zf*HG1i>cOdFWuB6agIPwG&-aWwi6p;F6?nMEBLB4)t=N7)77aYraJg7QxQc&ZR zu<;3{b+|^93>q1lA$M8zlpiK^1|hHgi1E85_i`-!g*Iqugvv&gaB6sjBTm2-nmWG1 zbBuvd0*=UEfcEee-s0!s0SH8RNXm^X|p^ayz9$SHuMw7Kaq{ zIvrLaa-aGn#IWcJX)Eb-wXwH=w3xG`AxixSb$gh|N|mQWOi+#7OIr1+HFHS;KwUb^_IR~w}<=nQQXTUH zk8plfYb~eVnd{ij;rM6%=taZvNPCRetKrX=@PrvoDziN6Os3Y#b-LkE(-56K5m`2-h}_Vb#p%RG!I% z{ikC;$U}K~Ci2Lge}4;#TLJFZj)XP3TS%768Spvyiu@i5o;z zIwN)4gC?V`vOKHbDD}!Z`ogG%6@20%nq?_`B||ldV%u~f1QJS2#+nvXrh_#y`ABWF zRPKw|P3=QQa~F+A>VbFpl4G05zeJD^2Tp8_&1lxJF~uKH;KWtNQ49P*IU)y7Z1w7X zCh_|Z0Io~+GIE)gY#p=={dV}+VXTMUpEC@y1B+mP`VjnpipPA zo?+|OW-4W@pOP=M?N zfDji6E-y>WUBMK8?<>(;{SUK$wSo=SEF|S)_A9FZ$8eeH{usQz0Xh2I>HB2=N-w{V z6nauuitOY&pI{V2JVVHcDZ%gq>e@=&=LmR>#qa7{$ zn{inEX1i}}#F_Tl9>9%#1T8Moa`Y!64dbEk7h!)LrJ4~6=5`{hMB0o5+4<)_AO3E} zr{dagwQ$XgXq5`6T2%mQVk#D3%}D!-RF)o-jj@jo`|EJto12wtrRE&lCIqq&(7p+m zt8c7*1zHNsCi?(^EN12WAM~1=vpFyv6agBHlbN-7JsFe(E~TvHORt+tK;;pDxWHb4 z1YUH9(Cu17dR+uu^Uzw}QisA~6kFG}C1)w?K}tCU(WgmE9-4#c)2wa%mw&-L>p6uYOf`#@Uu@_F>+PJI(OGnNIp#%xY&=l-%X zB1cw58m(Jl+8cYi(v2NQvlq>axhvai=R}$`nezOR9+s(atkh{^{!Uy+_mWM*X!kE`CYR!;>P$$hOf5F||(a!yyjn&3U%y-;L=!&g$hC1pWA1`ZVUJX#8pF>cCQ3xxpCr;l@?ml+)k93GHVYWZw9c zw(yRIa?w+x&0;e>_3{_1cwj?B6&~5|#g;L3tk(2i6Oa0qCK(=W*V%HTPG7g%x&%f` zt$q!-VJJrXLp8OvRe7DWnW55SbzEU|3Y`L042v@DnWnvr=;%UlnBP@46V$c+1|p#e zpGa)5TNnTBCJ@_{yg5+Jl&Con=;rhuP&#C84sN#p*Gz`%-~U1XtMq#CE0w|LgzudG zXB|IcF9jT%yWzJt4e|hY1A-INhPYBs4VX7r%V$??J%{12N~qL}qh^%Z-BGwtq15Es z!CV9mR=m-?%wM!+rBs+@t(77VYw;1sB2tN#hkQB5!+aLUj@)IH)=YyK3I3qY);J`b1Q%ftB?uF2MsO2r#&8p7zhJ=|NZpaPS8l8* zz$E|itnebZMFJd|J0fs5FxdnX1AT!yJK;2Z-ut+3B*eu^ffFGjC;NIu&uJNu9w4GL z@W~=DsRkr0g~liz9C4=+ACI6!!Es0(;?xL%c}5J8$S8OkgsYVCvVy$?g1io4_$3BR zKmIL1+=u-L$YVn_$Ti5(7{0}jfm~s6(2|!=**w47>ID|Y*6ZJ2Q}u5h)!d~7=@ppO zbD5Zh7;5w&n=iV1x;wjh-`#!dn7zFZCtv?-C)(&f-QNc`cZVAWUJdmvd}=S`Yif`V z4~j12NjduZFx~KQWuM1${^FZ%ZId7bnec82^E$TogzJXAY)q5D>n`JKw0Jo=`TS`X zN_u8FeFQ95yVkb}#{zdd+yLK=(CVIR?3e#K6@5axx=jH+eOLSEmgQVKrl%HbNDbo8 z#_!A6`|H2gWAC+MrAsl<>_KN~#I3CmThu?Fil>239U5=Tryn z#SLEQdyq+7o|a6;j3nk{o7sVySwf4Z+Eg2sW~shxRwx|fBA2{)rUu7GTfc8Mjvx;{*eS`c=hs$_qm0Sh+9Gy=g~1I?X9lDP2px-{{0 zRV~Y5irjx+%o;s6M1}dGzYNa`~yap%}1`QIVHI7d_ACAK=0uCTpS=40(3l>z3$Sfl71hqMv z!IHEj`ukwy!K}gm^o8e%!O6nf6HcAir>VNCCGUt8rdOZW_gCU9WmXGeroj(s0Yd=G zEW^vd??0lniL*S@XK%JyzeEdeA4?qgIaZe~CvY#4W-JcDS8B^q`AkbLLFxETo~Tz^mwAmEVo-BwTY_m!KWv9&&HZ|2)~wR?UC>iNX@I%soNidLCYGM%k1d>jUZpD?VEFz6}!zy=Q*{%9wU^C$@qlMgd??SE4D z+12TY%nht5ot&&!T{zXRfe|U9l9VVr(;5AwYadB@`uTg~Fmmr|aa;m~CZ~j%6rU6k zC$ezFEVm(-kwB0lYqX?|8D2dLXlPJeIa0*b?+9uoTd{aVL)()!COuW6STF}_D6dxe z&gzccmo*}r;d6X!ZCGo5I@w=UYln@H!o*rxn9uCw6NU8H8yd;!nWZov;=CJJ0EY6-PY&=*yK!xkd6@}%? zg16q$3r(g=LpQ3M^Sb>yZ*rWG+Ct;Qtp!OIt&Dp0ft`+YFA`AI`%|k9virfxe$W%I3!lty~ z(S8Y0Yq@_steV;FLRn;6H%&SMBk`hn=Y5&2)?hnxOot3LBzUnL9*l!b6=@+Y%CVan z%v>!{=aXd#Feb?r~V739(x&4_zJFuJ@C~w}K za=4;_qCdFxs0PY9Kgnj41hM(}i5}Wq`XafO?eK0QL)+Dc=_(CE>}?*!u7+d?4C+B= zUD;C{*i&AoqQt}dwNAfZu{|y?G)xi;Q*#Ex;iiiFGn8au(+5cCeeE*|z6e3I@NX4TqwlK(XLFn$U{`1Q} z4Md|4hg)@|+qpB{J*RB;p`$(jRa>c`$E|S7mtm zBacEpai1czqovFD6BJgA&fM(~f27YkgU=RBIyX-OZ zj`TO`-=;risVIg)Fz4RS29F-mY*5 zbLNdJ2(&rMGo;dC1&Eeg-VsfH?B&~St)|Ri-Or|gDIwuj}w6cv8zzKXO*Dqn(%&Ow7XVxLr6y@!Pr#d>OHd5$i`Uu=i)rC=IiYtO<^*TJ}QKSB3 zr=~O2R<;sq*E+?g&o$ip;|+?0H&S(aXG9{OZJll71Tds@}@O`jWZi_ibB3I&}C)W^vx%=#qAD z$Emq-4$enIVOVEzDLWb?933XziP$|HZJ0!nU%ww=2rUI6M*N9}1V!&eEpvo>?vYDm^^*c`7BxUMLdrf*-; zkEZgOy&MdVu$EQ)bD5x~V~WAu_bh^5rF}tn^~)T0UjG^QcAxGFS%uiX{BmG<2-Wg? zB{_a%{MR#oe_iXnhqVxFj!&sO**iAaTt{p?F%@V*lHyQk52#o<-wVFq=hHR0g2;g> z0SLD8Rcr75?kE5XgUI^xKct0`>U;-=3C2e9zkL%L?!aQfVV6s}cZ7PFiC_OGp!EC| z49bl4A_=#i&F0#=8|6!9=2&MXIIlP7Vy&y%Exu;{gD%}Cgi;TPD#wP%koAZnJ$6vW zKF@ZUrGz8voRJO`bJsTBArTN(I0S({r>RzibSt6}WLXMZfUxPS2gj-sYF z@;}fobruF39g~%Wjg^!4|2EfbB&^&VoNTGWh2R*FtUTNttcm%`)IiiDxbxQf6BOKV z^ZZG)ZDHMIQS|M<=2;FY=`3!H!o3jl614Hn^v!N8g&Y%O zks%3#mm;T^`Ok;uX93lS!fUH=y%TT-M>~c`2Zlyq{}JT=d=Jko`9qUf?HJi1#2JJ9 zT3-Vp+#M0Ox!fR}kekdBy!$vt7d90`G&njsDtb@l7aqYoF|ac+0FPsLU<20zOgPwT z!OB+f(!sMgzNsNFbJG(O36aSQD=X;({hP=Gs{?6;I0<_fH-J%uJOpP5zE+TEP(TT4 z1YZOETP_+jh9J+%?CPaObZBXCbg>r{<^@F~9Us(|Ku9OcHp(B#FZKcilUCC&fN z-gvbK@dV^skN|`o{2mziTz{_-KH~azL5&1BOnMNe5tjA3hVrWHMr@!+5RAiCYZR)BETh>tp3^?c~MV` zHO6XS#j0y+hFas{?f+EEEo%dxIoaRX#QomXk-^ti$DjTtL3hG8PVBM3;a_L1SWR2! z2QL=;w!J3}cqeCv)1N$_1Y2O_&z>D;1+6q|fH`DWe)|X2Cc#pZ?**3f=;>)(iT{Cea zJcQyWuCpzbD^+1E@zMA6{uguVH=y#Rp7gye^4)_O&abWcDWmY%()S&^)w{Ma_PLEk zoOpimPzUMQOx$5`56E%)0X2VXtCMfP7o`ARTd|zQAACEmBxHYEwE(Y^unEo!oXke}9{IVX` z5ahGj*)iBbdY(N%9z?n^`O=Uy&Rg#(!RZ|_Fg}0S1$!YmMr5gT@q4c;>BAK;9gm*jY~)0f1#T<$ZsQd5Bh^& z`Rw&gZx-VK1>h1o`$8Ot+Y1AH7=OnfU-!Kj-ze3O5(ma6$W7>e?cS!YEv@bnBN6}i zVL#%=i7)t7L5uXZ^>om0&Dqe258|7^>_ed)Xvj*S7uk0S*cry`dx=#fPDLxc%rzly zCZ1jrS|A=;`&0trn%-A**8zgzVeJu%Z{!!H51}$vK=te;^i3b;1h_+{yC6P_A?Ds9 z4vobCrtbE)44m1VK)&`L1jpPQn?6GapgoTNd*zPlzf6L3zJ*heuK^05z||sbx)A?rts;R z`^;YVoCszp!iUT$gHMoFYcnwW!z0G<9~csB61o5=0^%A_jDPoWxk;e4w7?(ljKG-n zYzblQf4t0?GBOMq`{<~KHEgHDwo$_avD0F)&yJDP9~wTlB9k)|yqlSu%EtS%AVj_U zd6;RWY(L?JW{=04IsZHBhDc4@qq z``O2vl2Q=}UxeT+xjZ4g5EM{9FSw0}?%y?xdEvB_bAQJ5DPgH9S3#D}h9? zmh|RiiMA}JHl9>5`bY-_Eoxhinrcw?S1WdERB2|F-2d=z zJ=6wJViCb2@MN|w?OUF>s1kIfgu`7}mRGq3j3zleFZ_uej`BxqQDq=v0K zA|aI(Y0uL8*=VkA< ziiNg5Rr)F3`>ak`G}1pehPVxJE&q{=hBgKm63=X<{I$3aM+B+M@KZ7?19$MI>&IAo z_fbaat=ZV}f5sIktd0V^2|E1~c}c(EsvTUJ;BFF=OpiphLqN=D#ZbZQS=mX}=oMY=fyck_{so zjiAX{r?2bD#^pC5qvxf^81PQRASRVME0rtjo76EXN)3lq>vC(X{aUyAN6=>$K-`)K@9FLS` za3_z3{8d=}%Ys*a9L7_w52@e>vAvQd5%<(|f`j?a?5S$fQ=A6ex?}EtOt(l|I)|o5 zYnP<{Zs;2VvdgNL2S<(FH5Ob)XwCCReZARimcJO-769q~OOg0_4HcF&-wFW}kXq;< z9n7OPPV!dIsNJLzQRpMn!1%J$C#|Xai#5Af>E$zl(h`xbF_Iu5g>IK>aZaHJOVas1 zy3Q4cp)Uc>mV%3Ij170_FWjiqxBT<3)@xcEbMt%&?YZsa7x?xq-BAsjPkgEg_I6Yc z?s{ZQs9U(K#_O|Zkhhvp}Z zsLBD274Nx{wjz3Vx1Hcm3x1Rr&pPT6OwNYH1)svxD$y%49$ns}N~By_lxT#SLhHmX zuDZPFSYE=*ixWKXF8)!xQIbE#XI(77+(eDdoptfoNj@3bstJM~Ilj^aXnZ`+6~~NR z5n^)*dv&^ijVT|p;F=+B<$bUxYQNztRzl=mK{DVJslrCzAxGROgx0>9THh0ow+Q;z zrSuP1J(G-)NgZ4j3HC>&LdHl9MJo#@6pUCMOMJ8K62q_Sq1aMBpsvS45<#FO>t$B| zKz!WRyT5v_M13%)(O-43Ga2;o--n2C`0bc?E|svb1Yk&}t!HOOf3(~e>{Auv_XzU8DW!%($CkMA_ErS(fkKsmi2}xnk-+pDH zS}2o!wg&|56c5koYbk=8I*<0NJaOtp*)IEIH|O@tD%8DzX7xV76Dd8h&{HUD7qHpt zpioy=lteOEy_NpM8Zc0=O$DJ^t(VshLGXqMjpV(OQx)3u4Rfw(X@`0;Df?nW4iH(E z%yXd|o~B&z*(|12`eg@A@;xDR@h7?F{V$u~UM7hv-G@14`OUw(=Fh1S!ryusyED#_ zJ0V8DEsx}ZPU~{P5;mPtTn5PRJS#4nJUq9^Iy*16J>Xj)p#n{0U`0vpZ1+BRYF-B} zB5Rqz#44)pA@C_x*|dla)=lVuip!WTN$#~w_rpv9jiFNVQqeEw(19|QPiGALWT<#% z=y+NM8L0*2Q9yT_Kf}kmMVoHNhxhAxdM&VUaWEFJU-jvaP7l%Xoo8gv2#ch3q+BF? z+{LsIigcZs*u5ZYNf;;#C18?9srPwWO0QAb^-3*J&VP0Hi9W4xKIVaYl4Co;=(wbc z>|&y4Tu*M(;>EXvd7az^gg-5+K*5|lx|fU1N2ZVV;G5Ml^9jvP)Gc8nq226eMiZvB zD|dm?7UF_sc<|3P%aMw38=K8$O;Zq>magS9lWeUvErHz{|4}Nd&Q=?HL)519R%t~n z#^pMN?Qgx(X4L9tcDdoY#Kbf2OA=PC+WBW^sAge%)o}R{Ux9wY3oUzR%+~PXS z#2WB!5%pSmQC;sdJ4yxUB_if##=6m#&rj$1t27uTXLTA^1AS!%MmGlZ?LKic_JaTr zQhG2eKKNl{V;aQweW~WAZNW2@kGKJ5c-Ku|yBlQ>(?>qb1AWXa;fd<)S+1so(sh-^ z6MZQ3tk7&MA9PrCQeT4xM6S@wyVXPs9$4%9BN$8};j_+zLlLy4t-bV}sMhulFDat~ zcOvNWSA$zkmuURXQC(DFDsn&Pw|pRn|1VS1$A;)qrsXw|qqBpZi*T+0=Mt_4M^q;~ z<@xgy0_$Bhz0Y4N$MOJLK11kW9tANMgRjH^Bpe0_A`>wjwuD3Dx1s!}03-qw!9&CV zKRMr7M&b?uA$0q4hs694H^fVCgbvo=+XW5szq6M4-7c*-h#4m2)Nu_75;~yHIJ78M z8Zt>Msw)gq7q>z=mt39HJW&i{@s_)lsJi3FvaMIVA$u+1@GQ&}FI-iBy3j{jJ$N}c z!OEI*!Kz1za1*Jjvr~_x79M$ zJbhl8+E(B5$j}8*v!zNlmMXxHpr|X`oIo`t&@2VYLO%_QipK3+MK2sQ1=tmGj%3sa zT=iVO2!Z^zNBXvAmiWSc*EjXSSut9Zo@lRA#!l9#B=g~R90L3D3+h|PiuhRVyMXI4 zG8p*tTz<_XuYriiD{}4^%kMZ<34$yVR0Uqad9iY&CoQMkc88}`by0wmzTv{rP$e{H zd>U%#hiKxgMfSu_J6+84rKxx_-OrQLiAlf2!ZNItF@tjEH?lgZ^RHiT{h-L0nL1E*htS61jBD0+xJuG`Knz z@07O`wU$jyS(8aG&;s}iHMkdQa|!Fw;mgn{$4ZnZ(drh8!u7nvSx)w$ z7f3sbiX2{Z_`MP1_?UQJ&zi)*$3E^Z6cvyZZt?GlbZbQy&I6CDz!{bPz@8L7!JbMz3`@>^d%fXwr2{*dJkm2ZjFs0T(PDYl z2=R_}&vMKqo;T;MBa|$$#S`?&l(5XAbul$u7uJNk;4MI5f<{~^Ki&;8=jHCbjz%oO4_h%t@sdED5D zg+XeqiR7ytpLPU01@L>hyqX;FnYGG!`%Esvs`d1sPYe`n!k_8-Yi7%z>4?-Yk$`Lj zk#Zn+nOgTgPHqIa^tI>u*zrP+YSV0ceJBhfEd?BHR(U0i`Y@ZgldM4 z153=}1OLf97`7N`IL|5hWf_+%$yOw#vXK&(?gXb&R;tRTxmsOwJqw1GWK~TI&t&{z zg)m0>ui;#TAM9-K_&J9Z6}xdjp^p<8#e8(Lm5n0(;P(6Y^$;1!n-a4kc4(BgydzB< zbS<*!hCI-Pc08ru*XuspGy9u-f--We|PRD3m zZf;_zD~82aiTE{7^YiwrRN)soJIOW7zn$k6fz1HW=Kl_hAO*C!Tfu_`_hW*~3ip5( z{H=bs4zhDyWq{;bIwID7jjx4yJPx)pjQXyV^9Xgz8E=j#$r?dRw;rl6PL@gjEq z^b{0ut3CcSI(F^2-4U9#@VEn&-R}p2kW!Xk61JdMCXNe1g(ZU3w$5H5yOMORARN#MqyJBD9n-QL~T>=brbaHL}Z(h(Q``7g2KR zo5+3|7>sA8dc2aPKfRe;e~QhN4Si+EDDr7mxVGqzyJDutru=GOYa=0#;AXR4Z~|nT zrc*1!*)gIA;{N>NVDwlB7@-S)G=`z572`W=#@30yC*|^Yj$)BcZ(jXn+Yu$K=7J9- z(IsY-{l~zSSawhD?9M!R&XmRpoDjCe3dSz=sXY%Eq`#VOES0Tie2l|=&6>)!|Gm^e z@WimDEYhtlwOegXg05ToN+AS+s8RmDTfZxE$ctRedmct|)RN9C^Mq}BCSWn>{)dZL zlG;J>(RP#&c2+V8l4hi?cGIgCNU{Q~C`QYf)x9EvXnm z?aiBA2t8_7FHa0rq3nb;W%FIHr_6Y*-;DceHg-pmw^my6C%2H5WN1(Q>Qwa2!Pd2y zUdTs=>e^Q66@z_E-~#aEL(2H*lpF(6_NOVXX~um!5ZF90$Yq=_38aZ($LcI9j_)9#sJ#rd zNq#T>NINGN*Jb`WQQ^UPy5WuX@8m``K-r~iOm|WvLF4XYq zXYeOfoqmIZ6I!aT$OfEuV28ZpdPxzxc{j2++SOgcLJg(^Y%Q-0L@Lx3fD+F{p(q`Q z;lq$ptK{c9O<6YYqI;~zzADA{w8ug=9vzd3_Qvk;+umn{XF-aRGZk2|ESV9ozJln$ zXY+7Qo9$}Gxu8o3D`L|eS<%9PkvZgn=9U15S#6E$@pzq!(hgH3d9&hng9=WejkUOK zgV@|mR+Z0^RASyMeA$XX~sVjzNZObk>YWy!rr4~#DYV-iVLgss{X%iarB;i(LuqlDXMmm(9B)wD`X zB&glx8CLK9vM#9_pmn8sXuhJU$4cVA#3X{yS+yG^{^ud!%1!flO+|4LAZl3K2CW|Q zgfpDS_u`g~7s+u3z$pbeV#?D;I@6_=c(Qo%A+E~$=O+(8pcQ7oBNMrVHlpd(vG7uP z)*s~B0gziJPy#JrX(@mLbnE`Mv%*X&1bDFxhtU=ew*D_ALfN?KZ>1M-!1 z92HxVnv#yv54-jT%GU0F90mgeOHVjSk!laz*cQpGoZqNliW^To-&}$oRmm0ewFafGkUm7XoIxhZqY;|S9oA) zSqq^l(F)Tp><<ew$gJru13kuFvV4d#jQ9hh7-lr{S za1Ff647%t$N!`-u5bOy2W~kXbn+v~BF%76|*-X*n!v`zcV9>YOt-q|UjD&%IPaXO4 zbj>tyU7)8OE}k>P-TZ7{eoZ#CLzEZY@%4e8{>FKsCGXs7tBXH}K}~lVXSxlBS6j$o zva1CW_Y4U&Bh`?0&DK#Xwk_jPeJUDDH8K64mpv|=$m?O4%{pVsETY-x`EZ7-uN!c~s0+RY1OLZAIR11Z$s~xykpZ-K#D;nR}@X=~@2+h94 zbL>LVhFoE;__ICQSVpLS82!rji@dU=C1zpl;HbQ{1Qk{VVW>Sxo?`YXUoi{EQ;x^i zhfjCnRAm5X+kkQC(t2fV{r)-m^>nLUNETQqBk*oKCs3^4VBjC&T)v>DmSG z4jQ^IsZ<3p$D1xK_WprC_sN7SuqC}DV;fCYdm?lL=-t|8GlrO3m z{o{v1!>;K0vmewSou#IUepvy!zp_L`KHP4PH74$wtka4p=lLaj_t8B|bKSbQ(sY(; z2C}IrdZ^25Z`GxJiGGT8n);-q#&>@Kz3Y2=k*WwE_ywMWV4iluJX4AZj`ER*y?vQZ zFUmYt)p_6-6!Z_WDvb#?cD&sPv*V&62ogM~q{XWwPX^13>NoHbFwX22BE5g91_=-rLrZ{4hb#-tZB1Ng- zuVHiOavEq(eKBd@^BE=&dY9iq-rreiZ`tSPGM4jg+JBn8X5!0=EwSD*sYf43WoGfDlWlzySrq@UR8|`7V zbvRGol@Jy8Cg>IpK2`1l~$y?g-Vn9t^%nS&_n#qZGd5Qc95g z)vH9D(eY44XWLZpV^O|cBJ7~d>n515t^{f6=OI4D>6)m87U2M(duUR6uJEFS8rHpN zxlWK2ZXa!Ph7dl9y-TI5tNaQ67<9+gVRf0Qw&X5LuAB~GN$-R}L*L!}+j&_+Pz)~L zKCP6uwIq-s08Lh@JDif=v0(<^GDSlizK3cM)yqH_!XBG7IT056$tmFG>9-~nhoE_W z{mlZA=6AE}s$E1;d&grxQYa5bj#jdoWd*849-@dwrfHrNG^h1gSxQyd_X9_4I^mc894pPfMuGuHCp`Bx@!8%hr|Nu-&I@Ep}+gC2+j zBu`pjvr#yb3v9r`NmQt=;RH@M9XAVbN7K+Wp({ZnNU-|=d8QD?gxbXG z?Qz}Pu~t4Zo*+4^M`pDe`hkUYyi76rMWuUT0zjs}K}pfiijPa`*H zfDHn`G9HF)=CDmS6PEk+hbG?gDC0G`3Qpn}1D6{{a9PMjzjJ4OB z9NW~;SJ#hfC}zBQg9Dlq|Ce_+ixzgmi;Nj?i?hJ0If;r_zfObDotLV#Gt6gtJa@`O z#rV(AIk*!CzpNADb_@>Uv@i^sal&(j!ao_&Ac5Nw#p<^hNx62TNAD3HST=pX0E)Yu z-$@8P6q>-og_udTdE&x69?xT=dYTLPS~sCwYPt)c zq_;ct`;>G%TO%u=(WQ`M6iYVFmTgqC@CdFWVys%)Rb9k|xA6?^e;dK6$nm#(k zu;zhB{^7asq3l$&Jzd+xp#O~UO|7KII`r>Up6nDBCA!m=ibS@ReF*`xKL#we+GRf+ zIGl1Q`+&LD&bV*3O7!-U5+=9o(4sJ*oVZFwV;{EUsPLTfU()@c(fKv91ApBWlwzeE%! zd!$b!m^SHAG;hhJ&X!^_<_klO&eNajqH)tMn=U3=E}qgGr5_XYMSq#K+)C_$JLfa+ zv)T7QJ@6r?Ft!w|!9tYv7Gy@FU1eLdkzurdvc1#c35!|}E~G}r}{d_;xWxP;<+ zQbt*=%Us7Z7m^l*C9x#oR^0qN1;V4pjW%97mD;Q2x^U-b)x_Lkr8pMhAipO~oH=f_ zr1znj%wpL-OeEmguzAQ@U9tWGuFEHBxq{~k5N)NXE8F8sZU}ZJY07j%U~C@0MyB_t zhWed4yXn2Eossw!Ysr&`@Ldf;BrDACzJdngW)HsW`>y$YA=Pl8HsJl@+F_5IZ20c%@=OW5wdChKE1Ad($r{{VDHcx zua@EAwis^5inAR~ea{aE5c?b&13!;Fv{apUYSQy|jo*<1RvS;8A0 z!z23YBs`n~Cl{sc)%=;2){C^_$NZipb?7rOL)k!rU$88^G&_)97Nk*W1=op1@;emXz$NKsq`wXa6%^oLUT9A(>mM^^GQ4Iv;zyCmE{k1!oaS%hTKV=6?|9@_#Q7_kt`Ryq8_a!q8I#-6Iu7oZ29y4BgJaGBcpAK7@Xo!wuB5X zLHjY?e9Y^q9X0(Q`bD`By#IVB?kzpdvU`BvwFLUvwM;3leYVoBppiJF*C?0%a&(X)L%NPJ(3^d}@ zlOsU5$F%h;u&#q`o%IZ}n1pUdym?NznS?hbl#I;s@J~AwEumY=Pe0S+;8Xt-@eh-@ zc)@E~RweIYk;O?pu%UEa-g^AHlbaYYcREb-*68dk^283h*5Z?7NUx{x_t5iPCPZP6 z%M{_rK|41qtTGa7WBu2A3i}^dY@}%&7QbF3r**m-@930x`5Zp8&dyc?x+~65H6^%% z@BxjzWrygW(48$bO$XGsbUv`*z}`Z*eQ}O56jvV7TWa>o+LL=VM0RqKsVnff$~Thx z2$D$)0Xcb3_J;<>UZ^jC^aZ*cB6XaPI~PyMDr|E){ru-Yc=wF?z6qefvljftc;AqW z-LvtJ)H99t6csEgmBKsGvZKB@uL)JBc7S0SX#!py0osQNpFGt@5g1|DL;8f(`w-s2 z)luiZoBn|E8o{)d18#jK{x~dsgkXF#O&c>pkH94&*nV%$5niP^Az0?-acyx3nA+Ve zjsX<`44NRtfL0D+G@r zI@JT8nTl;!-WG5?O2LmBPtL1vgMMn-w9|_`CD>CRteU5Y%kSN-S4YgynH%`aw^%Xa za*t}d=Ir~T;8k-f-8-i8Dbp$}+$n5YjO?~>v`r!$|Lg2oVIDXFdrxjO43*WliL$Uc zke*dYQwjLP7Hd>d`nTxs29|k8s3VLnQ+~xIKJ;bbO;rmFRd}K>?Ob3s-C-pa`3u-* z98ETh(%q!SBpJ~MJyRhS&)-YaGwJk+mMNZH>G~-%&0W~esT?krvqDpoy9?mHVX-*C zmZ17@&POR&s02vS*{mW3%X$XNC0>FXIxHH#c~32=p)klZM}iNjzDPGNmm#lE%g+#) zOFcL+{XU0iMzBYYh? zl-c`7&KFMU)8WxcpZ-+=uPCgCo*8B8>_)+ogs%B}_mYTMFg+-0#VW0{SYKC*17%co zkhLf`nGWwI+S2dX&@ou?Ms+wAB(;QIqaW*)Z0ItO?4Ze-k$33hvq3S{j7DY*&xS3= zfY0=g>=tnNo|riOK_9F__$DxiHq&-4qjrYBmFV2(c zr!lrO(demX=kRW4`bE}{{tkb&$K26*N0xQhDObF*5%yY<@N>w5nk&E_mqU(4(|_P2 z`((3DraTRdHcSWa5}vnpuf%3|bTBb?K10!V@&zcO(?8rAZN(>n?9|d3XqJh%M%!fP zkce#a?o*!{#1AD0EA9MLJM~fj2*6edWFHW)njn^Bm_AV5vtjuVad>su2?WuirM@3` z>uVp3S5e7dqfT9!QN5kXXM`n)W83A$?!#=<_{b?mwkMY zz~Mr!r{ha{0-YoO)6!PT$bH8Yo`dGaL5ST(1XnUE^7vr6w3%IgG|de-W2 zu*J>fc+2l;PSJBv_!On$A)1j_wWp%`DGiXpZpye6NGtBHd7tbIJBHHwX!VEeW^(*F ze4TXI;i@aE@jrV^7vu+uAxO&+&eUW9%y0UK!OHz+6jSo&t8UZO`(AT+exJHEg!?qGzf`yVCyp4`T|-Ndc>^O;io4U;bnBp^(J&@GMCQOcb-|c(9EYT!`JT{aL#hDUOZvT!~sju0OsHt)#fg@?%NYfh>`@vA}0qZDl1%M;QM#0g;z*cdpK^ zEd@HN*m^1JuDj5(40*=MOY4^K>rWpoI_KuOpCSaJ+&_k%UA||x&7qmhR*7 zl7iJ;JqvgXwERD^^{E4HM*Ar3CvKUHQ%in(>)4`f|A-WB z%YBFg7QQAF$P(Z97|a)N=H=h&fpL#&Q)gh5LKZ0^_(!w&=0O281plVEwxAhn2jD?o zcRun$W((MR^6LbqknN_;=9vILbvG@;quK|$<&T;WEnJ`cNlk81nG6?kdq-Z}yjCD{ zja2#?Mk9xwEcJw1iheo_=Qkob)N5Y)MonzW0ET+Wm3PR<=l*$F>AK+^dTY%WId$Hl z8`*->gmqNvtC|p@xIqNdfW@r&>knP+7X>Rs76bmP>Ih20n!Q~DEl8jOD&hL0)g$@L zJDUZMci7uF!0;csM{9R>j}vK?zdI>nuE?Q1-}*?smTDEbV930ip)uJ(s6tfM}TeMPk%@arL9d7eQHW#xdWT99puJ z)(DclvX@<$I!xht#P9bRPx{Mq28OB}><5z;R$^B@i6EzM^Au1Pd`ZJLFoCqPhu%$8 zTDoTk9+Y{yS}9O59}CslJ$>E&Mit`jmdX@OHro@B8DV?|_uw19liQ0(C21zL`IA6g z&YKnL@&}Wmr}NtX0$@O&zZV22zwC$%C~NnQ9cTe9Zk}7%3i-@U&x=^Slbmo_c{ZOp zr;5CWqz9w!+lw=Pv0FXle;ZL zMU_pG!)Z>*s7iqN0*sRMpI6I50*6^K|22)Rk~5*8f3h+n6kH4u@e0Uk zBB<}*$|{NQvzmLK3cV8+?A!SuV8k)LT0q5^Rnj#cFC3$44X7^Wciu8cXzkU(;lZA4 zhO-p1B|2(oNRJk)N*RWEwL&P>U(Gc*b$boI8ukwmH64IL>=C|l(d zPhNDQzvtg%CQ{W;f8ypTG#X6u`#lwDz}Q=nnu+VSTp_%9F(f^cJvoYslXY?wzRrWj z3PYS^9a1tTkgtU6oR{1&l=YK><9>tn5x+HkC$D!$qUxg;e}}`+S5T;z{w`Fb^<<0` zgL7rA273=GQpB)Z#~?ZH9xKEv=S}D?#YE}o=r6g&sC+$me`kt)hLAOUAD6u@u7)!} zPhV`6vL@$iRY#qpvx=niem^=U%OSXA`&*`uE7)0Eh0t~m$_EjLXeXDaVYC6|OM zi^QXe!0s#@kns~Lh*p6ON&r^(O}N=K;+8Ruwj2S;ZxQV1CnrsK7K&@`EcnT&Fm!yg`ZV-7a2nYJzLIgN`P5g(GvKnWWKf+ zF0*cImoG#7q-A*21?ScK({OU@y%E}1zaAg2$RWp!1yrhN!?xSG7#{P<#g!@*4*-R& zd|Hd6f!KC{@*$h)4fC$z3sT&un}J4rr_4=tnaH`}e|4ns1-y`StDZtCK`ql?$l?|q ztnOs-XoY0-ex~auj)$sGMLAry+5{r<`7!XX9mk^VQ0a*?l*|(*^2(1PDxmLz5%hww zqIy;aUzY1~q} zN3qb+d@cM~J$S@^E=km$TPXgcxzMGjv{@b|f6!Yb!cwtM`H4cG_=nzM%E={ zPc`r$b!^!9hK#dx<c`oLPfZ*FlX!Ebn~FUb{A5 ze=mT3G^;*34MMF?tHPYDq+mZMy{#%ve45Zhv6HAV9(hKLa>pszyZB5SJ203B8*BLU zk^HEGdA&6`#l@Y}iW%!cTC>_whgpC3I9?;&h_2(;Z^d~MyLoiqF1oL+_{y6ma;0)| zdNK#jugt74+{}UF zu2qYE5QJj3-h5}`cbogIXe;MD8~b~dVdx?F8Z3^kYShulgT^*+dKC%dSRVF@f1Z#c zInFyyNcQ`a^2*_K%o^U-YKVArv>YS}EjN}063XSO_;>0{h5;4Wa=O#S4l})bA?7O6 zJx#w)X%Qu@ETD&DEU)775y+`NCE8=J6+#vQ#(sgszJ<$Vx$(WBy3>>`@`Co?e`#m= z<9h1T5 zFM;I(ExSn1-1Ep(iaEsg#T<+V;?~wGY*+3g?uLQzdlaxFEnP^CqNp6;u}_&(T!POs zi($z^91UOh%jIH6c@1mNu*kbI>9Z9jobPL7EeSeeGrPW))s^LhX`)xOf3(jSm(V?7 zbiwN|1D>(2 zCI^v@alQ*a3hY%+?e1XeO0wu4jwdj+$aA3lWXjmnPN)36@+L2O z3_C~A!I}EWkf1#D6C8;5!?IjVNH@{XDyc1R|{f zZ(wW5sr-;^Zyc=$7r4&0?Kfz8j*nYn+6~u%Enc4{)IQN0Dm(eQUh22fMra93&7vz< zJW&hIw>K||e~9{&ia5*ZxbN5KF(ua(98fGTlewJHG#&eh?u zNY!A{sLvog?Q^5f##H6M&12lXdVh&Fbvap~!@xRTUrbKfE*g1vx~v2SOtzVf==2eyUSye#wuuQN9qF^ktvnCbOE@gNqST zCDl5P=wP~v#rD?1R}f2ZE{!aE`5Rgyz9Ztn(2|`U{32me7h;;FA%5U%rd)DXe ze>YPWIu#tcL!zSrSOuNqXB}K|_PrWKo6#_Bv|nYG;N0CnI~=+Sgw^D0(eGsZs>nJ< z{rJD->E888Gsc>($a+%h;JRqRGPKnskw{+d!E6ch=c{iIiro3aTjR}d5j4?J{WkHW- zgj)wvUKYLjgl(pHkj}-L=30h=YOH?e8`7IVWw>*L#=K>mb`BAo?!(N*3MeCd6SLw3 zLnOr5%R)Gx$X~cG=TzD>)r_XLe^e!jY|AWUXvi5ID^>>vaiMkRv)vQ!4v*tcjTe`@ zz8@^QZz1u@ljybk2|F9XaN6LF>*jboDf0g6c@Np2m zUkJee+)H}Utto)o#x=WpO+e1SweP_3 z0zOBcb{ppbn6AZt?Zih6fow}bR#%cP`DVljOMsyNV;VmNj^!=Fuprj3LpyY<#X8LN z(=J*#-}(&y3?%IttX`8WcRziU!oN z@sf;1hbJ+44ir;$9~?p;mUPG{@NLo)Z7z#rd|L1HWs4w=Y@)k9bctr(6l!9)?FoXt zRiUQ#+^&W9c`AHGe``;A9uJ;nz$(m_L}!o}C3WyQBN)L;_pTdRA&yPAvMTyU-yMJ- zTOOmir)Z>%Ws^!i>BVdi+2W#0g_PiSYHV4F-Q;@b_KVhY5s~}}hzqK-ej)xljeLp$ zvTpVrN&tlXjpY8P9SvluE_6vf32J3@-6h_zOLPBf6Lsfte*hxEUbADbU25GAy4x(x z@q;Vf++wFjf0(j~YC8g^Cfg{(f>RLV&dT3lSw~@Q4=DOwLQmq*Q!|U+%iu=KWW!?m zgNrBe#tzdom_=gWgB{)!)2D}%lXbhQBrbNGE^V@cOXH(q-k5D9ny+wI4Q+L^0?Bqr z8<%NJgtjg=f52eGT=yD`)Qz&Co=J8#43`d7`dXn2G5pzvA4v^|KdJi@k$gjZz}-wI?Xhj zkHI=>KKtj=W!sA;?}m}aEi%R$1BGyVD1^v>$^R3ue+N(a2VQkJ2b%Pu)g~q1STQB7 zf1DYE`YU42p}^m^aeR&blkII}zLovQZDZ-TML(rrm>HSC=K#zJZ()*Ax{tM#oJ!~Y z42y%b17qOZzXE_x3Cg~zh{ykj$gA6X9-M}vuNV7vg*`y>JXn@I3RV42ry5>j&S@&} zq}Z(ge>wnEheYQb+9lHwNmW6m?ZKjL5X4!pJd;gsW6Tyzw+lj}jPv_BKMlHcS)W{ydJL z3Y?hJXPJP1DBm$M!Npj2=Z-jQ4VW%?&G_K55pDKXQ-@9iB3?|UYG1paBcplU{=^vE z-7^)PV3Lt{*900Zx{>c9uOwoRy5m^wT$V$+koh0u3dk7SqTC=3x;4<&gdqMQLoTA9 ze^`uiB$MfyZQ6q4Zk#+2lFP>EKsB#swK`YG)jx&&CV8d-)~7XlpPNvV;2buz8(Wpk z9A52(XSKg4C)r>lf&QfIL`B`?E`|T4^dp%5Wwk6(cg2(5%n_Aggy(2Ip{nsg{PR4Q zp@qoo*SW2U4Qs|mu1~6Dsjd6wb90u}e*y*AU5Do`5o?g3wf)7+`W6_$D7t1q5jDNk zvza;t^uU~=?MAHvflkrJ*hmt?$|Jw2+-C+SjhKD0(W*{Iv^&hxI6 z;fl#Dl&vYO(kLo;D{A3-kOy4*YHnT?6nIp2~yTawp4T}{#R*{Y#DyOW1RGaC%^ zzmR1YVDr5N+%Wn>ggl#9wC0Pdj`%~Kf_6>fn1hn>;1EM?%OUGqi1##X!m9ZKeohlP5G@)NQM`-v6p^qKYeDxn+pC9lXaC zB<1UTDw<&jY;cE1{UkzkBla$T(MfrOQ_QMDI{uIyfVoLU5F!m6DTOb-wZ6B{|0W1_ zg_U7GnKMC3TDg$634xRPt~ZBRYx}|#9$>>X^OFx=p50C_2|YRk9#48?f46?4PdA{( z3-2MpJ%ywR$4)tn*Et0;RF7H)aInzN4%~`oT*yLHxaaDZsk^61mx-niXF5Z!m8{%Cv_+~x>K zOQz{!#~FRR-(aMHtjDl@LL>tbnM~`X-QRtGS#~#~y%GuC##cH8B`FxdBL8m4w2C|f z&)Tjbx7vyPoMHy#e-xe{08Is>ydi?YUHf_`L4&}S>2yiYZN69eNEvjPY(S%V>P6)f zMtq^$rejuNVZfQ_PBfAga{GD6W{y49eI>8DYb_r>v7;JqBAJNU)tNFYNlYQ~?&)S! zm9?21eaeU``gY?lB|&%*>ho#@PxqMg3;({VXOxd`KM8$^fAREovUrvR*0Fevom`Fq zvf>ulR2Z?UbS?^1bPNgEoj%qrOR_604r&eKI`me4XYMyU4?_-L8&RVJK_sWsQPcFP zbP*)B<$+=7-o1tvzUR3`CRk2ZiqSrf&4G14$v^VIP5p9(MJsZ}i!Gp_Riu@^QF62( z>mdX?0P37zf6`>c(+nK2v6n4C-T+*RW?-uv<&D^qD@=xwdL2N)e%9@xYkf z{|zOxun8R2GzP#875CWHG>0kT9x6+Ca9NjQesclme~6wM(jcq4TS)4pboByuU$HAy z-lh~`GMo7PTI^LyhBUliJ^VyP&Sg7-MgB$ha4B)66QB&B#rDvLMiw+3Z*T(A)rp&6 znpM5VcuQcOiQ01}GWqUg6+vG8{bRJ)JC4-dHAZD^pk2S&W%PfkG{C#&rMT)afXZ!5 zvm{Jke}^`3CBexD`b__e0tPcLoFN|G&+^4mT{%FD)bLW%59XJ*TY`VK^f%WJX{nbG1s$$M*J^Z`~8ZshYdwg&Vj-TS!2}RTsY2d zYUvH@)m}y4QF`q;0=@-Z+`Wy?X)I%KN2nAvF9Vm;)~HD7KgZx(<3`nLPm>{)Q3Df~ z$_fJwx4mKm^gg#5qXTFg0yi?Zt=j|58v-{pm(UIc6cIHwGYT(EWo~D5Xfhx&F*h=o zKcfQ`1u`=+I5Lx=QYU|m_XSjxjoJnZ6VfF}=TOq!-QC^I07DGj-7P7d5(3iFCEY3A z9STS(9cSF{-dp$g|7)GISPSO5zMR&CQ9Qg~ij;liAF{ zmD$n7T9}Rz;0b?nvjM0BU4bqhKuf^yf&t2A4#0mZV@9S1Xxe~W|B-7rTDf_exc~tW zfj!6q2zG^dxPvW$E&xbyfQFnRK*b3N{>NDH9|K0fzk35KIO4OzKZEg-+x{y(q!zg+(RZTN4N|F7A0a(O-i~d2}02c8-hzEbbBJl_D0$3#fAU*(#)PE5VD}Y7%4`Ktb z$oxU<02bLlhy%bP_Xlx8w)PK#L|6QSAkmfnAV_rOKL`?C<-dp*5?%EVg2Yq*gCOxV z{vb#^%|8fIyVf5BiLU(zL89yY7x6)m*&hVS#rzL~X0T`){v*>z&;pxA7kd2c#;he{$hdDZS@C2e60S0 zzm=drF*trhk3T`#ehdEabNx1Vba(lS9b#bp7lagL^QS~eBW=8$Y=GduEFdz_Ul3B2 z?OzbmP`ke%q-*wnK}bvgstocpWBGr>%mr};LvG_QJ)~C0KgmFx9sfrSDaPrK8bam- zdF6rafmVN7%*pm|smuR#o)eO_6XYS~_-9(2kVZJ!ySx6y50NZ=S>$eTi zAV z`~@MIdH%JI5O1%)AcWrgF9>Ou&!6NVOg=!De?tAw!_UIq1u`%%&3YsG(vJel?H=qXUUbzDZ*D#NWxPHQRIH9iEbOZt)Nm`HJXU;Vir0UNGYtMXM_p*1 zJC9ER@5V%eNRM^yg)#T*dKN2x>V-@`i2>RFB%Y(hSAUEB-QB#;dZi}2Yc~NEfj&M7 z>@TeGnYX^;M``kSi@s$gYlBN(t%4mAqHJyy2q#4CJXKfeIx(DZDM zgIaog9~zw3M@9#kZX(j#ZbzC&cYFMGK8g&85Ld53H1 zVu-4QQ%ksA5lNi5UEQDgA1cxZS(-?in@&h@8H z;>I}N9JTMxt2}?B#7Ew3Yx0B@Mt7+P<#)TPWXg!e!j#_Z&i5giQ=V#ydyqRcCt&Dk z3f=EcbeBGQGFHe*QqzM_=_9BO62*=F)f~iL->Gs-3x%5Vdi@=B z&cP}yrAg;Vv-ZU^p*WF-=IsYcpDn1q#jg{)iRzXZcS2^n_lK~rr?ibQFBN18r(@hg2bX7!!XTCJpA+^RyVcJVp&O+;V@tg#09wyjum-+df|&_(bkHWXfRe>Avai zId7_l7SeEipbm>KFPYP+S)CA89jVLO=nwNiIM>WC8!^w0Mlo`{2Cc#`%Hr8@K z#LO4L_HPbn4b68;IU6H3=NkoKn^oU}5E~n7YqLd02uww;c+!q>QB1}Q;0)e(UGaLU z3Uac|lUxb8P2I{utze)DaA&r*_`4{$vwh=u$kLL4f&*pYHpseF)z8fOUwh+|E<6WV zkWzmeZaSX@8Md_@aH?>6kQ-#1+{m?ks6G2!^N2HeU=d5mx=HfsQc3v%4!9gH&1Dl$w`BhJWc})TT`v_eRBc9Btg0ESWgub{;UMDgs ziT5fkdW-^1L?62f>#TNqHMg896_x$NxBGv}7N!)uErV|S<2m5ONbKzpAtHgo_~Ki3 zYU@<<8lT7;`Ei0wMt8>mrAqdGe4h>Xi_uwhSxmy>`Xc6penFbHk4?|E}mRbxn7tOEzy5r z_aZyubtYG|{93(B-zK2ipqs8HPDhcrAMeI=V)?K)_f1Im$_9W$8m%l0 zUlGiuaq0QCoauPBwkA);=eCURJHCI=Fir9v?f6rN+@p>1eZzw9o(dKKJ%bHa(Zgci z0S6A$Slaz|m_q5~yFv9Gh{k>_{F+zV~%4Q0S)vvx>`%Y?A zDfU8sQf)Ch4RJ-51HlU1A6#!LB=W?HHg9t61*(0=x>0B;+m>|Uz|!!^6o`MZP#I8R zyuRv7j>(uk{hD~RdnP*PFy>;387G~3RFgKrxlRDA7_mqxaxPv|w)ERf) zn7QSVA&RQ79T&3XLP=kcr8aSRlTv2xT3{$CEl$e}=s&F+z&cdEwE0ZMNe99sVcA#Q zeWK`<7p?}rTGAFz&=Dv0Kh%GwOMJDaF}w;QU@SZf-uQT?j)mKTThiGs9X|wH(W#ot zeAKD3$x zcifA_usBl&dtXAt8=%_FLZXSN6&^PSq3ourna7L|fz||$Np1cF_Mm_MCpJ?0ioKzD zteONRh9PsOpa=oq^@?$%;3_o^+#_vmfu+KZiKtn0G^}bBW|h1x5Mu`~@23UQ(38H1 zaO->_L!m8E3hAwT1?gMOLi2}=q%Q5?clNaQ*3~_^E9PIT;@8PrjwEu4rpX==1YSDuhyM)H#RZ%s)}4xC$TAJ1I{9iC3bVqR0a!xTY2#h zWgsEG4YA~S{W{73MJ73Ez}_bT1|BEFVoxsuEWI5WWaD)%sp^TfqZAx0;(U{})-;*M zo9**&LA0b|sP=!&Z)Se5nXd7=Ghewg{McQlxW5t>IA;v>8EKfIMs{qk*(~sa9cImN z4Z&O(Ccx5RllGeWF?W={39x>4NQ!Ut()RwF2z1r`kodZ zWhqYiDy9@#U~9X?^0~72;S@T#>h@k9XyZgr+gwts+G` zaaqy1<5z!9Ejbx>o&7bG+Ds-2ZxxD~V@#s69{!e{(-W)Q-UsD?YK~p!>`lGrdidap z3ZMB)(LRMrY5tqh37tNAX)L34mQqviia518q^OZpL$&w4MAGyXYamVBi})jBWx%zi zNs*FiXmNxFwdQB#HU*x98bk*5%!LyJmy+zqVZDD}18+|CoPquwbxXvkC9yY4dXcL4 zKanS;p|zwwoLoJ}ozE(ScF$wT#?jO_3PbCwiB4k3EpNF|7wx^I<#ZdA(ed=Z?RqS* znFQye))9QuqnTSZ>uu8PyP(l^37p%^WC5Fi-^0o)7UH5H(x!dxL#eBoPV3KCgbt_L~m-BELlbZQ9d`sRQA zk8-I^GlQrQt6Nns&LG+F0vx~Z2s)1q0;@8l3)rvq-cWFe|KwV}dOWz@mNlf9{bT@t z%a%5od1}F>e9KqiB+Sku-!A@i)#%Cs`y-~wn)YY87mgYux|^^;^$zbuij3<(OE5o~ zIu)N0H}>18dk61oI#44)jK|0~+una`ow8WPesytU5_NGi`!B~{pG^uD^>X>^xs*QE zyxKhYv5I{bgYf2Edlg0_QDE5vi*0fE*1&Qhx&MY~>W^c|w>rc@!xeiAYPzjd@Uoj9 z4>88wECD>AQ`vF`Ngz3o6NsIl?UrT~T_F|`f*d#O< zx`~Ta+4=%Vfg>;)>=P&)pXAe&Rz}0#+tXgmHc}yywgE@f_E{X9l(`gmpmm;rF@AJ? zt4kYZF|uh@Tl%fDHJtA8TK-=K`Vaelmce6d0cOa@()8Y+e22OtpM!svL!8swFPqIL zP@q1tD3PjZIU#+>77||`mop*?(tu~X0Z?Aewqe?!j~l2(DB4u$G3|#0Xt+Fkn{fe@ zRP|)a=cffo`Ci2n8@(!@!PA4njSUy&3QAtzoS`K|zRgJzM#=39Z61-7wT=Ande;@l z1t-L7Ee-jAxmS2)dZB-&rf|wGy?VvIU*K(84W;1WN>=S9Fp4BD+q8M8S>(g6 zoCTDqhV0uk!56rWvM-1u6Yt1O?wVo+jw0(PF9VZyzr>-m4$u9|ZA*~55{RGYTZ$k`V>1#Z=m?>9Ua{+d11|fj1s(LbF5+qYnt2qBYW5B_8zs0*WG)K%H=X`{p!6tvX#Gua~}g&k9Pq1)4I`o z?mf|M_X)ZdV-<9lTLIkxh+p=ypi3pZf0ee{1gH}HjYNN1yX)C`8Xi};(*0)%8<*KiA28fl;^t7Ex8lcl&XKn`qwCnJz)>a- zlEVH@@C*l571n$?aXu3(3G6x`Ma&Ho^_Zz5krA72 zr_HRQc%;o{XNu2Y?xXt)qQ)UUpF%Q07-qkwLb;hP)t;yINJ^7RsKE}5S1gh9P-v0& zD>>SZLp(tkGe<08cz_g)^y4N)A z!;keZBd!%9Z60IogT{uB(e%kU3r}jJ+hxk;R^be*9bFq?d5#oF@yj2zkUD&3uB^XX zPnhk!OLT9LE||#_?0cho@4enqQ8^8BPu~GEY<>O0DWc16)SJjzCYv?!A$##M%ea4M z+F23kSf7)jb$S(mdQ*~|Jk29~LN{1^l_?8O%!6qws}kd(_~t7ap)Sb6?)IcKF!b}z zb-y&|!H!Q(_h+(IQF+b`?9R*7(*whsPvrXJ0jK!me8*><-&a`ZjX8mLQOr)Xv$UmYQ^*y z&dHBI4n?w|rf9BDZu;&5rSUAaWfT_}84ht>aVlk=i?@tfTFRXp`d*D(L)*j+U{v1S z>62Fagh`gWiK24c0I{;N^N*C4M1^hX1a)jo_mn!KgkKgvjJyPF1Gi4KCFOtT{nFdo zbTRyAK1#U64C4)I4vP&Rp;+NR!DJLAr>go3z{OC^b|_rWQcfmm7Br(v-`pD>5udp@8 zJYA)3ag$F%U=bcIRC)Q4L*jp;y%F3?;AK?X3g012w{w=?(`XcApL++(<=FMw;IMF7 zTHrOK^4l_+H=yzu!#ZWP9=S`|xrv|CWZfc~{HLNz(r0*w$}cDg8oE8}taXBwbnP}< zIt%c@ot##!(vr~VP~z3$ zfQ>%AbJyn_9bXNRo0i;8pP%)%xl9xAqytQ{y?Ww9VYTx7Vrg`f8;2spWJEEv7G879 zp%{{7h8?b53qSIYXq!C1j0n${^3lt&`s2jxQI7 z|5Dv78>N#3_pMPF}E&Twwb|fu|t>V z7@X?vnd)bPae0qkMg=lIXr#-A@TvFO8;OZI$Qh5>YGDlqYa4=EJ-YnFuR>Ndo)AK12EQxrF=aMcUW+^8@WXcj1?2pW33xMYKF&wkM#29~y z$x+}Wq@M^@U?Nyt*D2B1SB;&h7ORk<3GK)2U%SWqJpFZC>WqD9T2_^(2d{?oRBumb zgsEP71WQUOY0)TaSUh?sp9%}g=z^VEP_6Y~C*T0q#(005bobl%No`=!5ar5{uVtx| z=S&z06zCrGoy-xD&n0C-%NOi3=FhERbS0!}vU`df9Nnl1=up#iQY%qbH~1KHqvBZn zq@%)J!E8CWT}3ELez=%^BxX!ljd!SkQoSb8EI{qHHog$v&H{I!!O)`9gJ#h3rVxO3 zjA}P2D^7oDKFf+s79ewnA|>#yf^<0Zm2&!5=?>$w|6!Jl1tvu63wz4YT%uH zXh=;1`B0#Izvt&G;I{_1&CqB{PNrDO>Zonfny8(M1@U;3A35^v zDZvs)Bx!L}#Im+$AI^U?&X3PrW6ZAf!KV?$YVLoE+O`xkncAzxsq*T4A%Pbg@`!8B zfYEQv2u9`MadfCKM~A}SyOyUdRBQ^a?PHiM;Jg&wrr0!m-xRw`>J9ZmI%?Uah{HdE zt#(1tIX^@-7DUOTe-_53mM&c0dGrt%D#N;+Cp}1r{Ofw5{siy3#7yrrqd_$YJn|Y@ zEUJHbaYvZ}{~k@>x1xoKJ$+uX=DSdWN|`LtTfpsLlNDvc;2)^$ zDgGpQ%Vw|6pDXfl$c%Bnthx^;J;$D@mCAodI*b#A0Ygh)$a(u)C~{Bnuv87@@#o-A z?fQ=-HwgRyUTLQ8C|oC54>$P!Q?`s@MxD&Vx!S>IqWZHUb_<`A$T(V>&zn%s%tyF; zg~u(fiGE9*w5vgnl@e)@EXi6KI0?+=)KQ;*dTQWdO;!OHFJ~8-xf*t>3t8}92nByy zM&1!Alx#cGiyVEg3Dzucbz!}@Rh9gv`j!3r#0aWap;TxHRRp-Chb}i2z#q+)8$(S? z56H`n?b3MpuuR>TgD}ToHJ-;y77-gwiLLmoA=6PU@KVMZ<7!t5f9%I}F#_TM#%Ykv zuIxo}qRO!ZytWTp(vM~T^+QqQ0DOPT0F{77vZFage)+=Tdivb41?v_sSSiR^`Wa@T z4bkQ#@#j`P^^$x2hW2<8=yKyqBo&k>S)SerD9cvTefzG%glxIO9ETF6si(^msdEN< zst(RFa+55S8fj?^PYsUJBCynfM$|eniP4{f6^Xq>C{(aKIZ_d9VQs#EZkN6ou{kNe?kOh=nlBLm*8 z5%^)OD?~Bs&jKvVk&|_{8_{qe&R_lEOGJzC1yjlR7vB)wY92)lQeLo86AVVfm8HK~ znj8-d>?*-ut*(gUwP-_jreeuHxF9E*JNreqXdufZ-F*&s^Uu=j0De$dQ>% z%`~Ew$>S{O;k1`Zd!T^^uv|1JJzQ_juvZ;v{k37Q!1PPKvMXtePkMi-H3t&(Kq%;l z5$*A#;L-^kV+~&o&rg5bdW`D(l)m#~=?S{}$$;F?#e9Vg4OLR+`7)BEGU^@y zTAsA>sxUXIh6B}b={|GHqB_6f3%b(DsYk;p*-^SXEa)EM1}A?~zijH3N-*nZk^5C~ z2FK7`@>)f2-xnhYjCjU8cp@RIqQ@g*pGO&eBSN?wuY?d$jCoCzzu$hud9hUym zi$ZFX9uTU+=_>O>dmwayM!71DOeJ?})W?r1oz@7?qiP9y;Ze5E9ttyUefT@h0lq7u z>5nasOx}8@QIWdERbSOIm;G9=acs1?cFs;MWPF$8;WwOoN}MJDj>Dvm*s)ZS?t26{ z>~G~EnI&rIx}zUw=w5iJ0L7|}MT_gmObw&(O@n_GXG;gCf^}lySq6vdwokeo0$L>B z$%ty4U)8SAyL1(|p-G=gO_z}J!hdh9!M|r$yypc8t1dmusUZnAj1w0AJPIVkSFs`Z z`PCA)@2>5Ji2-^i#$O1Yoy4Ifg!-MJk5a&M=^eTl8NMK5yPkPmOUBP^RDYZWqnQcj zF_C{hqgWhuu8=IyP6PdE?9Ehb^DYZj`04I+^ntc$EXi6IoeTYYh8EWKoQJ?M0(ClUNrls&JbN}cfvIIQ?FsM zPi8sRKVr*#^dl`=;YQ|Z!>$rAOe~{vf4!dA`@!0bt1)!CbE@Y^-rK>QkKYmko>sj1qP?u~CvpCtHORaQQLBB8vA!zl`*99!e0i>`ClG%xD*NZPXS@c-o6-$QOK9m!r7Ye!znh_#NO>)O z_1t%}92T-CeNEkc!+>IL`sh7J|B>U$dFIcmlA9x{pIBQ}HB3!Qd94of?wi-3Z78YNpQzC$}*oMJ&<^2zeyS6 z4A{AOBSK}A*#z4^6!Ydc;j9yw;4Go`D|~p;C~@4IurgJZELOF-4-~7X4dA_3>0Qxg zs*DgzuQa+8ti zrYXP)+a)pamUCo?!wWgErj&m@n-C_7pnooyZ3~*+KMx4RvFk7QRAt2ofVbqQBFyDV z_7J7EW5bF|FOiWC1%$+T!VS;&8qK$F|Jsdyi(j}f&l;9Fg_#GdOGeQ>Yqfmq9()w< zD%<@;rBu(4fM2g&-!DM36YrG7lbLzrow%K%E52~v&PQlLj;k{uD`9`JBz3X=K(n1k zKg))SM}ebozHxD+(j8B{Sf6(YQlgLA)s0z)-P;Z3t?rS^M&a*S!*uqn+(19)ovM^J z7SYepB34Gxa-@yCB>MP)+`=(#G%_eAZEU1Sff@Z-(LFr}6PAYdOC-~34G8Z`BWewg zPrV>Y6=`#~YQZU7nR|Zqcq|gi=9*mV%O86-DUj(*YJtyVx2m>Z`X%WR<=*P zLaMjrW!So@K@8_}MBJ~v6l8H)R3i5UDZxP|#p7$y(5t39?9cvm+6)4)#>wsT>x~(B zMuaF<_8++5sr+?^b5O^Xb-i`7DbUd#m8T5keF6>p2cpvzwbXz358okT$z`a+=kk?n zN#pD+_Ed;wsi+cOz0K|)aaG^a71QzJP<)o}5bMBkzfRJ<$!~SmTzNVlR7sWYGhm`l z3Pc=0e~DFRS0m?M7X5r@g(4i5gNwY@(=UWXmkg!idw z!>#b2Xa|XZjF^)&a(}^<(b5*2kB^-BRYnI}`@;~aFS2X5N~Gh0aqYtn;zqRIH%zcG zR(0xGl7DVpX?A3@~ zm-4C=syH>l4JIIDv;b~Ek-xRB>op7Je5EKp4FrHM2B3ro0rgt=%dPTkr(_UAPQexa zGGqgvo6>$r`Xg*tzEid*#!EWgeleZ^&w8- zli6`ZO}~K?5wN0vi0>r=aUc8Xt!p#~&Ne~<%m}w3t|o^qQ}I25G#*Or>4G8+Q3S{N zTYs$k&7ojH6;%dQA*>#x`#>!^Ve>CL%faVNM_4?;eWY6c+9fKpnwCGmq-M0yNE=K9 zVhW1*wa^x%__(EUH=p4(iAIzUN3$+K>@8%w4RTDYq|%g=&O|+ zl$sAsb`24W5i`4(YV~gNJq*&WR{oRF`1ReVGJf6*x_bLko)Yy14#RHErSu0DnoC~B z!m%5L$(W!z+s**dp?e<;sCYcJ$?#e00J`K%vS`dlA%rv5Mb=v!Yl*BId=h%a_}M79 z5nIWb~Orf6G_nmp=4*$#QWf#iU8hx`XOCc&GrwGQm0%Ew{xH0PJ(JJb}W zYIAE5X2V_w@9k#A7qV9-5I81 z56p&8ifFo*0Qy*Q8LS*d2~h=a6>WX45wfH2A8BWUop;U8`PVh0UA#3KUiP?LYHkLE?ELdffw?>)C;*@ zRRX4ea5V$rwKxVH-~%po?pwtW?X;9wW`CAf=d(mSKBl}fJUe~9!jaiX?j8rZHT+m< zKeoXtGA2|y&N>-%nEY-OtY;&7|7v%r(zk!g&kefH%xQFQ7uK%g>Kyt-zGTD27)oj* zE=oe=3)}I)U|r5Hd`{%b#l45cb-Zt@cpor-)#N{;LrYx{nUOfNShWE^f2(=V=~w_} zF=IIChV}HY+Uf}zVv(M3z^~6~G8|9s2N~mM%!E0SH=oC)VGedWFe||ReDBBR!8M1o z^;VHU1&VAGNTC-cBO|7QVA2gj#+VIfbt6R=kYS2SdCS9)6iSh!m9e9vLXezW12VpU zOevy!j_&qkx)7>K8rN53h%Ge8v_@f_D)%6;{wVIrO?(Y#>JCccb@C|i$p!DU$L9i#gf!swwN#muiESN>Jr~;Yn zHG*TwV~*{+!q7t;DoglNF^77?qSIn2W|Rszf-y@c2`>5sR5UgZl@X1OUWPS)chXME z*2=|ML6bK(ckixP_RFU4oiXw-cU9)h{Lu;UbS3zWYQ`y)uXz zK#VDT*zfY8I&S|_~EB>N&RF?cVCB6BqPMv1!e4-9@sy3=ZOTmT1S z9c&us`PW$J*cJoWhRV@qPxVPrvD6Y>`N9kUgNF&LA^uV!Zvgr`7M*p&H z7+}A3F4z?M6W2cAm=p(lCDK{r%j^K{WCPgJX$VIdM<)c<$Xe@{P|F&E|9Wi@d1g{4 zlsvut5MAX9g)IQ{#5vKy-+M~0q4Dbwe-?stj=y-TUe;#>HNKG|pAW=F^>e86{q^u^~x+?2+oim0SeA%T}=>XhdE zO0=2kmBqn$4)?2%@YOjhwq`~BdXm28N+Eb`^AY=vL|ehvOkHI`I(+wC7h%Y}1GFh2 z+;QR`k4u%?&Uz{Rl6moP5!nnz@Cqt=tWa{KeztbawHF$$5sTvh5~&dujzf_Em()YhXN+KtC5bAp0NB(7}unv&fQg;E177DmiyEpWg7d7 zM0#I{yLA4i8JJ=YRBv|+BHsHV+*f58+2oyn#(%H85CQLv{l?}s?ZbfL?yXwA$8q7h zRt@!Ju*zA`-kEELw)@~frg@8LrEOFL6chpZS`+o~@22o` zL!N!fN-C@i%w8T(}5bGdwXe8G=WVL#aMcu_!$9q^m}M+g3aL~>~W z<}}2K-@`WCn-8YhcQv2s4!>6?XCCk?Iu?s6ri-@?7=6I?47BgslvstDS}CUkti~e7 zQGbTsa{JB^G59v#AaGDgV6BdVK%3;6pcBWJfrFI@>Gh@2cNVr+AMHwAvWEA6rwt4Ru)7qmsoM|Eydo9M-+WEHlZ-l-4sAWA;hxi207s>`Zg?kXwF-sEIM#@paP@}S z(G88gWL7jcjI-f=oYzf*sR|8$#PVoEf`*P|T?(hOAJvu11s7iQWyO!g(>ihFd}`WQU?sMS7yuH30ULcN3u+m%rR zQ&BFcoAK(va|LozS-jyg%Z%tX6Re1TxTG((34Dx~rZmmlRo1IDtNmv-=baO%H4e0i;Ay7Lu5tw>8I*ZZE7ldR6~6D#=(W_RVo4sl(1 zISTFuKcTd}Tkp@w04a)z*s>1?&OL&<-GB!F7e(Gz6@})1PrcrSKP$eu!+xH#ThGr- z7W{^{dl>G_%NzH8Lbq5hvO+>>dFg(I$(HAofdCx`X6K3|072)t>IhDgC1<*Qc?px` zSG1`hDadV|^w31W8UbOaCPiLZvgi6LG= zTm&2z!;6i73zv3hZD?*F!z=pqOe9Qq0#=@jWwssSK}FU3-Kg9C9?eT!HvQLrq(^8G zNO~JbM;U7EtgRz!intOD!1T2uPlrprCOKA^x*HNQ_E*UIyd_s+JX#6u#Y%@SfcS4@ z8yDdXE>}q~2PX5PAvxnAO8E0*0U5`Pj%+tGpH7W`QrF90U9Pxb;l}&J&@_36SvHOgm_I#2JPt05Uoc8f{Ju@bscN<*+snlN9 zh!oI&PWuaec(vl~8m?+a$&vWYQbOx;>H+%mQ7Vv%qK=SV;|(kn!c_Fy!5|vUj@qHz za3>)S-_e?TS=edkgc8i=AzSZgwe=t(p^#$~TxS(q9AZ z>~^`O0juAJ`;Qk%?X1G{5^5hnJ%fCMn*)J=I5l!=Jp?-W{GOh1<3PP9&eBpt`sEIB z;hbV$%Ko|0@;73~LC!M|eUnnvBu~5d$<}*%nxT3n-0Vk-o%Y=G@x?{c6huaC?^&gJ zQsl{%;E~@i(x=lhW@u~c&r?aDsgq@>me5}cHYe=(I)Ej+?3rDD3PurVKgXr1JMUJ1 z!P5>iO!3^%P3<==N5UWyy^^zQap&?Ka7PgNrM5XwAa8filbqW7A`DDZi0?B>82vO< ziSu*A@9jc4)+PBG;K0LZOt)ztUiXybW0%z)vxJP%S-aIWUk4C@FI?B+)UNO&^Jox` zL1>qLMN`a#mb~~LB77I7{ z2b`Rs-X4pq^41!qdc(_7wNE{2^-82iJPo2`!PQ1>{#7jX2Rn}{yzd2lK^Q+*`WI9R zkK^$1VH~DEbgFhs_`%d2D$txek;LCJAhs%>yCfjmRX$_WUaQaxVQ&Cr2j*;llp+sM zFOO?qVLxV^pL6jhe@P|9B zRBsk>u9Uj)XbdU?svm85lYwDI_3SQ^VlajzbAR*mmkit{kHKFu0iF28u~ zMATEH4KT#&PSvYQvQ68joxi_)o^+f*WOptP`r4@+?i1*(Zjp*0v^JxkcRqBBdRI?f zqrIEXlRHQrp50ep+hR0*EE)bqtxV&~!7uKEymY^H_FDD3@K5}TD6;B*g~K88W?#V+ z4$MPi-&`x-y%Wo_&Ql(++3wd>bVT(hfQ4yH)DFQGGzF@8W(0ypl@tq$rJ*my_$a_J zwnOll8gI%8Y$|f*z+a-vRG~uvoO*(0ugiE4DqIATzyUFmldSe~#F0o<8w&dfH>w<- zv;%6R%`Q@(l3;@~83(9;3|eSmn?Ew6Pg^y713_0TU<5|U|?rcg*A<8uPOQ@ zRWEhye&iAwVEc68>!6(rL2H|ALyIn@Upf-BQYHBJ zU8Or$1T@A5Ckz9BH;ArC#u#j;>^sVQGEGm?>D&_d3-n4yJgY>x<>8%~Wj;bRK$$GU zIJ^LMjy1mR_?56i*`Ge-wN&XX+<2eaRBBgeSJ^CPE?w)8@6uyS{|b;*j_us zPbzx`Bm>2*p<&0_#3PIjj-!fYXPt;v{W#BWus$A|I;^pOjjuq5=b8DG4WIdPwCkse zpRu=RVURT;^&Soya!WV=|OaO*G1aTGBR z5?n*yFrU7Ex_yBP+4L0l;#BU4nW_nAvh7ut!V;0&!&oC`C{O3|`bMsN?BiQl9I5r% zO5Pr46R}C)S#|$oH*O;ByE&Luv{Fa>fy2;`o9-fa(Yhv?2&_p4S)8WKagl7^_utV$ ze!=ZXbaV+yWW)}dn=d)`0&YhR0RQo=ZEfN8kJUzhAF{ki>NR*SK8^{RNC$PB#7jw8 z51DLpyL@au8+jKI$n`zxMmR42*C?U2UDd0tgNS$i0cB*_J*eF}^MV6R2Y&BiSwhiy z_OgGmHb~wP7__6aP|{x92TF;Xlwe=4jCSB9bdezXP1cV$OI&l4txNQ@6}Z&#l%63C zZV@9vZtu*)vX;2-x{K$gqA)1Md$DZUj zr&dw>kCElEx4B`t!FjcBs(eX5NFa?05>rdY7P#YDwpt4K1+Hg-vc<~4Ir$tsE5Og6 zfW`BseT?5E=kiA){F|_IVN6_1<{dv{$-+Ap=#u;JiK-^+M76k z-_vr~PXZlh4eEZg-Zk6HKb(pmVHdA|(A-eIf|n`ajiH3w$0(F4YT@NL80Co~-1tf} zoOB!aM)&JRg}oLpPMmT|wK?jhITE80)ucdBVxP$h7!EUX{*9~nYu}pNsUCO%E%Y|A z#5blhUg@}X$p$`M?6W>Qpp@^i;t1M*bkC|*MVq!@sCO84=_{d`&ToDR=UqrTmfEc} zpV+maBp_+NJ!_t^mT5WLcS>=fKEL1MM4&b5D1wQe-a-qKdlCPF{3B8L&`wGbPg`Ip zx~;yg%1~H(d8T(=yG&%HMlTihwT`R-VudXh-bH*_1qvK`ZtUEVo15&E@;fGfIu*#* zca7SSO3k0A9~o{k{nCB)KW35G(`bVQqWbZ&2a4B|X7Y_RQ%ot9g5^}-i)YGX8c_DUwq~ycUc--Becn`65MpVWHx(@2x<6k!u?$$joGBuu z##F~bW3ica!qy-ilgu%xX%9w!plKCCb%eXXCLU}M7k$;HmPOqwPEVRKYDdE^wMbU$ zizd`Fe#gnZqm_hyJ5|_SKSxTsRXcY2Rr%ukeWf(Yo)l-x@&4=D#h*jxvZOMm58_3& z+}q(lcZ89x);*#RiQzV*1=@r}7Zf8qN(&EE$EU>+0vPLGD0cyI5y+l@b`RdiW#cRr zw5Izd>Z=%GHT)LOzgCN!E8 z#!R{!A~d;Hn=z`f~T!O&Agz zsuztBzJD}v8inG{2HRI(WyHezrNxlVDHKx)_H6oK@AMWGCWEO^b1=o4_)Q>&8kLpv zz{6(VprX?u{ZE0nhpz;Z=7U`h25r&1ba*Ht>DykQ+g3}mcG(Fz`_qZFKdtbgocwqe zD9y&S>h`jB1!%E1PDV zFdjVpXK-?dkZlekuv@ePB_yxvUeB(jm?oCQ6L|>k-IxSeUP8xnuLtQt zYi(+&Y#J8+szu?e7NA>~h&LWecKdZu29O+SM?h{d79bBx^OWZ zIt?jN1Wu0*To*>ni%w*D9m9CZineo+D|920(JOa<=@)lcohf_MLFqD(Ur1y z+ha65_SitWviB5tJLgcl&y_1ubL7mTL1tzQFNo5{6U|~7Qs0h=4U&8~$x-d2a=V}* z(2e*{sb+!ulR7ae{qF>b1Gn=UZHd*I|I?plWYUw#GS+o_h!?Jy>~<*M=5~FB)WqWH zK?2BsQA^(lfK)reWlnKIA1Op$=e>*%x8?n`K!=QTi*rAe-pd#KObJDTlWxpSNwZRF zW8D+%nX*q{vg#tt?tOKt=3qzP+eMWo+8bs^Koba9?@oF>vWk|{a8gIRwCWGRwV`_H z(jg~J`=gxJT8^=@5#m5HiSfpxKKQ|a|>>!r59}di}>C$gMI7Wj2-A4G( z_9$!PNcxoL+1Xon*#?qucPHn7;gy9M>wB< zM=A@{3K|ypBU`aAk`L{-DCP@0MjC3|B1c`DzSHRp=jwHiG-zI(Kv$d#WS4*K=STcs z;b_nIbRy&*EQd?<@l{=y3{I}p0k8CDGgKzvf4=sQrT|XG;@U?uI-e<@x_%mcXvQv%WW1&fz^ zS)qjKMh^zgre&QEp9x58a#ZSn9Pr}XUmJUeKD2mN9(l<{L;E=J9DJ{t*&=BCtad8c z;yAepbI`X=bvN}ed13ON%&U-8 zw(EF_`bvm5Ne&rb2M1NJz5$|4#rP)VTs%Rp!vaEL8EPYNl{8`Tl zKnO^u#KTp~{78SOlu{3RwDQ)#C;fui1av>^|HDt?S_G8Z%xSNG@yWevYp`9YruB0L zA)yMGf#&R30ezyl*QnNmHWD5EFyJ(4HzuDPUo{3D#D*>I@l>FK@_f!^j)7}*$|0mW zxJOuwWX_NxOIbU$fqhr`~$=5SnTP}JBB`5Mi z!H4ErtF?8#wWmutaljCZhB;N{aEz@1bvbgG4NLKYj^|gh6RhF2^aLiD!AEjxFvy>l zJLm(qH!K*57zN@d)}W)pJdZmwksw1ZK7Pm~8z-kG*cuvt#NhUVZ;&m_!E#19jy?1& z?)6%qxIn2he?7lgF<)YTaaJk@7{{X}I?~16v+bmF~%!R&6J?tbV z`?NCFAX6#7)>A#ci1mlH6}Ny_2rmcc0g=gGPxSG}5j#7o)94{jjQs1)h5;*nGUr9p z8F=EJ)Kxcsx10{~qRZT9uC1Mbn_J^8#wHRsfk~1{y$X{G?Wv__kDp(;=k7oHv7C8i z<8hd1C9){WMGeo;sy-*-=J=#e-+v2pG@ojEA4LjQa?A?UFBCrZo{tqbW zcYAd(`hjCFtl0}9rg`#!&fwn~>} zTroRMqy!EQw+&ia-PX02b^1ZD3QlSC=;}#ZnJddG9txy%0NHORs=Grka{}%brOWur z<-KMs*oZ5J_e|-Ns`*c_Rl9a;BG8impqLqdvZY|SQf^ut$<#n1e)=p*m}Yd>1aNQi zS~4ZNy}Gn7V@e(dQRnA=B)R;fS7#F|9MCKKz+$4B_|e#_uc)M6nkl=_gGH17sHkZ5 zn2JjIA8Nuy=#Ckap-gLvr^Xv+T`kDv|i3u`5ZT_4^gA z-o(oivMrV1T20|YMkSzHv7af3@95%xF{N_I-vD>#%M#Z?T1Mu3(};PURq?9Bo6rOnW=Ftk%|mxKO0nnXawX)0XJ3(jr;ANC;)&643<`(I+?RZKxD}CzxAPBE@wV z8~myBbLIIL_`WPcEtVU-C3p0CgN%3zXtL3&bjvVhK+UZT;-ofI6ig1k~6 zYLP&}#wz9Dz7chg>vP^jxBV=~y(A^$*%lEc@8)x z>L*|kT8me@g0GP|)Pm{A##dH<_+hDQ_pr}+zL#rBD=nYNej(BZ0d?-8toJhproUW> zlf+kO^s=9C2n{0wUNItNrP#v5`&JCi@tWu3N7CqvDQR{#|1lg0MS~^4&9U-n@%!?BG4{-xP);BJ z%n!;Mdl^5g#$jJ$KxOb)qD!b%6GIjRJx^Ul1-loEWH zt2Mc=bBEE|0GU-=MNHAJ;X5qG7I@dmF7S&$*ayLBsJ32;8@=&f+2vOhf)sJrVN;f; znnL!-17G&(BjQ&Rtlgh~-%f~jhAnIo9f7pZ1%r8NoiqTZ3;U$aMu+=l{?Gzn!nl-7~Nu9NE8kJj?{gK+M-=lbpy&3Ski6ka2%lo9X9BK?HcCz zvC+4dr;MA#DarH!sIErxw=>^*{4kkleuJ3`D}m5S9XkR}oTII=Nq2N}5l?~0>7sdW zKeGrB+emrNkPc3NebI<#SOvfhFZSGQRfjpl;aIzBB3{)HW(H;O;nv#AXC`Kj^r&MsxvhO z&afXOw;kb&shqYbUrDW~g9I@KQC-K8mYa)7o zNE~Z0k@lMuSNXkO!7dNQ?xm%R@d{-wi*tM5f*-Vyg|n$$JB1) zxp-5#tN1SPdrq{%Occ{yca^HFl>_H*C|ZgKLF__L{y5{TQ)O~RpbLl03L%veN4Xt| zu`v_eBaZ@q{S3)&c<(#}0Lmwjy3=2#Vo8;@)aXQ%Tgs$wcHHn_@#C4lEmEx}8ajoO z`r+sZn_DVm+>sik0it0DN&cH4?e6z)JU%BfeOf`-wTzc#Jja-ILvn8TlBha8f538w zK$;Z63>mAB?PO~QU^Bl6a_kPk$h1CsS4Z_gn@9P7emCJ{+1d1MB);un!${?p8l`23 z1bY8oG5}jy)2= zOIQt$=U|SaV>+?ognQr3Hkxr3!N%ScE=fm!^`if99-2wTCthZ;zqI}aljF$=+|*k4 zn@PIA3t@wMm&BAr-b#0{dmC_{K~+c*Lby00oUB!z7&PF%2o$P$9er;ciWUf|gJ_SC zE9zlSu#R7?jogeCv^I%Ff#GyBfV@9%IN^_(gpnD!4qzA#l zt@6h*HeyGpZNcR~o> z&p6m&u|$1H_iNc zQl6h&P?>D~R<46Hd?8E&x85P48*9!x>gKHO(4D79$X;qT&XkAjCO+;gKg;Y@wnG#s zk=HPDfLFBS{S(H`Q}%2_^`{wffw#{}j$PDzGC;7@qYAAlFaq-|Wt`^gGm?p$KM3E} zNxiOiQrIuxBhG2%MP`V92)8@cWFd&}l@XLH(Jv#kSY5g%2x1;eaKpKGY6W;}Fs7Bi z6+Of88sDg`c3VZ3jrZeANKc9kO6$MTU?{b91M#SW78R`$x|Mz{_(JN}%`l`KN%%N0!+EjGqd5B2jd zUt*LkE0~BZ<@wTh<@Pb0%1+EH0tw>rk#gTuLh*Op~d{U^jXD9<{-H0rhA zF!eO|c#>U~%qjmdR)WWcKJu$xU*KY67(M*w_MiAS6x#Npd*24@&}jJS$&g0b!9H=3 zOaY@_zbW|u|8WR^r&OPpbLPh&GDu+U%N(fF$UcF!A=E0B>@<%>2>|cdlwiYMPaIr( zmc*bL9_#&oGP#13oC8+bDpEjPuq|2Z;ttTL=^z_Fw_S9vGSIrH zk5UeQtgd$51O@~pMxcvqcBK9*sQma^skPOs=M;ZS;>>CBT$%OY_e-N;(RrSMi~f`A zW{Q7JLr$p{Evmwy{ZyXcdbNZX@Jx%Th`2Rr+1q$207)@*vV&b3A(RF~vdV<*$OEm6 z5}b7c>A`6nvjt6-&*ZL6G#pktFB-n31tL{{I;z6d{}j+xTgA%QyKjH%B)`mZbh6o} zPa*FgejkyJ*{V%V<2N4@3^+m58@7*=+qecp*A??AB~7yB&gzK|*VK1vU4JH%g3|z` zHcGzv@oa~W4P>e@EjQusDeN47B!b!EdF35B5+)U7MVs!D?cKj6BB~SgZIbt0=*iH3 ze;vd=MfEXHWQwoQn3o7VH7i*QGrvW1wFS<{CX&@eAHgqwl_IrZ@eKi7e-M-3DxfF7rkw6JS%|v^^s~n+ z(@)B^+(p=fE1X3kEH`A%#A6`2EN1y3cbvXx?fK4SiQL$vFpf3nuQNs4&DawjM-p+Z zzuK9=9_f(ZT8c6Yf$$*BjC*aa;YueTSLh|~=`Xq6>Y53f8kV4|ArJm$7wrOnC+;t| z)bi#?In}!ZdSLN18A$4j z#eyY=YrTbD5qy5KHoNnNdtwm=5Py32H~%o&r5Pr+bf%S20~43h6$2HgcUA-^m#|_3 z6}Oju1P?fu8KVOuxApM^=^K}3zXKH$GBPkZ3NK7$ZfA68G9WQHFgZDwK%)Z`1u;1^ zGBT5)QYU|m_XSW~+tvjN?W3|El+@tGf4?KIWQp?P_XrRSjlw3kNfxv;zpt%+A6l0FY49lw)TDu(5Hnu(5F< zQB!N$fbD?)kt0!S1D#!L96$p9u#j*Dnu6bClBR#)H$x={5J2A54#3U{VCNBF=M`XM z18}gh@&Cur!C3$xY3gQU0Z?KA$UA_5E=bf84vwDAHdfZ)w>#IFur<*BEu*=q9YDju+y)5t{GSkXLe^lgqW~+bySqD!sl5w}gR_+g zJrjSx-3Dw8PzSmIo!x*IfWIgMluhk{|E9)*L=DiiwsHBFLc_rl>~87|1iT6CY|Mcm zmp2zzkOj~g@Rl8*A*TpXaRh??Wvuuw117+~n*(5HVgGNqe|!HG$OiPcv#GhcgT13E z$kPU71+cWS0|Hc}6kb^tO z`#;Fi24rFR7Yz$nM^-J6jgu=-PV(P2Zz7~WGAke$z|F?S#>c@206GDH9_H4peI9$Kws~FD*hKCv9kj#Y|Oy` zGoY0X2tAvk7ik+0poOXp*xdSGQ}Zvm)?fQ(X9EJNI=I;Ub;G=Qv9bLh z-P@9x+rHf*E^njxw+i^SL;sss3S{nJ@z=6(aPt66ot;fRk>1Yw4RHg!+26L(0_gGg zFauawKn~zH7r+}wUx1~9Gtz%w2g}0^U={yM^e@B%V154w@d8*S{vbX8tK@$XFB^bW z`VV3Uu*&>FoB&q2KZpy!D*p$)#Z>x(-eM~MLHqz#mH#5Xw+yO(&|6H6KjjLnf> za=+QWz3%>@eyiQ_kNSTtujAX!JN)Su&l{Duo7d&<(f{N2#^@h>+26`{`O}ZLBrZUE zoBur*cJ{a6;6Fxhb%Cv&f&XaZTj5}LhkrP{(RTd@e53955BQeF{U2xa=I!wh_!i#t z53e^@FQD_kV*k%xn!7qXzrCdXzChoW_CNUVHzE+|0W?QinsJ@z_Ptm19q#qeI_>6J%k9d)BBv=zc9WLyyPgbn$a8{ZK}Trm_64 z%=!$Tw*G_#1!{jhDiR)_kB<`tD!5HNy{-IxmH5nTyBw9vrP%nd1QO}Pht$3i4({## zbjM%jT)=)PoViOpDw^G!tYA0B43+eU&69g=^A%@Iq9nt5KF+_c5rB_%TN zgryOYdlwO ziM5rMwP}A4E1vZjqUw}jpvU4d(_xgU+`timY6pIO=8ic-poygNw^$Rkk3lC3+9xK<;?G<9paHN!`I*%A*j#z zUe8r0Hm_+(b{Xe7$*&WiQb=UMtHjY&Nf6NW{Vw<#VCnt&jrsHQ%73G+ca3Q=Uiy7AC%wWk5p??di4CxF?!*S8c?x(C-3I(zp zBCLPq#~;P108_bC1LYcq_Jeb^%#~jZ(Aa{#GF*gk7}!_@Z2ELmZrGu38F7l59qN7bxc;$ZiYb5V(-xuEx@c`)UaWF!%FIMcqEvXziHV3TFba&K z1SF|d#%!~?`ftwc6<;NDUz6_3q`2JQpHgLtDhybyr$Ekz^By()l#m%VcprV^Ci|!! ze(d%lqYiZ3S`5ofDA#zjApzt{MFt!?1oz!TK#3?c(J$ZMO)YqMGFm&&u?^mcPk1T zuyT3N6-EIYz`ZX>a)sN`B=~=EaYsJrh4Fr|$svP0a=*BM-ZP%XNa!8H)X|UEStBcD zJ8glBqhML&)knHq>_@Vxk5nwN4{`4#R`7;IrtdABcQHHlvb?%Ezm7=~8c~qZJ*^dc z#uteeSFAj`lt6^KNCxAB%ehFoiQyH9@9$@yoy_yH3$*i68jgL}2YP>1S4QM$U(}_n zSDOc*pGb*Y0w6);j;A@kHZ2`r?3`q2bK^xKpg10H(2_b3s+Yx8ChQV|IZ6N(xs(Zy za3~*Ih(^A-bdot_qaZ>wKS_cwpAJoT6-WZc{gVZJmoVD+S(TOyEq}GZ=`Pt>Ugj`A zN{{<20($fS$l~mm_@RGl{fX$6tQ;?V01ceOZ$Dd#j#!P7XDqbeqab`R9m33&_o``> z{mK^Onz4%$P&KL1u;TEARnG*T){34Rd${;ez@ReF8vTdfS7(_v^28=j0Dsk-bB{Ho zdB#DlX`PiihLl*Q(dG7dqCpy%2wkV{KlB(ik{$i&-6B zD>VmuisL>M5>l1!zVG+a``Ypj%h}2~X&kTILb%ifTn7|V+}o}hK@zimZXLJtUcB`&aiXiu9GS2Fx= zIj6fPTJL{hNE&I=bf3C+4$=~NJo}WrNxZBxx0BJy$zmMI2#+P6%aQu znMe!+xdi}!6%O**v7V6wYSeG@Y@)+?h+a@$u<6^>=S_Kzx}#}NLl*W2gdGT4VD=YU zw*7qwgTf;$r8cktam**H&W-;518GM4z$53cob$NVMGV+ru&x4;t2(qIStjf}#&O_C zVP4<+SuV(*Fwvu`_81wx*5N?A-ItCJWoG=tjq4A8%IZbV!7T{XYzl;%X9Fxdt+bm?##ScUSD*qdeUR7wjv&YN0EL&=fZuaq1p_ zIk0y&PTg#(RA}Cl>3__ceM)>`W=86-z=)HU#^JPHVrhw~78o6j(PaV)LxBW3z*aLu@ zyLPLWoV3r#zh8ro+R3Y}YEc7dEqg?Nood`$!odsa3fcN|PvE;78rUhQOeP^ph~Mdx$i8#~U=&z0}Q zB*N&BjWQZg!S!3O>PBq&p^;+>V5~Fmxej!z_cc!xa~lPBXOfopobKl-N*C)k##B3lvfu%6@B2*b^zU){zU8)`w2X4ZEl zdL5A^plF^kQE3-V@ne1*J6+M=sJo7N#UOe0f5*MuzR^$s4xSrPa~duGwUjz7V{1Ns zyLIZFn}O(4px*od^;;1V1Ni`duip^cO+wuIfT|yzjyubfUxe>ioR81p2%UZ8J{PUB zcrZLXOJi7N5JlWgR5UXAYvxAF9Mn!zoVKltu$`OP`a}*S6yK0f^3`b{O8&ZBml#-ojvc+{D84&xfcOgz<~q;EV*>y6CK^FaoGP}ow@2fZJ_ z_=|qi0V6WQNXq24p}662Rn9FQYnSMh_bk8?Q=zqn(WNCz(kqk0<)RO^@TLBUi?Qp_ zzr8*Dr+|n!$lvi%lXZTnkw*75dUhypEo((Hnn_GEC`8b`1o`EzXqMo|X=Sn3VCzi5 zCho+M7jW(l0ea0g-dxy!YvBCGboW8lWX^;NFX@)67xNJvX(DnHOLj@dD4mrSjG*(X z^LuLed4JrMn47_@4;mhy|5s=UosmCur(q)9}y-cCesQ=K46d7x)EA$^I;< z&ZhsRP5$%3VwK^4vAd0Z*FlfsNI}-^mU+HX!&IiNNW83E834M#h1j^F%J}I>?;L_P z7kgFqoLY7Q!7@C-(BBvfg(74Na-KVukzZwg#8V*ISexnZP_PGKOlu;DlCN^hC=Xptg%Jyx(kY|I(vBl44&4#cn zI*;Ej&H&|)jfWOn(f71#=5Px>VRPuZ-xpd_$Buw1T?>Ip?ZTqcJDcQbi@ZqcFL@9~ zew&Xk@TaX$Ks7Z*-s7`(OD&i00gfvWS%#B&=yCD$?f0@hCr|$3)Q2aHT;MNU=9pcg zx>A8#m2M7yC#gMl3^SSI{ZYs24hP|+d=F6-&vFDgC>_y zt5T(|vi;ezXNvt37O$|&0L`{|2Vjpw^XaAYm4CB;3FD!IzC$-Y9E6N7rx#Vv#By9@ z)i){4$8}||SNv3?u|ZK-z0X!uBCF2u7=hx)_wPfzG#Vgnj#iUHJa2+vwNw!GdoyK3 zGwh+KN)-oAU-uU-;OtcGD?VY?!=0@ZJBoprJpH?gx#n@lTnZqE1^PUc)9Nzt4uceQ zO*trkACVBEpsm`yZirN?fm@NSOIVPPXHh zA!9VOqzYE;B=Wwq?MnEXyPNT5?<@b;3fj5*9&M_7N-H zz+xpM{$sm8J*USiHRw039RQ*o$6rCE;IYD99ot|{j@!`&N5zj@WYS7ZZ-sj|k&$q! zoB#KA<3d9M+fZ!{j4huS+H-it5K72xB@>!clK4<}!YY*Had^`qm-72!SA@&X9ZxWS z`lOekV`jB=p+`=?$P+EidoiGyVVbNYc%Qm*o0W&>V7dg?(fNSuH)~XK!*K% zjB?!WdWN!Y?^dhZ1hpszQpm1@Hoqtn;CHRUVl|y}U8aRjtTC*?_1*}3>t~#3@x(YV zDpHTF3IDFV2Yjb#sc{<$!gTd5adN4D4D2jqQroVSt`Jpkm$5fZhwZpuwb>;6`CZf# z#q;^tEXZThQVUNpHbw_i?JidgJydIznWr4Ma=6sg%qWLj)1L@FC)cqgaPL2DuoqVz zZ4FS|y54Dm{;fZ!H>J3ua*>~V=P6&RmOxM3sR{|r0YN3CJJ4!PD}ks&S_w0MNr0Aq zO7>cVD-QYqHx(+-85hF~ILoz7w0Z~H138f%C&PX&L9%|&b5>*YvFUJ`*yGELh?!_$ zwOnbuN(h$&%KG)TihSYuUG8no%YKw|^6ZQxbhtq103WGs(+h`a7`|pI%qi2OTE5;s zqFmF{VQ|fRsY6)#b{gkaeKSOV+~GkB);^Ix z;ABS+pr9fvjfvl+&I(rCEe=HZqM5z!aH6(nvvRD&e0HIyH+omN3Uh07Ta>gOna+-* z-nV!Ipqs$&OX@ElAdZP^JRq~;BAcq_vSaP)(^ZFNob-{iGz<35vK~i~%K98=$Q|?n z#FXa4XGmHhk;#PD`hE_7QhSJkK{+r_f3{&@DB0?3#X5sYt?2VgEPO_uYG{N6vP5vp z_sc7K#W^X-WsL6C=`%tNjd2JELa>TiIAXEEH+W59)}^QGrvR71slJ=OPO`|`dT@!T zM1GB`r8Hi_?Y9xcRTk4G0&{p#yJQ_%Sx z&wiN}wVt$}#j0lu7HiLB;rHjhd~g@)Q3F6AGn;Eb`}@442KsWKKvcMD8OMy87xwm) z5l~Xo!^?JE36=^Rok`fsrV`ZGaZ0w7W)pSWC%mFf&^^JcIc8Yb-oi^pNL=m8ET?JAB#_%=j&GmeI;w6Bzvhl z8AsjkvzfO$nZ|-GguAXJc&uP!nhxaF>T-jfz~syfk@VMg{IrA@%VKvTGeZ#{lh>u^3QquiL7 zZ99^@!t{TP2)f|Z+3QrtgLx9Uev!&VGYhdq8#18xHfgETw8VkzTl2sDL}v%{9X{my zL^wF;Ji9O89 z-xe-<4goWNRBic~sKIzF)z2)hsDZ{(x1k+vqK*4F9=^q()C-^-v#Ye2q7M#HMQiGK zib$^6N_WOnAsSzDXy#enq1>nAc*7U=Of2XW%%e_6ohHnvXW{X)mQn|=2>ThWamqXI z2h_z-=U;?7-DcTvN_zp*f~m~@u9BW(Jjn#~Zn)xq-+mQ{ux2era3sh-+2v^Te-qe@ zSKZmpq;By180>hI*a?X9OJ-DY8WV!8CErp+;K$H7xI-mnLJ3KLkaBelkrfH!ocAj_ zrVp$C1ozs@AuehUWF=Oa?%XO0|b?BBW$W)DG9Jc0fKnNMhivE`Mw>k{`*V^?YhJwyiLal5Mx@;k{*NKp zY$LUM8nJuLvk8-G^%rW2a)J7TOEvR#fmhUnTjm%C54lzdz?0e7%OVF7jKNb-=YY0d zX`VaLntn|d_Ju9%t;bJ*&LR56V5DGqd?(GSc*Wk?Mdo<t>fjk#_+3VCg`LtSUh(C6?J4V)4g)Pz#@{pVD= zs2_F5aolf!G?Hg+@mCbbUE0AHGN-#sdS2)n%q!~ma* z`=fIgIUnl%72_a}+GFcc#2vYSo}ONG^tFIFa>Uw6I1y)d`CE}QA+#9;az94>Bka#0 zr}}>4iv9Ut$$b*2vl01+I&zt=E4lm+$EjHqI3UqH^181?@?d~^%AWY%T*KAFqx7xF zk$MCU%3UB$Y8z^ygO3q^p;CFh&h=;fHMg8gv{%wAXCjr47ks}Rdd{$5gYC7<5Wvq{ ze$ABX>+}ktCw#x#adlKE&(|A}RWrC0b ztwZM4n95G@g`6sXW`69}w-0wBNA;b)kJJO!jBHd*5>uDdlJqy|$tRLLd9e1KV5Sy2 zbbS#ObezYT_yX3lwR#o7zV{dlBseD4P~x0jnsIU8kU8uk?!~yBa-XQh5y;nl`@UMx z48RWRma5|hwsR?DFp{F<6>48H-TM{m0IeW869IlY7{B>{_Ci}B%GcWhXfyNMJ|Z^L zFNuqDQpa*qj_ApO;(f+z5+0yoMh223e6$lPVD2UTzUT1K*o@Q?kS60IOA@<`#$ngM zd-5gS(1MPheaAE7+m2iW{J<&A@lFR~FXr_qfx#l|-c%z_J23Q``mQ}TFZw4to;w2g zLDjey%aOi+4c3}f{i`1#qGKXyvi-$+Mhh-!Eh00cfk5Of{NjpKuvN`XoU$$Rr_%vJ zA;||f34TQ4i{Df4ha#_R6UHv;2sc>70s5pw2v?M`)|Tte30Zd}_pU7jKk}j^Wm73` z$A1$CYC>TMC)5$%P0Xo!9Ab$e_GQOQilR3?gZFrUbxid;*KRnan52qG`_4sWrK`~D z5c(~-!h4|YW#C=?EELLd)Ds5s49|xFgU}h{f^>jQB^->Q2R%fTr6~VTHUdZM4rnLB z<^Ev#2XUIN)@<{nRY6m5gLGfs#vwWxPDI3E34^P*r^bB&B1W0(U{wd9r38<*YZMiG zs`=M{3S}^N7P`{#kX<7FCjmL;HG)E4C7MDk+85OJ06J-pTT}MJ&1)9EU%Y4)R9eY# zJnc1v$k{$BLY-B+WGH;?L!>3WYT^xiXRgI=xovZ+<=OV8ac5Lv^jn$)`ji1&7zs3s zxn#gWO8nFSg$=X_SMhv3J*BE{8mbR|meu zh)>gHZQXAt8h+{5gKIYQgfdYOWjB8$clb?@s0cmGSwThR2(l%L63Y*0lyl=Ws9T6n zU}#_s3@FbO|A}DQHT|>t`?XQ3rFs-m(1Z$oKLk#;+bcbqd*@ zY=ry)53IAd0#SB3Ge-$3@(k>RbIPWFaXFp_)ns!Q*?8nJKJ;OksFOJdPzPe@at3H3 z%#$xORF%X~hz;a zj?9W?3GN&z69p3!@s#OwpM6I6;@*g%RDEwAN}APj#kX#n!W37by?s;sEMq!E$C!hla$*t#OKeIPNl`YEMa=8Js1J|1@=fZeh zzejqL4KGx-bv70Bf+4^D#BF_lp(3d1TsYws-B7OJf?r^+fGVtY4nrSXc}$C>Dz%fN z9Rzt=)I>EA-qZ<2-gicO_T ziTJ=Uf|@Qg#eI^`9G1?RbDf1iQ+EvvvS{kF zE=4{Nxgq3jfybX?pyjxK8GQS{JU#LUdv95rpD;eG8d$b)vId>B);*o3o@QdrV9Rrvgt+h(m;471@ zECHt`tT0U93+GvZ_E?J%vM37Mm}rN7E#qThWI1e)ZyG5WJ8t}c!E`OG-{KgL>5HaR zo}~6PiHd?+D!;d18&L2ah2Q8cDX1ZRd{@~~o55Jbrj+{$;S2f^5={{Xl9%Y`#!0zz zEN-PnUb2c{mi(qe3=f)u@2qq*vkPARQ-yYZOh$FLLGFbtEWifIX-S@`^+D7kN$FPk zV3)}NZ!U)G7y~nZfPa4-zX+|tk88YYy=s(j-{~@1 zx7X0Zbk@|ApeT?g>4Yd#uGnDAs|#HnH!{%~jFN%BLz~|02Nc9;m5>2ERd(btA8%Wf z8X27mU76f})`Bdw)-zUCq08dSj>l2ij2fQ^G3E|iSKV1ttJDP?d<qjV z7xkPR_99fh3{t~BRfBkm$;xJ;0& zWctD7E%2wqe#56Sdo>s`V=6U2wO{C$S4)mfi}+}N1G6G6ZGzjV21yiEQum zt89Tz-?%=4l)4(njrW9ncpoc#t{I)kb8#~^r7=g!rex_8PJ-Hy4l*l1ff)7~C`tQU zG#-PtCfY@yAGb{l<|0Qz0R7>*GblY9r`AA|jH8cEWmrFCoOiNdu3JGyq(fTp*Daex z6MA%ig!HCQt8(^AxEqYBup~wbCjZg!DIoL%L9}L~AI&nmB7LcVOaBPKzI|x0gW7MK zhhE9u4lcMU2L;)Xg`q%Q(HG0q3b2t}u|0T%;>X53XF0l5)p-9&e1bmCccta5YOjQy&cG`%fVsYDl7)?UWc|%{;ZK+}E`l52yJMK@IQW=Gr z-)z2-P_SJ~vAI&{%@ni25$8ygnF~X;vY5q*NaO8vSo@XK9A4Q%jr=ZXR*=-ym*J^` z(H1in%q^2`5p+`w2>F#SULJaA+!JhKahIkbu4Zc`Gm-YB+JsuJd4yxwj8RHyNv~gj zqqc)ZgjU_x>Bq-3s(m-IJ=YAgk?p1u@%U12tJ8}!alYz%vTsib z(+Hu9WDp={b$s(tdWyE|gr<)|PU5Uev)kv)VH^dElcPVw%6ga{YZu<1Uh6&=&{ihF zl(ZOt-s5;$KnVsfN5wLjLn&?ABa@AP!to*5R;QYY_xnEr!g*~GlF;fU!hSM_&U_=l z>lhu<7vtiIO&gjq`{gv#Cqcoh`yPzC#dTv!O28Bnsk&9vL_8u=Wsr}W3q@v%5qAeK z*%jhN|B=w*(h-0X;OV5=p9qy12nX+@!uxZ#@_J{nWkhAlp0Qqnf>H9T*vTZM6 zuG)065F%fWR^ewlCu-$0KeEsG3#9QW?kHpw-+75)c}P^9n{arOpboO29*H2)y=5fs z$b%Zi;q8weYGN1BUe1zLhktCWFBuM&{e+cKw<$R&c&a0Zf=t7s$Ir^mny5AwAxo?`g9?wj3& z_QE`vIAbJ2LtO^rVA2ctUE%hc2U8tP8WS0KI%8pqx`dr}tDRxyCT{5;$9Z*F9V}yc zamwi@s#rPr!cnRHI9p7A)!z|`q_83&t9Z4VFi03;mM=TClp|Sf_{?jV|1mGq-6M-O z-@aK|M09#ETqPFyhtZ2(#BtEhLbP~J5Tv`wJ`b1NO9OJ%GC{Ia@P+%f?9?CK#%bVrcJ-eq9p!Yq31XH@H7+wddmH(AXK5I~;1xBT7v%@5RrO{`cR_Zp|2k_&J zhnh#yAqzq?N=sNCv_i$-ty(>%S-mGha|pGrj3!K)cg;5T-g?BY*u!CbL#bw3iRFjS zAXI7r_=A#E#$@1}ZkVo8$P%xstmRL|d7@bod= zhH%lSXD=*Xq~fxFkNaTmizohxQWa;~A5e8jgj9N!UN;q(@L0ZX5!$aYbIljvD=goy zT6(79N&&yk%%02_LLk$^M)&sg4`M+@l?4?BY@p4%s>qW>VWt*}CeN$vIW{`ak1xjM z#X9D@85}VMm;}EGrQ|}_>Ty(?|KM7>xcGoQ4oS)i7vWlf*iE7jBRRH#0zCe~?hIy$bPWi1(TAX7HttqO1j z%4%ox%QzAuwO!6$I>ZW_EY|7LErcr%o?<~*nCRA0Uf3q? zx$YAzz&d1q%zqe2lbj~Frso+y2NIxA8+Z0wDA7K%L?!DnNC?TodA zHkE=1B(Juv7_ZPu*w|cCeOzeUBEy-1C?YzShVWHdNt!6=D#~C+{H&O_+ZFWzgZT61 za6GMeXCc!?^0L@+CHGurqgp_T98E#tH_pxCAV9Z&kV-OICRZG(AZyZ~01wz~kywf+ zDR9Mu^p`)@N+s#1PePNTyZcJFp35y;EASWMe5i1eCGZ3z`tW(MoOG0^K=%!J?F%&q zoC3`CK{c5AV4$fLS6EHL@ZzcGuA=-wh3csb zbKkfC^uxc4JLawY97M*Of=z2o zN$!bpS6SdimuR_*AX;f%vh*?XFnuSAzFfidYn#tPWvP>U#0^I&qHT^`jx2vo> zpWB+5?XkgU2$i&)mmJ^c0til&0xYQw*=B-bJ@kt9`0<3NRZMAt%QDe!d&nj1T5n=cJoa+*gtt&iE>kc@v0JC16zejYm3~k5zKslw$b0|y%P9?2jYA8T zPFJw3w2K<)I3f5p6~)x zUwlok)i8>IjV8EZ*Dc5u<32oc==+NbT-?V`&!8Z9JX7S8a13g#W zuztj(u27(#L69si`;%6I7lkU{i}KEu{`QHXWaoqh4#^0Uzd(!SF)e8^D`@_84p9fl3k zZ9U(WLp1GHH-z4?PR8VadWUfUP)@8}p#(K#X5(^_Gvl9=IB#nY6jIzGV2Ph6Z!EoG zL{V;{>ugWMtu~jq>TA|jOPO-NZP zEU|wM`NnS{2t`Z z;Wsl$=gE%dYn+OV`{S3>FM;}21rP0~=_ZmL`50-x)FF&YPd<0>8qGQ3<$Os<(!MAN z&cT8unm#wyDK0At#NnmArBP#Z+_br_Ape}^k`ak>{o-Dy6ED@j9z5ns0#? zNMr6zzo2A6A&GW4L->wlryUC8dAzOq)7VAU@anz#t`cte+H1n& z35>bEbKHOla)w%`TKPkeW_^me9)8c|_tACHC}@=OHu^-5rNa z^8MZJ3p?B+yLJvzi)ns?sZ1O3M`m8Cya;JYf+6F>Zy2kDKtzp;|$1%m<%iK?N^O5IIa z^NZwv0eiyv8CkQyU_*XQa%+v}uv7`nFM}I5bh*yjFX9$!J-C^nM|;|V4@>XK=ypS9 zv5llDFZiW_eA?)&@pM#i^4^f~Yx&LnR&oR$@69n%l^Xeq&nKy%NB|Arem*ZO zo=z_vKwxd(atCspTV+oF4d(%X@~Azu4{UZ%v%$en}2?w(uhBlP9Tw- zqb5yaGpk;dkmCJJO5naaGBT2QQCj!2gA_r^G=E`jL=ARA;AuInB|qk1ut5{j7%1eE zij9`Wyts5Ge-yNP9TN}QqaU?@I)%7?rFd<=Rv-##X`>%M$!;PC_GL|X0n9nWKAFh1 zLcD7jY=JEtdd;AuprEkoQSP8h_8rQNxj%eVm`?{FK{r^@YRA=IlksP83xM7;_=cg6 z8iNmCClu^dj{CPIJjEcUMN&yA#163o&!ehq@r8h6HBRs;JKvN5FZ2k1{?e8ci`d(C z*;lBir9*;{6r_m(7MN?3n?Zc~Jl_|GksTc38w9bys&WcesQF7_Y(3);--j(z>4zv1 zY+cbl8Ib-?l%TDzpW`?PZz1Bv_FF3J7!CJ-$KKyO)D!JB`b8yw@=C|ILV?C)P6@0- zmUp9Yg&k5~`hCGIa{khPjM#8n8l#Xf=UvbHR+Hj6gpsdaUyYv5BmA`(^4d%>v8MyN z8Ym^%la_9iaLFpO9^&dLJ_~4@m(cs5N9S^Vw04zR_|0uO_e^9ltAAI)j}o2EN>3*d zmtgsd_)K52gy3r_C|br%=s@$yNDWgh`^QnWE(z^PoQ$1|l;2T*jx2@lQcBR}NH4wJ z*;mg+i~Q6tt;VK9U0!S=JLnj7WmV0e3^^@pb{xke&E7Mb(tqM@d8v;%z;~$pQ09r7 zGf0XkULpIXL#28b%(cDUSBoJB_tPrmSQg3^%&9HB`Q#`>|s zg$;K+D8HZHMLvuH1lW_3mtTxwVN=(?!%*~INteLLe7Gc&HT(qu^=sNS!IqbNfq#xX zDMN7+XG1{ho=~V|3kQyKG*;De=E&wtEj#Y`a+N1E=BuH91pM7V5HVe4% zOQhQ~-dw{~3^_(TN2#kbMzc8~MLrLyQyryW^*QgnfZ6`hS?6Eg*t^e$=% zIi#Sk=B`KPC)Xn=^tT!?yzzHaIgOMdcvf&JM@O?#JR(r% z<6MNWqxoQ^!xv}%v5mCsJY-hEuiZz1o8sL!10UKXsXK*KPF}(YHG>44$&lx`sfmb^j*-p zk&!=t@dxP$OKBq5r^1!FiC?H(SZtZblXS01i8awr+mszc2zIgd$mJURstN~T40^*9 zJFa!eVMCkma$nm`|9t z3k(Z{s&x@o+qU@K8Yl_!1X?ImV~>yC)j2GGjKQ7P0_>hx=HRk&hdvFZ#dYz%`)M$F zPBq3EM-Q>aPGaXrfL3`HJf65ufC19uYu&q;;#Dp`|D)=z&yN|RT*Mw0TznNa++nS@nalOB^hpnUJPPjWH@U9w zz-v;{t`7GLyXsh!=0p$IETqSm>pK)BKC92e62t4?<+Na?I?IBC^rI06n5m019JsvS zt=UNB9DcQ%`K=#WwdsB2M0(4>7vNEUD|h~h|6A_Rm_rpyN}&HY<0MVu{B;dcr2~}p zZIfudCaUUb)o8SHeWyaAae@WWGGFZQD<;JZWBA7%9U+|z!7guS|NM^G#U|JdLAlg& znh*p2S+byl7i#NbKFltoUAIpwy1U8LYJ?e!)0sWfLTeb`!aC<9ajsFQ!t}3y0+IZ9 zDngG#!*~*|vmsiUZTW~k&PxIH*_JY2Hj`2Z3QNAWV z%n2=4R$*uy^u26n+Nnq*jz^c#8|h9pto*IU%c;1mh_SHg`XMf|5SUdh>%{JmSQP%q zqcs*wb!-iQjwVwnx6W!w`9;32dCBlwQWgHERAvS`%_-SLVSnMJFvgsJxntGIp-(Dt zOwQe8my_0LhdyrkG7ke|E(s7Hsl-Vuk^wrUd?53|-rL9^=6sk!F;Q~O=_QB17xNN@ z9E&*{8^43+mXTGiZ&y*YO79Dz?!EjNY4QkTr@3DJ-Ih^c+cpkab2Un5 zbJRmcA!jbtrZUt{f|RmBoT%KA%qxDkTxL_>xii|({vB?H@d zX2^u_vbLWyR4Skk73Dv<8z$Gm)brvBu$By>Bm6vzJF{_X%syJMrZrq5)qD(wD7_o} zHZoV`d6c(I`N2ylmD9V|h(dopj~5QvDCxuuX0dH4C8cswbRzBmjYrvpv}GM%R{)|) zy8Uq%B0$(mz>?E{It?+265n!VZ0t+2z|_)-&Amjw)>SHk9~?EyJHp+P#5me_?F{Df z90D1G&pv%?!`7$@jGe~P%bx-@qD~Y_98r3hyk8j`gVgv&b_eKc(46R)qlaf9;~x)- zUAw^~UdW7@#~Gwis{o}}3=1}7yGvgr@g}*fwn3svL%S-_@ z=w}KOaSA({)WZ(W^7v^NRiJ5MKDK19hqp5{o~>Y-K{zT72f!?~jyPxmEcJoJd5%P1I|AD93u9!uXgZEbWItE==;Sg-YocWS{B;297;1sNK8Dx!h z$x}Jf#$9r_ByyjXU~Cf__1tQTzD^YekB8o zvS6Yd8f?U5hK{O~mQw9SBa15c`|ijcnE$}eq1!$tElK~_5N>V&f{5i)V^r2(prn)r z*oU&=Mks_tmhu*FFxA-j&ozbY5gg>FxtOHk?}v&)dJ}h-Z7yXe_*H>{X>JI?Y{~t9 z|LzjBELx$raMHz~<^6#`iWJC8orJG?j!qDPjOJ0urz3tN;B*Amt&v$j1XEeH0TNWC z3x*KqEE<#%sSUfe+9`JFnnThZx8p{ZCvg1CPfxBYxl(T_bfTElskhn0_N^Fve-6MK z^?r@&rb&{)giB<|JvhI#e`=dGgkZIQEm&-q$7N}tej}^HPH^8Hl%6s&q?#VKNoTd{ z@WI&D#V_P)LKMGJGMB<^U$Pn(OkS+6w6MNhEh|Nn78**&yDt&U1{-3eY&b;G@v1aLKoQ;&(_t*h{vc?*U zU$aj4QS9ZDmeTZjUV#Bz8f%9q7jG#<7ccJm1rcUDuPYIMQw?wn=v`-EQ35a<2#x4q zEMhR`f5{Dia!zK~S>im?5y7@=YzsK0AEdIOeoMT*zVOPlsn%f%|F*1+LB*doUG4Fs zjEza!GHXc-^rQhq0Ir-cMf8+dNLp{XP`jre z(WNObKhy>bgDL#LdO=w}Z){?< z+#h@ciq$;Y0|gAEV$4~*?X-w3O^vJT$R+l0Anx@r7DcePFv0|3Kx>TVQ5kIrSPQ%k zac?Et^CK`U^`^*-r1v9(DjsmCIPegCA)bM>t87` zs^vHzr~Uh5C#$3q(Av3>Om`n})CZH(>UJZ*fqC-r-UJ!U@D=EUe|zKg`7)NeKPwaC zlJGf5M%Rg^qwra*^d%2&n6(wwzt+P}WUK)S15T+{e*T;hy6U)ol_B_Cr9?IO<4F5g zA#YDXa_)fj9aaW^V+dnCc4Z^=)FY5LQ5r4(Y!tY@gLQNfJL*(|_V;};MZptrR}Q@P zXVEN}?pRgXNhe7m&$(T9Zzh`y1$x)4D*Q)HpQmYmqZeiwVGO>LP`EkR1`BO2uHyjmH$I z>|t_e19vt>z+BKqv~mr8tDkWj55>v?!oagiVl!*ZoDTBc8SXsJiK|OhxcQp{i%t1` zf~Rjk6++>EK$g&uDiAP7PB`YK-(Kgi2}^fY7r@NC=@>1DDqdKIk)P`gGr zt2h_gnf+q7OJ9?sl>-u1&lzEM7V+_T;UeDLfSL4%eHP``TPje1bc*HCf?2kHsF z?g@^h=t^kKI0Un(3sa#5p}P#DM)Lzp%h-~x2LuolSGzorJV`Md1K7IG0oSddWhr4z zWxrQ{i&NFFrPXVTbFw%1xUXN^k?vx#++~~PWi+9Ny+Z74AbM<(je``qeb}#PB@xo; zJzaQisntwOm;@)pxNyJwM7Fj{ae=>vs5rva@Dw)+Xto26*Lz*KSLDf%+^bqsTTTBr z&bQL-W7_$LF*Yf5kZw75zF$ClV&?bH>J>PDC8zmVNqV$tPY{25Z*j5H8x;zQJ$HXK z!^_0pn-}M03xS6$nuuxu_RfPDESjoft`KP?^^A;j<#Od7rv5tVA1PD07Ua4Dn5zI_ zZy#h2^VP!G;wRJAn$_P?MIWq9QbfR-)X8>*m>wipIAV%0FGbPF%m3m)Q-MPlGF&r% z2OxEw9EoICFg%nnX|*jK8F$$STRJ3XbIs5v45AJkM(w;d-A=POHXh0Q42%u`{^ zG3k76#y7*H4}OHfG{w99r4joDuCK<6i}^~omna&Ba2K|AP>C z7&W>y4a|2^gb1Yr>EU3~2;Itz69Vvm19Y;5peEu+wiC$fwD^oKIb|3jj)n(r26oql zQYS2GN1;`QBANsK-Lk>Yhn|O9#rjxrg;1W~eT^1((!$T9jwmw4;!+5057t?ZoK((1 zMdC?VG)n)@L-RR|yEAswJD+EBNI3+R(AO=oQ3r4pj;X3#w1x zhg$dcw>J_@wC!aUH~WY~&67GT(ozr*R4~T@@}u{u=FuY+=gPy5DE$egqbxCUbQ1EX zM4ZZ1HP^<Aqpy{@4R+S#;Pgv$T8FOl6xrGI~IP&b2beOG9k z9y_)d>X+2gA_aV^%b`~!B_vdhQir5TiuY=p`5~qeY1^GZ@SaGZWFH_f8^2C((%#5jCPj@4ZI!5WN## zH}}2wUEf;Ydj6cV&pzwyv!BDurH(=4A@0rykT6I@R0d$EZlDVi6%_@Diinf(@~U7F zP&^WYR)yjbG5`|<9AJoW27ttW0Aiw|ATnNn3dY$Ti?p-H0|a1#e?Wk-6BLd_A+Z2s zj1$Hc39|>txw^V4y5gRTV4o|9TsIja5CFVA0$_`DLI70s^v$%u8UO(eun|B5fkt4V zP5}MqHcm(wKnDp!pm7L6fGq|KaQY_!z%Xby@^4Kzkv{^^t_UptT9_?=7J~xlszH?0 z^}rB-n#u!+3IK|R19UX6+tGNO%rzSU!=nD)?mhtjU*rV+FR}n(K%T$(FZ!>Fb^9k0 zAp?N`a3l;5utC@%(PR()_Du_Iivc|R2Zld){nMH4KTo=BJ0~q43y@X=n{{er>`cULQ*YmHKf3FDu`oCNkipL_|e*os9B7dKU z=-=<($nyVK%E}lwPhrp_X@Ib}7zhB8kbDS`7MJq=f8@fRW3dP{{*U3;yZoE~IV1$a z4FMyY9K*n5109m8gA07ras~=-2@UjF8wrhp2*!IGx6Nsht@iL|OTSq6Agq}$DA@b` zY~;Uh&TH*`Z+r=kO zP5SEtdnDeb|15ptk|$5A0gANFuWi0XGZ#BCe1O&vwB)Btd3s5K_#sq6GhiQ-y=C+G zWMPspBs1VU#WpX?GyCiUKj)7wz_3_?nS<_bGt9`qQc`DN~45FJKXDD#Z^5V$y3 zL?X812>TIH<1hGK{opEG(y?LAe;&y4QiQMT#;BPFZ&pBl%0o?`!i8ec{rJ?GWfJZ) zCo?BL4qdmg_M+pLe-?dIN>t;@A(?vw^wd$W@p;9jmU8vjo|=273w;fwrPDIG1QsO+ zF2_ZaA9l)c`TTk#O7$$E@0pT=&>GGRhDu|9Idy$4ohqKyJMz`cT#2o4W;D^OCdYTr zuOBR?fx7oIZyV(Og*(Xf93cU~??4IWOht%&&9IRLMR7k6bL&WEkPVGJ`-tgMyggkR7I7C9 zCt@z0B42y1I5>j|5DexxX^(h#6&mCFb3GWD#TK*NWiqtO=)SRt(By6K3 z1W4j?DpLBff2n1&OAqqE_NH7M^>?i35aBu)ABi3)U+Jt5onT-`9gBe(v8S>?8%|K7353`8 zi_+UZ_5jhHx0>fw?IkA(F%mPw9AR|hmLJE6XM_d!fA(}VPx-&v3?kOw$P|$e@+q-A zt<%mF!v4-1b>g@Fq(D}%-PLbdLB0qxIGITY^xj7b@1U|YU)Db}=Y@Bj+UZ2!Zon$-^ zyW;uN#WJ>U2Gv;;OE zy^|q2g@roD7wmN{;K+V&S!<7+ma6>bti=z@uy15h9OlWu9h1~|ax>w~KdLs#5?jMl ze{GqOQ5i*RD!O#qs z9?(ZG`a{-UvbI^3ljrs2Liep4$C3EUucw{tnN!~VIigZK#mV&Tw)%%^n8^+6F#r=Y zu;I90OIrDKmP!RGJaIe2u}HRoT=T^R)B*IfrEZjY*-uw$l7&50Sc(2whJ!nke<@OX zXX8%qu8_t^S(~VD`{u9j4rc;S4}+Cd)C5k0J?Em!`Mh3_Uu6) zmNZo3O$=F5nW;uP_tPL#%7#*zrL5Zu>*AHv`r)tk`uiSSX$lR6OzNupz($kZ#WlI{ zKk%#v=MRb=JID2WtLAr!35ulYDRhXRy1A_RW2$Jfex(hz4#AHHcOYcve^mFOt6?yg zsnEDm&sZR#XoKJ~{JGRC0p%zxC-sL)hNDnMLp#?;#o*T;f)@*gny4f%UP~BMn7Ho9 zz$3fGRf4Ztx2o;?=Cvcv!KATx9?+SM^rII}=@?#qp95?{jKTfB+|9g3ze)`}NgF44 zH>mWiRJw+K#DLCLJZ0fRfA2I^@Y|cQgt0U_bq6B*Pjz~>w*0nHXM0?Z zJ_cImi!6($M8=-_qiNPE%X3^tF2EJ84Nn=R%lG1?PP`Vf#NM3MjS0av5DA4A+qttW z_U+bJ0RkH#qa!6AScPVyZ`R+pIWP+;AysqXD(^tPhCXS1;ohHoe@AxN9|Va7E!4<* z?+ruwA1!1#oJ8%GbumsXbf`h9s)@1_32<*Ej2p+EhD{sYsjwZOc1f`OWy-$GCd9Nh zy71Z51oCEVR%?|zix}b-=R4Egc7^@~UhyqiY^+T#BPP{stfgKQ_OJ-YMA9<}OIiQ& zzE7f+^bQzk%j@!NfAYBfbvc|`n&nM8Nm2fEz58Zdl)!4k`~`Q(?0410woGA1d;*v) zJ1c|n+i}!wpYyq*K-s6Y3r?jp4LJM9)g)RGREJ|{@7^;lOQrm(jrdlWZptb@$wQ_T zqLT#^jQo|)ZJ=4zJGvK=Q(j|v*P)3xCnD%lTy375j?# zjt^VwnWyf$_|JXk{)YvF9C#Mk#sQ8nQ9If`c4WQaN=t9e!q+!uKI+gR%8#{{bNDrA z>T+BHRM7db+}H)hWpi$&+3Q%e*UgCFtnUPo$nlVbJ$beiV{>`Z^cT)R!{l~@(oF8dc`UVru z#crX(_$1*6d@~|yiCaB%b0Q=L7D_eIJS<;(k7Gbl#FGw35pC{OJZzk(-Sk)UkKsj) zt2tXaXbvKdI3efWXcLd4P$|&5Ct5gy=FusBe=;<8ZmL+D`b{o&-Tac*)1Ryo>7UVa zr$!M1*H$;+1Q!B7uEo$YdIgnb4S!qhuxnN6i|L~5_9QcJ?KVC-r%5?Gkvx*A?@FJ4 zt-9f{GM3VMbiwWME{Wk;S@I;vz-@jh{JmF>S$147pkuqU(+1*YXLA+0!pL8^2mNX3 ze{Wwwe4?)}`RH`R>CHFy0F^<6h``mOa@vXf%fML$w7cOVQcdsXX?zqTA#>3{f01c` zAV!%vP^_mK%A3jWzxj-a1x`%xSF!>30=UIa?M`)-2*Akl>1@Xr)V#zR@%kR;)|y34 z&}46moWSq-2qQ{Tw)^&;IGf5#Zk0!-e+ulkk`*T@yXyk|U(b7>@=H^}0&VT$xw10_ zEN&%B9Gmm(M|1&xMpc2M}Ev#ojS(p(@bGuP$o$ljiTsVp^f8*X~~{ zkJ>V3-SW4XB@?%n_osH_NnRh>fr~eZ(xd`<6%)fVnQ`Qxe3OMx?{C)pUoFXJ=aq;L zmm7l&WmiYA!w=t@9*`zbxsggQB&M}5wKFoJa74!saYT1@8a?j@3Hhp`uW5@ zc-iq(m}sYtAnKkL;F}T^A|q9Wji{y6>SU~!y*2x3e_SfxA&;}FmZQ`s4GRD4covn* zK@Sd@kB3Fn7s=Zf4;vjoe|>LN@5MCk$7gQz6@|9NpEa*pEOZ6&4v?p8z-4*gLP#*}6r=D|Nt!oQpT~ z*Lys(9M3NpCRO8)X@=3A-74aCd@%2wlxzyDkEiLum7CKKwYuCWe`}Ub6EU*(_ViOD z9JFiRK0N6~#S>RSDHuC_Iy)t7e{Z9;$P36*y~E3y8OuG+FWIxyZ8nvD5*L}Tsd}FL zyz%}_@!~6|16^@fLvPkkkzzSEWfMGA<7Y6p?CGszkuva28Mv@*?nQ9!oXH~^Ooptm z?Ts>g?d(Mj(*|}{f6r0p^9B^mb380CExCF|D=fwWnTb1L3Ltv_I66%QRP&0``a4Z{ z9%qYsmiC&TwZQaxzS_PmLU;-tOl*6D3sbv5!VIW97dsBmSUn#8@d@cPK|$&v)>C78X>rpf4k`}wB| z*@H^G$^$B8f0^Y#MC|xTX5f>kSlJF|+APaX@%zZ))5^;LyMgxuErs=wwEemv9o9K8 ztLZCMj_7o4^K4Zc!E*gTYf2V_<0U#ik! zGXBm!cR$^GSvf)bt$Dire2ynSI4ZYU8DwnBd7p^vh-fEqn;kofO748YTUHzlc)DDa9h1CzA+Wbs?2-b!b)O+n0^o5)W5_G#l&-~JMPL~ zJUM(he{`v9O* zf10y+T9Xf^8d%iggpK=z6C1^%!pSun{DYQ-fBo3nr#`w54@!A{tnZkP89YPP$TiAG zHGc<$e^@XY6k*D;Ful-_B8&F$Z+6d)DX{AFXqYrVshz4~{#rL~A5l`MIbYATK0f?S z+o@i@OeoC|-Jz8Wqt>I75aql}l-NiJ58A4!rH-q55tGE!wDIDB4@8-26Z`md^MDk> zf3vu;-k5p9%b5sKmX@^y z?H*h!7nM0~B5H9)KAf4=8G$?DY{$RY^ED8_7@4DX1BEJ2xF*hFqD zm70>jEM{owVSEog$Z0?Xdpk%tWDsW^ zza@>#_NbGuY;Or1R=?@v)WOjLtGW5tj?<<2`TCB5NV_&6a+z#kOsfeea_kE+TZzg&i?UU*Sq4m z*S*%go`-`)-%vmiin4~Op^z8>prEh}00eiic0uc+kU9cNC@Q8ivegK`ES{xAR#6cP&m)qfgV5R0XV27m!*M;HW-JqB}!z#M;t z_yLYEX9qYMjr|9}(EwX#FcO2E0R{ztBOwSE=r00TzYXd)AxCEvHp2lM!-DCf&=@qt z8SaPyV5{n@sQtkcV+Y3ks*Q$Y!vK^GHWP}1xcqAAcMJ=IjbgxXBpQH$xnq9SvW5Ym zaDTKT0_=gUjRkXbhX1DFf`%h)|75@qaE94}ouLRA8jXd)V*i@XpM3)Ut$VPeBf{hN zY1Hqme{q0g&@hCJAPG7>FIf28_VY=(pb(357W$;7Ax&%im)J2mpnJ{}MB@gG20*zkh}< z{znLgg#MK|R-WIyg&rC|e5|F%_t)3-ca}a@b&QdRBbL}d`p`u||7HBbP*Os<1H1&p zL;(UKl2QN(DIh>f66o_Es{Mum{%PxiG0t#zz!PlC!oc5+|Kt19GXD#VDiVT%{@M~l z3>XQ;F4n&szrqj~XJ@RQzwbJ>;eUVHzgHXvbB94lW~WgQ+2E(C8EKd|v^l-QDo;Aw zf%v^4jz!f*`7iy;QEh&y;mgvmtu87;1ZzfQt{Ob1zB*oh*5Y03Z>K?UwI#!La_{=E z@pQbTT;yz$1QA1~dE;WU-r@Q^=+gu%DljaqRf~A%HPfkX zoK1=HeeVqyo!ll-eA9ioYJZ}{)d`6xy8eHx?d! z7uo(;v z;&|^hcW+Jiqft5~_oTZZz8Pi3(}Di8^Bl@Kx6YBAKyp~4tW)r4Nb2eKz{82yGdU;n z!;m;5F?GEr@535ddVd*1-zy>nXE6t(>L}`mOF=^+VB2Q*;>@;qIU={{S)C}Olww5m zjJkv4%VO_X1h+!@eTw2Ow`&BAu&~&d6z11tRC#F4o^hyyG|urib>T8ih57+_vxn#SVIQIc zQ)CUDqEe@#GJ?hn*+T1dXfkWN2(S_CGDlY-ACSu5jt%q6hD&5jScGWF;jbT0U5eBiq)SW#|se*Ip z40`|Fa=CTVby4o2{s`L0^yz(kn#?Eawz^=&LBG;j`}qq=c_!wtaORn2 z86PMQzj0yMK@f%=%!1!yzj4J+s$h_F#K<*q6@S&l0YPc3=Q9J$30~o?-JHd|FZ4^? zrtjJoDRBb9NcMvhkUjgW8TJ0Vy~#5^EQAs>W7N+Ez9vAL@x~idByxCbfr%h0_TaAl zPDmu~MGBgkK{`J{gSD3P5xQXGDQ!LzTCJ|T+n?u0u)dA_jq5=UE`xs0W{YBW@(<}< z6Mv0y5BREsRE=!MY2AFGLLzQnEtvPGeJKQtB&ocW?UQM7Zh*T3uMLX%PfZ3d1#RPA zs~#nI`zG(J1aOn!DQ&Q=@`6NcGWvOT8GO6W#5Ui}0^S_2cEwV~EGG!HOw6?QQu~`0 zSex9HhP&d>_kcd)L|1j5R5aV*gC0{fi+}X9)zfcD=bGK*XpI%PGR18m)+i_&PWq_H z&e)50SjQZJdtM#JvE%nW$TVGRqEs) zgMmkhZQsAS6$SfwV=xp$jqK+u_1|r~ zb4qm*4jAS+%&XOL62w6=+Rr|>iAd`zGqOcET^6in9rh*Wp9Szym5EeE_V^O^#YF~* zwdidqO?eS0DU8m`C~pz?g>EI7Ujbj-!e^G4I=UVo=B!Q5ia*F$1f92*V}BwsX}D6K znVj}!XXNqfDTLBG{@6S=d&KEdj)Z?Hm$dd~(v>YFO|mjCFthDB+Vxx|$j%#Me@ccg zoZTXwbVoWo=psJdi76(6Fs}-enB9=6`BZJg>f?vTw@cAIK$2n%bn)ILn|3Jqi-yQG4@~7B}Rc=7IsI z#8llm@)&yElXlM8Oy>CcV{`Ta8m`0aAT9<>>d>@j%ku33JxlgSsRj>0-x<5hQuoXa z_{J<72xQr*^!b=?MThAyQl_MCy;))Sq<9?tmKC72>*ih(K!5n;ux_Ksn^w9vX9vjm?1deqK0j*5`5dz4*XJPw}pjByN=@&7&TX zNuITSRK(bN%Ed}8F?hJxm|zj2BzuHksbW&s8{YJNLe@h%{hQVuUuY9*O z6#))+PF8WK(~F+w&FNE_!ISc^ru(*(y00i)s~nmJ8clkUp-3VmpJ7uU(d1F+=iSE% zpqed&+RYGr2wA~Y!<_8;PJzw75l6OM+SB&uKFeFdf_WFXHE~BsDW}~}Y_?zUF3-$q zeE8zW>3{NU^*+-caas+YYU6jn4{Gb^h~;;T#w+R%>|=2VEW(EGGgm3SatU#xXtlDb zoueeoB6}6uv0rwPym+erXs^)jn97q(ELN42Y8P)trJ20XCs}9D_MGN(Mw{2*4*ew= zq6S&oS^KqN?|K&^o>e^Eik=*y)JGSmy2?O$;(v*Lu#Zd|=@=T+CJj)XIs2OZUil3G z-E&7UPOI&D_4--$jf(3jUJK0?Wbe&c*WG?hZlW&cX~A6tA28AL#hnH|_`r}=Ii|bW zgsvdjAfV_z@5;AqmCaYSJv@Cg%54w}{$A&26WRApIqiFZ;v~n*cSPg%ZM_d8V{SS6 zG)8tDhb|1kOdIM{EO}Urs7tBNo(x4<5r|8Mk&EV=MwkGnrEre?vzxX~GKdY3K!4nz zXAi%8)NXDgJ=rh!n|2D#j1SC+9%2k{{b8zEN3yh$*Gt?}Z^htGMNl{Y$w-q>Mg>Xd zf5<0q&G*z`6j}autWQ-t@HGD2>vOBmjn%?;i|dlCQ5uhQ96jQVYuA3K6mBrW3W_Z33(UQL!#G{DWrg! zO$K6qhDr@yZQN&+bD=22?_j3rV<0v1@|KXDV*XUKv>y}6cxdq=r*w*3e9q-8g4X(c zaq1b!)$W^>Q35dB+Rr=7T7Ot_B1_;ypIH1;*)Cs@8l_jNPn1n{BfW(;UfxYIjVW_F zS;*N}!f1&XD>79gY$92CnLak2Z&*uo+rKC=52!-2zG@xYlC2f8$ZadIcBNHC>Q*Dx$LU{4tGq=K6>oLA5`Tw9^=R+X6dVM@ik^^6zP^QwjBy>tem=~6SzSs^@^+_f&m zp5x54^$LuRL04R2^?#RKZ#i2eIp-^(Q5DkT0gBR}qO=D$SKa|J?-yUBfcQS?i$C#I zA<27@G{hlO7i?pBTP-`s3-4J{cB)H|F=Z))5!cA95fxXz`SS5>&zY8z`e%6VLl$%f zlCj~(t?*QzcS_QSd1G*osdrLpt%d<)=hB*=byK7P9~8g4Q-3%Zw6v1ofuP+L5Bu?4?c_2Bh*gx5gtaL>3MhHi}xhoY#dtIG|A3>nq# zFrVd2Obz$y+J>L0co)Heas-b#vuyk23mblj)7@SNhksn{BAoiw(8OCE0r*abWMPB?2DJMj0uY=pyC8O`N7H1PoKLD+M^1#FO z<+UGCj(_gdpuX8|<9-T+lr1HjG5Kv8bgIlm4td5sE6v>*Tra%)GeV%SpSiDNO_b>) zBdxZes7Kq~)6D2`g=-Nuph7`3zqVmQNQl3K52etyjP-6Zl%(|fW&>qTWpavJn)L+# z^O~j4^@1CDDH0W#`(DSMuC(U~G>u%3yiQ9coqxlS>B~Hf7&@B)Ywppgt%S*enV1r< zy?i4Z(@)&!Jw2vQ+Y`!RgZF9l9oZ=XnwVQfM!ep@Q{qxmJ0`hL(j}ogE@|`Zo3nF? z_PWHGp%gP8MZjIViF8XVc}Asz~bb zhImzmppE3$yZ5?tD+B@%)C??wA=-t5Z*3YAw z9r9phNkNa{1=^0FqkCEUV*$*`lljS+U&RyHT#eS!TxQ?PsznBde)*vpa&XKnP1sW3 z;n{qR&C4Cs&_BJFjFz7VD%^Ne8wXq>I=-K1B_}N)qaffor*%RT`Spdx{dfC8W`FIs zj=#jj3hQpu1cb`4r0qrYvsN{-_4d5FIRXu%BBiU=1~h&Qz+G~+gfCJaxf1JNPIKh* zK|t4w$O^KaKTqH@KEF&7zu#TOe{?o>dy9PJ8HV;J=`|7k_(kO_qNMHnjaD1@-RJj+ zL`l?i+SD&FY0`}tZ{?bd$Q_S#^lfAVRV2>Y1pUhS4f2_81cxGR-CLG%x^NDTS=-9TcC$^oAZQD-AHaoUEw$sV z{WEj^*w?jJRjs@3s=LXQb963PL!O_#%%EHnGK&7Uv zK}}0b_n(%3LIB2||Ka(&6KG{&51{z_;$~*+;Am%N@A4Po|9Yc}nHj*v(hOj3Worfy zRZ!IWE-wk7l9X2iNSfK3IUCsm6kUyNtxN#2RwiclKr?E9xq~yn_TLMDiG#hV)jy>H z8UA7ke**zV0HC9piPhh2W*#PHj{msm0FGwPc2+>(-*+7xB{*0 zE&h`M9l+Vl!pPaw)(i;z3-cHIpYHr;oq+$XdLu_iThD*(cKBD+|Kecf0yMKVXMkg7 z`J2g^Y2baGo0aX8YDl`1|iTvLn@qdfJ|1I+Vzlr-_HTvHU@&D_2{;$vyuC})FMs|M( z;NKSv;O`CN0FVXzbH~^kIsbpcjqI#!J^v3I{%fFy*}qBt|KNOgG5XsKVS9_ef-o^K z{o7~-l(6zJGgY*5F|h=g8`=Kt)W7U%fA*$k&bC(eW`7m^S2F?h%uG!G#iwd%WnyFh zPwUzL?J~1B{jcQziu5n)jFJ+{V%n;-|MgD&SCryk?Ojwo9sd&hpQXq-nEtQDKNun+ z4juq+`oAZTo`sbY!0|UB7c;Z({~_DIV3_}NEobE7Y~=ya`CBp*^S=uJpU;1;fAszf zjJUmtgXurBqT*s?Z~Aw<{+Hn&w~4E>^Iui}b>jaP{2%Lo4Z4|`hnWf7+OmTQZ-{kz zR)$MGR^G^zn9e{SGx$iTV_B1GabZBML$7~dN0;YVF4L-P#JXNTv~nd6^BX_}+4 zK1^H6-c+-z0(@Um>i$C1EsCF+Kjr z(q+T6S@3gg9{mvTC_nUwW;?KN5$#)!;@A%+BpnhOJi6^9kuu@AaP5q>&GqkF2d#r~ zHFM*?K9&lWqvB3l5A+%@#)Qtr~buQBNP9Ezey|mNCz9H zVCLh)?i9eO3vUWA!#H#vS;3{#10P1`0GZno%}7tNNl*Ri`q}2+-)dn%C=wixEf0cFHQMegx^zSN2 z9#OPNf$00FLonq_)+RT(l$;Lby8I>FdzG{)Y$$@ic6~g_vWokIU~fp`Tz{Z+OzluC zjro$lVDP+)@7+wL?>X*w^qKtzdT~{Y^VwN~C7xfNH4O}ik|`Tvf4ZP+d)0|SAEo36 zBZ3a|?rV7}1j^Ese}!L}FFYQVC2q@cQ#C3_G~staE%_X9e}&>9zg-ihNlDy?{#5H4 z0VQEQ$0NV`RXLQ_uu2(8b0r&m%a~mfNM|j*q(c~3TD^Sm57VSN><_;$$8MY7pLFno zN?+MVQCT|XWhZrq&mR#~?KCB{wy=n@KIr@`C9!-KHQ{7Je=yH>n)s@^>e;**KDB z!Z_q}{F>H+>uEcI2Yv#ovYFq1f@y63OlG6)uFR2A-kG*4?UHfU-M8$NhMw_f1~=vI+ow#korYiB=OKw=cwwC=p?vpD3=-Ho8Pf9e2W|If`17I(P}k? z`Y21_EvCpiPN`JVND(0<-wP*c75ZK0NAe*Mk`XX`h*etm)Y&}kAvI}Pf(ni@oEs+X z67JPPUD0tLD1N&>(fA zHuEB$Jfzx##6a0Roo8=BwrMhdF*`%$T7We9gjvSbl@mQ}vG#qNys_W$y_c^$uw#Z; z-_~QgL*qKXsUo7)O)EKEMsr51A~B%S_@%i`6huvz@6RpOMsd2h>A+Kv8#0sv;bpZ} z^j@3yf0blqnYhSqrL|#n6miAv4>oz#^=o_TDNr04{sBvPcq8lav2)RvI2xam{oPl| zhfVr(B#sHQUq($>NtJ8w-mdH09=2*B&#Uf7aWDXpiyp}D31S?Nka)4Ngr`3d`dKOzG`NO;Om0--KT_h(RgpMc|bszQq z$<*{pyCGzqgS$Pe#+YV&;a|neuUajt-Xm*uUR=k`A z{Vqy6%^se@exU=_inl>^#=+T_M%5F99TlJLiGxLGl&J zY5I*`MzjEpC}l*uAeX^RJ`EpJq>=jPv+-3RqPc&DW%v3AQh0=I$$h=$L#*R_`ru`- zJC*W%aF#q0f$nGj*o^(i&-ac@)}@Zh90}N>%bQd?X@5oK4(Fv+jv6px3=fMUe^|z> z4;jR&IY%GDG#?d6y-<%V%8jSwu;W@6ulZW)3mpn|@eY5paSG8fK{s0h zzB#I+-p#g~C)1&**&=f`FW1b8qHjc^g~5*zfB8ljJSGHa zyx`t0&(ElKC|b0KdpA_nQx;%k+dT>2(~BtIi}p4)4gC$!O{%^)Yp1PxGFRID`uU$* zEjoY4yd%`8bov9_X;{rPc5W#*%OTXcGSPop~}DxXjx=z`>KA3~rAY?pi!kMk8IqJ0A`&Bl1wtGtw+?Vh4s_GYiG@9tF@m^E89 z5Lu4pEpR;&)al})zZ9bPI?CPw5^DgZqyLm|XpR zW^cUJrDch|qu$Pae{)`6sgpW&QYCM_9ejdqR?@-#^t57xTO$9Gw6>U@x-N{o07>s% zj9Z|V9z-HocCe1mS=eRDeIV{asUM4Q*oGIPeuL73)0JHs)~3<@L2fM^E9UlZrm<=e z^2W!g=P`jc!5!*q+kxB?A55g#Rh(SUJJ4)tNxCUDc&cyVfBHq@V6}Pe+@T$|72636 zv6`eyNR0-T9OHNa3&1k)4R4gC&_J!N+uY%`ZYm?-wTB{SaVw5I`naEQ-rQx*_wfF~ z+pLBi*VoWNx>oj=Cq4-AfxsU&dx?pgYWmFXm6#Ho$A?6p!X{i_*P%4MGCNmhv)n6GuF==+TKJrCj8 z)vQP0CcLna7?YVkC=#!STN*~`Z4TZ*SGDG%lI=LU)!HhQuqar(X=55}`e_n~*!^+J z-ac}lerB5~(%R1wW2MN5@hu8eUET>O$v>7Ve=$EUNPY_i$zDlM7*{*bg!3mrf5L%d zLe5$`Q@|kvL_D#`=hULQjXKL-(K+51f^+)&62@`QkdYt!CMe}hIvfgm4 zf{O|-;=tfH6kp(`jYgt3>DomJf~CL3kh9i#ANHO1Ju$|qN)_^jr>dCiGetY3LwgYy ze_iM&@H2j>=s?7ujNeQEiHCB*_o~QZt$$}o+X~^6!@!^an1nW84OAYgPVJ*r4V%Vs^1OPJ`f_?LVM0&kQ-Cg|`ZwgU4? zv2KCp2hSB;l08jmRic1q}>F8N9)%mnAX3I=Dsg&EuQzd*!ny;jp?@ znFq(AtJ0ss7)HE=W35Zzw#!{!UY`>ELf~T!XW|WD|8XBgtw$|8w9M|1GG^jzkue!X z>cj+F0M4r&h4YM%uk@>@l>lT;e=B8UVzxKJV6wn)%l5deIKB_%{91SUrg)g$F;@CH zKgOAlESC%t6~1Mt2nJCrE!?R`?|z7k!c3JFjd^ufdAXn53Uerh^J}ojG0z&hy^Lk8mfcU(DXKw{f^N)DMZsfx+^FN>LdaCsuXFI`A zd&*oDf+`DVe%v;~ijB^Ge_=sorH7W!=fF{5=iCOv_Phkx0I3HZ5R`nI_*6iW_ID z8&*>$QPETb8aPQ>fB6yBlx4A`5=O2aSrWd{)XkD~rTtaY8iwO>o@3{o65G#Ly_00E zRA&e}RaP#sc(Y>F7Y4gaj3x#vaPr^9prBKO+^+)dON4@4+_sj~W2;X&r0Co+5Jj`W z_@ul#CaYAMDcC9jdk?!H?L%{U@);ue-c9aIIy{w1_tz&TfBePM(T_)X+eAqYvOymf z=E7l_bpBruxP;dWcjnMNK|!t{Q|(1pu{hJ52lElwM*Hod)*Bm-IQYs2)&eDxC!1lV z8bDMepL02n1V~xhTFr4KU|+nY8Yg*Gg@~XGMT{mii8RW%4{iQvmv&aA2Ws0^Pvd>6 zOvbsyOImRJe=|+1re?dAh&$O_UH~&rP9ti~MB|xyj^M_hE5QLw#s<{Q?;dt}QdF$1 zY2=TrCU0D+o{`*;KE^aBg*38A)L#Z`;RtGN8BS2f&7b@oq|spm{I3SKXA&ZJLb;0e z8=sj4kzpsC>Z)M6`Sfuft@Bx999c9r0YzOSQj0Q%f0<>!Ed>$5e(zy|5WA>4B@zBw zA492VMX-psQJb97Aplqm6_84o*QHko7lzruA^&1>jn$Hy_WQkVvDQ2nIGRD>Uv1sX z!Ep)j9Mh@7;yHU=L&Sm?02!B*n#K<96Th2;N`Jk@U(p%PAF3J`*)TV0-hbXYwE6Xx zA&0k5f7z5(;5fwP>1y~s4+Bei0d6@2ir}#$G^A9*vuX~Rc^jD97`y96WKk40=X#v! zIWWVe%tUhKCbyQOPVnTZnCBGj0|6%a9OC|z|7 zeT5O``-LnT^e6jSp(f@5pC8T21B$yX4T~0p+)?9Xr+*_)MfPGL6~U4gcZDYisbk+a-IUYJ zJJ%+LsazDs%d@`%YlqlGyvg1+X|d>8azIR>3@JL9lOc1n7 z9e+klwjSs=FO_T7yD;EUIgE0=GQWl2B|6&<#ivY<0_8kycbnyz^uaS6NVxRh^-tDf}{ zdp%&Kx8q2v>}fo^b>vvD3azr4L2*z^y??YE7v%8YXvS$NAu`l81$lF?VMM;;aKwRN z2Q2s?`vULI??m3ILiA>SY{IEhzD6)g;?J8?k~u9La9{JdtY=B&ha|Y+ROt&TuC>FT z&g$*@gpZEPokFKJ4)F>ojsFp4Bv~AF;nTa8f)I@s!(&+Zlta2m|5iS3;OG(@Hk0SeeHT)V`hvMJ@cOR z!iKD@c^D4%m-zgE8PwMF`>E4)j+CLnd;D6qNv;7k_cb9HnY)O({=9uqV(Z&{E2hFH(9FXjBVwczA@Wr;yVBtT{O_MFy3IDa}df;D`M zVNM9v9-StO?xNd3$ca0b`O5WnMhu8)`=HSsvXV>9Sa3J~X+E{J>MuLV4BZ<#gbA%c zH7O@h>%L*1h~j)vw*q(7&SuN0{@q469gp@S4W$}JElWQ~%h1my!rk+7;k8pl#!%&v z4DYsH1oO`ZtBcFhQ5Szbx_`wrW8Y~MEz5ntMl+kj00)se>8~6EKTjeJq85b6ZOGuY)}0chr38I^p+HaaV@bAN&?R9D&AuWV3J ze!)?xWr>np(TWxvjkGqnKZa`DP&vnis@0jd7zCqZ^>*r}b+d5-$nvnL{%ne6>$<;` zl6u!Yx#0rdVEO%2yw9`MNEu_!_U9Q9%i^T~t6fsKv<8wHd~gNM)8fi%B8mA(8Ji8Y zBlp_FR>68aepwazuTy4RL2J+F7pyX$CQ4rxpij7-zqPELWlGnlZB{v8qf)6 zwtho3OvJQ}ce9>wV+@fp$F{|C1r_Hb1u^7?rbqAneac|sZNf<<&UH(ISYrvLb!rmv zHkF#OUhV;f2|soos&cIHK`!(#6fHprGbiLPbPA$0ad0>*8h_4}C%L^(}h~%!bh-%16>iaJ!M(3oMBkxAoXAdk698>R?G%D9;$wN7rpOsWqCgXOdDX~ zbnYo~NH#cZ`V;3zSSBOa!TA26+G|)&hs!t$KcxBg@yNuymnie(HnZ0dnNmj)MO)h067KCWk^ z-JfAYpL@>tm3m8kO>C5;^U>couR+ZvbfF$xF!CZ#EX#(He;(OsB%6ejszDPd{rRS= zT1!x`v5s-Cm7Lh3v`&L)jP-L9^wQUcL|>Qjm477yxl4Ag?t}9OcRVeM+p23C*q!D_7mHbl^iQQj;j>OO4SFx@qW)iYxV zP21V=IblMmNNR!2Lsa^PAWJ8U$60CgRbuh(ck63vUMwxijUv?5Bl+;|LQ9@?m4idn z2!mrgFdvh}!!##BJ`7C!O=DnX*4-hXiGLJ2zFchjMWxm-koBWBx-D)Ky#D}D#mh+R z9xyF-GhcBTprzNz$>WeDSa@bFbon7KHFm=kvN1pcRqAjoHavuIT(OJ?%)=jA!V)Xi zOa=oH*XY!~&m#3vSuB7#xJO=nG0GhEL1j4*)fQ7VBqztO^LDZ%iBaMp=h>!=YJVH( zSMiYhwxXB0vV9)p1lRH8%Ypacb5?KM_X^>vzI-~!;t+~P6vr(a&dV;v8ji$4v97jw z@iwF+58~fAr{)#0*xNHOgknmW07O~L^nq5=K8CPyrw$~>(ZUpu;C8Ihrb@79H;f*YGcTmvIL;&S(Y+h92#Qz|TUFwuy zEAXN%w6#p`D(JEy+|YyTMkVjwJ7(8o@`)h5Dy4Jp1Nv=MmD-iYa;7NoB7vF{qhSK<3)2E{OH?1gfbKW;k32DE?t#$n9NDk(o& zCWxCREYFeyU4fxR`C9$EYK48abSpi2lpvl12NPoXI3 zIggnf7_gay4O_IZY=7&h8iOA6Qm6Fx%2qU_s1o4kRJp-?%ZH@IEjUM3aMBVS)1ttA z>1reUz%GVFQ?%zg1QWqW`f)CLNJ1;7??DbQe)Mh~Y^9$y%5j1{FP`8q?_Ll;PixtU z;6_fkk9A%rC5h{1l8!gn_$h#3f!m|J%8)?HWm|Z+lhr>Vynoju?$o-v8l54UD(e%y zfaSLxGm*&S)-npdD_t|JGxifS2_M!606M(4fJ-4y{&7;FymJ<-Ug2r;iz9l?npDTc zi_P$t@RwDwHGB8=b07!n?R_2hR2v~1p&Wf7V`XWU2{Tq$_{mBW-#5C*4BVR8ZRP2H z*sqG<$Is2Rr+>y2?>Ku4rYxF{aW#`j5JXR4yy`(oBKa&dChPfWP#1T zb!#X_F5`@IPpF+t5;lpNznTnKVVG3=L>YkHF3k8<3ZB&q){;{eFVLF8$|-RNclj|u zn+-PFylI9v7SnhYkXDS6&#GqbR0L~=5kCs%NwmfqHlRAw^^ktf+Q+`O+_A6j^jfWz zDKzL!#(&-Cu(OHM#@?rRa6^;I@jLf91t=|=EbUBAr}4_Ow<6_7235mU_`9{BU?Z&I zj0p@kLZ?+3IuMQv3`1AvDSrp{Ye^Yhvh7H-#Sns-dYICgR-P4%+&VoFH3*89<{=Mi zku6Ll(Q2=f*u1;IcKSldSY0{vW~YC^!ZXTl!+#L7&_B#J8}3V&Lxce1SnmgY+Z^lR zJVH9TrDd~;Ci`j4m%Dt1@VH3Pwnv9uR^EF_P&`2EBmigexrC0n507VsY8lWk_QEr( zZ${*LJA{nhxc#FN6RyRICup(V?<(i#0;u=wzmFf(GUSiyGPx*)iX zzJKUf!GJRNMOaVrQ5mGJK*zBlG`xBim&0JbMt6vIPm+E#c31~c_G!B+mQ+I+~F^h5YQ zV>d^B$r{Koq2HUpmL}a2dLqELEsY*ke8;*W`>VOrPN?$3*h0fpi_lusip9cvlz(!? zSxgaz9b24if0)qK6p-t#M(XRYj9pY~q1objp(wF0t&k{qA>6AUrnIVAHy3YD^n2I3 z5SYJqJR<{+^{WVLNP4o1fa;K8^oX$zi;A;J;m>f3uan1Ne%lwE)r#ZD1d@2G!bN2B zak)p97=x!Y0h+-O;&6IwVnR>=6o2X;CH;^rsZJu3;2te$(ZTQAH%1jd@s8J>&XuFF9hFH9B0+m;&snSX6XLXBMMoQ<)H z-$tpyGEP}nByW^boHI0TY1|ly7>z-57E}>diRt4v`NqH%<-m49r;K(fkmW+s!Z!oj zV(pDQru9_7hVezd=3TzFhK*S+qm5+LT;Wjb!o4ClklRzuZp~F4D>~g&6#R+J@H_MS zKn%T!Hp7D+U+8J9AAjyT7;h|OSXCHEe@FEXbhiZEWo$(9OZ__+Yc@gw`Zo^OTP_E| zeCS_P^CW-Pykm}ex1sgrQkotF24$+oY-~?<+#CfvYA7LcD!#^7)aF!?uS7#3)2Fqj zE5DO-(L>zy9N3o==4W&K@Kx)aW(m9MmGd%9N%>+F!b@&YsDA;0ooFY9WW=SKVPmP8 z60de?cTUYjdK|}D71h;~*7#BIP4jb?O_g$>r;%y? z=aW4_LOzmDF@Wlr`xkLXKDYyl+W{Fk2Ywlcd}+LVN`FgI<=9u6$yje_dU=0;{(kqD z+<*K(?pSa-dHeA@bwl4n6J?#IXd1AQ<$bE_78@3oR0wFX=*doAZEG|_*~^6b=B&>G z21z23ZGV{9hRh!6Px2EK_+`5Qz`U6D25d)^pFHIOK(~FGFO9h|tGs0uOkch-S1nU( z))g-AQ3}J(I|`wQyKWCw7Vu^J2~CxNs+PAFCa_LjUGgWRipYWQPMn~w!=MLi;6acC zD|OGXr-L!KZH?sIA3%(^m{`A z&3}4C(R&}-W>RbF#;8Hb-=bUzCCG7T?Y0stSHaB$E6iBlKwjdoDNqi7ciVDMrbIRG zba1lgN!yD3-q$uKN{c|lI*pa8G(k0KDz^Xqrcb3_#ufEPs5CZAB<-XaeTbae5NoRx zZgZ`_ZM4v0G_j!p#nKv-{eFEdP_0ttu79lkTT1Hqs?oIYPA(bE`<}oNNU)ygl4$ED zoTu7lBnq*94xPqv;|8BwO!El(`~68yVw0c(Ud2L+_9$K@kjn~vw_fO!buBtpii zL+T9qbEoQ2NHg*_PUekP4K5v`UeG=h%(C~A-?{i(e>Z;5^`EG|%Z2A?9A%6VHUKjL zI`0idhhwX|u1HwCsuXCQhjB2$%?a={LTXg2NDNJXEG)}B!nFb)Z!NUpnSUU~cD~;; z9`o%oBD$l*C=}Al)LehoOuIR{LE14GW3zCat1m-%QY#m{y0sMtg5Hp2aH)IV{}IkK zw#fMjHYEtE2LG`)_f5f;XjGFM5w%-#d0bUqX&~D4F~~!9G>$wlEz7P1!emLD?2Y^*81fiO>5>L z^o5C^R%CWeI=zfijnYHt&Bu!-+Nsvt|wH_AE~Qm)TzvGh!7OX_%b z`Tm9knkLZ7Ug-(gzn+u7eF|-#`in7*5?z3d46(^$aG@b47_mm_^M9DETwIpvyBN3M zbhqJ=iwjC#w6)WsY$U1>|JrgpG*XTfnCB~NB1bFg?DWbOmg^?^+zSEm^?wX};!dXS z%5}VrrGQYkjAuPf%>fT8d`Rgu*w{9XI#QKNd$6s_HB#1O&}iNI8SKk#gaEmXugy_# z*5b#XoQnIJ!piaB@qdw9;KV{u{vDr{QqOhq$Bp>m5{U9WDWpEbtn4vMe4SrTJ_Z>R zOB0T#yIKP$?);2QN=@b0A6EwmVM~k_<>c~h9oPhilbFbW1zPe&S*}rdKnRu`7i-Wn z|2BdK+vp~4Ep@=4H<}8wXTR=F0K&Qn=R`W%z|>b90{{ZX27jT+2nGN4c#4qxdMWX4h%d>%t#kLxl zI1R1^l5S&N?{#zcL!Hx}MuGW9_?SivE*^y3LVZzMV%@yAveLV}H)dq--tL(@xt9;o zaUZc<>|8l1Lw{A`?+PEf{Vw|ATB2wic|@W1QI?wS-(Cym{YPQoE(!!~{=E()wlu71 zjje9H0Tuo2lznPLPD-89&3KHiH;#36DeEjjjm?Z$vMy2Tjawusd%WXtU_?qW_TRAw z98T{#0dwZghduYb{@r-ZelN93!8&efMsVsz_6&A8WPezQiWNDla4}DwhRx;Ulo!9K zo?Z-VcWPDwzt_F zVudj)5r0aG{Miqe?O&$2iufbl_o5}$i(RtW@@~nya$4{MXfXDzkpa}-#pqMUK38?X zuL-+#7+Z}YTXf5W_h5LAOy_0cxrbxJ>7{9%6E-mgb93L}gQlfxr^NJ$=`Q_x7Cb>$ z&tSo5gZ6?Gx|$5zy$_*4`pKs^iD%tbbr4b*}5S8sch{Nfz(aSD-aL{F+_x z(S-#)){i**8hW}2^@&7H2mirreyAw+@W9WnhdW-sRzW9yhPg|HGTalryb3rx4|?QO z!^Y_r&kSb`OTwd?x z?|;^uj>k| z(yKypiOa7O%G&NV5yx4p`%lEsOhY`NmU&|5d>LsXx!x&}W3cQhaCW_F4hkr*l*U?O zPka|qoMLO_)bM(mKdd|JF}k&obp9#jD}T?t5-hnAFxyZo9E;W>M+FWCF5G1p1R%2~RVMjg9ngPt>v zCo}_gcBz**KA_@YZ6w6{u9ql?VfK1lceh1@j=c0(R{7Tl3}nLys&@Du8%7$6yD%~g zB`?9~DI8_wlyp0jTLr9+XCR41GJl6Ip1Sks*-yzMTNQnRN?Hc3kNt{5+m0aH#d?E= zK8n5q@=4N*5GYAMglQ?Jw};2$y8N9=ac75VRfXWR)AYKr%xjRF97Y)4uG3+f_Wq4g z%!e=HUjh0Bhlk8IAzSnrd9PE1&0&U%&v3c3l(0>W17EQT<6(O7|J*Ro#h*yKJnypw#mQhH zM$&+(=uNvVgr+Ao@fV2E5h%^RcCEp}$%vZE-#AWV{HlQVu9)|FbXJ}nDfh|;8S_oD z&03h}ZP{V>8eq9;{dTp8Y=7YjoR1pnYTlw?*E{`0tHDwbBm_<(ut9BuOqk=4wXMAd zG&*2^Paf--Hu$MH(=#z_pINGqg*kMP9X3ORNL$i>%KgNg{m_TX@`FAcS!PjJN!ptZ zc?ocZSwipa&27H%R==Lc4h!~^PIhGfY47(+bcvmH^(j{;?hYN<$$#zYEcnbdW1C{a zycQAbx*{C!2`yQOW#Wz0xE^X8pXHwDFw!7uMn$GDsvka0krT3C?$+QP9ckMbjUN8N z@aDaB2}Sqx$DP$vMfKx%oewVG47gk`F^^2P87^o=hkK1=yLO7^A=mDaO_Apv5!*V~ zjL_^oEdtY_Iv2}xs((NF2q3S5jtP}O#Bqz^aBn|F5L29ko;ejdPAMs}%ax8i$9#>5-?%7Q!W7}n=E~r~Q8jI%0sI8t zzlF8wD?RW~yK5B0P9i6$lSmiX&FEBcdde__K_4_tMFE!xbqDu+t0! zc9Q9q8l${c7Vbq{fwGfp!d-TEWKeOYIG8I0Ia8|sHo^O)> zJS;w^!908>@*9*tiLsXYu_lc9Zfs|(iq$W-;J7e~>3?UZqtk$T&K~c}{KE^1&GY?P-W@qhppP5Jm#UB(&JVQHB>&we%JS z8aZk($W@_~4nAT-QHu*ax9*i>(r3${b;g=bG0V;)jjR0jWFi=QuRhj;NVTfHi_P`h zM+m0~x__+1C_`K=YVIHil-HL3Gt&|FL`~Wv!b|mhkXbz8!={n2!fxJTF zK)VijxMu7-Q%F3d^gW=7gkYFg=eb&BCkXrtEPtuOoklq=Gz}a@6-U+J#`h?F`W8qK zxn1yJ&e>((Vk73+5j&#V*PF?S&c_2m0H^NjiWK<^cB_o*R045KT95f<(9X>w#{rzg zVU3tD#_}YdTxtM$J(%2xUlR%JokFnl`6Z7p85&M-W+@IAwgJJF@)DMWD#_ZJLVf)h zhkwzYJC7QO+HkP@JH4@94W2Yj(C8L|Xl#SZpCo@J&Yj=m6NlV(s1B$#&RhFGnbj=X zLkgKW@HUg;Zo?cQK3Ru&$MX7?6kWSaAj0c*LpJq$ra<%XRGkFHrbY=0xROgaE`vV| zZI|Zc+53==6kBvrjEwq^j0B@DV{)@)^Y`iV4-&Ude zz@+O%<%U}Zb+6taOL?A3J==ubc~bB?ZSSd4YsCi}`OU=GnYr*-so<_do;0k;@t*Z8 zb#~b@@NeCSx#E~q4ZkA!IO~gd9L|1)!6YyhBtc&7UxiT@eP(y2YqAKl$JWOyX@B4@ zWeR0{i%EzQ&E*eQ1eBLsx6nW5KVL#&hXFmW-f8@2g+~AodWciAvuHlZ)3PODco#tc zafU(TmJq)pX7}f?*AUqzH}MFr*pj{wD_mWSlJLjYKdjeKk_^Yz-UTJ`iw!H-qse;{ zA%Ov-1kbcwN#?zVzbM;Ja=-*L#eZIUyyF3HpV;$aoV=<;uqe~X{`kvH!_t>n{8Q|V zyIW47SU-kAmF%ir1>d{^7Lazvmv|xY=$BSGh3y1FrxA~P5$q0L(e^G6VmfLKSZ1yTCXg5)12A@(H4Kg!;iuSG=7$i~PN)AX7Z_`hP_`H-8YUM)@S! zl+THd@BrTMzQpAUon}BcEWDM<&UPWp-F*C3FIi=r z;tA^2qieWO64)PK3hmun@eFpD)FSlu+OmPDHuIfPZ>#R$#%yQ5$nU#o z``OnHFiqe9(H?7Nrs+u3*p4?j*|IluW$`-2FG;l#-0A&x458a8JAY4>*F)y#;l&gq zth|yuA)K6?ALgQ7U)aLff*uEff=TNh=ny!n0N?zFrU%QZM0kUVJI`R1GV=F+)M#Ke zDL%Y9`d?fzd$W#u&N@|4WFrs zpXMta#Qr1|NtF07#c&&+g-+b{_gpz(Z>8Mg&LI36hk(wcVDOp0p56MY8?Emf>adxU z!f6krgN&1HUIv+pK@1H}M`1_9n4aOQ`gI&kM!$kwkTG>l&wr|u-Rhpo^+I`TSUEbe zmp!~*UZT=w+k4(FzT*^PH)TSh^j&+MZFV}>I?SO}vO68DS2(0JC3O|YAKLT~4U5H8 zs7srHy?3Tfc?DkmweH}vEZteUOerI|7ery#LIkwIN6HB4!1?s?I};qAm=kRw)Fk40 z!&dfaexj2mZhvp9KsSS(Xok0&8b6=NoCiK2DprE$_DtIDPeeFeoRS8e zaoU z;3q~n<79Y0A0zSLJIPo9=rFL${l)k`0T%JjBx?-n(|_8+V?UQ%TKY?VrYu>;{!cJ? z!VW_jkFq)m+lH(oL9+!Hl3==IxP`5jCUzV zyt4zV`%&8qQx=}PZPpgxC^BIx?7?s{I>y320cHS&|IXbyM)!!!UC<4NQfwf<=DRsf z+B^|&RDb&={#IvTiod<+K~T51qv|JdJOdhWGqA0G$c#bV1jdWTRqPFg{tE%Qm4FXW z*;sP`*(lrhjsg}4bj6v zkA^1;GJ1ZE`B~}j;@ih0cAaMHThB`p+n)bHEr07CKj!VlgTLaL&Nv1UE^Kzq&5E#0 zfzgqN@bOQqi>S{uw|;LRH7F;BmClA)S3K4BFSB5LOujn1zOxbYSmL0~MNl2cfc!*%W0vI*ERK9hFI z_}aUH-A^JvD9~G;O=Rn?ICZa1w&^e$yMI+Nryas^jxX`UEE>RLA#4AdPg{qL*M+}8 z67kUsPT|HmhKjWaSyF57`%DMv=+p^S6<6?a_BzdNl*ol@L~03NlF#^x72fft!@U|F z1`{QNujml@nPAGpd8-|Rqtn;&Bdmope+rbc9i?RRIr&`W7$=?X8gX&`rZvfEx_|2= ziE3_NZ+2Lx=LxOGwp39w&ovHs)Pi zzn@7B4_|HzPmrk{iY#nIN3and?7l#wa?-(N9z;C2fCo*ZD=OKF_^SMxqRnl#4xuT( zBgIA06JcNjDkenA*Dx{NPMFFNK7W(X7p^}nOeb8i(L^9%);_>R)MVTM5P~c?{M?Wh z1E{q>J~$`ODSOaT-cfJzM49R+DlfE@iUQED4xVF38<9eg;eRY`O6jz-wZjFuKe6R? z=pppZ=6pMq>{6{nm8Un{|2??cf)0e~ZiHAAFz%F;g_ppFz9#@JrdiG7n6hs()c?WO52?hHNX3~9|n9LVuXHjBszdX-z zDuNa`WpF({RLJzbp;uHg4}TnZokiXgL>gd)?ZM+&lEnHFM(ZWpyax$`X*Pv{V^s}d z-ZM+t4+|1Zl(>eLz%R7*J}u6u)aECIRd+UIbm5JivBcF^PG67cGrOFBe^W`DqU)o; z&t@J6J(nXQz9Y+E=fR=c1U5bd*K%?O^dm}!qD)c0Bv71`bwz25IR)qZs%fApbNy7;pY zl5Qb-G&;A9x&DWE7dMqt$%o$CxZAC}##$8W^8W~P0*w7o4SyJQW&7GPnGMhwE3(!R zQ(2eIrZf%N@S+|Bd(1p1zp>D|kVH?IA}TsU)ehjSgBkQ{bN05tN`&2ApE$sAs&PFF2a>hOSGaT9?6GEr(isoaOHqN9I@0LN>!%^Szlp2q9b1H4o8J3?UP?M!JJ z2V1HEXG-ife18jc!cS`PjO5Acgy0BXbw2@TFq$yU-BAP&N83Pn@FZTE>Onq@T(p6Q z)B#B@2`%ZhLn4UM#hzKV@!>*{pFQo;iO#F6Q~<7F0Vi%DAVx zSW1(@K0j-w;lxW($&SI?oP@qwRXwj;RJQxw2@jp}D3Snc?Y$^31GZ_ae#q^(xyn=r z>Ro|a)qk6A)UK>Lyozgg*Q1u7Bim)eT3nX2wCdxuF%ndh^E_#mXxV@e^0kkvLOJLu8O)fktPnUU;<5LP$YJ5l=D31@(pY*LuxI*G zJnVb5`jVni*D&$}jpy1*pnl*3u&nswA{b6KHh*yC1CDgvQX(=5JE{w$=|K^tjPRDP ziPd8BSd6I!Pqc%h36vO$XV;E`SJN(WVeCE5@H1jp1S9fW6w04sRzlMy7&66hZHdSi zG$O+IE*&8UTdJ~kNclFEJUZs9q6_CB81j(Pd*Ck(RE-iwoT>DOGc~2Y_R`1-Wo~41 zbd^^F4VQv`1Qxf5z6Gugm*}?y6ql~j1-7?~&joA(12{P|x1G`jGXs}q)dUo`ht>u5 z0+;RZ1Pzxg+66?n8Qul90+-S81QeHAsTLli6?EwY{mk8|zxwo$N1qTC{%>x4zB~M~%Q*><#FHRsaFfa-)Mrm?$bRal4 zF$ynCWo~D5Xdp8+H8q##Y$T3d4yITn7;uh8R8P0?!Ir73D^2_Xy&f!QQLfa1Y% zI*A9z9c+hT_Sf%sj@owHjx%k-?pAH>gVnkmN$2vNqoZzz6htXPio#kvl88aXvJ}dc zcq*ZS!BY#ZsNV?fsox5NUo4$4Hsa}pNopsSL0IF^#%cjel}R{_`KlCu&SSn(!s8c} z7T$qQ8R2P5g{`f|(}@s0p7`ms6KT&t{ZS-E^hqQaMF?J~63j)dg;Kny@jHaD!i3)9P1I$7@U@hZFHDn;R0EUfM zf^!I8i)Cs{BN ztE5pyY(xdsl5rxG9ta)L5lmq42v9>|uyl;DX=#bKL`qC4fNy9>X_h-Oo-ks$1_dfb zqao48SWhMF?qN%RrOQZ=0tM^~U;v;>8!)IWjS{rHp+4{3&cla0a!-5+fxPWd$dh;P zg^h&+a8{*lwgQ6hKNR4oX)9 z+f6P+6HMvGtxl%!rrWwY>cV$i777bmb))rV5di5tQ`Uy6*KWL{y&fTW>n8#v{a8Za(=seR?$QO)JD->e!L{^=K*{J`{2vx~B-j zbo&&V5Q=htLzf(Has#^52sXI^jMJe*4e%g;8`u4#YAQZp1bMwrW1r$=5$9MR+IW>+^;5l%5m30bvEej)?dX3+QKDQXo~4p6)}CpZoM&< zz^TmKwDd(s$wFV6Y|E3vI%Jkf83xEQic*;_q#pQx*0=ci{YV|W@wUKx8>vo(^PR-9 zHWW7aPNZO3?C9oniY4WX!RV8G^zb2X zARqOogL)*7}C^z!C^wCLAYa#~HM56)rM-p#bW>hXl@Kc|=V z=)v!kdUQRmuA$3nGO5Qufcbm!k0?jiOoJRW-~xf$8lJwp09U=ia9aNa#tKx=2BXVS z@9OVgM#X78>0gpSEhY)bR(1CJCDOaSex1~px=5w}&p62DtY*nu=+%L}r%%LnpYZp8 z48%5cH%aJjlF%hp`7fAci^#Mngpk)4=hx$lQ}JQWpxmpz4EojK)7_7>6y?(eod1K4 zu5f}&wCJKbWD7MrWJ)emqIKFmUhz&Xy|%T|mMQmGe!Eq+T8+NveeF5an=O}rEz}^V zr59dLtGUG*^qARf?};ZmIVp90CG=TJM9nuDNXN8xVWDv2a-v#7PHOk^l=$;-FLTI}7%*ruOe<07wW z1F@dV+(V*;l3g;3#o+Zw_WaC$$)hD#&99@`6&7-OxO-B*8E^V{ZnHXELp2I-)^}N* z&CxMydiJk{psTf(3V5-`8m)TEdfdBYQ@vQDF@;;E&J-q*Z<~BRWP`LuvjDlCOWqmi zGK?;xIGW)A?)u9!nvy;T@XijgPBmrjiFD7SZ!3Hnk$UMQ%a=M*EJfjeglt8l1X8oo zd1fjVO3!ksk{?78*~%djVXj96I|O%nkHR07B3nIgtQ6~_;eyM+n9rR1R((|}N6C>{ zoNG-T+C%Jhs+o~{XL?|c5s_y-$?=JkXU?fJh2;~-Ixa1pIPKA_t6b-jGMN8)XJR42 zSWKjpdz6~rwdY>|yPhw9@wO>*PcQ^8!;m2L2g_{ZcqdaNP6iB985jxfQyQMB+2!Gm ziD#MFdU5SeVx|&gS+w&)_}>J49~N z7fzl*RCJERN^B|Ii)W=#5ju&GA7# zn)K<$>=P&-_pX1b1{arTMvn__mB$_^8hkeG4F~;4ql;mGC9wR_w7Pmj=-iPf%_N+G zSmUxcrkm#9t z%k#mPN}l8DFE8Y!y!`X}vKq;O{3M6+N{(bL>ro}I<#jb4)MxUu9LtHER9`?e8GMyf zIlUZLm7M;6QOg_oMgAeb%0J~lt8x89R>uASB1G@ouL%B9xzFCcdGsnPS8q_RA>}IQ zgo54oP;Qy-Q0^|PH!JtWT)Cv$yA->k+kyPOQR-*_ovvv1+w>Z@(d$2+J$dnb7kWK- zwh6RGH=r$T{0qIByY%{iu$na+bW5>DwH13Yu6omdYP=*;D7O)5_u0GmCxTSe){@dX%FG$S8O@_1OOw2OfN6fiH z__R^TnLj*{`||0US1dx#+a=%V*H>4)mWNcIZ+b&neeDl>SL7}&j~U()kba+sq-F1+ zmyoP~Y_74QXD)R;yqO?keZHwC{F3?eO+Bs7PKQiBYvdW+%GKE7Y~uP1Ea4G|AH7e~Al{$9qp-zJ++ln@=e> z2Za4jG2O?%LJ_Od0xHrA1|4?%FD>awls(;Ecm74U2oN8h}DbMpMv zk1q#Tr#F*>di3JKZaqBPaAZ;r8R)W4Hyzaikv46SoYQR(X}>XrRBgdhTd+P5F@TX* zWZNoIKHWdudw<-P?XbGI*xY&4vxK*|un;f!hNnT|Jib zV+xY*;UK*Uov)KmvNwgZoQ`|_ibDq1^1(~hPt|nZjd~tfb*-~{IP8r#CK78&_tuHS z=XrLJE0Y0fVFlJ`RnFWOL zjlqR2Z@1bETe!Dnj0o%JM=x86Ou%+0Gi8G@LKrJ-Og3xA6T^fNC%nq&65bMUTTmCl zG*|68-bFM7dDyo>eGAZtm`j*{7Rj~1B2sA15IQ%`*MM6CuleRZT}nFVZbbj4Zn@IO zPO4YXY!0{|*ReSNzlPvWxc_c%Qt@~4wU-}D(B*%r^WO*d2jj_l~TwIa?CfpZN6=r>CTb2 zZS`@g?V0s8DYfrSd!=B1A94F?fBRE49F>&Pua5qB>h0i9qw*zkUYqH|alfMpwAB4Jh1Q#gUI_r+;ZS)qiKCw6}J~VAT%p%1bBzsDWx~Zo5i{91InS|us z=Q!Epwmo#-dMy?&ZgHH3Pf~p6EuMzj4o&+mZogFM7`s#7e^{u05z^aiL~ReQu=D0| zf3#xpUE>$(>t}C;rf0Lu*Ai<2dEAD;oQ1t{EaX z07nNJ_60fTqJB_t9Qs3wE2wm+MFE$L1Bau3{Evte zMaVUhJ%pb|T|GDYdKM;N|8bRY1}0*Ep~JAJe8&u5FZ5&BQ;EGza`n!n*9&IIFZSK= z`6bY83dZoruy+aeiuqg<)QLmh7y4q>lc4{2_6Rj&))Sy+%y%fII;5uv&`X>WpL&UB z-*IL!X;>Cg6lWj#x8XBRaK;Jq>Fm>aFK9?pK3Djg&icX6Bg)OeFBzAs`LChB1phT= z(q(c~r(tkIg$5T535pMy}$0EjIx(Ab_FISPhx6QbZrVR zP9QNbFbXe5X>xOPAUHWV3NK7$ZfA68ATu{OIG3@$1u1`8U2j}B4t@8pxR3P~POd~! zA3#xHn{JABo0WY9R2=P+HV|ZRmjMDp@Le3+@^q1PJcI z5-fuU3%--@e)rtnvwQdd_dMtHsj8{B-hQ>Kd#bw{ZD$fzWoW5w5`B{vgG5-DVLc3d zH0!|JJ^r8FmP6l*y}#1cO4|`ND4(TDzDFr#{Vc3ecH@=RI>fpKF4iu|gOMk*%D%4% zs2362PbUecyil6=kz{yL-k>V=Qqv}zXOH1Q24!un$oBHSoo`+$D|@j*;0}7EV?8dqM%EuLnqI1rVy8v zD`-DiR=%Nsp){Kl+0OP&TRXeLV8s0WMGR9gyPU=#k&3Mjbcs0@YyEVOgpougm59wj zozF#qvQ9Hck?x|Ndc5EI`(|Flyg#A zgccl^Dz9yk_s3qQSZIb-+Ttk6DtH34XKSN}HkK6Cssszkv`FLnAogU9@2kxCWMR`3 z4%Ce}P1M1nS}COHz;4S6_L6AQI1;I>suCL&TNO%r8A#=jd=)nbvhHa#MUTLN%OEjwQDMT|MQ2O+IxTC4l(TR zZ2WL=d^`K_BF;*6ee2lc?$^$n+dbIA85QaF*5<V@Yf~WR>NH z$5u_FbUiN5P`|p<`@VqF-yIW=_YRns9pj@dNDdFcz|DYV@W@R12x*yHaG=9~Tkcxuf{Rt~FT zE8JN;>!0R|_-89;>DenO5eYTx&slO$R?f2H0vZNaS08<@zrVRbe2(<8w0rrRC}Z=4 z_HwCn^o_yl!)U~($V2~W+~-X&wKe}8G9`hG%aQAl*Xn-ToNw?&M0zOuTMcW08ibSX4n=ic((nykMqb4F+QWiqY& zghfdK|Bc&z@UiRm6QfNQ*sRH=_WIN399D9XGbWb|E?GO6mTG=WGi9Ma%rR-}R7Tmq zVNNa17nNxko?ML-T(1^2+3TK3gsj8q*VfkUM``jUZt}#$DXouJX&lvd!td}! zrypfSj2#6#O{d;F^onHmQshzKA!A9P~d)UYceId<1G)QX|5 z3RmqZa|MQ{Bpya&jk6LG!(Hc_>Ng!rhAh2Y2XlC+A}iVGsCa%s`+;kk>)yRi5!Njd zG<7j@F+1JDu6gLEAT+fJQ)dt6$Gx-tn1;?S(@~6FNPtMA* z-lx;|$$oKTSe7@APlUxc%G{F|yItS7`H{SN{KhrBm=&aUQ7t6S#NR)fWJ!-<)(}@T zD9x)>6}$|1y!W3U~PeAbL8z2Dnf8!i1@ve|9@ zd0C8#izkvZ*(T`>Pg|f#N>rVIg$NI!*1KTu&8w5?$?5(i0 zZ$1efRQB$Nmb_yes=EweLmjL~P5R=%oxf(0ThdD^%d5oN7bnB3gvqR4g~s7JrlyK` z{3xQN8N`*RpZuKPF8Nn%5*d$qAFl$iCvYSScGNCeyW7%^%rves#F!GC38oy^U^*y% z@dam;=VPXsb&BM~{dL9g@@+Mt_O@H_yEJwMV9m3UWNk3E644s6XLn?Jy#u7B$+wp) z_fON8>O*6|_GwrqruEk4sIB8x{KU!~(L})T`T^Tlc9U-Fd7FdV@WcIG-vdGH09lx^ zL%@FN@rHrU?ah{gWUc412>(}JUMdTfp-r}g`X6k z)DiC4lO8o>O2Mkg)^;aCCwB}2p;9_lauG7wQwMChx5k%|fZ_0NP)uR%=kLt%KA%Q4 z-k3;POl>X%qEOyZCJpMs6+c^yN?E}yKay9XWPTnj^N}9=OJ_@QJ{YAvnbhDw9X#>b z!Y23yDCQ~VP9*!AldOn$dn`h=q!w>%vx9~l6g2^e--`&62IJ*}5(g(fg5nzm?Ubu> zE)i8ti(8XSN|0H)CW6vOB!&Xn$(Us=KMJ~LaQ}p)&98mj0?`)+>gvJ>J4xI6CO&^Z z!LAp)i)IfG43Ck6uW_GI5{=@0K*6$gMw7Ap*b)pdxZ_9ptZjs&IBB7W$4+mJ*Wg8^ z$yNigBAM1M31+WxlOZFHwz1^S7X-y%4!VA-@)*>gPfPgzoF_l<&Gvx!Bm71QzuwW( zj01YR$lkkgMPxSyw>^aEuM93T@n4NZyGyM##N`{H8r(^;(!~^;KKBx)3Mb^2Tk^q;iXwjESo5k%ULw1a zj7@WLr(!Ugq_OSe1w9{q%!qb`eT2uS=`Tr)&DQ9RZBt&p=#Eb30il1CZ)JduZP3#g zXGyY-*7tJ5u+i}PvsZN1>1(#mrzKHSq8lp26KDnpmp(P0zl${@21cwkg8QTIvL9}g z&&;PhrGzykR|eaUD{uQ%cVrev&yl*)GL;D^Ij`H;hEX1S`lpCXnD@SqSq29?jVd!? z*|v;XzQefT;4%0a6h5l_kUawS`LmBmPV&a7Yu%c|Vu4H}v*^r$d#em`Ea~N>`LCFC z*Zk27*JwXc;vL$75?c?xG%4e(YYDu(YOWYu@xCv@k7_! z+&UBqxi$Z_mL736fNQnO$FM^lio+Q>!UccklUl?A+|TPXCdRMqd3FH{Aex5-nn8}f3>iHcVpUmez%%ZCX@1|E&&xmP4FA;Gg|LkX zib6X-nO*jyJFrqr5>HV;Yj=UF)J~qru&rhtJF%VPsD#?$D2JNiVDGt>H+GU*o_6Y3 ze(c0O?kV4oDX-cce;9=k?75C~m?D=#ejVxc=7)7|6S-K^Ik%x25v8;kK{^>qj$Y0o z`nA)P*hN8kZ46+$HX_7{{FL5jm@)75`8a#<#pkPfittAGsY!G5yK5T4KE)j>161tH zBx_&3?HPb@-+MpH>#-4g z5BSXmJ{Ts3A?J$So=S`FPONn(0lRHhxyU*%W6*Btq{U$q0RY0u^#)o=)blIlIDJ_% zX5GZWsJQmQe@qQNeS}Ik0DJFviTpY8y~wTRbA)A6CA9OagP8JJjh03AHzukFuxLSC z(tkudxLKJy{-K;Lpjg~s9$pX_MD&Li7RKUIcXPJ%d~M|hVo662K!aP7!vW#s=iuh#1#?1pK`aO@kh0wyD-gmEgcW4(V(ww-el`|;Cb?|u5o%3@7GhpD)TYMp8Eb_U1zEp z)M!qyLM85|o{@K{E9(c(*-VU13XnPoq#Q!vlJQtk*g4C~aO1?}nxgP#gIhW13ZJ55 z$X;1!v#Clvv~?NHs!a^W)c>OZMDVe}#m#A8A}&b;Flk;aeYuWPk)}Zs2v|a`rbd^Uf68E7HyWga`qCJPYO*elb4m(ECMmG z^#fR=wPn_fSMTmler{qy+p2uMJpDSjV?7NeQ0%3GO_MCX0?cr!rX|}zP4vA%(@C8I zv9$|2LIY!@s2+{pgg!{pXeda@D5!x|y-=;oRT$ISV&kVTWR5CO{NK%vRqA<)u_$yR z`6E*D3AR`S(>z%KNnd%bZw3pV#tX&}b$lO1^)i~-RJtN&K2kuGWGv_cOTsj{{ly&i z%1vR!L}l=WSOTpc(5G3OP+N937p+o>?_S}VX`_e} z$(2$NN0|fDg_fD4;N?saU((PO$&1TthrS8l9t0aV@l};2ALJ(+AjYTw5XtB@ApQv| zhe`)^Ta+DZG}3j%<(VErre^zz0;GfgP$w*KlC)GAQ;DpOYAc^`5- zQuv$?jjlPoMfT}p7sv7|E8ak4KQ`GX6a?iKe90OP)yX_qH9A(Z5{(sOBGFt+r1685 zMipNM;ZKJz4!Lx}6fPGQRPlbluYkt68% ztM_#MfF~;!P3g!z9B&w{d!1u0xLT0}E_{t42s4_9F5G5;r74A9SeQ~^@(w(g90N;4 zQlfi%{Jfy7+YT=?@1&3XM@{?#NOPRIAf%dCFD1%C30A9R5vTh+wa}?zWveg7{9;;Y z{wMlI#kc(?B=LPdTi*;16uZ=FlMwbVy0tBb@%3QbZZjgoYK-f2zw2rg!gWwNV45Xb zE>e~d=3?JGgfhxW`-|Itv7p*`KGm#ubSaC7ebQ1THJPv=N)tQ>>EwE%M&R5~4% zO8}uvAV%EEY#qJUUrnl;Z9yv?&X9qjwUF>zYxHr1#TjV3D1F>g42;#r7IS2C*K;#y zY8chzM~;3C%!VL~yHjnjq}5`or$VnW!H9IG(Vape7v8A*VMpdo9RORnjtDoZV8XT` z3eKmR52%31RZ+|n{EoMp3Wgzgj#6zWic3xJkcvMVvb{q=@?_g!u;|WA-P(t(M)>iG zj3r(~y+Nc)%7tj{U2n=<;5GXHIH0@8+!^KVi9FBT`Q%Zfd}i{#t#E=@!>1e9zXX^& z>ZSurySbaij$UG};Nd%%na!+NwtSEA%{uESNUf=^=E1}N!$&9GLEqDhtI|3X%iQ=G z@kHabEe~0H_7CH>^~DW3S(ZOwOR-D~?_7nI`~%=YROzcRc+G9fd#?#}74W$~WG#LtwYm20eEjiqb98q>SH4uLM-9rbe{Fei{OFqO zp;eau-23KR!L}C|KI-x9#m^4coUt2UYUY@3x?zR+^ew?9k1tBgFJ^umz&7K)jAvfw z86Qie|0v=UPe_?(5LAVJ%pUUhgZ*;ZE#=zhSTGx`xcf=mrA`hS=Y8LK8OYnjoGlDe zxf)6SaI^+95GxP0h^%BYB0&Q-lMbbB!RfS$5EvZ>HF+0#*p{SrQK7%sJK<0 z>RuOEZaUQB3>1+7E-7uu-Og0cJX6s%A0VMDiOr!e3}Y@dXLenH zN4&?a8doeE6&R1&-#*S*1>f4Irc!) zVXG}#;Ch$U`MjkP;qq6vM8;QW3H`D(DScvAlPbVLJ#?O=PJ5KSc??xjjZd=l%IE^A zN!ylh6W&ebCf5s5yGH4g5PX!Nv~rPV9Y~b;VacGy+A%}8?X9BVv0U(>KKyB6J_9}T zs4dyZ@5JYwg~hA|>#)Qv84CO--W1@-z*ziz$X=B8V@Qv;JjkMOn4$2^=RMkyJ+cu{ zhUO@~zqIfp1K0{zYN%8Zs6q_9kd$4JY8JtpEVcpJd+=InQv+AAfDDSV%#uY9>c{(c zL_$`cLI*YhuL*VncR*hy+TV5_Fz$Wq`ugAQRWVAf?+;bN#0n5HJakbUua!{ zJ!!4R16~NCZ%gKWW0bsY+FZ1O(w1EE`YUMB7SJk2?6s~qlMFk}kYzPbp8tG^FuSjE zrk4N1Rxw=7Dw$QbTqPWG-(J5q6tsCf>#4mu+Bx=8^P=r}+uDAu7qe5C5=6XQaZfuPj&a^?DCR- zaies_FpK9ni%Fm-pzHB2g^&~R5|Q@F<4r@N=Ktul@*$kofBLNd@C@}et*o)Q6r3!r zyg`Ow5Dekj@*87uY1#Q&AtGvd__4V3K!)5P9uPM|s_E?P@kh#oFr)dWl(q98_Kz$4 zhm{5y3PZqBU>+HMz83-zK`DM-2}H_EUVezI48oBGOUcMei-P`F72>~i5LNxtG37yI z9sJ8NWn5G!V^DZHd>UKf+jYEJd*#2r0QX-nx#}`K_6zY=@BGRbKhjGb`hwM6g93F* z+`P9J4HX03lE`vWf>1_7gNr^o0#jXjpV*|^@@`*8*ZQve@hxzQSLJNoWQLX|g4m^g zf%mnF?a*yp;celojy{dRHGp0HvhRQ>&TL5;teS^9L;YC%I({apRrXFzIaElO{h4UT;=0ZDW$F>$Z z7pt31t5r{F7AxOKt6;spH3Qskn%QP8>BKyFIAZNQALct7a6ygl=N80c&hz!eQXK#a zV()GUcOsK-JTnR&bwR7?=WE3i*nly83tn*{#|vW`b2eIL8xV?r-;1rMxbcx3Oqivh zv_JkW1mlE&rth^kirOYnIKp>&!Q*_jh)vTmBt1W~rC{DSz?PuDTy1}Hi(#rn!dACi z$G%C-L%iZ?@2z$hxlBbfHkSfll+YjNwle^nb!$hwqSxTHYnL7?QXzhtGNj6&Ocms7$3wvBh?Z4+C|=V@%<}Hd zlcZ^rMVn{vYAoJEeDlHE3oN`|I*`h<{{_j)?IisrDHj46De`{<_7CC+$$c6%k!}@3 zmf^pGzc`&n*i+RsqV6^!jt+ChcQ!;6#|($5&oTo=%bZd<0thCy?sF)^?`%`2bw4vl zjvbKHM~yMZWDm2dqt@+3yiRmA;j2S#<_RDdEg#^kBb)E@T|}ZXCw2(us3UEL_2DgI zc9;nq1a;Nnhu6{K^-2h$Mr;D8!(O{ktM)1gqLpsq zwW8>4QW`~2xez<`IkrCWGDkV;^Y=!=-y{?cXFef$-{_}{|V}FhBfTXL#_owMk$7W1J^Xk@IUyjq26jJj1|qwNy75) z@PqE{@AikRw&yXDzn4G26LG>|IAQ+=gN1o6E#4#~SpO#krOnX2wbAV2pdtBBNL5<9 zfHRn2Zbt0xFML-2PkVGhhIw+UYgQz&OkAzK)mjUpFpF+0RVqO(qC0m|KVaW`Jf9`>*W;i8@rug<>tRknYZ0 zz4n2E8nKlUsrK0kKC#)P&bg8_J^m#LfaMyfxe#&=khWqiY`pvynC*h?H1M<)o7e^a zXyA!AAYp@BIH>dl2Tt7?n0|uQnv^}cay^M=Ww2uccziH?S`TAr_#2~;Ka|>^1=X6= zmb9I;8*cI_cJUT<x7OcOW0Vt)d${CChwZwX&JxW5<%Cb1^|J7DG{1fMtj z4cI>kca;yK*C+r{KVi$CHh*K6s@>wb*FMfFR@b{2xc>?0?EirUrgD4o{pI|yPwJ+4 z7-002UaYsaBO+Dl{J13pI2o7?X8dD8ZD9N=mk4Y#YO?S?445svzk*M7 zfd#LteLci*j_!+TL;xXPFpUJ7@IHZ_<W*v5qPm3HFv|Z9Z}rZ=f{ze8$FfsjtpnxkTe=S zues{q;LDd(v+*JrdT|=ZRo@q=nzs8+fh@0pO>d%K3CSEP5U8=e*A=d|d^OUTY!^0- zRZOaAC}0#iJzt$u>4IA$<=FIRHipdk`H?ei(9Cj_BQ9hVQ<`~AUz{Bk8&jblq>RrO zU?S0ad426u$`1pIt?NJQRntA&t7fcnIrlvbN=IKB&;P9d+UQl%^{+## zG|YWOq(j|zphlE#FrKw*`pTqHy8hBoDz{|c0pR(vmiR66Z`G6B4WT}-;A7Nv%L9Z7@%Ijm@C_47?M1CyoB0NhKp#?RKWsNd zuA<;S)ewn9B1K<@NEGm&MA8L)2}WNc(3dduB?NsLfxbizk2X`k~or~Kda-Y1Nz1neF;ZjXgoUR3y&U(epnx_PcS7$8xmyTo14gRt2Cz$0#YbT{jWS8cy zpQd>2J@?x2^Ir*d9eWCVev`AM+bk4nZn=d7)Dd#&q((>;$-mpvu0D& zaWl+@BQSE}fip~oBQWjstBIF12z^WA9WhK!$E@KeocZAez%qoX@fRIQ6#9FZ4*wW` z3jg(Ry=2J+=a<&%H^clm!X+mjV8i_IzjO>3jsX@F`~@?BxyHN5Vud-Iv{2O=SW&R$ zTuwZj238bk`Z`vy-o*?s#|-_BIc4lm!8U;Y!E&J^EKz{);l>NhTU$j@r`9kZC3`*! zd~RtlBOLQ#n2?gqDn6iihw-p@E?7(Ae_^KZ0^{H6CWGg0I4SsFhF!s*XXFq65yRdn zN#(2OO-6To^LbETUA799O&8R5nsz@NvzFjz`O$!Ax^ z=30r)E{*JX5gUNbxsH`SXb$*H4M+b9M_&xA;D6!Y8h*yGhd!tK8~7(2aT|g45B|B~ zKpS?9Lx^|Nu>1H^cr;9ow@~+a{3&c8F%kY9{uyQ)f6=ZWvcGth4ZE)tC<%d%P;=I? z1RbGfFF`N#4NH#k{7Hh0`NN#~vFR}>o`9JBWBikUu{-v(&d*Yodgk(7y<>Ni&BE zkAgqQh>6}}P(^7qoiD=C(G<}aQLvW+8wsps@t)C!X}F<}8K!HHT>KHd7(5xqzrYk& z7%)Y&f%THKm;yW#n&r+@L^X!F$A6#W+2eWOjl}zcCxgGV5X`m@`bjkUg0~Cr0w#hJ z3g@q{{?~W{2KSXJNuepk9A`vDbVdyP%LJSSVgI|t3G_sS_)`Y!(L?_;JSlug4RX!= zOurSXB2@~l4IC6=j^Cjo>J-CN+R3MSVbuIwRlIsntXrdb7O;n6n;7A`{eawJ%9`FGJXB-j4Tw~RU7Y2VG ze-!T}Jwz(Ub`Jj%e->{v-ay^&3=4!mV31ICQQE;UVUB)K3-klle}?Jef9dpDdo=CR z9WjGKG4P7_x+Hyq?4LnkFtK4v)kSI$_Ld?w!qOt@610e6vS>$XiEg(4U`z2~GwgnU zy@cY~;_0wVgkD0`1bsr|>_#|uJ{+y0DM70k=EKo1rJN4l|9>_gG+TTqv7koa$?NB+ zDN@sLr>N65G*0AbN>De3Im*#+|61_A93Kcksri>ETeFpE;@5`~y^xHKiG z62m0$znDpY{Fid4&;&@cz*~X!3sxwh`bkJ7MQI0}?*Q=-ZOEocB?9e$##Ev&x)pap z--PPF;4^?#71qdD=*O`bDC+#`7@#=zUn(IUT~73Zb5wX7yqQ?~7_EVrGB_Vn3E{Az zv*sa{pnY-|Ik^Tzc#0~q<}XbiQ{Bj7fz1aRe}qXxnmP524)ql|xq18fnmM%(36Ag$ zjtCb?ajMVV%*ow1JR~yA#~1wwtvCFrhwq30?{*>ML>}k|N{v!1Q&A$dLMm2kJk8)Q zg~6YIk0YUXH)AuPJv=m|Kg~G24jeRCq>zi18j)I}5KE+TQE+5XkSB-Ou-j%LU^FNs ztWT)7kFN;rDooeSI|34@!6GyUeA{tcM5jIx-Vwecq+i@cW=^g!HxbIay7rYzfITgp zE96+DQnZuqNXt68g@yR^@r@99z@O~kDst-UJ1#=R;e-{wnmKj%4fc!h7fEHw=F5$n zdAu9kEqsN#+L4?cmltSO-LP19xJeW>E6`{B*!5v!!iE_+2T3Ir=QR8iSMTJb$KE-Q z)IHNKR_Ho2zgFsxH#0;p&CLIf`x2%3`L61jj+TKlH2%@EjL*0?K2>+IvB|=nMm6XQ zhdZT@y>N$?o6R#_j*+#!DwsXGQlZi9E8@&eO}EdtF|%m?xV7u-J6`hL zftI#2E4*!1?aJ*u_sR9HT^(_0Q@^Qsi36hQl-<4MZsO60Q$+SrH#^UNr(V+8ck1N> z+m`NWJ-O1znuA(oJhlufY*glz>ndr5Am1e?UNp+3YtOi0J>L1s$SNaGDz7cQ5^j|j zS8LnXt}m*Jr!QD}>UO&W10{2V%rd8Ljr1N^v&o!64X*m>_;nK`R#iM0cCN=MnIc~RQPR{Jcf0>IaugN~Y zYH7&LH>2#bJdO_h4eQK?hb?Qm;HU000o?P=G@z{kj=_|WhRPwAeDAXwL(}41S<_#}%x9vDP zix1N)Jg{ug`RV0umBJ>jF%sKrXp1u=zr~2to}XH-**h$`x5InOH5*gDjlW0#n7%5) zwf(t3yLne{n1$8Jd+>>cjxAfF2D9?&O5)T;ris$&KbrRwmD6W zSHE=;A4pmAIlNP#@~*RQeJWsfA_4-9Pb{_sQ|O9jb;{RT?~BQr5!!|^~`sNY?>d6TNLH(Jh=Oy?5f9>8$F2F zk$iV<*2x>5S0ghvz0FHKG&8e_Ap^wHVOXwjQ0gYWMUpG;aYr_=1ga}s(E`g_9p>Yd^& zo)ymeCPDGrm@_n?C>61KFBa^{q|~P5Co4Q$8?#|CVMsSqD8A-#WN# zy4M* z$A<*CFJ5?NwO7=XAr7YLLn{vKX&y1c`2Or(p1mW~S0eh_+lW)!wLQJ(Rp8FT9z)k{ z`R!7-U-dw-xnGSAQN7OZ@1NbJ?#8~E8rv?_-BH7-RHe(oeTHIoB)39J2k~VT{w0?#@ZJRgB+`OCS7oPoh`i*SK;UGqX+d z+bvt&JvZAVU|Hpm^AEeL)3a=51~&{5Z!AwI+`Sa^tK8!{!Y zE7^Z)37lMlgG0c!c!0h|4v0JapGGDT{R5dZ^nb>9NpXz=zLzoDTPkDJx)fI<(9ao# zEtO#-1K(@^AWr|I-)sM#O#AmhO#6j#ZxzP>JvFU0-M|J0l|T0PVGYIuo1pt*p5m(ojN;p zacb{@{-6Zxs5^wNA`gWOtfE3hfpwHfD43W`Olc?)rId;_QWbp61>3ZuYl&?8tMfk$ zn@tzRSZVo^D#U6ESx}W&s#1w4nNqBhAUB|Bz8LqP;S1+Snce65Bmb5!rAn-Xy`m%% zu~Mmk{n5aB$>DpASguqE_@YtqRToX_s*CI;(>c9{CHs$@Db+Hu91<2%iV|z&v;rI` zxmYF>aK>efy=G{km;>_PmyBk~m{O@0OC`V=tf2;yRZ2>QTrnbNIuDnLb65+84{YiA zqKlJ#?OrO8XQ@<)q-w~K!a-LmC1Mq&Ci11*N?jg=&6(Ew#Lg$9>Rf_p&`5-1S(5bY zI0I>?z>$=yDKWT^O1VO;lnI55y_K-nIGWcohUznnQY-zMm1fD1xI=yq^q^P;>PRVt zttBlP%@TjPHb=%@Ged+^k|rzVk|{J&F)Wuzs*;NpauqF7N@QY*yre~AB2hMHx{&(6 z9ZW3$+TB#B6k-jSHqc{Y8RY8~YS>*BS(h2)j48UYIWq*;C9fG>y!O{|Mu9d1B}+jr z2n>*d(uidx$v;y;WAi1{{{L0}6=0ndP|uNprqFDj zTGFC1#UU1F*rWN+YliaUdM85;3RVSzFI7pvL{TES2I(_0XF3BQIGB3KLa7cWU99t? z6@NL1ml6^ZQk6_B0}oNIQiCxs{$T2|rtB3X7yuf%r2pOk$iWQ*;Rget6e}UWB&WcK zkSYaY#ustV?e$q!1g7y6$!6Yr&N&E!h41iWUM6dXqi_EMn~tA+j|NB(t1684(? z?+k!if^~%)#9alsA(>nX!bZzPav8X2GU3t0YsSv15^TC2KT;}TBgh(U@U(Rc2lhw_ z`ymD4r$B?qVFBf8@*&V!0bQn)y>O+o0yGK&N-~|=m6L&&A%i5l418M^m;;#xd~SIu z7LIflw8nr*#p%4Ee|Hvi?19#h0O~|0lZq(?Y%u&>ttrB>)$J=CEQZD7`b5Yj!r|8c z=0ND!1KXs695&ilg+>K73-(t*3y*|A?nuYte`OYEk%x{yuuwQ+(P&_IVfhqlu|iV9 z@-eF?(7`OMPzf#wU83-515lY%DwZoi(@B6WBzzEvN;PCnr?U+L*9Zs8oL!}vq`<$> zz*@eL<^|Uq9R&dB07qhtn(P|sxZ*fQ*#B0r&nilxW9$?pkxP-5#;FkPl>S9p8qU8V zFO3Wd92}IWaB}73sBt9AWFnkgAvc2N%6tqt`3fe<0otb&*=rX32C~-+8knRznY^z^ zW3&=yYXl_$Ovz0IDRElmpC*D>YEr4qKN(5_m=WFDqvQuuS%8W?za+qp0MM>+D2p#9 zz0R9DH>e z@@+y|lnN_`X&4vcG>Fki3;oZ^MRalXqW=%)(%1~b^K?=5r)6j<3}=`&IVX#uJKUoP zJ|1XU=eomobA)~+vcIp})66_Y{3*SQFGCU;A$sSY=OY7hn7QsCsBTHr0OrLWVohBYdNL zgF-@`+&j8-=+RLe79PQ$D_j5m!?^+)Nh|@}4F$O#xz@{As$`5p{sW3sS)U&UWC8muQ;GX>ZmFrq@@Vz*UGtARbDh>HEF>}%d?h5yK#hx#xReeOj}}6TaG}-V9~?JLtzLM@F~Ufh zE^U4#(nty4_$51-8&yspyLOpTYy8KUwPrjlW)SeO`i6N2hle5{mrpe8LLa9NzEJ@_ zzV4mciJZEKBElklTen`g%h5Uc?`lS>g)wQBji~gQY0iO06bvEBfS-;xqEVU0aOVH1 zp_W2^0SuxF68JI*4x|)H7iz#K!3Mk(P9n|o60s!?h#ZYwEuJaXgK7mPp=5Vf2IWa8 zP3k$7OCb~jmx3-mt2|EmE+Nl-D#oP%q=0_KQEJx%+*2$b%*id@rQmC54k^~|MS}CN zQ1ebL{V&mZMMqnuKD7gT4Ikx;vf&8s*JU&W9~heqrnJjwsPAb?aAM$7fQD?(JxY4` zD-sbc>JL(!$*Yzb*=OvmZsch~XU#L2GxOx-w(S<&+c9lv{mO2>{@tj8o~~v4_P$&> zbI6^`PMylmu?cP7V0-IoV?6 zbb-vX#i&hhep^OfSbyktt!nYEkDXtbT^h6_qt?Q0%c&l(GEQZ`yW1dn;<@U}1Dv9B z7VTNSICIUF!m#)r8=AI1ucpgvlg(=L;CX%rmATaRu6^9H4TG#N*O=sSd{cVxKD!8~ z0mr-@vzuMon=m`}@v~?9T0B@Zal^salk1(1nOE+?Hu_$q^8DG#%OBQwe)(X(l&k>b zmBaolUAlMJ;g2cVzr)KWKisq8xM`EmGXtWl8lBnj{I}itfbVYYyAQHEC%KqE)hy0p z*QBQfA&p|1eL6Vn_TJEA%V!>6>FImY=E0X+Q4xOH(%wJIBNKdt*b5e!DlUQ z_F3wc71i8I;yuOrAl-d+z@c|Lve(v_HOlAGh=KN3AF79JTDP>|#G&ZCw8W7K&7#M} zY#!GASkIxEEzfNl{b2sR8n>_19Mt`BK!|Valk3!3eJeL<`lnf!pDuRG7u#M;+1%*y ztTm^lMt#27e_9tmcUt?fj{bfFzB|v#__g=@FY~H}$U;AKYkI8(Z2paIq-CZ>RNur%NVo`;`>EJMv7H^_>=b z(j9)UIGOwV?%W5D)>`FSPF>ilN$0vQlP|rG>|c3ETt7?KiLnEZo#l_#A@n+(nAOzr4UuXk|7A$p$r%PF^M1#KNJKAzNmjWjE0UrxQ7AJ$K}ce(xh zE-BR8{XWyH*1Mz}cHU-1%i)DJ8!k6BuYA1ob^BDs+kPDi{CnN~+dzS`tvR>kiM`~)C}*@K-pMP_4XSJx>AdFj!SNRtl-&N zB$?=NIJIkVa^%#e+l<2|U;duhKOtoJ)sJqmmRDbo8!>mC^46+N8+|@*th@Tolsz^s z_onQ=ZFhciw{Gpi7e{|zvZNq$&uNv^FWRnkWxvRlvQC$l1zzrZQ5t=H&gHkq2UT!A z6uTy_T3|u%t)GM6Ui}tu?AF7U73qyX52WT-{Zyxs=*_IWPxTv(inXX}4&2H+M6{Hh zu^ztNrH}dNXT9a^($7>ou6z<7Q^|bz^=bu;FIT&g{w1&XjQErrs(CF&^!=>b5a(_A zxZ1N0g|e|->y7)BpHw|~sI}rr3JnM6{h}XhH@+IV#5#Y%mL3HMzDAWx*clVL;K46T z+jZrK)<`SYXo#!AWm(rwgGV=*Jio9_OtTi{0P1IvoK?-pLg=Ar9ST;|1;r8UW0Vf( z4TS*waYK3q>Qe?Q#26uMwtCOb$QYDS@qflJp z`<*gKNa-zSQN)m!CHT8CfJ_xbs&n!oA_QVuI56K)*RUt7bMgT;1fheFm}T#UTx3N8TufOa-wCCqiKA-6%C);*u$3D5w&K2ng0u z3^8_8-?_v(XyZDz&f5btUvgpu(Lh$1CSODq8iBLuNfKm)ch-bEMR6P8;B z)kzH@h?TKgqc9;EiC7JHCjd($*eiV30rO33Qwt<&Kx9b(DkG#Wg^(&cHrVd@Bb2cdvL3l zMTOo@uKzUID3d8O_SQF=U4h2XaNYVbQ711fhtI-Mgeclz^Z<>;{ODgBJ&ZtyVfB?v znHHm7iqH$A)O9R_QsR;p8+ys~4R5qsg(eVFfGLm@Dr_Y!?Z1t4?H zJ7JU>z?85yd})($@M}d4twM=MVO9>XLtGQUnzP}AL2(Jth=lWr!T&`rw|3S_C=ftl zUC1}jUbBYAXPZV@IRw|26EbTue9fSwq2*9gA~_lyv{O+_Mg#mtLGl&wjfNtJ#zLk9 z?}$)nm*GngMUpZLri6-$5`tu*hr_}06v4KVf+Q$Gqv^ZyXr-IK+Bj{jgcK-bTA8h4 z-T0Joa4}cb>V1X z26$82A~qrP&_Q_&T9~=Mq{Z?S8+vd+m}tv5q{VAtTrp#v5U@hHoW;fvso;JE!j-dx zh1qUaXCds{acP<3g^1OJgt-iZe^?_k#5^smg35{pK$n7{F@Q%vt*bd{hlaw6hQv39 za*&A)T37{@6%Du+!l8L#6LHp3K(Ug-H63n9caxY;jJ2=|-6baIe?Iz$PmDD67) zAg>NIo{+j&A;V$5o`BK8)p(nh6E7LW@^~i7|wY&o`WZ8LOU8&;(j)0NY9-au*DZi=u|}Oy(QhF)4v< zmRmbA%C$ifR5)@egiMAmNrTfTB-YB9!Qm&Yw+xOnWL62(d?U>v#$o~?JGh_(9j0&U zghNxf$U)j^8C=5xG#FvzQV1EujBxdc;I*?eb=rd^#6zK*UvLeQFmx$|42l|J1<5Dk zl)+iz&A~%S0T&1EiC}0szcNHxGK2>v6dd4QX>muIW`s-%S7Vig#EYC?q#=$BF&0Hq zgV;!G&qfiR30>OeL#2c_fcirf9|Y}jaxE%2XQfG-l@gRGmnf4L#2ZKwu#jG9b0art_#0|(O`8RGJdYgkI_mY{ z;!sV2)6tP#(#FVIq{U0Dchie&H}tEU?`6?!yPy4osdY{?Dc^E&UaGr;bgm+j95x|DL<2lA8maT+ef0m5j7<=EDwm%A9yJDRg_qj^+*DXHp=_*@IzT&SCj4)n;+k^Du_OA zG^y$O(6JvT=RP04Z(yqL;_MyMygL6nN#`$~otv=GBenCXFJGFPb=_O*X~o$?~9Pc%Je<`mI)_@g~G6ZeHm+J*F;6aB;U@T6pq!KXa-nq{mX ze!Iqm`&&;{4ixpe)bNeyaP0DtQyV|&U*9zF*u9`m$%DHZ+0k(;ww(OBvuF6BQ>N8> zg!Y>9?9!0*&iVU)?&{KJYU{q!Un^QypEABj)pJ#QRyfq&e~ruWSEiqjM(jMduFSr- zk4CpB|4sQg#>Z@Ddd=?5f)~$z7_wo@tL*oC4*crBBQ*cU6j9H9i4kS4Ue4duzQ5}i9bC_pphfw-Vt-sq{1etn3_Zq)wS zyVWfc{Bj-*z1ChfIpcthYr)(@D?^@C_PKO8uv0#RuCvy}>@W0uQt{$L)8juM zzo(aVoPPFU`$)^2HOCLHpE1Iimb*naiYZWy&wHQp>HX0!DS^^>%;Kv1#{> z-D+)aP+?(SmBBXMFWbdl9NYI~`vckU-VUW)9kz6?-gH2UX`_99sh(la%`EN4IBxn_ zee}BS(Kq&`)XGV1x8_iK?zh>3`+1p7i=Gb1k++a%WIieu@ z&cl_>j)t{fSNQGwr>O^>#)Nm9V_(edF#}bskM&o82RSsjp0#CCmdXH z)GH@>_N&+39@sigS-sIs%r;iWX=6Oc!{r%G8Ux|mi9*Tj7a$Z{FGC1=a`yOG;{D?j_G_F;|D{gp*OrFe|Gw2| zMW$zV>+IyOW9jHmgGQYhu&~eSe)czh?N0IX@=K0gktd5Z3Rt%HTt8#mFCL-Cx7k<@ z?`zi0`02*@iowS}D=Wn;>+ECV754a1=HY#24<2=_-PU>H@hi&@UTm3GyN2mnmno(p zw;v~6?lkDzNs@8r2P zHg@fie5Ju{r+4zk4f;$_RY*JLmEWXkfR~^1#x5InM4YV`yC||%c8BN2f7yQN_Sc*f zBGVU5l3xuiJN>UA4Y$wrlJ#6Ne2U*+r;Vn}K2kj-)MS{|NWZJEx|^rn?z8#OlS+AI z=UCtKp5Y;L{rl;2k8PTXa*?O{o?A4noO<8xeb&G>mZ!T`FKe9K>DBkSlIi2uxYlld zwQk>uookt#G|O$87}?HdfV1D*B)iq~nkG(j*kG}{!8x;94cZyUkMQo0d45NyuvT7? zBYMBB)$`KqpB;9MJ(p*<{lJK8VcoKJZnf}CcpQ=TctE@SH(xf!b}C$U>TrUCSGN@p zPc*A^oAy4`c|&1py3@AP5fxQcE?hfvZldj0|6R*|jcMbR=9_Z)sp9AU6=f|x+}T`h zVM?K5LD-7mY`_Ipu-pMz$3c$iYZqmTSn&v^c9_|y0mQI9qbd{FTB&`)X8 z5B?mKDGIN)_&|*rFP=seScg3J>!k4RaJ;Xt&#Uq?`%S8|IEJ<#zB5bl^Ml>&X{$Vb zWH!u;&UWaYb@S7!&xJWbgX~VH-k;$3vFFE}`WG$?&o=!kK2zJ{e%`zH`FZa@F7nMR zQ{$w>>q5TuJ>SG`ZR`TaOiL9n9vOCH|A4*IMo*BAPd*xb>H4izRa^?*HeP$~$aJHO zhu+qIPqn$&^}3y??&Dfz5-ezGVRE+7z_J!Us*nC))OK={`hS&M_-I4cZ^ghP znrp&?=RJyhz3f$CgKOinqs9l?z8Rkqe8IhK#JP3-l+N4yW!HLG`#yb^XA*hAVc(bG z4*NsL@0vVlP4{`(w`sd8$)cfNeatmi-)${>vwSI+wJno9TS^ccfIz_anKXf zwhPtXol~|3sGIgaP3^PYA-Z|G+lkP$@egMz)Z0ho47sy;>!*%M(d%{(^RAWJsGF6M zU3J?^T^1-SpILYI_G$Xdx|%2NjtfZ0Z963W@59da*1!8*3UKp&x$lrh()>kG==kq7 zhwMKbdu!6O8b^~Ku9=c|IJRZ{)mfSLPp(`YmA>-Li>#Uh&rV6}dSJxC-xIg?d*!jX z+4Dx$%P#nwTh#xN$&T?C64UB6ozRHB*yLVrmgLCJck?fwnp^w(Ub~n#3uMn%(A7tq zbWU#~w#g3L>tJ+$(#Yk`{x0eMHBv@8H)}NFd{Vm2wvn@14-k(rUgGd{s`ZQW!1oG= zGt|C$Gtoo?Qyk=VOai9PvG3(5?Rs+Ft?Hd7jyqMM{pr9SC!|l6`*uw*F1L#sI@srQ zQlBO6oqt@Ht*^A=T2onzdVNE!QYz2SqCj#uvV-nufWQH9xFOFPS_URipTK4IE6$!<{RlzV+cx-Xj(L;CftP;o$w=i4)^yew|SP6+Q(!*a^l)Znf!2ai2(cQ0^P zz37RVeNGSQvgBRwvFA4$*PrdP$$8tcguY`ly|3DSY?BdvKVYoa?WoSpWE6|HazOQpi9u!`_xm~SR;$^3@u(&@&j)jR$5@py&y zKl*|YoU`4xt5tntBm`C;1K!zljqOdXK&ik4%0Hxm`HcDQJDXx%f#Nb^qh$!y=AVXm2tB zM(H%;_USLN_0dTh<2vK!+}$q%b|iKfQ)_MK<&&rFpY>;8$8w$i`T{()=m(#^gLrC) zd7`bpAf`q(eD&LOal>_w3JdLSzG!4U`4sJzHo5U%EAD^rMYH_Xp0(iAs9IQ7hJ$&;1gkJetz+&YUh+ ztIvNqzi_yJ-y$*v=nxWd5Ft^`2UfyZ6VaPNU7ok_-9+x)qA)hCCE82M_Tt3aZ&T zcsXtiUFs`2!m6_z8Z+Wy^+_l>W<-}VEWYZ@$3k*xaSloaSEfmb5QJ_q%oio$xx`FP z1bXG6o67vunVi!F8d5n#T1b+r^w4oN5Bg7NBs z1X|Q=4d1+^c}=?!IGXXUsTYzgb7fbxMFa8V4~EbI@onJUH5P(M%; z>Qiz)kdixTMoLh3G-$!fUNHvyBgcsN5*SCl)--TSOt9V&7ggW1pt1nTS$$d(O@+Q1pql8!bl`mDro3MLy%BDh>=JQh*1@x4l3tk7>UGy z7)3q91lUV?@tR+|S%4T-5v+!sk6|PZ4Yys@I)oM*^}~2oT18ew(d1v%OjzJVelM&+ zhGtm223nkQ%0I=HL+?aXGpUhbIl$;n)lxtkfdJGY*U9{^&_=lc+KB3kxITp2lojt} z^6`mWTCI}_|0AG!{5;G$s86xO7J~)vf)gwK$1EY)L zfXxtSc0M|hFfawQq}yO}PLnibQdl$AD>(|fKFDBKgd_9yD~npEA__bW@A#aPg@TF|>U^J#mFY^L8eBaMC?4U^B?%db3A%r$A)pVSRa+^9OaX^O zLO>tL*^P^^x5n9OEM#&(xIk-Z0^3N&*jMOClLik3Tqe?_OCe-(=*kR^Jz;3QjA@~b z#Gyf-DD=??D_X{|61G#%nKW}a0N?-@Hwfy4)2|2z`5bDzWbhyc>@?wIY2kqeznnwM zj0`P|09>OBqS$Pc6q&)v)KUW|NJeP+Bj+ImIZ9M_ETsSng6$TrHy9xzY{|W^nwm4^x$I^ zNjr_u-V|6^-K2GFLo-|isVr$^Fa#>dM+>P-A!JGjnN$Qv1-gFYkqwZ3F5_6pz!8V1 zXM{EzI;fU{ZE!U-kZ2UL&6Y8t{$=C@IpP|EkSX~6B)DvAi6NJU9@As^b^cXkPe#G7n()}BahJ}bJQ;+~FL~r5 zJQ--OQ!+7)T^WKWgPNw4I5et+!n1io{lPDr@MeuCO+hySIZf!Gui)2Bh}7^t2fW%O z9GYJ?Arix59|{~9(%ff+Q5C)9S)&$J1g}-WzadT>8ZLyg3b=YFO2IFj5Q*VJC`GtV zijoQ?vkfI1ik~(?PLzUQIUxkK@UR1 zeBoB}8z>O@20aLM8DS#=1;0i?qy|NZo_Z6UEq((9A~7gJ-Qi%DBo$CdFLB9G=^EWN z6OLSrl^85)$tA0#D< zPD8RQw2FV+$qTB88BlG#1%*~lg@o+8<1z@>cgIDU|B!@KXj?b1Ob2E}r$meQ-TB24 zW)eDD#&-t?n$R~+!7Gh`>&_XM*=QAN(?^O!L7{Vnn?sBThAv5<_z8;0(71s?#o>YZ ziGJ`7#1cYA4TAFGMrPQi;O#~!$qnU~MhtUiCHg72S1%>`p}g7%am6Tj--Ps#lLF>a z%!;WQ*PVigT~GsZfj+>uGgYwxM(Zr9XlLtgA{GQYQpK zk)z;}P{~p7s}e-MQEbVDZenP$f>V}2`A;G>3N8uIO~{LuV%FeODM+V--9jJL#TAt9 zi3_&hkAh2r{>H8Pi_}GUr=j~W5oW8vZ&Z+I*{KusS}Qa)6dr1RRf4o&G8EMk>ShXl zRf0>btv|`Yn}a4|grQ3zWXPLS5pdw>1<;ZtltzzgK&(S>fcaGkF5}GMKuAP2geC$# z$OerRmp;|)f2p51DV;~=3Ok`|El_MOwSuk|qD&604(PXUsYX?+(3}j?#9oj z;!@0i@X1g!XS`o}r2qvGG>SIOUaU`sUS{TOHkX$1$*`FhX4#dTD9ZG&lgi9<3r%WTF(0f}1KNdX_E?hF+q$x<`g7qMb z%yS31BQq;TK?7@|=}>~_Q1a0D@m!%wQ1UO9kcL)*u~lfGC?;Goo;ygS25U=_P+a?9 zX@4Ru*jk;0a-1@yuF9c9{S&Fd*b*g_U*+Hu<5Q`C>MXbP#h~9%cDBUTR-lI^2{=b3 zzsSKInAvFbx)mV{01uXzLc}22C-(JI@@pK#k)dWs>g%V(H4ZlVjYtg$08(E+CBMc& zBu34lNJqm^3lRlZ+0(#=#|KCM|_;; zJA_D$(g*~j!>@4=Y2o=bj)dxiVm7#@I4>3%Rq)bE?ZkqSD&qZ7+yzUF&SWWjT`3g` z-0LdCYP(UhN&u%|ok+6h%7A0pmxGnKnDbveS6xxX;JIQ(O6R%iE`8_?EQc1`NTmu8 zW5oUCYEEwtC5M#Vprmal~6(<=?s1eg-8q! zs%l7%D!+mPcd*bd>lRl#N7TX(Tyep%=a*23LjxjQLUL5uRX)}MpnXMJ4&1yW{>K-b zcmNqaK878}S$T+@+&Z|5ocj8Xi{LzAr&KBz8<(k(F(lK-v?5#;F7Y(rLJcRkuEb@d z|8g31^&7)!z>MfNtoS&NU%yduXqh+;^+_jy>XeYM;rS69Vn$NXEhczrk{~I3SAawe z_82_|B@i=y{RXiu@FU=A3*06m7-V+3040XFlh*PLcc@XvRN>J4m`2ApJGrBROVsH0 zuaKIpF^d`+?ogvk9YSKZfC-4T$sGzVQ6uo4keVOU=on{Z!%#s&K`16Gd4&|xlF{%4 zILgEkM&_zb60r!?Bao9OWSc8xWMXh6z>gpaN-3la)gvf&np)dCR>?1`3I@M8wwb^g zH8&=Cy1Ft-5&D-|ZiJL2;e(a@Itqzx1e7JggHZ;-AST#NAe?D{8xirrfYWAC3)G30 zZ-`$>@L(msjG|Q1NN{vkM@tRyD+wR01jTA#yr`ieekH+!mHg`++9lJ0i}7y3ePQC2 zH6_1}LRxRQ7z{}~f-ch4QS`ned%1P*hof!~Dw5IS*HMT=!>uzF$!2ltD8v!d{c(V9)6yng(4nj?`S^PQ*i5R*;&~PWyppEpIZZ<52<<$LWpN^B7M{Zn8U8iYw zb6>U}SF{_aQDnS4Z#2I=4fh^cf=P~OaD9gB!!hqVm-dkzO4~5WP>NM*%Qgml1jC5# zG!^f|@$ZswY4LG@S`qX{A;<;SGD9ked0(A_(?=Kw(sf(FH?kHB$s~ywvVIy;R)ihx zVkZoU1uh%~X+I4C5J+)qCPfVmX+P3+TLcH?Y9AfnY!{9KD@D3pM(OG%dL^KvX8TcK zrAU{{5HgZHG$z)$aA2lLx69xShT^ChoeR=Myj%ts+zrG<9K?UuavPLjaruRRkX|TD zp%&WEOFLukRim*`8Donl@iYPf%!+dwDO}|#bwnjRjg;>GiQb}9n2}PQMqO?~Cmmc; zd>D&*^BrAD;Rwet0@;ulAV#8A)IPy|pEWvGrY=s6-atha;^Mo|3X2$2|a zXWIM~r~XFqiX$FGV#u9I2w?=of+Y*694f6+c1I*#{+HsHD2PK#QNCU1;h`Q&C7w!n zEP~LL0Gtk}{+3J)kD$)cgtsab(DnlHSaQgad22QQStPhBPTkp9*v+zd}JI27Q8} zEFm$^_n{CmA!uYl zi~>F8K(!IhDZds%Rz)+t!`>U0r1 z#lKC$CDz3#5Z58dpKxftho@tl?$M==nypd^sk1v@58awE&gwSt@#V`i;{x&Q$*MDZ`A7)EAbD7afP)a8ip7NWV7 zJTj!3N$(a?{2M9!p;5^KuEs(6nsBL);#X3*)L2XukfK643c*hE>nL1WX2IY>0m9x0 zuf{=1s^m!{WEvnF2t)Hd7Q$X3WEx6IBfhzz1iz9(WE^r-L?!YB#& zE(+IC*ib$aH40&r1bi2I>%PRJfkGJ4&1T9_N6|w0h(kjNL%Q0GE{GR1G~OcsSV2LU za5VU36s`Tysb6NfWe^I;NcxvwMPRp&8?(TT1hlE7e+v`gIR8ca`y9*&$Cp6u-b-~6K<{g5BpDxm8dWx>DNcch>^a~n z4%c(QHKqUJIcSSJEYATmq7$Lw-FkLP89S*QS}eONKuJppm;ET5HP;*Prf}Rj#Ek6n zyQ(Dj7MHwM?n;mqlw5j`9E%P0SAn z(gU?gP&Ac<+Gkvbsz`G#$Po1id=$-yjmbopPVkTZZF&HuZ1BeE(*r7|%2}H906*5{ zl44OUDguF?gv_|QdJ9b;Mvy28JLRec_#pqBBW+w-Mg@WPfCdBtE2QGzs?pMN4<|Zd zr~@b8hN<}1YKSAly>!&WNl45)By3`RcMb}=p^(~#tN4W?Hnpzn0%ShGpB9>Z)K94-Zt-e~Aq2&g8~it*wmE-kZH;D^(YnHT0_RQ%Erks37-AZ|5J z#<;|oZ4|wL#ucEzpiNZ?3kK_jq8DCEYJ7QC#jhN32WIAsf)`dtYPz+~w@~p*M?`8= zU?=2>Rs7Nskr-fL5?-1ZyWlE*>4->;3hV^L2B49?!YG^85P_4z)H< z+0y#y97)vA8gs8(t=ZP?R!o_IZD-eQT3!CArcbv`Ui0$#XGd>3rt1!;t`D;F`u95ZYwO&R>B$;-K!;Ix4+Z*_|7=s= z&#vqDVRJ9_%sG5Z?%q6o?BVS%zW3`>cqC}n&2G+>H`v}lbU*d;iF>Pg z^dJYX3d8*h+*Pxaqar(dZq2>E^}?urUd=zw>whKE$7ZkPfIF`n4Y-zEDWuk|{$0*& z636u0nsF|8X#bB*n)`km_4w?g=i3f#?&^FaAh7=3Iv?+yx1PCXM4Xb{C9T+-s52d3=FKC+x~F)^U=i0`$j_+?M- zz|3)1L2m-&)CrC|`(_qyXhx()EdmIgbde6=>M0J}+M%IE0I89#N>}&Pc}yyJV~Mrc zT58lHfB^bO&qb6tGz2ch#t14--BZ6;yoP2JY7szy_`;3w;)ceX1#3;r(Ll%TqG=5- z6JWVf6EMMU@ynj1%|fkZQ0E6BF)t_)5M!4KZiOjHz6ZM^A{1|Cvj9E_ZA%D71(#lQ z$63GLy4YSztft{MF#$1y?vj_d)qphzYe)#ibmc<5lo5msQgL7mHNvc|ieE1jtQoif z@Ujl+5k?iio5zLUh)UR3;YA(xg}Zs>Rk01nQAF&D5Q zg;4TxLpT6sPJ%uWgiwU#RzTQHkWU7Pylw+g5aC=gSC@*^ zzs!mO@B_ji663tw3U_F{RVc|#>Jtb+IKyHWsef^ro6yt-Fn9*)q7Eg_a+6L5|Lzh| z|01Xksi_Tmq_D(8iPPMKkd(=He{WJPIiU26h%yC@aE;>KNWX0K!@%S{Sd`2{yN zG3Z~sSyJ>S5TOAPYGhjCoB=RM?3apK)s#St-navd5UHsR>gibmH4pSbxaBNQ+{u;WqZgf;u0y`us8TULx?_Vf&8yKWP6?0f8sbVF*EPgt!&2v` z1+Jl)3KTus07HJ7VMJ%cip@_$V?W;R>8=Q1w-O5-SUDo>M8&P%(coBeh#7fT!Pb*t zCn|pVjz|o4gakWL@vC=0Jd}|T7KQ?1Y$EJL#eZ&xI5gy6*|3x3stuUDI`PBk86}c~ zpu72`xAB}6!pn<_=qjl82)rWxy(bu$4FqPE7bSyG7FlkdQ ze#&fQ4YWf6*PAeKu@a@_8hX;81fP&=eqw{ewYEDVfNIE|H@{q`=bI%I&?b)TdGpJ4 zBw|_tU1^A(H@{p*qK584WbMt)t7Buyoi)>N4;sK}Xp*VL^%AyoLZXH!i}doZihu2i z$TtL88e-~>fA5J%4KIBX8aAo;l`$?YaHm<&Bj!&+@U+j?J4TfHZa410z0sr*T+`IRyvG35M6uYRa`g)*9GVq}o? zQxh&wsrjWc;?R&|CEW}_e~|0fz_Ah_8{vL1@n!%NV}#V$gJG#6=vzd*8KCAAs8CR< zJJD?YD+4Lh5EQVQ-@;8#Z7}K3G!!hOFdRlcnqbl_wwdmr3~E@Q&~mA=B?@96NRQ4fc!h7r{G@>g3hSjO^(910VLuRacA4@mf7TJvaSw zuWnBgF1Wm3V*jk&&=zU(NUO5mR?dFQ*A{-w*!|3=O7MnqEml5G>tFNT>uYgaLIzZe zNHC32{qUh$sAtub-9G8)n(knuUThL@X{U{3SKEeD3cNZkyi=fA*X zMw5NkUY>9;beheTC3Px1wep5PO{HJ8j@68)22;=N`` zdiep~9qbn#SND4TLo&z4`uMjet9Le7_UwY=vq~*HDh6iM8*yn8{?PXWsVfw>`_wgxXhQ zeAJnr^5FYnd#5isxXbtQ?yoy9rC9WxH&!(3ubpn5Rd%hmYSFF#ouBLWUrIjpc}p)# zql>-0<2qh#yM6enle0%;xAtqJ3Hj#spnHR5%XjZQU+A~EML&;;Hb=fxdQ#(q{oYiU zL?7S3bFxKMYP!&FzZ%uO?w4bc;c_|b^sa)W`ps)y3c5e|KtZE`>Z(y~50C0q<#}kM zk&halyFX^UywCEWn6LgxeK!8y+*o5@tCh|8N&YTZg2&vC-%!4H=KJO=>K`0Z=9@>i z#$z0*#i?x$Hfi-DsjbVE`-y`hlPiCF)%aVLHb<+fSJ$X_;n!GaO_z@`bhU)zgWnuk zYrCtO&+(@_7Jg70xB2V$R>u^}a}Bos^i6S2e6jRr)0-wI&0^%oYsAM6xo>?{F{Np? zU$A?~wG#4>n&9IefO&faK@f z=et(#)8z3;%Zn|Ptu}9ebK>{n`}L;>U#E|qihp!r|NF+dxx3ch3EFa})pMm=wT$S< zE;e(i-|8f89tQPC%6fJ&4-FQsYU@ck1j?fT+B^3Ry8)iDwC7FJm` zepy7X#QFpKI$X4Vyv?b?krkHfyA+J`a9y2v;+)rT50eRrGXv<{-JR1{*RC}6Qd84% zV&z=ld#8FZ5|r&oBGk~-Bg zwn?_iTh)KL`NN`uN5^KA8(Q^J zhUudwkH@}hccACy)4%ev_8v@mzqQxf)*WANZ@9JfxTkp!zj^kr^}+K&Q1i@if4a&Q z*IT3S$_C&39G3F6Z0iqx4XW%2%|4Rm|C4?mu%rD^S>2oQ78~Qef47z#IQr?2f1i=x zQFSPJQ8VMJG^hGc%mIKJMS7ZzEm32@!GFjBs3G>mwnUFDQDa6*l>^}C%ebW2Y8Qnq zQS(6qG=UhQ+Xbyqpc4u|XY~(A)%>ffI$D~!YJ-_p0@PXpgYZ34w%tXpu#T2Z3T_>W zg88IsK30KG3+)j^@QO5qrvx9I=TP!#5h>(5NY62=`Dg(Gtqe8!rb)FKo=-=jMW}Q_ z*r4VE4M?=;F0u{?!!8u?5yK_X8p@q!%z@Cxw59ZouxkYEv#}FYq;CXCf7EXu`?Tz) z)WzLi<6LrskXMaCCvdi0!JkxP3<>^5AyRk7pb+#OH?s(%YTe3G75~+;WEWc_3u8#x zYLIi~K!@Z~H70!BQEhU~`IDAe+q>I*y1BPY#;U;dlXj9l6WoHD_O|YpVq;tI<;7Tg z_uU)McDWhUEAji7=r&byTFI(xFKcxuwXkKXRm#amZkX1oNL%PSM4y#=||BUSzr`A=dwd!i|))z;|df6XOsQPaE35&ZAhd-F( zm;FRFsDGV@@4L5k+*+~Tz)X5@FF(nUq`mdO4Xt@#!q4~$7b1LbZ8&h}UVhAe(|Z#q zpMCI3y~KR3P1={jDNdm^R(yOnti^0;m3eQUuDU+ReM80%$$_o$L45+9kMw-Kylmi& z*|Xdy&wRNi=9eh`{9K#p-Va}1ZP6y;){)#{12?{3*m33P`;U6Oc5ItD=UlmQ1D^TM zr~P&)DL>BL zaLPYX$KLvGxdDx-I_|r>UGQ~(b!gzIzN5vMq|eB)zkk)4Y3h3LLTGI2)|*RP@2)4hQln?X))(Fk zdwBi(&xZG&hl?cj*Bi}iLO**Lx~guTv46MA6W!*j`?+kI;?RD4o4gUJHiy@E{7z_6 zu1?~wI&00{r+zEf!hhGzf@|%&SD0kHc;4!<7k8h?k4qn7ZT+NEb~BqaEA^qf)T)o) zljhw{O&EPN?sfj*2I)3U;(f}x)qAma@kYN2U)=pC1qas7da>^BvUM6KENOgv?FM?_ zlziXH$(y8$|2nyINsOcSkffQzq=`FgH;U?2cG88_b;{?hnrZjrLr=p9z0?@pZ<_hjY$=mS@LdhEAfJR}{*-(sSD`G`>`UzV%3p-Xn7)G>X;+zBOUIoSZ^PB*#6V%$9vx|%da(H z`PO}b7Jg&O|J*EARouCLLC1Nw!u>o)YT{>w*4}(*`&`!x)#o(-6PGx0ZS8V5-`boW zaB-KX&Ce+~vPukM6b4x`N$@`^^p60t8vwN-RFd{kCW5MXQmuuhc(S>g7|Mhcd zjqQmOuA0AF@V(k3=a-8vg@i1W^$^Q{jj}PDwcuI7!m%lK-;-u0<?fY(!>6um5K3+{y6FyCzH_XmueZq`I_8r0}KVPv} zdUbk-g<)^xrn%Cy{yzgOTE1=lws#(#F=@xm+R`@tCgiD(=AYklGkE>u?w@wsIWBI| zd8x~ZuX*&++vPh?uNOEqCcwW^%?DS%)Vq6VL;jFYUuWKr?U(eS$!n^PSmjhd`Rm1J zBfS^@PD}O-FF2AMJ9zkEr||K&w;w2cvGw;+(F5PVS8GnscY9rT|BDYDPsQG@SGDTH z%ELVVQW<&0-kKfLQaRsG_OjZk^$)I{Xj}12{Ga9i4c~jet-BzLo)-V@!}NL|sEw;8 zJNwU42etmQe6`7y4}12{urJ?LzIW5D<#&%{ELkeuzw}eRjOcfcXBI!sc02PSJKFPF z(Az~(qwl=gQugT8fX1UQI=p4;fguL9cgN(t>N_{nxYDRz2` zpjGqxX7Gu@>y<%wN!0R~?``vMh7d`iNeN8=_MkRx|1`T+s^l8yY7>)O3)Z@mtb`i4 zh7`DlD8nak28(h*OXnHNDSVr{j8dBHz2DfLj_iFQIIC@?LoXa+yH^==_`PRv4Ht*L zMm@qdO)T4NQlo-q#{FL38hfr?xule+Jt@2Vf+lOKwd^>r5}dgg&RxW=*ZY;rIaa5%xYW;{lm6en-K#)nro>S;n`1G_*Nv+}2Kq9yT8;5H(t? z=4>hs>ynlhAIK88sJ@zKIn0Rp7L?ooP z0h8j4&|todf}=s5C8#4#S})}o^Qc>-`hBg{=|^{93PMc=8fG3$910XviAzKkOu4_w(H*0Y zI7TPne*s%xIbA^8+wQ`Lc0T_kH-su|-^l&!xq_;(Xq*Q9OO(J~&yXK{Dj4I(itvJz zv{5uV1l10#OCOjT>!WOs7ha9K)CBMHnv?bJe%>FQudYtGfQ_9_?!6^&fAS)-{A&Vt z!*KX_0(Zmy`2U2!{o+IXi@@D9rHwXSWdl8#m&=hWHK3;ol*C!~gi-hB%9uwY80-1Gy$S?+x$f zQ*vJ5h7a@U-xL|#M*dndZrgN|6NN?G#@@)-UK7H7$*RpF!y?Nf0e-NNvuQ)Fc?=!N zHQ7M}Fr46{5GZc~K1yWXetkjxTMESst5NTd;@$f`T`A#v*3u zXl7&0qRgW5R2K51H+6Khb>L@VF)?#AbuwT!w6S7wG<*>J6!^ee6fSCBM^HS zJmB#d)Q$}P=l-WY{o5{C>6=+P+VF!-Wd^-QX4aum5?tj#i z!+V1+|Ixf)`-dk*&A;dUdEEsve6oVq1pl}qK^_YK0vP1(=x-I@WQJ%|-~->_{yFa- z%(?&7goH5s{?9}Z{&w&1x5uBqFHaogygwg|{?$}P{;kNpGFl7<1>pt5n`Z&}sI%v> zEDuHKF8C@JwyEHcjV5=j>H}XVtg3ZyaWL(l89uHjA2RAOMCE(OLsl%XnQEu=IE6Hm zv|%>n&G{s3CYI_e-)L3D>o|Q8NhNtDCcTo5W5@Y{@Qu#tbwsRWot~d_|IZ7ne>3+X zFOB~&_aRrH|MA@Cz2QXtgT)>NVj=n;?oe+ybpJ!F`eVCsbE){Zyg#w(-yqdLFw_Dd zRzV=}tKwU%`Zt%TynnJF|5sS`pCQ%lBlq9+JpFsD`r}FQUm?-rp?3;G;Q6VYPo% z3sKL1J9BR=>VRfP{)qZDsWm|{Y&K>AkZS)TkiU6%H6iM$IsSBI-hF?jgr_1I zM4Kxw{l#Yj=YjRL6K|P3s-{M3G1I^Y)f(+xI$viYwe=?g%5xk}Zct=R92fAwmvwyC zolAa0grjE3WnbOFEwXq>vq5>4sAxtw)F{6e@MH#gA^yF#faV#%6@~+a<%zzPF?dDE z$98*7DzEQoZ{|v_2{As!e#5u`QmViFAR&hoBQ9=w@|uuyL{n z7nhrNXhm?HQ8osbyPxJD09h-26Jv4mn;~M6GP8GZlrYt|C+FivVR@|o$A_Akk)x>t zIqxquKa$plHsC^F0*3sY>5zPo;vtD{w$*>GW4|R_G;jH2e~lA>a-09}i}tU=L38tF zFJ2hi8(Tx#ugS;Fq7PZN{=}v~*GDiCtoxSA{E_B2v$7_{U^^EG8qodO0FWmWq89ik z;<2$pxJ5t+LjL_~BADPeWG8AVV;i15}U$f}R&*9Pww0n^GYLCm;p-CzbJjvHc9_hw5C4k!d7e_-VeeZ~Zz83jQe z)?WmgGfJ-tjuGHs8{^=5%Bsi;FK);IZ|LBIBT*>MYzPaF$;l1#i29p7-%I=TclYs$ zY}a2wNmd^Tx#P+O$SGGJCBVevqE;VizrIGh zxV|R)aD9F4bqRVztFAy7jK97XY1136c(V=rMP$h#H(56!e^BtBJnw%}QAjpa2%Xjhb$x)VxOP-iD9CVq3xr>V{R71Y zD`wFLoxjoSzdi3lV!;;t6Vd(+=>LKqf_tI=C4%`sD+glv_W#QU0RJyn{?~;4t;0+c zG@JpF9nf$TNa29nf8Z@57sc1d0Do zet$OL)_>bxP>DGJHXi)lEy;B^8>{lQBF?q90}sAd6N1Hg2Uy)0y< z{i~-Cg|&R(LE<+4wvyYtw|-D+7Lwxz^0(!KSF2!!;P2<&<<}=fzYH6w$O$qOkS_kC z@2~IM(tZxeP06=@4v>8nT)`k9x(U6_@iX*hp9Bd3HDCW6j+;b(B?nD(La+cLI{~^k zYtzlh+!l5ld)tLu|E+sd^&dF*>)@fuaf5Rl5Iei%5INCbKTuuZUmyR=9(RAUh;*z5NMn$kNUSF-HozApYJC1Ro~=X5xbg zmymPcbd?QMstxuSk_Oy2Lh?hDNB#8kg8MIU%K$Po^N~Z?u6b`z;kITrwj1#LY{pGv zKutmr5Z?3|a%u6)59#KwZUHv{0XN*YrQWXdKmFhcu#t0sBBr+>yAAyXiJK;an;&ql z+*AMxAAm^vGbdQVtq)XL45r|`+1PM`T*chr%!O=Ze#ZikuH1m@HtDVVbN9saYnu)3 zvVY4lY5swF5ajv~ez!UPbpQW8|NcPX-)C3$8#O7QOb)me`k%XyQhxnFNlE}x97Ijd zPZtaVLm-0vpms7a6jW*ip-m8#nBZ;<_Mbq4gx+-bCX5TDjl4JC5QaKP9B8o!gykRL{(abi(9#=v3SQ)b zRQ1N?0A_mAA=ntA}L2O$9M%#RYa8;@+nCD-L3Y{5I7;H|w85fPdSA z+oV4m^|RlQrrq@6<`f6os)H=rV0E{>4-)_dzh6e#?L0$9W3K`Mc zfw{?dGp;wjoA?{0s35t6q`e)ezv6CT1lkH>Mgo^tNOJ9{YXewPY<6~5o?oXKP^uOb z8{~@G4~4;n;{z2!g{P3x0q?)V+8W=PK|py&GCN;lHT%hGb|;!-_EUK9c*(FV|EJF- zHUsf7>l_Q$YM(W8W;6yjzqLP4e~Z#n?oE3vm1%J7%v}E75mgIHUxNZo3IPfhmV*Qq z7MqhHCm^-6S+FF5xlmd=~ z`fxrn8nmX*BkeHBM!<&U#@83-FeicRq60${M+;+X$+FOlc##9Z{fO;;tvR%W$IwYI zM2`%W1->cVQxm{erfV{B_AE_D6`gM$+p#f>X+$%Hy0%953=Q6IT)Nu6R3m>>3-A#U z63x!?ct7VyMwdg_az?m4N+1Z)cnQC5%Yn3FwjPRU&lLevm zYauNQfmbd9yVv9#j|8yG8cn0C_=oalH27;`FJq#fr{pb zc`Wq)!P>Q4^71;Mcg8~VMR!>Ny{kLr zgCeWfglzSxkso}^k-j%FT&poq8|^~xWf~j94zZW8L*Wxl1L{y)Nf-^+MAFSe2MbOY zt!g6!eWXpNF4alyXA0fc*YnT;02va^B4F4(4Oka4crFj7Zn74$;{#W$SAfnBp!(u^ z_MkEKqLKORx@<{pn;*OD$^f{)dX|I{4aai(KooAL}U7 zv(Xp23F(2r(zgdlGcmIll|hjM29czhv?!6x9e6-d?}Gh!BYJa;yK;yi58}_T>EOYhJ4BQRiO=K@5P0n zG`4aGV8!N{I5053G77&ZJ8)0$#V*|Cm)9mOadW1RKT{XleI4ZmhtKIzNa1HH;; zZ-fsSuEmm0pIs#nzRm?Oi9B_-8~qMBYL~z~pVz=V))%^MXE_|7Do=?=0BWE=VE!u^ z@BvHI=B)FIV{pOZKo>T1kWwVeWX*CPBTIqs1rRU%ppWVE71jz%MSb3=2(hqy-!-&I z&J}X!f$Vt8XmiU^l8Q$U6BxExdWLvm>G@q`k?v6(&@_lQb>)?`i*qItsv)AiEzEO7 zb~cDUb`<+3Os~tJe}& zN&v#e==R_b)cQc5@O2TlQ;qt-+Dot<$W>Rc9`-Khh!;!?mt?KyM_1D9nS*gQy}R!_nauqDvzm2BmT1A5kg8Aj}sY)(3ed`~VelSE>j#ecdz&SYl5mqM!YGv46bS}-V z*uaU>(N1?iIZ~c*wZb5nTZ#*KPFH+HXV#!}3`0A7@7{Ak8OE>oG2SM*{5b5Y9wmc& zx<5A5V8YhdKL1?vaf!kmolO21)auWpU6Wn9u*;0*#ibdZ;y;=UZ(Wdd!@ZBA#Vy)+(`&6upI4Z-gkJOx`_QK)4 zOokOZQ}PV|mt61cL3-gh(|D}q0rZ2`!A4`3B(=RFMji5`lK41AN!hlhwE^jo41tr) z!NCa$sF9(+MOTVl^q-TBtMx(#%7tQE3l_)BIey#mH z@!|-fkY>Ax+zxk_Ik5Q6{b`QIA8dIq(L1p=S+#BN8haNQ&scth>ybA5HK4K|Ks&j8l7}x1t zb111;%JMo!*i461-lL!|^LsC7*le1VHJ2K)E~8eAZ`aji@@41(4EHC7sr6eYGSQ#m z22qom2SxTriKKbPStnz^{2ZC{Ij3o?I&B8e^~ivh43jFAYLE*FnPhBHsH$r z)Kz>`fbi>`05&rgZ-5M*aS5e7Vm6FJ(A#E)HS0_2d2?Un4{K6Qdi(x}!)KIXmbUz3 zR56s>81IVSeZ?{gT`x64+me^Dl3`$e9>=1`|HSo5IKR6zqagobkZw+m1(w_1fa(+1 zjnu3#NrN;ZGkzoMzWnU)<-v}cTDK0bT?Gf}GJiq*GcqPWvHJjzb_KlZ>&lQwf4n!z z((=?_By*BYp;UzsYY^X9JGwKIT758GQH(;KNOh0phOeM$pw)LQ&wR@IE~wR|#jYFk zilz>3Wu$hkpVC&$Qki!_Lo9-vE=yXea`IR zQKgI^=kic#IS(lb#z(h8h?Z8!eCy1I#6Qkog=uyj)8+x$c+^_agC9BGCmCp}QVs`* zm{AM1!mmU6tFzpei7<2T!Uxo(p5oD%!{(kn(M@FTRkPaWrNbXhGHWG0KGYfNsldV( z^~@VUT=Hll1!~kwT1DA0dJ13dxPF8q8?rpK(00Ga>#8cQf?4{tb~=vlL4%;C(;YQz z%^|Gv;=)P=iyY_$@xEm!suP$nbmy0{-!n{*Sj3;))f_H}2#0UW`$FYyyxz=>39Z*D z=1&*qUTT&uP!|uo-|WDbBd6a0{Ma;mliDSk$iS7mT>v0CjQ9Ex#OvRCaS@ECELkv6 zTZXrxq`S<{EXVS=b{3~y%GA{ak(mo`_an{o9e%jt$#df1`Hs%XR*P88p8RNDi8!%= zMZVgXI>9kSk6zQk=b-C(&S_zE>QBBz7IUsPD9~s%2$o%@@w;Rj_y3+pf|`b!0t`!Q zG8on-hHwFj>9M`l0iOnONA9PRR=O?ucE2@(gNE3QskCNHfk={O&29> znIzHjYy8V{zf$dH>>R%4Pt6|`bd{>}A4>~<;dA$OMwJOviwhn$N}GJOO>I@d{KGYF z1^!Sd?afd^bgs1{>BZjr&5v~E*QK)rJZBOUuZ6~ehJsEKpLGe`9UGm5loI}ytRHn` z;t%+wh@m;G$_Q-(*GpHNwB?7#yBg(OK0HVvF{m6#rGJ;e+^c_haXdj_!>)H0)nF{T zXL}wuG`7)ShPxYQJW7AW|M=sn*0{P0qg{C!&%*MdM$20O*(Qeve(gIP&kN(;e%wVA z$1x3ZfXtX^%>0hOkCV+%*N3ZemG=G(L2}YH0lsQzzWk04~L?V#Se_zNBb+ou= z`a`nOCp{*|-ms)jx}Ec@9)m}Td9AD~y7l{z3xjzqDZRuRv&IqxX_tk>cEdWy5&>j|=#j~#5EU1KZv@CG->d_@tZ4Za zTM9mD?-q6Ur{`C*NcZCejoT3_nY`VOOOh{EU`!N)KA6*fubzn$>sL3jj;GFsAsCz( zxm*eF$Is792ftuny!K!qc$@sFFW~E^MZyMqP@)5`;us|KA(1aA)y%QD*NKMs3#OQW zG@xe77Vaw6Kc?(m?cCLU_62yn$5QxHuhCAcdEHzp zZToq$McnqnSAdwKPsv3=fed-<^=`PLiU{CH8kdON>N0I1xW}oUyaSbf=i7M3CtXdX zv$6zO7Uesy4V0B&b3(0=1N75Wk*arPrpS>8xuz{m)A>4}liMU)J^Jlfb3(ryATHV_ zXOcT$?dyN_?d^F_(3mCP3Wa!Sz*=ZK;1>BXx|5C~QGUmcQ?_5sL$O7z9oa)bP68P~ zNZ{nPQGF;j)=Q-_GQnmWkdKe0VHhTctNNuVHDywYG2$Ll1=7ohY$-vn`*%7wtyzL* zg{ko!ndtnV!5j`;sQ9;96-Y6YdJ zr2>1;*Anv0?g#Hv4>1!pNqcC{XVRWW0$a8DRMjCQI}bky9SizW7ze|~eXi|yDrRg6 z@z)kcknv3Jx(Esyla8|Y?IcV~fwK^8JeyNlMQb)wY%THe-Fskeq9=)}@%HiR=G%~~ z7J<*EDmvbAOWlzN9*jJ-jO%Z?c-9J0^FMrO_6c+fWr;Ao78ZB#d{XuH?%WV{s5)@g zU5#L%9X%NP?IHHSEpV%&eqgwJz^cbAIVQW=Hx6J{h1ypMlv?FOCDwrFH_Z~Y>zOyqDepgJ=t`mxSmSbMd3ue zlk*b#sinZIzcWET>hdyts=Ec*fD7)_g2jiGQv)nnwAXbBev^&7h0iHvm+kH4kJGyR z2#{WElZ9((Rm830($VQWRC$MN$A;MHgv7lZuQVqqVojQ79yK^MbALR_Ku=r=z~M_? z93XnBCo5#x1!E_da?d6Yi{;`ile24OTPzB1Iz9t1eeV*>Pt;h&zLy_XiMK7lfm5KboA7hEdtJrFkTFEQi|8JOZS1QNt7V+w3d z45mf3P}aFpcxo{BM>F%?y;)5dfPNEUH_dx=u&FK|?rhLW%5-S17VbF83VOmmS%C@e zaOCCp5)yOY_~8`QFDj9Wc;L&JScpPzl+3}X@VSC=Y$gbI(Vvmu^W5!vXQkToF#O<4 zP&Rb2n-g6^2zx!zSZ$%Xg-DbKbame|I3v`sjYk9@>R+vWtZMgZfAj3x_9akB$aMS= z>Z8d5z=i)-J+aJ%n)%HlUuJ2`Rh+crcl&SklWgLj6{>O;yH&9_eSZu&Mh(0@A~^Q+ z+D&`=3OnQ5?2ldQSCeka;fKN^uo*I(=8ta+{rP>w20nlxuW;9YA`M3#OOck)F<{dIE=BAt}Y;V85G zTRObM>RpBXcEp-Z6xaY?gbF|SxVx-}y+kbEFy%=kXHPIi-6D(_lN%ZkWv=g%?`z;G z6+H=wZOl;nU~!Sk6W;f@o!q_ho~z*AC+?$!5f{>OsSWjsc+=pw-($W!ZvdSp@eAD3r+7zZpKE9y%f3s_7jF!EOyCg|ieI(RP|u#REr1Y9?d5Ctsil>r(Qo&? zXN#ds>w@l&qX0yW`5~$4z148~g1xVgR8fbaV0~@fjuUOz++KckFp8&-%fWK_@UHb^ zI=qme;EsTC-Nc2ga&q3TDvSy!e_J*2W9^E`$6(haWuW01p^b=#Y?S)P%msXbwX^dK zhrJ_|t&Z;*Y?V0AE4Dd|-?`JsBdi)l#nn*m9|VqW?gqjwm3=&=psMUWT_muZnRWCX{Ub=k!!^VY= zX=~|-_wBo1Pm#3F-D_JY_AnOy_Q5hovae^w<=U;XB*D*3Gd)i&0-4n9Nn3T<(ALCD--7^Y<|9 z<-U&Uw=9R4vX2ad(ptC0&6jbmG$UW(&%6rD*zgvFDUhy>sdKXYaZy3vxhg6%Ol`|( zxV)0pb?Sv`Kfs>v(krUmxz7&AQy5xa(qtL9dS*RHKE#fA+@4xd07$@lghj}YyzL{L zRNm3AoqUnx==z3?Vl?PjLr3VP-D z0aJQ6;*s}eEQ!xnk7T1@jqh)%(Dgv6lRkQ8l^06=#f!&@XWf84KXlw211*Tc08{oH z^O!z*YW|!n-N!1LodNhlQmABZe36(O%!1=NMupfqBF~yyhGn8%IyN&-@|kHf?$Bd} zHs;Y_8QP^wUgth%Mh0GDuXfX}|0j4Ey0hJn?)WjQnC=#duC+uXKAfg@m&e)pJ$G%} zMyiqUXN-y;sYD}IcDyNmslM1){gPdN1_`s-gVS;c6`47lO!*67kL2pc$e2_UOrcFH zZ{b@1ZHknI;}z3qDRnvQj%Nb3QvKA?54o5R`SnpIE%p|s91&;~vQP8kTnmdzJhgj?t^-5>nHXrskO~C$tjKT^g%@1)F3q>&8Ry z0Xl+Y{+>q*H`Kj!pncNRIy%bxz%Ejx?=cMKWISy@(wi!jsG+&atwm(jDy*3>=uQ~# z!4XA*i`9}#J^TIO6uKNeCQ&qEzX;fcX90962ti(Mp_9EM5fQVQ8J)D%PYN_pY!oLW zD3o7ERmZ%1s;bZt`|`3Ra%H83EfQ<2IN?4&b$Gb6WB>)dFo;-5!PCiZw|4wq z&e+$+rC!zAe5Mh4-Iz^@jZN-vY;PY<#1938m@x^uagizoo>Pmi#;w!wt_K8k7FiSW z7rtnZ?ff_+{$P!}cLvuZUA#tV%%5|J=W}5fz6#|jne>C0EiLBzDh@>fCI^Q^a+iwA zVpASJ#sr=hT%7>cI;NYIAN7Zl+i~2>g|K(9;f24{)6pBp=Vl+N!)=m2!WM!L#{Y>A$a<#+PQ`Vq4p844>7d%s`vlMX}{xtmv2HBjYx^|m8-|HyG`4k?ty*Cq&<43KG>Objm$Ew1Wv zkqu%&#lx4*-Kj`efE0Fo!Xc zTVjOI=4NUdUA?bz&8Ieo<&Qq*0t6z*(%6GzJm-O*-PBu`k0-6 zGfGWgX^k~#+kD%}Vz|FZEbveye|HfsG1|aHny30xIbciNO2KNwmtJR2?$0|yjqVgK zR7hpY(c3a_EdUVMYNSiY6s}pQc&!N6$+(({VXjI&8o|ZNaWPg$^rC;OP5<=u`095Q zSF-!6U0Gpxs!orK2Vmt;W@r+nRz%9J^WJ!+MflVR16Z9ZEk#7CQE#cppN<$cGO7T( z>T$5KB7g>Qu0T-L;|1enyl8VRMU5zBg4M=$Kj!E4NSs?Aa*y_oEWR`m+Bumr?|E5# zGpWySJtH5^bo2=4Sn8$?E=ZW>S1pLRlx=2%eV1fSJ(K3j=v8+OKkQSu@O~Tf+>-73 z9pgqDf&)BWk$#F!Z6g_F=3e2>Y`=~M6!a)DLMT8&U2HpD=y6gQjnla`8&c`7M7uki zc-PACA$3QxX}LZM_*iDJ>)3|%!4(L|qQZ`2`@r8ieg8;JO# zi_Hy8A?BO3U_vVuPwBK$CEFFvZyhpt7X)~qDTyp22s99-XLb&<C2+E6=h2bcYTqfipG!RnKdyrvs<{l$^srca4XI@Oh`tG8*ekX2ZHsYp6Tc?Y6N; z1u`FXRvaevebmkF4h3gQtghl(0J0YclgF~|q50b?U0jtd-=gUjDH3dw6 zKwHMAc_6laKzWKQBHR;O=t>v`$AiSSBHGuwv0c2ERG$7}V<7BPczpu~g=cgpa2PT0 z3c~J>pvG8SU$E>4D#h`%#>`YGFIAlv@vSmS%*&mnqKrOApIF;1 zV|c{<$%B~KJ#9|AHr-Y5nQ-u-Q3b)$w8$2Y?tObH8;yvd4=Ki46cVD##*Ck|HpWIn zp1xusP0EE?epdgc0#(ZI{>L}uol>~h_7$UzE6)okbPEcC3hoCyp)i0(}+*k6cT)m}BmkObER+RT37Dea7B~OuN+LU+PlH2w zWt_wuC26>5oQTztLUZlZC<#Tdc24!fRArn)p)s|{n)1VsK6>K9aRWJH6a8>@BVV_!U2q%u5;cC1OVgUwbX->rM98~WV~#;LQ%SmfYX zA=NNlRce}8c|CD_;VlM_o|}QqC8am)=XJEg>Xx$BCj(DpRJ}vP+DPQZ{TesqIv=ZY>yxLd54A)C% zMadV!|U2mv=j_v&Wb`6!VtLx2{yIY%lH% zK2XO^IKL{4_;8=WPTf@8mB)}_;amOiEBIFH4mrAkD)o9e?g9pp5{J(LM0cyDi;lz;zQ10Ox%il>VsnUtjpPT?`FM%Ms0@z057qWDtHo^ z@IutjnfwzZz809DPHGpJ;Lt6e+)uh&^5MSWU3(-NWuD@1Qs-02&uwOybGqwDUb{pN zEb$OB<1=~|>Y683nX@2A8yG2Zzba1hjNCTL#&NEG0z+sN?0n3tT!Cm(mHV|+0pkgg zuhskZxZ(ZUFWxihpR)FwHR^yLL$B65cUlop#n?vFR+$Rr+_Vq$rNSSyzDnzxi}gV1 zFKS|9Vy&KjIOz-%ZP+S@bVXNSUEcMe*Ds(N>m%TVfkJ`mJiVLgOWm#ZAp-5D( z0p^@P=S#!=m|%uFi&xTWGzn478fE)SL~av3eJE7<&m9a~9UBGAO8iX$tD3KI|I8nvOo3sJ(xT2XA?Mq_&@0Wf3eCs8g`567k&HRt zl{1hjEOA+7;F9oBHJkT-m{vXpA>PZy;_tj6#R5ZXenVSz*;^!!M2?Ou1~5=~pluQB zOr5dqb%7_HGqqnR1U>iA0F_YI0|a`Cug)qYtvOUQQ;+$*Mtcx5WSp66Nh~6JRB?;3 z1lDaL2SA5q_m}XAUaqf6+3$%t9~O27DM%zwI})-?(?6Nvl`}*ueN*~I zmLV{j-Ucz%Wspx(Iz5AJ&9LS4BT-QDTwgXVRjaEE_93Yd=>Q+_V?&CpEF+%{QyVS` z`gIP~o0%pg%KYGHCAjjmefCN;)eZ4J)tRJ&ar9-9;rHk-D+9=BAHJ8WCuAV$pzdd%{CRK2TNS{Y}WHgIDG_yYppgd8{&%!cE2g_ z=M$|=1aH*jj-9?d0&w}aGj%=BRQM=Ausc1rC+}m=kVirT`XYtB{kh*^D!;K(Efd8g z9n8x;Xp0KFgUo3?JcEtnocubVwXk0;b>n;e4x4ttIOX`^mUz0Of6{~38%^9x{ls$R zdeG3xNE}q);|Rtu$MTDO@}UxQ60hh3ar1Q*1f^4U<~x+ZXn?MFt3_LHQT$w2dAFuR zUXJGhY0Qze=(6l9J!OJ`DA7o3Ti$V~g0aU!B9i3kc2PBVXiy2KQX^cIWH#q753qVl zomSx7R7@cTOmdBXaPA7+Zbe=DSD5QV`(3*Gb;@dY)Bf|GE`^yK_}knr6FI%>`p zc$QYoxkb)ku5JJ(Jel@!pee@ZHs)bx8-!i*N#6elsgU=-$R{5r}5QuU1UTF{~%+4kgOA{E@BrehT3m9xA< ziAkvGX*!Erp>ZLG%JM+njJ|k}aYJ5oB*TA@OT4Z2y;BGfkjs5i_j|H~B*Fn2yZd3b)sp)H5~6GTkmhS=AvfPx>QhTn;MphJH41p z%?}})NIY|bmglOtM3OGB!qOc4QY9VSptX6blHe$3+VB~Ta}wbkr}5v|uropJSH zaw6Zdmy_7X;*Vjl=c?izvNS0#6zRI$ip9ry9+l^s9|A1FQ>DJ@F(fk~!#gK-&pwc~ zA#gq;k6&5bq)jJ}g?THgK#(gLREd%D%ElJD0E4xLF)@EiVBD360)633#;5}G_-z4A z`ly1`#!D-b1BPZEB18Cl;y|Zi+qv?OdV!Pe{rxv%xX}lvM?5+00j+nPmX;|fzYU3H zWOJU1)vp37eo$HEt7&1S|^m2MLWZ*hJ7kMp&R%0v}xv+ZsJp9!shsema4T zoYx|<4WV!FGG41$a=d9(9l{rKD)dI`)aH4+v4ajp`zTbrJ8Bkp&c#1(wFSR%PHSkO zD0UOn7&<&WlIO}JK72A3pU_0iAm+m^`HZ%{m9vD+B4r*H*Uz{&!z}t*f_!?hCbWdZ+%cV^&V`#(n$NtgSQ4m612yBh3zW477vT(8F?EW&{=B~K-=2JLH zmb&s#klH63%!hs!1SxNDhWilO=-gBSj`4(rz=z7#8>?CQW(LcMPM^VIHX5|oRgMFbf$o_%Gs3hM9gMXy&%joPr zrz4OS?qh?XA7*FcZNC~#RD8LJ|GM=_$llI{d=hLXle+(oxlr}B5kZyHGdg@7>b(!p zDADX#!>!R2Qj=koIqx3=)e(;}y)D`k-JWq2Q=y;}iZr-IEz;+BW99jNuzWbDm1Nk7 z?{pPmB!1e$r?ljvg6udX3O%mWamq=kZBzmfzp|aE;g7KK6{$#TMZ?k5Y#LWM>Aq(v zeW_Z7hFr5kbj&HyYj&`Rm@*x*>p^jNSeT!sXG8i3#{@o$a;kn_;tOm`C2CgF!c$Od zuiTO|-hnn;>7r7wo?k}dR?9PsC!=RnERH~zLQ1u?$Cg>q7l&yqM4fF%X1r9Gqwmqc zx%y62_POXfU9>fNi$bJ_#kl#Rn@UgjidFkd^fu1(8ARTs35zb~9z*_VAwKGK(XBBg zo3&V~{ZPdhc?gx2<&x5KVP+mg$BQ{#9rSe`!Ni%8(3w5^Dgji~C9S@*gNDTj7U{Y^ z=%Mu;r#r(sftRkepq{;nyWP%>IfQ0_d>wbzTh(s6RM%re$CA>9h$^kuP&;dA^fCzT z90lz@CTFkAIePnJc#zrXHI7M{kV%dT2XkhSWA=p}S)lMfW~eCC%B4w5w(3mxkIX$# zQJ3K-bHMQ8yD~%{UDhF6@11kXuJ@hv-}*9qxw;Q!-TX;&Gnpt8mL8A2rz?3J$Qzlh zL`QMZzDN=~zi6wvdsY0*?Z@glN^y_;rPA8@&=-)lILaSGL(3$DKl&Ql(jDK zv(>5f`-`=r@NqT>8jUOJgza}32T-a8ge1A&aq!^SkWjDDI~N>?cdYan*1-8St>HMj z!NHYEk46U6p{ee7N=qJzMW-cM0f7N)>zXxs}>TC|%0+7QD5} zo#G7H2z+z=b$Iu2_Gv9gNN6b(iqT`Efu?CE3e_C7`p1H9@7Ncl7f|Mi34r`4d-TCV z&K$8OID2wqrkBE4L`nyoackr>FNa`O@ zjM6H5F463V;WMkTE#J$;Q6Hkgzt&KeNKp!ah<3L^7QkSiDYXvDzQf z5}CvO_>2$7F=^@_(J+A$MnNn=QtkDIoA=AqBu}71t#BZI8E3BVLd5-~2F4z(F+PR| z#@d{IQO8~TNDdp3C-wu0GZFCwLR)Ve`d`(1uc;v<6?lmsv=B>uua7AQg10`2sG^k+ zO~r_eIlNIJErQL`NeVJsB&VefY_r1a>QH+RFD3gp?k#LR396-5MxURf;DwxlL;`f2 zSRf6WyMtfgI@6TNyTinGp9MwiD*Jr*^rq+x%vEC-LwB>-C>0<0E7H90nh3}ZWm4~H zLQLIw<+>bH;bYM_@pC-e0sQ^B3(bf3=Ak%T9ud&$-aB$H!9x~1THN@gzWeb?39WVn zYR&JR@QN?B2eQbz5DjnczMYHA;k`%ssUPRmbw)X{p77{z2At78_N(C~BI0Hmb_5Q4iijU_bL(1?SvLwe_@1%VXY{{eq(U0Zsf%-Lee>!wv3Ymu(B4;SjtQG} z!}%}9=QcKdL)Lo<>bw9Gnl_0x?~X6_yjYE|qrpdNz4SvgZ{Ii zmDW@FfYgRlc{Il7Ufdb4;jP{}pzg9oGgURTqy_DvfZ=OMAhM>bw)LO|$ zTO=lLc^RAiP-A~u*Babi(ZHLN;nz)Q%)?wVrFC+tX=X781-sa)U6KC45c0%@cRu&`7o>NFv6ozi-8#aWLSJ#Z%w4){Cr-@}phetof#Xrq zpG*x%Ye(wyW?ow9-8|dVE8K0b3&f5}c>gF zCZW(_nl)(osn?IqXZU9@0#i&=yYTI}a6V7*9%MALr%0;o)8(yZNp@CJa>?l+@6VvQL z6Ek_S#7TN)9gf35+x|YI<3g57`>}=oS3HOHf-1xG^4&*-M@*SRYx@|m@e!v4z-Q|H zg{|P!HSO-j_RSJxRH;_?{*qC>00srVZ!2uMedOY#2221D?`-5U9AGzGN30r+(Vv}R z8y2b+bxt8Hj(E@PPPn6vHPbkP1B>r>gF7me*6f+HgFw+k1Zm4SxO=e{h#NLuSSWspjX7` z)^=wX=@tWu-BEI>qnfBG#?uy0n`%Nr5@HCZhVez6;ef5@&!^AEqb51D%UdGVqpJB& z5#^dkk9#CEnnRWz16pkF*;(W7ipV>A=G44k(q*!36n{h9l@eW(|L))zy8z8K)j(Ae zej8mym4%Z?=3!J&_>;T?*G>=(19!MUYWzDTGIJWg7byBzgrN5B%X66tj6~ZhZs1Gy26|;QFB0R&uUxo-Z;U1H z#;gnzWHoINqgj}_c(;yT6B?llkWzG_w~vQG-E{<(j)KnmLv(XB9v|fb6YVOsL;(+W zqzM`>cvf@|kYGqG3WAhtj_iE5t+5Mxu(AdxzG630de=@sH8w8Ne%p$?RP2R^NfB1e z9f4=QQX+pR@6|E*ndAgD-UVktFb4gaX>eAl2I@RzzaS*T59d-Ezf$PU)o^xO=y^c# zXVhw7=mJqbLQ$weMuxk&K+<5^qf_J9lE5v~Q(*F$+d<{g7*nP$3q}dUealBKo@-Q! zOrpn^sQz3TT|VE!r-LJi>W!ubzsY--iJr*uZ0tHM2ZxQkYYcW?n5`B$kj0b@#&5-U zKzSPWl1Kv;sWDf;17D}T`BaV<-#!T^S?6O0ppNY6#9Y=+H%zm0O&Nh-M4Eg3a`Gwk z#NAbLW%c^0E-VFREaw_DmAXuEp^;-)bnunK^>r$BGQoJx)P&tVjD1{~!%oaMu;Vn& z*2#+46#gALIm6jNJ2bbr17oQ%tI!41g6l(u+L^A0ERtW!8YJ450){0G_8u6bF)ypD z1O2rJ@vibH9r(h7c?r%rPt0wxYtb$0MkzIaL?V{&A|XjAXkdkGKc zp1I#|sI;TmwVInYo3bTtPjMW_ZCCZxPV(?a9lQRc^NG%3#Qm~xnWHt98aqY%1&$)F z{!|;j9k}3JzNYeWQg@u=X05qr=f%eYtw5iL9icl`alHLB=9sKAhcr?ua<$rd)y!DGrmFV*d6_ZZ)sqt_nNFn4kd zm@E3QDv{S9h+Z6`@wVHd#sk+>Ij+;U88<#wwjqb%{c)x~j&?xoUAI?FgQXPt$9Mpg z$i*0u!bIpRrz{e;R6W#u^!(PxkMCj&Xuw&f4h=c4@VryUv%HX*hK{nSvkZMzBAXR9 zvZ~FF6>##ErKlT|czEFWLv%E1?z7s$s5>cxNEVj!JKA60LR-D?CKR|c-LteHmUVcA z1uN?pY~^N}Y44*A2v4CqHz~x}pFHXSK797Cc6a+fl)ZCwW$l{o9a|MwoQf-0QN^}x z+Z9_gM#Xl;wq0?hVw)9LY~#zj-_zZDkJG#ReE%%XXU%8a7-QkO=kFS*PAJc^>CZn7 zb+i(Y8&W1gv}7{hAX{6whB)_GM*8!E>swqHE6#>9ZmVDLHwpXSWHD>#@;gVFTv}gV zzn9nQ>^AX&^AXbhxRyF}RkEPmIuxcIFLW-0F{4OZp-+(s(X`K;RfgzO+gmKj{%L3G zE(WDlh%_AK1eA+(5M4+%`E!>KgvYbM>D;@)it&#gJsV+3RJQsle-dUImG)G|`c}8w z5s|XfV&Fgc=rhjs{)wHhOi}?sk#X6OWhpqA4duJSLfEuz;^93pxg?;{U54}I0;B{P z8wy0PU%PLKWr{xvsWS7S9%yY0;q8;hPzqZw+DzOwF)1UgcSck z(jP?2e~oxkhsb?Vt%Ut?CRvYe@tbh=knPYt8J@cbnv#Th?|3$lALj=i%eFLgoaYU* zi@o`8E>3l50lmnqRTZzAedC0jQm{*_$te%r8-0Y{AQ+0E6YC#I$)F58WR(s;S&xdw zdg42GH-J!@D#`H+aLo)#6Ulck;goT`#*Uz$v7!jeR&8gGaGYnh*t#zn@WAY{bg_p1 z%y9ZX9ltaX1vgo^g=b9T7WZS*TY&xYidz(HcLUbKSb{XIgDC* zeFs#5y~yuexu7RA+H<&BSiQi>0Q@|rfus%6RP?CUG}KOq$HPe$1tDu+L@~^G!D_X{ z-!w5lFzY94CmlkjeKn!3KHQFa(D+I`d~@M+dXge3Mjb4yd&LS4hDT^bcFQaLvTED4 zdg3zWeA-MJ8tA^WrEA`u48JogrfATZwguP}gpUR+wV~uC52KZiF~(c(+91LQsb zfd)T~FjnR|(qR8tpYB=UbNGXs3<+~n_~9BjJ)Nvd-n$Gy@rG{!sXn0rv}G?V8imjRCyC6>V_yDgGU1K=OiH!F1(-u30?hbG=}b ztsAvqBK6Z|PP~?Jx;2?a;fJJ^(R^TB2(iL8Jf^@XJ=f|s-+fQ@S&7Qe`1d82zK6u` zq5Nk%(X@+&%VxO%*QLn={67K0TrhF5j-LQCn!G)Mt+Pr|X!Nf6P zIEYilBGQr|Q}5SzSmnEe)ufla&$&O<4}L`sTHVHjEE>f#gr#ml|Lok5=qRtbd z(PaA*{J9~hSMR(5Mw^vRQ-%vIQo{m-djg^95FdqWBC=1&FXH=juZ5;ZSsQhTdbEV_ z?8L4aNHQzSgB5W)LLAb@{T@+`WhyETUdkeUoJ_lfSN0q_LDf?=+Q)<=vuwnlDs;D- zPv9^dASEuhm&(p0h1iRK6FvZNAFovgtDcPtXnVs}SQ$UcDwn#pN2#BwMm&=HR+P3#o+&7DTBh>h1_?(M$P9x3)yUAzrX`#6Wsd zZBRO!jE>itHOu$p?fkN-`OT7=xddg3AHTix?`~$zNU{^n2OEEv=YNzQ*?Oi}kV%Kw zj?P$#Y}WH~I7+7f&embm&dqWHDec+aY+1dAV#uLWTy<5`gte+n_V!Hn%JAdf&ZDrS zM$$T^9b_OYIZ9PC_u}>pxGu>ImtYolu25WGAFyC`3hIO7uPmh5%I*q$ZQJ+2In7~; z3^+;JGb-or2{`{1Fre;MfnPcmQtQ$P0WsrNJ2c^*H{lIvbM-1*M}H^1&)^~Z33n*+(UkgIxUN~#P}**tHSXey zi1x0TGJ?dl^tsQ+xig;Q=1KP&TL>dbn2QhVlS0?Yl|z0vOTG$wlT&@qyM%13?yfS0 zRbIDzBD&jfH|>7+fD3fVZ|S>_H}f(`72%fAeXdVbrG5Pk~f_l>OIE>R&9ypuy1_%fHLGSF$+d&`#GCWfRMbATiG zJdF1#)CcgcDOE(DX>>Wh0S}#n*@U%Mf0>lI6gGOKxo-5pyWfnWEF;Gfu)vinE{oCm_db@wNh|`Du z9Jkz>wEUEpgKt!b_6oY@3DYkDewkRTzu{w^oIx>6E=M%dW?Fc_(7#7s+cAXBeWRlbcL+=mz!a(~O6$CIlgCxFm%MA2IAcVwmy ziw*!@5cnl5q0Y?zQ`SY7U9CRwEqVuURI4e4?lBi4AIxUTFs0alvGGP!2N}Psq-^@ zcDSVEHRYmNBc2GMTc)`gE%`ZtAIcpEJjK(_dJ`taProln(^;}J#hw*!#`Yp>nC)0V z0^K9qO?0C=(VzxNqs(T)Gw#?9_}NyAva@%QvmvEW$C9d{GS`ni<75gsn^d2WiX4q! z1;w`pN8`|=+-&DrmS`YQ0^-80hO%C$bwc5RZhRDpmV$5E6rD1YvHljxIv8O`N_m4# zmIoh6TFB?L-Xg8kiD+7hEy6Un<1jveLcw{OdU3{eT{-UqhlYmbm+1vtjKJp!U$Hz) zV?Tc}=epOV0=|Po#GOY4^~PoS1h|-P4ZSOUd15}aR7<+XdVw_Vp7iyC&zt4!PYv~9 zKh3fuzNt1X_?a*hg{J`o6^Zgtf># zrb+(xhfQRtCM!xv%`o{0+~O#0*qb^Y=(-@c`ev6NcX&NE8wHI?Fzke#5SR{i$BB2%h7S!ysuk1uEK=_hm|6#StyD z9Wgd+Ij+p5SKy+l#;8lf^>!||Oa?~>lgr5wD>C#NGl-7dF`+HUyZjq=uI4rg`Y+){ z$@T=gh8}?N*m6K-Qg$a+xR8@vX;4u&0RyCy| z7q86@@i~RJJYQOg_C+7@o6>%%ERGqaI(=Qg)Q8*-t(qg9;>__7PNQ8mUCc)Ut8t45 zia0u9DvlggnbuD^FeM?kb}M)-jjwl_e20ViIDze*5wCE*?cFV)A=Y9|R7j@#GJ zY!lpTdx@ll-PwVUUrY=V>-nIEy(rZXnMQcE%;LNPOKk)#=~SeSe0AOo+h2-~P}XJ@ z5KUTxZZIZk+87cXC7a3etL9JzMp+_`G>lxBAS@|Fu*gi+sKq>mSij69&qklW5|I$=R#YAecaNCh2My)Bs^U(D45f*Yt)EslCu8gWy z_9C-Y{<@eA}WfKt&okr5J6apGcDmv5I+~ zcYk5#Ebpw1TrVKAtLRjXK!mem$#^6VvNO8$uCMMM{Uj0>u%;*?Cku6GQtV>o9-lU= z30M0_5~w{FQFl#2Nge|k)3wi2meQCWwDkUiiN=cyYtBFYm%0rm>HJDJ5{6s^HSL5^ zGWrgvhFDh^(V+!)qCFXJ@w=0f;&))_g9cwB-rG{<2rt|NVmvxe>G4lz;VJW;KQe8# z@f6CYT0&$oKw5*GxY84?*TGJb^O+TCg1e(iym#tw0{V?XR76v>My~0)*(6V$Cr%*Z zOo+l78~M~FZbXh_Q<(IVCG~myPEO@V>=DWDFPw<-A3DE=bVawad_^x4SKg@DHQ`Lt zsR;61lfKUPU_S69#Egxf?h}X2IG>UOB)O?#9R0& zgEBQyY{MsfBhkBa5@&Gx*DJt8i$$~K(FQ|Ac{_Mm0joBED@0!BdJB1%B^4N19`liz z4bYH;jGA~naVq+%F;&viw?c;VQEHei?W7vR6QZS}Si7!s+h;1OYm<~mGrOr-u2CYI84U6i_d0ds*_yfK0(SdZcAAvQ?(je@DcK;IWk;T)sq!3` zJ0tN>&510g56Oq|KsBWvraLrPP*!W%HVaZez3X|kCPx3g6GLZ`|8G_&pmx<9HXU-( z2_SWzfaC_>9GNgxsj!OO3L4>~mz*f)K62nDjBSo2MOjLr%{gu}j)7!QPn9blI4p7HU+?b^jR^uDZrd=E_kk6oZKy6yQQ_-k-o1T75oFx%K(m_)a2RH< z4F1kC5@`ya`Y)XbmQs~m%VeG+g<%ibr2^L6sK`P4-UToaaLt|%ltH4DXAO#usIGe9 z1}HttTSS4{{+KTZobg(YhT6~`1!#Ks}=}*T(d3v!>o03lJDlr*GMp4K$Y{V2M5mw8uj|RrEEer(w zBOH(|q6>)MrI)K49O}ugy1m6ehM&-8#rC=x-l(sQR7WRsKtP~0t@zrKh~_93+Wq`) zw77Q$ffL!QPU)z--UuPaK%#tzlm$Us@wbNo`~U4>@E6Hf#MH^y(bC@8&hc+>@82YL zMJ*u>X%SjsSs@LkzlgpzhUQKrtpAK%r+?>;(=-3Y;beM8dB0OQ-_gB-PR6G1{@-kz z?<<83?Ilbt%`M)aa=fE?MS%Bx{yIp{^w&{IXG0rHV?kSU8&i_^^D8@>epP!v)B6#P z|MRYQFy{M7-Vy76(c7s(f*@hg`~RyTv441(NP(n5vLHE-JV*hg^ln9>0#XI3feb-L zAY+iRoz1&Fi3!LQ^pEX9?*w{7Ckqf@1~RjBH3gZy!{I^ZAPbO%hrNZVEyxmN1+oU& zfWCrkLAI8*rXV|z-TSRQ$llb^(#{0r0CEI5ft)PeLCzp&3rAB^kh7Z|$OYsIas#=8 zJV2hNj&?MECq~TjJsJ-7{~PW57jC$DJPzWS5BO(%`+wn-|NA1yNouMI%Ku#i=6_QJ zmcNSdZtKGI7v%7NErKcVzZZd#^M5FU&_BxXmz~Tzyx~7f@K*u;UHbn@`+sHL@E@uF zE9d_{Xk*du9K#=ULwU5B{s?%^gh*olPD8 zrMuqEzWzd2{}ZSB-4yu0g8UmR{@xEP?}i4*|A#XEj+%Toe)|i{hY88X!I2Wj06_yp zsX(hFS~nMQt8T?YN-RvSts%!VGeSmoBQdeUO=qD8guUOz=S@pUg%&u6LIjemGQGa7 zUTw6`cUsRs?yY$7dv$qrJ$dk{QTmYSK{KwRbC51W0>HVv!DKm*wj{gDpxmym{J6MC6$YP=u(}N=;L&1Z(Y7CwP!#Ng z-33kr8U0Y;enUBkW?7&*g5&m_yv@$q?+sLS)UgaY|=RH)ss z-|Qi9g?LDb*3lR@_q)M#V`+EpOuV5gz>KL%_U*bptb+fByz~Q8K*1^Dh1v@rJ`eCG zB?6oM4Mv9i)$cn#)GdC+3w}4`y%ReaIG;a|@|5sWkA`_m`_aS>)y)O6=Q)Q_+z)aV z8e&p;Zcq6BlRFp*?mZRS&K3YKz8lyfsDKkoh;Ux+geIWc0|q99d~ePp?}b`|-@g7CmpC_z(aV1~xDd)b9@##tpV*eb)b0-%*>5zXPZ%Y!>5x5mfNQ zUq#;Z!-GJFa`DS~g@fP`Tt@@z?L$PzJl}wPYk-4-0y8M#g)o412BK^J^ax%cbDe^H|G%_ORnBb-=;aCwh(KnQZqtUq=Wg(5P^sa z#hjbpYq)Vg`G$q~&~^xE>UxB)OCtGoWWNmi@KxVPxm0Nj%597TL=>h~gCE^Q zBK!94cSM%0L`S*~%{1>HBv^vuIFHU0j9EOGef)+L4-^vdT0CAmm=K@uc1QDyRTTIi zyXe+i^4Z)Cs|>J`tsnk)Qc%9t$%vQhb$*K=%^RrNa2MXe|Khcdvrtge=w6;Gvu0yP z|Hmx_s+4cegw_Z01#xHXn$SU>wNscq`b_-OFV%v_KZ(H(<+3;k5>;1Hop*I-P>ZE& zNgI%NDgd368Of2eeAc}DT}4{UYP&wGqTBWfj&*q<-}tyZfkYCqT11}c4V`{dq+@C|vr$h$})L%UYM*rmQ(9R4DQDml`pZ6Cj z@HXP3EC^nbubSVO3W?4Io5u_pv#gQT8dK$wJOSL=)fYT_w3G`v(PJj_qeM5q3a}A~ z0~g27jwu(R5tI4oPepydRURCA=Et52jyyPs9v^41GQ`k3l-M0t$+ML60vE0U*KP2MftyVqX&=lLyNr0IJ@Oy!;f@{c3i@=EJS^FxTD6|IrKFoU!eN&&w7^)a7#ZuE48>=$=|5PIhzQNI_Z`SxwK zFFg>H{x$h_2F|nrdtoh;4K%C|Ko#xM&F7Q2iue=>ZX3?W^BOwK`&IWKzuQV9IiqKS zQgZlRsw7C9^r^JN*T;f)lLiO~Ybu;=r&6a53MC-a{M1^4|8Th6NYi2K6ZmBcFL05Z zIc7&=-H@hZ|Iuo%YnN{3b8Px^Y<2kL_ss84CS-FPz7#v5g*CELdFYn-WqV`M3Cg_Q z<|3vC#`9)kJKc5LihMcaL9t9dKYC#0BQB6|oto7d-M3)wZkyy+iD|#Pu2fnaKsqH1 zW8b8lSfhAjv{P^=nXCM2j8dH8umU=#ngbdVrxIh7h=a=Ohvz7wdkx_8L~1*QTGyoE9H7?*u>2kv=rpF*LbO+w_Jf zvQAcqb&a~A#K3%23>490GP*eb&Pwkh-T0c*sh?TFx-oOpc~xUSKQg+UCC>u2RvR=o z>xdNQ(Q~D=jMcvR zr5L9wU%wK;bJ%VM2Hm^KgQlW9(9x!r)Mi3WwTN%Yy}a4* z+n*)PRBn(W>MT6UFm5U;Mcw#!+}4YOcmIP&)Xm~I0OIA4C|vs6@i?u?M$=n(#yJUf?3nMkkAjrRIT>nGBC{t zDYC=wTM)}@NkebLZn%_26k;zuW<~fnZ)INNe=&6u62oO09{6;RhgF}2)ZPidVy(zV z53MrM-uLLK{wQL3!Lbwk<(CW^H1lHkO+k_3Ic`-E9pyt!3{x^-6<6xMXJKwFfMo_T z53(N%xZ0!)1B2#uRO+e9GO^zkDtu_vaKrt9-v=+&I@FthR*$GlCkNo2u3gbInY*#% z6EDUcxHkQCUL+aW2;o7Ml&Z8VuO>)!)iyb7F#hdjr-MHQh!uSAV+t-}^Zp;_U@6l-?w@thO;Xa$w9jEYVo!<|Zsgd~ZohGQg?43{Re#NPUnGry zvSOa@_Vkms^#HPFOBkrw3FIA`*$aQuLI0^4wS^F46`Aab!scbIoBicT{d7*zE1f}X=(hU ziXjaca+?j6H$&5oa=}s5@a0{xEt-LTg`p<~lYsg{c2%FvocT*n*wD95?GWk`rWYHA@geMAJ zY9f6MJU58tNOqr9zF)+P%1WRvY9oY2>XR)VFTnvU7|C&975J(N!5Qx>LaiOVcW%o` zdD)iyej)vts5t1EB73ET>4*gzBlWBM z=KYh_Wz;7Oi=`uWtfdqj7#wg-zvHu3xU9?;Nmq;>BZ|8m`eB0Gg_Y`Z>(0FB>C7yh z>w|?c_8>f|m?yDJ&Wc*;3Qp0$&&eMiuPFJl!O2Y}RSqmoalW9fX)!KNs`1~5IlJVn zLGjVNF~<=4p8k>D7E%|BK4IMuG#!9|{7IS#@0jUUE8!1M?r~meY`hT#OaiGj!=4n* z#fWS?6^?$wUiE87vx!lL^QtJ!XwKWh_v=?(1SimR7+qJ5B5P9<1?`mSBGCL(#k6ph ziuF89Ox2Go?Jwe2MN%@K-1ao7=!iQWVg4llig!i9nP{h0RBG~CP{FvCE5`y(pbb`~;b7vms#1twNfFXQ zFIO^oeywUNNRkpZMoIeSNh2I^RQh3Jw#dXI2O9>zo{MC`Xni6Bc-rAW!(N6(c-+ws^JS?|AAS@ zpQb~LHQ%pV!gSQ^5))P4NRM)@2*cl$sGrN{RdC9a;Q56?sQIzxER_uRO}CSs z4Rw3iN2;<-Uul=nJgJ1Zoq3 znf8uP7+%H3JUVR{nR(Xj1GwbvsXOj~O?C_t3GNRu0f2{>xjXwt-&IR+Tmp+-?a7Qqz}&3X1Q&v(ef!VJ3iUK44tdUF7u#`gZVb; z+kCmxYxxcfwGsyLRoaomU}9*jaPt9|UOb(fw6MJy5?jhsNs^f3GsMfYzLq-Eo!Pt@ zrFjdrM6sQ@e_bp7?(6B8``AgbYMH(N-TZ6%@GtJ}CJ=HFw2VGO%hqTdyD3Iwtp#?n zladEsJ|eR)*=jU!uhFz0aO`|)c9J!ioE6qV({7DI#V|?MS1V?>ZMsopKZKJN6Y%3$ zky6ysz@CdS+kN$#*na#3-Fxxilaj*_x{AC_3>*tt*LZ9oGACuN% z(^Gt4kg_C|z4aI?RT6eZ-vR~_;=~djeFU45wDx2cPwUA6;b7x-3+-r)fgkm$#!*L{9HxuIu6&Sj$E zTx(}yLUc<20~M=TKFU#R@+dNvjAXIWmr@mkd!k&xcihk^FTU1I`r8ARTJ!riq|&>c z0a4i?a15&I5H9|CvIIlaJN!}OA6phw=c~tjPLe!`>k(xu#%YlD_ckd)Ra3cG<=MHX(f%W*Z>bFb z!jH7gtL47UKqqZB49fWki(CI~<$bbTrjQX#w~g|S z=O5duUwD#1ajd_%_ok0~u;g=~vKO4jS98CF;!-Unod$nlLq=A7neSpfIrntMU$a`< zabI0eAgJ!#uBMUg1j@OYk99x*(b+eQKk`OoGoNHfs>{aes>n!MzJ$XjFjo^M%q%Kj zX=usmOx9x+7{yt8E|89a%Z)M=v2z*PjKhtLRA@zF`)bqa1`5{qakLxvg?c|=>R*mF zyz>D0)xHbW{tW-a=GLgPOWAI2ut*s&t*&TrAGm6R1-KL-GL;5L#v5U}eui zymhvG`Z;5RX-M(MJh(LO)y$j|F68JUIHQNiI%G>3-0nJNgd5hlz0B35d3VuNVx+XC z!n~m!HF+=uwZidS2P>2fdVl}yfu;aTq)?(lVV>?ZxV$M3_KsL9tOQP$dp?M_;eD)?|eCq+6{p>un)@HZ?s zou0;aDi35TIw|+Hi;fq@BG$`q6U#ZN>&njU0woqwX-CDIEVP?3kBG@sv=d*2eW8ki zJg@%bSI6ODD^#&E0SD)Ym(t)2m0f!*zI(e(-uJ_~E74!A3Ma+{IcCNL7G_6+8kkT1 zU_CLS0!2jIDm-eWeQ72(K7@Yeey1h<(Z;G-U^x0iqOH0I)wZ8ZoRh4|TvqUHzbQ%v zlD8X(Q^r9M9woPRl2!Pwlqq6|upySREaaBbzux>59X~;$1{#(B#6xU;ktD93El|rH} z9sEtDq_XZ)p8Yv7GG9FAH?jIsV}TGj%bfSHG``EU?jayku^pthJIGQKlI&!)qay!g zA%(oo;F4kKTkzSdDM@1fnkdq2=q8%{(UuEb&sRc3#p4s+OtB~^o#xxuTXH;|tFK2I zJi9whc;sLNuTm;J(Z>uLVkFW~#Ozv?od|Y_de3@l)AbRiQ2J&EdU>p3`{;)I9~ zFN_^8c&|W&XoU~+aX<=U*icjn2E4 zMzlp4vCiO0yQKW099Z2q;v0{JrfnKXB*bsgI(c;rA>52*mSFd2sK#~-s|^u0;lY0v zDhHl^7s58pe$_t4PvB!>{!L}pqIJh@f-#$YO+N@Qtgd-+W|TT6&O-&!aOc0KSuVSCCeUZ!CWabUfcP6 zh$jF-p45^JkwZ-sekd!^{Y2-DDl`T=1&}j89WIQTdky9 zPUZyfdFs?^f}7mx-%P6qtO`jYn6=n6q2gR-9fCs0llXB$a;v=YkylGO_7*-KNtKo# zqd(qc$)JnE{6J08C2liPw{g6CLtL&jU;j%j#{~Yv0sCKVZ~uFpR$N$0Lqh2v%Hfy) zR;GP7w*6Z-WMTc^RNB9E!*``z|G$^Y|4BFGe3#Atjc#b@=xFC=VP|J;V`}F7uj=7n zTH#;nVM@klD57TZV~DnQmGnOxq^xsR; z{}e3yyIlJJ5-jLHLwEdZ^x$7(|I3%~UzO8;I5L0w7f0rI3(+rs?e@2j`tCgVKCZy} z59t(|nT3^^@o!7BCTInnh$i}PPytYGcB^X?E$tXO_{9!xZg6t;$nhjSye+WrkI~<+ z%DCloGtYhk=Db8zXN-qaf2b+Pe=cYGmb#PyMsXs@5LqEZ=MBaLt*V9%hKR_Gfry9? zK~dP26hVK^Zv-VJo0CwV#2a>|4`U=JV2o2Ev$_avQw$iOLi}o5hR|37uh8+XSoNl( z17pL+UVme1aNB|m!*AD21IJ7StGgx1VSy-2{ma)ZDYy`kWAx1%dNOqyLc_zO_2a7} zY}g`rR)tKIAQ-eUj&u$oM_y?yy};P|EW*LogFYrJL^1;diudT~>FKG=PuFpoTRH52 z1|%>yS^!7d@AKrxgB=)F$Y%!J919!R=XPdFC@H_T!lbJW$1h$^IBv#NBw%zkjm*#i znLR{RBrG`?U<3p?lw_z1j$i?=Y{_pce&FZX>tGsb8gIEzF?V*KXeaf@e-;(px}y9f zk*AG??p__nhEs@7Gd;y}?A}ej8WV>PB-QDLic3#U~OO=ni?7{9!uZ?;$V|~v+)n?oo&UC z=KzS}$d0K6Lf;P73)YXb1umyLi4*M^wP$5%5gE?j!4dk=^G*9=1I|AQ%fQU^5P}h0 zOT!=SwI*;t;Hrzs{a#Lu2uv6I{InKA!}smwN|v}o&+L{&``ykA7)#Mq7Sh}f#C+Mn zddtVaYP%0Peah6Qe3$6MlAin+ojRf~|MeLpT2cm|dSH zASR#pIV`~6#tJP^*R@Fe_9o(wYVGS%1Nb%GvejQeDQ{iKZ)2B$_T^hvY(aVDiM~~O z*Yz85V{KMa<-0RpxAf5=1Rof**ZD`k*XB~}^Rs+auyoDV?Vp?radj?*mWzTOnk2aw+ot)Ndrcp)M7H z^WA4R3HaF3&ZRR9?1NZ zy9wR%Dl*7{)&H`a+6Y7Jrh9~S03cHbUP*|+>hFpB5e<^>VIAthQYqd@)WGUz-|0dI z$*+Nn;G@g{8myn@Eh>a~%3EOf6xJ(=z4HJ+9D(j1;(o~Js%KdL?b27lO?N8*jpO?x zF;tcA_WRm}=l8XZuYw&0CeNr_VB(CfFlS*&^<%^s_5qadD+Ol&G=NIO+{zB|`vpHH zK^KLqD&kZ{*J+u z*#q-M4Y2Xw1GGka9*Ik50GIEOnT?R{_qRaN0Jv>XU}gDL*L@HAAb;Oul#c&6u=c>u z-FvHTaR$N4Qu|Wfa!deVz7eKp-SMZtVb|9M@VG7Zqp&!zXX^SXImn!dO;J>xL7T=N_D$UB+gNK_*TPVZZ}M9q>C}_s!lJoIo`s3>znSVPMeiHaGX1~tr5RU`|7$QaNoe#{3s96@+XAWAotI6x&ui<_S)*cV6bK%=K+|}!q>(4D^a$iuNJKKln zR8NUhm3D}tDw#U$bxKF5KjQGDLw}QWjKiH)!&OW}S!6D+P{|jJ;@wyk!{OF&yHo-r z1!kdMaJeNnhVht?vwkJklxZR7GwJ-OT>%S6;TjcHU$JFvAFZ5$OK~r@(g$aeSWXrP zm(^X5afvP$?t6)BHngO76OQUz(fy%CA><DH7T9Vo0bK6OHYUHyBHcgHFk8CVhgJlp z^Xts4t%gqu`FjtDKdAlFA9cZ77XTQMiRamvuhVfuUlHt95IWJL*D1mH%}1#$R-isl zKb-hQj@;a_GAV-g6lJaPPCvOw2W>E$Kl&dH2Ikv|3~e;k*Bc;26G}sV8!oAz---Cc zq`x2USkc^37fdX%m9ehQbu?FDsD~Kj>ruT>iY!^nz<`=eN#2;+1#C!aLa|4}^nIcZblrOs6lt zz1Gn>?~t&6ed-COAlDi#{L$pt{md>mp?#;8v%6j)mIJ#oAYvu(%YzsgM)g2pyQVYSJ zh`aH%vX&0wKke9W#_1e&KbHgzH*Np)swNVwITSxVk@WhC>0$N_@HCQ56E&8WVt3l^ z9ni8NB8TOPF1R#PPFjJw75C+?NFQYi%sUJ2(&f#Jts{4}++XopQ_ftKUqyjZxK;Dc zCg^qC&{;8=X$GBX!m8l$Ar5Io=d=**L@d9=2Mzo#Hx~`jmiQ7#i+{b-hJ2`_1&Jp4 zDJf)gIFMtGVYPG^z>O&?FLx~HIF<51b=W{vqB@<7; z4&_7dc4eDEcG&z}d9-l7afu6z>8Hyr(7tiCpG6oGdsb0!)2mSGWb{sJzWw}hBV;=j(?juBWlZSc2l!IHtbJ8oi}vbjdcAF?_}7~A zgQnd({aVxu=V;V{ojQ{v)(W9iPcvb{DLhH#@wbHW`KU`bN-wYZAIl zr-hZ{X>T6}V{yqmwe7rHv~z|}R>g%4od_6Qz5lqF0>;gfAf6~5s@m!O^Im#|bZF`;S|BcojA=VR12cEBJbw%sdkTe`8D!E&Rf?Lb-^LHAh#r5ooDqDmIXn(q z-@EE$0zwgJn)2+s!tA0I_y!T> z`B6?PR^ge-T5@<6WfeQfv;@CpqzH+v9|nJxH0cR2z%Uuvh5yKaNDL}f0Z2(;ySxgX z^Cf8HM4;Rj>FI`muft7#R$Z@hUT#04JspsQ0BcJl_SCX^KMDnu^MKH#9vf)8Mvh$s zyZFEj`jBpx$s>wSx;z;pDB+t!&bb-;QyqfxGoa^lvB+*rQXn~tNr0AT&&g zAbsy#KdC;vLq3cz=?`r+ja`mr>~r8k1F&OIcG2(pr`9MUWrru1hm2t9Ub;1-oA|H{4x@t9TZZF>_MWL8$A#NJ3{fsEt=J}c?0dwx7-f0%0i>l- zO|)Tg(OJn2rw^D35izh?#nrI!_>w_}V}To{AJHr;LzHSATJlqtJV{R#M{6vzjAmP^ zLvD#_FVZ`(PvdEP#s_d;bLWJq!mGN5pO=2s^N8)@d-p5UeV3AA_b1nV_?Ev8Pw z|7r8*XpKS-bqlpjlv1Z!t!Om&4*(%r?`CGTwo2JyZzku~h4^Q96WL_*$qK~p_N{{z z=o98%xcTquTLjy~a!VIUXh|03(=>0ZKWhyH~Xzep@I7e*mm*uf!;s z(LNtyg?H?dA1$OzAlWd>&bJAM`Yuw5U8)8@+K>Dc#e0Yy^I4bwaA2!le0fAm?*&aD zsb291^A-2qg0;FUQ<<^-2?P@0I+}FO*4ju}L*f4a05Cw$zh9r(XJVQNdnb6#A;OW0 ziIGHmJvEYCZH%uHte=VGq)6FOtC-rWs#%409(8vBh}j z)9ja7$8+$&G}N2gKyN-a;N@BB7EH2fSR?9HIUJrFcEu*-Hq!v~zTbIhF4U)rds}Qt*$@(Dw9|@){O`OA$jCmUM79*~;0;Qh7zx0vWx+rv`Z!w?Lcg-mI*O54t7Gc0( z`Ocimhh_>`>GhI*lu;L%qKYeP^N?k)`+-z;-pkgG<@xh3)tJxwL(&r(1akE zd|>-s#UUXK|4V`YG;L>CL-u`r@da}%|64UY>URds*L*uJZ)Cq&3m;;7e5nnVpka|3 z<{xXpT2^s{iYpsPwo#{Ue?H4W<kVFrbgdMSg6d}<3|h}f>LAqfyn+vHdSG1I3&fE=6t%I0*<%^IHa=6Z0DfJ zDaQ?|^$d*iq3u~-STl~2POaF`X`Zg)aE;aQ{odER-*Z(8i>U#aexVk<`gO6~Rl^}?i-4on6 zBra_oUVysojOBzCf8?=}im=DjEx0r>S5=iiZj)BIWZTP6m0CqEu)ma1eF6MPYd*On z>6K~JIM66muq|T>A*?1%l`8NG)0X(_4bTk)!GjT)Eg3|px2^fDoW1YTxI%=~)3a@x z?|hmbGsl#)(BljyHOORK;bkszliA#teLXevXyo(2Hknjee=1tVKDD`m^W@tZk`G!M z&%RGL^^Hy1z4fsMhygS6l-556NToYYqm`sz;f8+1kr>`LMDrhn*Nk2GCv3?!x#c6* z1nRGlBTy{9Ek{|V7PAxzf-E}UURDqifpJDv9E`Sm9lZd}*RM<~j zdo9R11)7U^e^@7o#uD;nqxlJtwzu`N5xb8qlp9f{Q46(Y31(W zWAEewSc$6i)AwTz#s>z7feV&LN;c3&*^R$4w;k>t-c|6pdah77U8JsFrnn-Q`d$6B5ZrYhBWo~JKz6v~(e7FCNnhl3e<+3aF4I&R0+j-P5=m-yyf{w4 zVhetCJ=o}Fl;VrnJn!`i&I!$w*3qMk*En%o=!76fn(*2-z}*-TjrF7qP*mS)YG8kl zTlwK=L#WLTQ#SDqn{k>w4dtO?24 z*3m^eRe7xZ<2rQb6zx8Sv;AbKe6gVYy3Rk$}=FqmqVlDpyO`~q9#K5*3f zW=F=!@l>Rg-CQJST^r5H^=m-)>Q2u^`{e2Ie-yg56Y5VQ@#`DD_}C>g;uy1LL=!j;1Q&X~k)cU_ZL>z@lrJfl=`^kP^|2)Gq)6}*-@?!s@BZlCsvS$;{`^&k ze{bw`zjwT-FN^j2MZK;6BCwNS0Mf|yP8bT`=grq+60EtEh=aO}euE`0f?v!zo|BJ8 z#%KBHp9hhmbgRaqP>rTKMkR6zyWR1-V2+K63Et&gz`Xsm3kr9ROJ@PmA$ucNf7uG@lzCl7rwpS<3pVZZoRBy$%1=@a7Cu6s z${7g)jOt1$yNyx{eyx5VaxNEYaT{svH_&^Eq)Wt_dsZ3VELAiy52asj>sSlPu_uF% zT`bXnZ}XbGv^cc*VZ0Of(X~!8Z}O8s55|WF&()^#uMPS|P$s_S0KD zOjUrH&E;94Z{X_QdG~X`qYbajhpR;M!m_MM=&jfB=SO;s#m^rkj!RNe2bm5xNjoQc z$mnF3)wq#6m$Zqi;0O<3POX=be~7527DWzZ-_d{Bi}>E$3WvUg{{A{uF@KkW%dJKY zUtJq5l6)DrQa8h6{XVuc)>o;Qq74J)rZUI6 zo;O1`kd`rhC|~dIb%?)ug@~8A2)|>$1)^tU<{l_42n$-%3TRmx?I^TGe+a(L7Yx1n zZ2~t=G{t3SebQQ5KA`wcmWVk;4dV2x4~h&PAe!SoL!}ocCM)~$!$gryx5?d1laD2+ z=QScr-ahE<<3HaT%p^e*;X@-7d9NxRN)y{hy*Poz_4tFRB6@OzLq z#gVXIlBkXHm0O#joh(x}f4Rseyk!;~&R2TNS4BIA1yLFn|Rj(gl zn|%+>Y2SgWyPrQH$&bpQNL5OWVO18T_f1iyOXfm)=Ev0pNvDuH--+;oA^D(bOLj z>j%O^q=Zp4=1{q05cNnth3v1~2tM%*X&OF44GGSE=B1Ni@x`95*CX>@z=Atv*I4rE zKOb`4k<2oO9$hR7f4x>-FCC_p_!z;167-}|ob}*NTX|-I5jBG4IK#JLW=&q)T(yD~ zVfof^0I@i$&DkD_u~|3~K@M7qJARw2!bfEy9BQxpVHcot;pOZT8suBpD?eMOh7ncF z7hqmKYu8rNEy8{pKX;~v$kzKFFJVr%)~s1KSf4GA10^9U>2{+*B9>oWC z#HGWUb+SKGWZ&r}3ahenvhoFQRMxGVL5{=+68@qtbUa0K?c>KRg!HFOm5@5!l{Ep4 zt`B^KZ-SPVg-q#hC^x>rpD4Djh^le&hTR2s)k4OW=aBWx^=8#t9H{?nTir1*DbwnM zgI%Vnp`!rAf4IYby*r@Aii%0v4mH43Bz3Cj(e^49C=R2-aZ2MCF_RG^Fk+4f^hIE_ z20(Io>5bT4po~68Wyx{i)BOmPW5kptyOMwode}B$KDWKB4x8=77ZE3Jcy!~_Z zxZ1yPfP87d+w8N0`(y|agw=!9A&EU4uT#Hd7$frtTqCCKZV z8hw*ie;1N&6GlD&>FAx!n6xOl$utWBiJ#Oxq6B|jIq~49H;QRfl5JR>S373*clVZk z;tQUTVvW-5Dxj@hgwcQ0BDTnMXNpO=?Q;Lkdj_25Wy4#sHm%7{(k zs)()fInh|dUsSWpBT=WNv~5501crch(t8bZzZtXk+-ev&}d1RgkU*y zYt|8#{1{1W(^U64L5J~88(cekj=Pi*n>Yp#sdIBdy2^0cr0)ii?ghPFyyuGFktd3E z=W*FtW<(g$`}!-oi#`k7vD&KgWeb%Ie;70DmR9y)rDfSNHdA;>hHxO#qiE>7cij9L zjL=myC{aazR2%rERp*K5_AMWPN0PBK0^32_%>}migf)GTLF?20Om%-FLCt9)o2l1v zcnl47?K;E@(*gEQ{!x?jN1p`_n&p6}uVSg;%!wN5Sn*6Ilo7R8?rJ#bV->*pe~amP zCeFI;%6w*=SA71ap*RA$;!Q_7p@YM!K=ra_CzkU&W$~ZNQ*6gIbZF|(1wX@8Vx2-r zZ(|9g8sF6~JJHx#>SR_4VjD}VoJmQ%4q=ZVuEM2?f8fqRKr;|ZLe7s+L#zqP&C3&(MrI&EI%~|gh^FSw z)r8qq>TQ_XKjHTlDD&j|=Y^_hc=KS~Id=Lv>GSgVnSMU@JaWEeTxWk#p;}Hf@X{Us z@WJI4*%7OEQ-+=ChbRE8F!hrB&7~{iw96V>Eu!9l@ZJKD4VR1imZ3By}I zHR1NuAAdTbnW`&kcr<~7MQUHZMp&;H8skG02-LauT{Mexe>-80?%H6}GG>{P6QD#u zonuevV|c$!{OT=<3|89B@lb*7ZpbmpI`5I-0yPQD})AnSWWDXXMzO|MTdGRmjecEBoUuD*o)%E51S>&5-y zs&OiSR18tEp^=Pdq_3j+S2V(EUKHlto=bR;uX*_wCI`H%p$fG5JQ_^I(oGAl-6)0p zlUVaM@tAUq4m2m>e<=&Z(q>y=wN$FxfFb`vevsqf9nxWqckIJyNIjPpDm{u>Vj|py zaP(z4f`hNTIyG8zwOIg>)D@mGBjNeO=tu)POO*A?IKr^ySgXqx`Dps16#;s1VU(JT z;X%R2Xk>jSebQ^zx1<4G3#J#6INi?>?N&}j)Teq$(S!&ee|YYK+@v8nl3WlYCrn=b z3>dT?(oDWA2uXjKrn{A+`PdqrQH_jUr8e3~iYhorU!u-W5}`>45%+^Q+*ms@vCDTghvstPD7$AJa2}i8X6k zPeeaoiUy#+b)S(dc`C>>6>#Ur(S|#5F~e+xW(sot#nDrA3S%(_1LKo)fpe!)w#8ho zufa*v3dnBvNu&#vL8|P2ZNFl>E3S&PXfbwVOD@wLf8u+ToRQ3Zx7HcPRc^Gc=?CyW zA>r58*1tF<9^9cV=;`Z_oNGSqlMi*vjZ^#-5u(ZWkiX-trw2=t({R^~PZ{t*PAFJh zuFyXweg$zpT*Z%7O9NOuI_xb|hd%F8|LqbYm}E*P!)F|(Wn{R*@HBGQi2<{5ZT@HZ zfiBA8e|ZNo1Qor4av81Fo$06|LvL$ZGb7&Bt8_xLo(he_GUds1AlawNEi|KYbs$?J zp756pzPF?!3+cGOZ6#3{t`wTCD!jENzg zb%9%S8rHthuKdM({u>`r@tc?4+1jo7DexZbfBUQoMg3?p!CLsvq%u4J*Y8^HDltmp zG1AMQjvhZohF_1>apLkNanb2!+DaHPGsI)=asDj$gX0&SUn50*@URQLjW~3z!gG>Y zDk`a8T{qNT+6jy-P3(ui)N@FSrIfv4QW>zm2V|eID$Is2WHc4r5oKiampjrSXfB%C zf0zUcv>-I!=Mr#|k9RW81{Yk`f0i${nD5P9?5h{mfTu=@WA5*Kw)@|wBYT+96UQvT<3y? zkRr}95m9uUb78`PIQ)g3RX5d;`qQnaf29()n|#yMJU(|KF{uCU0oV=+2qc$Q8by>;l6A&v z*-_@2v?#n)CxV}&zS%Hse{hG$3`15(QeV`}2f<#v36=BSYJQ@MMtZo3afnCQnYGVg zI36zPs=9hfZ?>-8-VE9zIQxk6<$x*wosx95W+Q8`anZ9^8-8%Y9&+i|vvzyW(D|Y) zzn>F>iZb$kJPyz>j(tDW7v3G1vZdDIN!QNE{Ioi8ey?ds%6n%xf1@M;Fn^xep@ESQ z$aE5gDc%y=v@5>NM4{*IWO{II7-qiP6``WB;8XXnQQ!ZWN7sv11}p2;;OcI5N~L@n z`3`l)1j&fK#I7w^o;zi%YHlt?<&?7@iP`n>p<@5u{(S~V_**lBW4_@-y#Y-KNJlOW z7y~2BPLdDDLCwF;e-J5(1@`iNE>-OjJK~h|DWBe9#kRY7O`mp1zmojH744jRf z)au&Dbq#92t!M(qa4z7Gpe664W)5CZkPn_Y%OTZ81PU#PfBupQO}!x7@?Y4{(Kezi zP$C$b3e7O0vphTrV!aS>q%}USz=)cy3;8lW6Yw_64R$1jAO5S|kCPze6oS6&6?zGc zqH@&x&xD!rnumBg9va4oXj)sb(`2@DhH+-MhohL6?SlgvBz5 zCQioo#{8{ye}f6A*vM3+Bd>U)jU~d4*ZLF2SZ?$ortNSZI;?ud;+9zVq-OL?B{}V! znm+>5yzSQM6D6w2d303@Z|N6?e1^d z6ic-7(ncZCO$j3|J(hKTU|#dRNh{luSuW-%gPW4b95ritQ5Psy?PGnMjG_DTFX|PX7{2bIwnFHRCkYEb z>NF#>e@n)LM1cME(`8pdr18aKrIYe(Yl`>qQ7 z&7%9ceX0fM9?H-j{qiEl;tSRm*b=;9B9KjQRkze0WN>awapeBZu>!W^uP z(Gt@&REjIJqd5_JnPJ0b$GRePl1jPS`m3VJe`2-q71rY+ldhLPc3nVMN=ePd+ljIY zMY(lOh%GzbmNCO9aBag+Fg=KGhigT4j2X3(J~rb?8kXc*9NDbtT|(pec|u&y*{7)} zOk5?kSp*0DWBUtNqj!u5*JJRo=sju2bXuq>`zs?%A9ThU59Ug(wqUWTMUgpYTP ze+uGp@j%%g`-kuzx_A3${Sq1h_8SVumRM~xZ22{ljSgkXh4$KQext=PTEC9#4r5|v zmxj0;Grrd^g&bbJ|IVyrLw7(>8=M#E3fVJ|wI0_>^;H)AlQ{JXP4n)=W41mT?HfAv zF7v2fMc2xdxV?JmAx}XPBmtcOj>iv!e|VUEM<-+EGPl*J@am1pWYv426v#nYZ_ky2 z<)C6sZ2}%MCAa`xN+jZsw8U~#PlNt;O=0`by$f7I)-EsPTyK`$2bhrx?kfQH3~4@4 zC}C;KYX>5pBtv(8S#f%_wCw{RuCD9ZWCc^%I{^JhKk8v>K#dpcZT232`L_V4f3*EP zs<%-mLPfPgL)Buk>Z#LTOx&7e^oa^+yKlMo(^4naU9wDG61Ui$W4ne6=XZ_7_8&Qq z4SInMx^lv#^f#`aCzC5Vx~nTz##zPps#jZOg!e4XgNURcM#RI(YM=Xtc+TWc$=&l8 zQ4X&2<@us)7Y%4?as9rg!+Z#Ke?g#QxgSFcrWSg3Lo0zCUv#06>lI|AsoJi$@Q*uO z+p(9+NP8yZp}AQ1H#>o0S0fDFRe?v%Hmw6sP#;6L^B2pQ8qhzY<7;6Tpq+yLH_Icm>-5}?n^|?;ee?4(zX1(!e zV~aDXU>X(P4LRT2U{x{CYiB0!#-J0ZmqZ^~ytfre8alq5?Wt}$5MO6M3ZIlj+Ef*? z&tJ51duWDLgGLePWj`WO+$zLep>#E?*ssLTkU{46BcK)IeRbuEWqHrwjA(z3Nn~h4 zIK8r==;HexAz5Lpq_j6jf1c+X{oK%7$8ma;jTJMlX^O_3N>KM`>-V1PFoRVGH>Qsi zF2+7N7c50+2o*tNs5MWKnHd$dPKfkzQGke(&el8jV>QadSpX^hPL;`AchT)agS{4S zXUM0GeT6-Yz#446(b!jl=3p`-W~u9E)q7rKTsftvcM{IC=mA=Yf6JAmZE+_qu{9es zF6&O0x~fJE%;y#@rAb=+$9|4N>)()na<*Vf)Rl+XH*o#bpo6gV;vJ?M^+YII6e&%4 z7((U@a8*IHgcsPXt+?;JQ2jbnIf|uXDUm-vYH3gZfKDUQGTIh)!B%Ep*ggzBy=-oIXw0$fOjW#` zK2)u_;~);fctfPtN48!Z18ikmv9Uf>8hbbk90gF}c0q+D+gtz$}w5zez*NJxxv zB;xigS`q6^Sxi;KTO9x9vsaP&b&I9jV1LP)_0UH;|75t-vK54yyl)xSnGrC}DoI#{ z?~*T47IL0rv;rud5eWbR3{(?hgH7Kc98L z2}_y@7UPC{_-eKo>_a6WUM1TM-jxK|5|*r zCng+3mPC;0qXiY8L@+xxa;ipbY(vtBTu-aE;d@MwP*|?WWnoplsp>h@=isBfD71O& zh;-t_12Q?B!H0?(ccO4Ql^V+-PfsTlb%lU>e-q&wV`Z=Q=G!2lO`tLB<+5!?=vU<# z&NS9f3=@I(Vn znxAm{NlgN99ki=khqJr;XfmNQOeRkvnjR~T?MZ&(rUB&{r@NxgO&n^dQ?&c5l>G@iQ_~1AWjVdA^BD_f3N?i zfI)O1W-do%w@kEjo~P@nY$^6U1k-a|MjaI#0PV}|KHchZ82XtkWX>9oGrRAmlJDcOkxs-l_# zEP8aL?A8D#0chCiHu`?Sqw832@E3*Onv~t1Wz%^Oft|?TI8ru?53TfE|m+^e8i1Z0-9d z0_jWvT-br$Hv!3Z(Hh+8(o?c33X}Mj?RRTBDRHALVy<^j_?>q-sVGn1eWEjp zhb@dmx=#TZt$i2(uSi^m;+yx2+w?gkQ*Vv!UZ%T-cuR+zHv&e1JzCSXviLfVRu zPHG)S*uK`Z`p!$^t*F^+f75G4t9D5Q@2?~JD=}Y6*a@;AT_2{#44G^=@q4s0`-eyh z6K^g8qd2Y!n*!<_YS=42ZN$NPlQSjiPf?h1U4!2_vl_;s2yc06CzKcvYXTzfU<$5% zzSg(P6Z8lpH)?Avk%0qxKF`!yqe`GqXwE2l`l1b>0 zzO2RUV#ZZBCG}?SlMqW$km=EOT&*K-Oe9Kzg3t>BID&t)5-!l!_v~e?`W@c)IB)fm2O=;ONu)X`-JTJ+RiYQ4th1oj7wNCB}}8?uEL7 z^9WpnTzX{JWi3~wYey)vG)(!-Pbc$1@k7nbsjEwzAH|B3x*+}&T(f*SX#o2Xp49{+ z+RYCShl0&etR#~U+aL4>c=UFO3$d(Eo$RIicW0KVqP@PRe-?DHT}Zq(Egrn8R4YRj zRdzfo-hNdO`Uxb{96v7pC>1M`t^>>b9NT+gkeSQ%NcG(UhSN&>Th_Dvb4m>%jfRh^ z9*0t*TiYbA?}7KbN%74YkcGMLgQJpYSP0ciYf8KUfu)@^ieYbLSTXWth|~BcN_8{& zA^c>}H#mICe|f!MT~CDMwrCW=#@w8tU&(uPDY!1@OzcS3ly`C$<$0P$s<@eALT*y( zl{oC?Ash*5f2jFRwh@tNtZ;#LdKiES~RJyka@^ zTk)+Z!(qA-@!{!L z`y9zS2rY^o>-A%#l(gorQurm(E3S@uZ;^v{e;SLl{$Gf=ZcA0zy2-L>w_wcJ4vjCK zGi>9U-A;Mp3~>WKSnyO$9Q#eO?!BD5xY8kh5Qef9v6cco^4~+0MH&3=R{CYJo`JXVv@}y84e} zW$l4*C(`&Ikh}sKc3jh(NeRbNwDi7%FfjDIBt)}?WM4} z3ww1|334ItOHY?FWGzk7ZlVUNN5@f|QCib?!aRlxb*e%Hm;A@mHJ!&!HO_U28D8HUcPfnbDL0*&qlLg}R0e;Bn%8av0S z6;sHyjoAqkFG=UKK2+sKjd0gSOJzUkb0YNqcyfv%tvq>83(8sgLxJ*}WDblt=HU1@ z;i|v*zkK+fABfdSZ8N=;`qqaiW1QrnQAraocnKs=#s_`iDEHG~!`XLnglsCB&Iit{ zj1VvK4tvkvfkkdP-DHS^e_A1*pgcX2%c*DWwj`OFxpBJ&mY+^3py&P|wF%FH_jcWS_A#K)8_zEJVf;a~5lW8~iY|(b2 zlDkFjaZ-+3j(> zrJ0vRwmc|v->yjGV4u)ZZ1L5XDeZPXjkcJ$vo}Y&Rz<*xk7VX384bs}hR5&VO1(-a zKJhDgTxGsb^Rz_Ne;!eSN3NCEh5xh=x(7w=6JAnxwvA$&D?y*xo2-FMnb&U-U_W{w zkHX}M`^oMgK$OxXJ%LH9_O8P45H>2F`3*JeUhzPWJLhh?y#4|CGpE&97Pr{3Z5bX( zgCIPeL(G~^f+B97tw^_C!#9kVQrrsKy6s@dMB!KOu0fbje>A2xr&ga50A{4$1I=&W z#!)vJ`|`qjkp2=v9Lr2q=@#MdJ6pboL8mJGQm7SHOFwa*Ci>!C{Q+_e7W8qs`%u#r zn8`%8E74}|Ewh)gY-c>gQc1>|uA9l(n!I3!+$K!tx%N1u+sAxT+!oRUe?TM>#8@^e zyk_o_sOyJ9e|XiWx^w)!%3yBMJHeb7-F_K)fjk)#O3AQsRdEd3-kuolLn$g6@f1nYci|ravWqb9OW9A(Zd8`x) znb;8q2ZmDah!A|Pv(?UCwXlXlt*b(w6AnaI1(w%()}_g3QHEb#Yf4yU%GIl{>D!E1?wn3YnQvaLMG&cC8%x9b4UC#vwGFR7(@oaNj_hwM`sbFRQ zEHO^95ckhb8G0Ndk&n;Hp=-({ONHTzhU(3u`k>8f)@z}Uwl;?Hkr-Bn=*3ei^AM`2 z>qt>+js%9TpHPRZZ@fT?Us^ zf8EOw->=IjP+RGdQWi_A29R4+aP$(=s~Yg*ZZ#uUi|}Z;-@dOL2K>U5G2{cluA-A$ z*HNJA-^#Jov0a_t#)b|Qvt{exI#{r4q$B5qkrhuiNWLPCk4o)3yJ``A>zH}NgjYTr z|GDJpvdhl!8)gmgR>UZ5_kAF*=ls2#e`jC^G8ay5Z>4&9rrE<0J=GGb)suu@&;Ufw z)-&@rlfdPbhnyR}&S9Phjs7n=xG5V6meYy7i_5xcA0pqb-GA#|Q^dgAIg1EhzF>hd z<}=WISW8Qu3`K6_f`|^~9L~{Z0{_kqXhnM@cQO+|I^`evJ|CqMt2^@A^FH&-f7Ju% z0I}OBC=V;5(|nUC1_pww1!1`{&8YNUqv5Yz;eZmH46`TolG0w`*yF85x7x4#_iC@% z0ZG{JJ)GegY6LmHsJdsZhdn_-T@#^`7EwQ09h&P4F>*8Tv& zX1)kB(r31p%3hcpjYdy&wP##?e}pR%%X(T0t5$9l$MkGHF$=+nvNkP$h6?t|c?CCpsT9VG=wZFk3?UcDoe}KQWfo^14 zWr6`;FefJc2!Iq=88R}X+4o>OZ3#_FkW&vavAAqXJZ0T%q)IgEGO>|XO_A8adGnO} zQ5lr#JE*hoU5LuPSr2cbE^-5?fbiLHHGvy1ICp&D(tvHTs3cB(LMH2;DAWjlD}hxV zZn?D?RgO9LhEr;*gXkMCf7^uMxVy)vUUySMHW0(`SwS)UGNKYf&fI5z_o~q!LF3(A zr~R1O?B=!4w!a)sN3ca;ms?q)@$p{Y$8&u`a}G_6lOt?G4%Ka7!^55ZTGble>ktyk zH^?-^OlmE$91BtsU8=jZV~8#;I%L;P!(*EGI=c_u|EL5jloZVpe}Iu=X^anGHfkas zhV0kOQ=5V6t7`P&>9ll!VC#5(ibz+=O87xrvoi2bkTGIm^0Zh@lnf$TO1yjk9d;^2 zo!=&u|C(;ioBJ_aLwpoQ zsFU0S>izvqg<&pT`S^4UF9pL3qNmB?=B4hKyAlolr|9-!9L-~uPs%Z$O+;60rJa(Y zQ8(E3(U+Vke>Gv5Z~Pg~Z#jmBUwlh^GVA@87Uad@%;a@8zjsu+R8(B$E6!1FXACId zC8yw09koa8LDZz#8!!anHg!Z={ht7|8B6BL<~Biy;Y-F%f;7IgyWMHYVtfgg4|DG$ zkthL=TSwW`e&umSUga;}(Lsuy&z}dnFWwS{t-&a1f5HDRf7U!eK{Job43)Z5bE?ms zo)P++QLjv&@AnWDmSfNRFMYaa$WroE3^P)yX^a)SdhrdljpB>(0;`n)v6GXZ@5Hwm zCd3s6E`cf-#Dfb;>8-hQ=g5&}wS_+gr7svjn#=a!T}{dFI)73t=VQ=q#qwWmOeos+ zi0%Fsf4n7TVa>Gne~mhoC0s<{3Ed%}#4_{?OvM*6@P1sOsWN`w*>(vC{x{%xh%S`| z*FGfW;7o4DmnxvKy2-z}!iN|pub?zv`;Yomo1?URAFwO>etEP)U~C&pxOBg1_uFUb zxF2D`mWN;Hd>o%!_kS0}ZuHR)IGQu3(91yvf3XF)C326P0d9_Mlml4O-pUMQ6~bT~ zMdCD0QiIdOA`HGqXEh!4mtP4^v8n$PYrVTv8&csIU!uUVWy=qHc)7dye+Xt_s4it;D_L?4!|Gp!=4Cilg;pOeU ze?nM5>LEMg>Lu-mP-R4%q&UYhvx5sZQhBe@NS7RN0z_<+-I+6BPt_tw_LfrMevd#53^takr`bf8hbi)rAyG6;EK66T0}jvUxf(>xs$oQdlTv zegooE491r?zbLFfEZDm4 z)2^mh(^jY=JI*T-Eq+iI&KK$;c&1)9aU38#?CAsur;HV#xVn$TW-g9W@v{Szd#}OB zogtfgRDj} z-TaMMHwjl+IH3JFQD=ZLISR_jf4FgK8OhG~K~4jj+c)XN!&8pnh&phUmWOiFneDP) zIRBQ-CuD#ivC1q+U*Wq8O-;9`4CQ*M!b+6P(r~-k0V!Az+#A?0m1d|he{ckl0}j2Y z+_$mm@@goDguMW0G_+^jo%VPB9o=X|D0e?-)E!nv5pvnegvce_X&S#ya{WCx*@%)Mqje2JnJ)8Or!rHHKsT=_i-F7HGHi zbt=d1qgRUe+cCwp*>@9=nhYcBDnAUv3VOUmhx^5j5osKP~rhi$2cW_8rxKe796o9K0d!c7YJEKkmb>3 zW7HSf#vf?=E!2=4p~xQfREKzMVKr|c5%!KPD;@TnJf@qqmo+KrJ6#ramKeL~8^v0I z%!z33S{GK@)Z;s-e?(%e0k~Gz#s}+O3(k&iYh`I-T3qE(=zM(@?X16P<~7-iVQ`iy zlN$hn$8rUs?|l39CK={O#EN(11 ztabpd_=n6#1`VJlq%tvws7hy;o*nk*nlk# z);NnbHyfwg>0h6#Ri;a3k%BEaJ=uD@+16HO#+d?Y3U1I_Kb+l zE^i#1yagpQEL4N1L!;Ul#LciYxe;faB2pRiX@yxdZ%YF50v!cO|%5x3Lel#(wj)PNDFcMkA z=G3$#fAQ0u5oZgiXOIiOY5P6gX6!mVD@&omY=lql6ijnpH2bP7*JF*c_%TiYwMG}d zwvm~}3uD{dJ$e5o6NH0H9Uncx-FS11MS?Kaau)(NoHaSm+tOl25@5Wc+|zhTo*PE3 zE7$4$o;Gd~LZLuihHrl4cxs@@f@F}r1;~OQe^G;5yoIN7NR!*+i6*G`dn!j)o(EWQzK$lfmgb)n9P#rU{(ygSd0-nr1Ok%@! zf7?ltF}~&(tdDpz2#3~degVXqnwYA2$!X@rgv+J!**R2+YQVCOnBI)Sfko}FuJVaH z!oM^wQ>T3ST{R@KJX{18WadbNp@VS8b(OH&KP@f@fX~$r+W?GnpbD7@=vhDif|V=STiJ@(}@PfD3Y+e z<}~s#e&Aae9#s?fUgaToRfkKp>ieq&SMHPef5!uu$URcF)m>-6Z8pH^9p4h(e>2#y zShf%WJLrQA3-6?hQ4PFftv2Tho}3oVs60qVy0E)xW*oD5vaBhB8$5rY+@qFB$+ihm94{3!gSNc4>o(He|7n+Mbz^fIaVOJD>Co)%&h&-Mr2QX=#8a(c`MJ! z0F0<3Kt_g}*{L5U^XjOvxYgJlm3ZrJbDP4$hMfw=2$c9(e4c4Bg->AdUr_TiByBVH zfZKjXy;M@iBYNfD7w!Y=Q>`Y+;Dk|hp4^YJD!~*B{I=|dsWQmvy-!hge|b%LPt^y)^E1p-+7aC{CanV_#<6HlhMPb5I6AK)mDF^8%LJU)S2L zNd~Duu*OK&K>FOW(bd5O42e%&nOW%xdR!L2s;ZqNirtfQ**j?Te`EEHy~X1oM6jwl zrbu4xS*PE!k3L_ptb2$O@~*qB{;wHKsEE0B_)K=6BHvKf2#4%W1jRK0oa2ZkDL0rf z;qTHJKyEm#c98R7Xzo1Ng6SUC)zBQLjfMl66R1(y7jWp=ocqr*3qXI{->Pr}Ry}Fj zfaimGZIuyep2@{&e}T9$h=<%(R)k2t7>QL5c0!()`u(I7ZF;3?TA zo+yn;<8<8bGoY+i76g{z0>oN5#30rm)j{UxCO<3@4g z2A1e41mGMPq!*jsV=0&SJ;oQO|1jZ=XmnSz#_@1kHl zcdy^;Y%b}Bf1sGGP-f|Yqm_8i(G3{$(nC81NIwTG3H#dff(659DhH|ACSV-WCfh~v zqCjCa|CGm#Hh8uulfWdF{PRfztaYZ~-_)jL_`ZJ2$fos3^ItgF(kq4d>~GTXqS4C+ zJZ~2+sf#T8VFsN)lK^CL&0)^;B&AMb5YZQXJYqZUf8IN#-PYw-9d&X@62KhNE?6eJVNlZQe?c=7O=x)#j}BqGfbit6r^IT^`oO`5hz z-g@cLQ0gMMkbTJRV@;LASJJ?yL9if@({-_v%WJ#U&?}5_tc9P(NOVU|>P5BR3V`%p zq5!AZe`MeR^z(sxpyQpbmvPx+`d3H|9WdvgIzKm7_OsC9^2URBT0owqc3O`ja2l}_S^>JT%p<~=+ea~e;(;A-vSvt2dv#=kR{Q&C;YPQ>auOS zx@_CF?Om=e+g-M8+qPZRWn0tdoVj!F#JnfwPQ?3dt=KzbXRLhIhur_n=O?%v5gBQi z6C=CyB|!$R9tpX>;nG0rsa4DoyN zDAdVXfqk^!0|16XrUMxYN*h+WOYK>fMDi9styRz$8h4lTyuT0wM(~}h6EtZHQGvXw zj$Z!77w8Ba@(ei}eX_vDkHLBW8~NMkeWk#1w|Hmebk)v7fHrHj8l!8@QE89du^5=V zVdGXf3AJ#Wh{Y-yjBf4Fh$r=#XC=e2VJ|Z*P*5*87f?2#O1$Qfg6&F8w02>lApoH3us!zG%r53B>B8VK~p-1h%#ZkL_npPwt7`oyguH zw>u4BX6Tskj77nf?TVbG?t26D5_&Q1Od${N07jWWbFT~N%dc1y^1scn!j(sTmZ*(*b3zGsu`Wz`*+C8d>4AptgE+4fnLPw1hq3=(^g z0nOmaE4OaiNqd1$UfcC4(MFofoo2ltqoOaoOnw1PKC>`KoUn?=h!zS>Bgxo6oJ$=do-_6b*BmgyQEl~);&cW`AYCTg@`JZ|PZ*OH zjLLwVo^4u@WrZIb_Y%QJ(U?)sGi=6-F^&C8T!i>&^{-AqkWAn3n(9=gCE2 zSibskJ0YO3hrJKkH>^#)SZaQA{`9$H&aOTGwb7PcH|*v6RI!?B9dRky3iY6$2w2d; z)|sb8#ZX0vb_}8%|)#@f-A!JMr2xX`3iz~BXjSv3hs+3Zy+Q7vu`Ky zr)H2?u-ohBika)lo!Y#d(6ov_?XbCMXOg&D?sNch_378K;*6C|efJvgv|kEvTfK8_ zZ7KDyn~5!_?86~I&;$LmV4H(n5g?v94Cw+Fh&4PO#Ba-zLtJtmQNm3FDR(d@D9mZE zCt6NS^!c!YT-DJt`NsaigMcnPIXxKNRr?v=HbG^We#xFNs-9n23uE|&9}~GYct*Zj z2E8bb#!IzI{jOBtDm-y;;vlCx2-!jQ{0M;quc@_>dDvBdkc&XC+^yCd6F_%l%ObO# zf_W_ZB7flLGzOLX4E-+Z@7lV;;+C#6rXhDy1K4IQJA>nG3Xydsdxj>kvgv$iIq)&B zb2N#NI|M=z6KDhm9rF-xV4dzl+D1`2K>`ECMx<%kTN>j_GhI__7@p|krVEnms6Kfg zb9tGj+rVe1!A?SwL3DvR0VF)I(i)3NHi7p+g5rlvBp}McItL;)SuNvsf7pbyfbpcX zy=Ma}MDZbIS_)&bLC_ELL;(!rfAdFQ?=B^ya@M9zR9V=Z2hHL$ed@m9c9N@-y24(~ zTIta-;h&jb$*sXDrS3yk2){!F5>%5w$5Q;|O6e-l3HHWV%pnIm07(<7g@A$2ko0ho z>6(DZ0X>tN<&Oj13!|2CPGX`0j}*JlsokRT>Nc65QX%zdlxS@Ex>xZN>vGWq?agY+ z&IiUez06PF@zcXr3T3P?#NX<@iC^Z$7{ZPXEBpiyjdazT^Q)i@SkohvunX>BJ(Gnm zE*{}v#kBp;fbCT)fPct%UPE?+Il>xnYu&e%K)T-|{43a$tws4lB#KVwGZZc1n_5uB?h4T}p z-0j40Rz)rsAd4oEmst6QYC^H68>k@+)vkO^2~IW47PGdUY)$%yI&(Q4aW@`y#2umj z19CT*u*I%MA$xsd0#cnS8`Z-A6QVFGy33~NK@7%YxW^xb;E#;SwW1cd#fzOxOm2-txGzpF1CIiVr)^#zz~&Xm{TGTVIT>Lq2sLy{aZf;g z@fJjGT92B?Z{!am)@N{<^oe@E&U+xn2TAP5R557U3_^_I{i7>`=9=Bf=q44w^jK5j=M=-y3biU}104vOTHzkUDS|B~bSwd)HhB1bx6O5$%LclgzLURnS% zc!MkWPsr<~e%~Ibs||WRnFO>aY%>NR7M*U=F^!4zNKEIeMl5(bAi&M_L1X*z>26=( z1hjG9T`+niFB_}j6Z9XX!q z_{guPAMvUC+4w9!sJ*oIn>>(iO9N`?5TF!u!vtn?(ba}b7Xe4~P`Y}cv>+=uqG3kB z)?Zg^Gb28@KmsSIvxIX5o3DAakh}tUrnCc5Z>27CS+{zbbU#x9U;kuHD9s||zFD#; zpvv%r+Zu(Tl6H&k@Mm@V_4rY!DX#!AQTfbeiM~@2beN8s{5|RMDAp6o3(?K%9Kgra zF;*!BwSjmsGL}8M5*6%v7VGN3;3=uRWjto3N2WrSNouHLD1=#8gC3HBT7=va_MPzj zm5?_iyFY`HI1YBDPB;2E*0FA2)YjrY;NmA)*)@Y}bSSe0OgO({sxnZNAahyMjX0}C zBFn%n1EYr@B-UPHZsu4kn!F1~Iw0bsE;wOMr|DfQ2$FlBodb%Ml*0jAq4qnX7$iBLrq7*muos1gpK0yJe4)wg>y+4{x8t2L=gfS=BY?~6Cs6xu zmEKc^X1CVHjiUxb2mHSP>}sM4sv6>dd&(>QJB*r@@jv>kGyeCQ$^-sy z{yO{Lj_&`a%lc1-f63qf0NBOD{!J-}{F8lG{(GVSd7Ug6EE#MW>=^7B?CnhdWAR-qoJ>s_T-@#dKUU@+ zP&?Q^4T6abFoG7A2v7u00N4ME)UKr>rXl_J!B<&jnSZxA*#ARnXJTggZy*GKzvRNd z5f}dMiT??;|NpT&G#E4){#9D0{{RXY%q-nZ|E?pis}qBr<=^%DFKhUpwfDbP^MCUU zxc)N|K%2daxihGI$VHI13VyAlsDSh=0&;ZwFSLo z1qBPAx4kI}1qn$dgdk5+Nv#G%x?=!Ol#bSd~!$k8lgH%vaPW}uD`Pj z;$1}ggTM^}wOgRU2@h9cn7Y?u=LwV-i$N=l~6!Y zfnOkjfOsrcdi)DmF~UB2&fe?gJ|J0iR3I#ly_{D@B>P}Y43f~Fgn%i^FB*8eOg04t zw#E_)xR9Z^&ogcZ!29Kg?eG*5%3;V8NUx)DuMm<0)>R}e z6zEe3aP2mKZCviR%ZIZl1PE|06colTh_h(!=vNk=d1&9a*1_}+&K_bd=>8u_5Fmi> zm+OhYF&0|15X1-0*ZZ%brpX65SJsg4s1Jsca_V&gBvNW3Sfu1+2oOQSI95S1F&Lyf zzzpxO!C(&m7l|4qxHzcEw-siKJfP*`Jq#2C07eY;Voop28q>z;-`f*zhnNH+PCf#Vy#d?{PlH6ho?t(~UjQEl@?gxnh#(_61hjJC5Ej2N6u#k`{{E4w z3yOudcksHShewN50)d`H6El~en`zVw$ONn*W61^!z*$B03T=KFP3gNu>U#+jD=-?f zLfoE12StK_d{2a-Vh@5oqxJ2UzHWdISpLazWm7<6eMns;Ei42!u(x*r!oI3>q@fZ- zf+~@soc!iU2i`ZLWW~S)>7Bv?@h|8a^TVTsq69{Azl9Jskif!ypLiajeI5A#tT27m ze;3dXj%?si^zVT6u{}P&wd@-*0bn<)5~%oych zCZ6AZ#%1zLW-m|TshV5hEv)(;gq)?Fz8a|I$)BKpJjXw9!tk=jZ&+$Y-Cv@C00)(_V|)LKDkJ9#c{4Qa31ae%d?w^_Axye*Mm2< z#O@lAm@@k9uzi%m7_T9|X1nR+(2w@j%(7q0TZ@r&s+s9G!s)L^MoR=3d2%kQ?w65! zk~@h#Hrb81XxbI5Lu`f~>Q#nniHCuO=NjGuRrYh%8 zjP5F2_04Re<-(VMEhOL0kS!#Qp7X-!#g1#T&c{Oz5DU$*NA4g-{xw3OJI)CO*9e9d3#wjaI%Jf4N+wDl*uda%NmhjXb zp@Q7@IWse9l1G?qS&P`IoEfC6qS+808OWBiNY`tYn$!!L8UjZJqrO-sSH#_3ygPi- zf_Uc8PD*wv;kedh?^&5+sh^xTl+AACyYEe_PYAi#0L-glXA8TT?E(1C78q?l)uowm z$T6ZyrCB@xAnNhdH!z8URi8cQKN5y7q{;z(SN!J6qu5H}@WhR{BcEl{Op6b5;$c5# z(%{e3e~nXi{V0e}H=)n64wpB}@!2tXGm^R=fab9#OWk))G#hbEII&Z46d?;-v}p3?{HWgG2K>2;wP(Iy<>#03$9`=!ZRxjI;FXT|WbBmp1(BxoAH$MAnBZ;^<1AGV10o`@pgyU{;_Q5=ukCaU!w5bbma zJYAj+_AgiRwX^i!vdt)W4E`qs^e zkw6}oHR|vaSj6o7y!Ac}OiZ|Iu+`JfoNG!Ms6-<>0#1D?ge*>*r9}&VKZahPxKvRx z?RsnyWZ6JDQLwI^(>=0ueY3~Cmapi1mmhViJIC0)E8Hyx+yjJ{gLwVP)AK|DJbb;< zF`~YQkKBX~#W92vO zzc2jAIOnq}9gPhuaL2z(zl9kpEWBx6VWD{)mwy6XpB%=m4(TlqhO|T-W*g5vHe=F) z7QH34kmqF4lK&iz(I%f;!Mr5^kR6^|r}mu9dV4!CsX8ocP{9yE24#Sn@g%Tw?#o8;@=!1Kr{6~D z?vuwO4X!YUXjykP2-{Pa7OIBLRCg0z1zgQAKXJ6RSKWB$Y;k@3+E*t|2jp z0T#sP5gDwcdU2c)ST+IwzH(*iU35MVKYV+mbk6CfpMlJUs#H){fWoq`ASiso_x{+M z<8?o2G7$zkTc6$ADMaVE~+@Day)W88Xn8> z?xO5*rT0Oezt^2gUx1$M#Mcev;1tO+bS=KSZT91y4}VX0p)`7T4Rvo*W%YPVhOMe1 z@83EbVk!)LB+eXu0=Qo#Tt7ikwL!*i8q|yx(cTKrOEdNT#*4i}u*lmXQ3Oh4Xj7o& z(dOgY9SMHCx4~uo#yiYaD;T{G61=y{rCCw=JuB=2xlJ4I-A|)9aJ~0_aCG4Mr$C!3 z$jgts`Z}Q#CRi}WB?;N+9@;Sk)wd)1@Ga%mU0&~_lk>T-6%Yd^ufTbuw}X06?I3qq z>E>l~ht`KNUcdKv;lh}1oD>X}7{h>0Xoi(Ts zWE%M1F}tp$q=v>AS0{GP^iF+}^-@CBv1>(>XuI88s!6^@aS6L@N?YWcppgZ%D>x&} z)W3#v8{~$~0T^E;S+ck2jF5P~D_=n?uX>wr{e9rQYs(6oB{-H_ojf;*)N4u-a;EuQ zX%9GEQ^CC&@1SGtuAD&_A&}3%PL(|YE$NtmZh)L~2QjXJk?T^FbicHpMO}w(Sw0`o zueUiu)M@1NE9?IfyP-Z?I6Z7C=DM$z$@tn_B>N0U2S{yg1r^weyNWCo=??ALM)~Y* zu!r+k&#a`<8TEjl{8hIJzo<>In_zRAC05&vaq*qpm{2QkSeOu>0mbs;l&h^d97FrHONED;huA7K zG{x6P0RBa58Vi9-FXqAR>$8mpgu~ z;(Mg3t`~KAU!8wscUBbLdZQdj+LwN(W6aDLEtlS9N!GFuHYIIl(~!Pt2q!T-h4wM3NL+3LZ-5C<~9T(xOGT5{mo^Jhy~ z6kuJAnXOqnQ!tJy0U=e9v&oWTwXS^<(xT_dI9-H12KgHk>rKI*Mbd4&q8)OGIuzli zE_CV$)KMawV$l|#nj4`mFbd*CC9le?hybu|!jP|}L7ea_+*$efr92onaV>1&g@JI~ zL&aJK(??!B@JO8;V&W?2(Ltu+f@Ah;6QEg%JRPjC9MUwNx(UDgyg4v>qGb~{;pNEn zxT~Jw()C*3r*D{6v*c4Nl~f=RE}+5oHMy0Sj^RpcSyifyQrcMBO;Bv$f$v+i0WR8? zjph?-*MSH0J!E)z7u9Ex78~`Q$|)8qvO^_1-3|iRH;*4WRy{ zfA|?E#{FsG`OVjJBYM1~^MeWBYhp>31H-1zG8Zy73^I0LYRk*3Ul^*h>QI}{wd6;h zYV+OP>aF`&|H8Z8Z;8Y=NNjQf=L2Y6wTeGOT`@I{xB><&Gp!2+T)vUBrz5{%WW5-y zQl}5m$7Yn|yABDv1-V|^wu$#0W&j1QJi(I_lA*_2fnhnXAz1X+8e!@BKk*EYG*3|Y zVg@CX%gK1t!6S#s_b4tO-!&_&i%x(!z?RRmJa@pBYL(QTT+`xX@q1*gMwfIia-*%en%?+w7qKep`j$_cb{``}^J`O1<+^OcPEt8nj zRwu9U1GKopxPEW5^-p%Kg&{!KHGHV+Jvu|5b~?I^=aJmVDA>Bg%*M-r*+r^XE1*(Y z2`nj@O}y3^c>eV^Ro-dZ`5}`)wOFFbo z!RkH|m)*57ecHGfjmW#VK=YAWTif?`G(mLi{1>Ugo8PuU$S z`pzw9SehPLaRi|!s+B&vSc4hm9xwwqL4mJ}DJiUQnR`a8kGi{;ywGDxWgrZkSt?nw zUJ0ox4lb8Zm+cU(dlq0gm4z*XJ8aZTHil9vndQ^Ur-)5ABJH+3=C=}4s;4Hd;KjN! z+yH)GS;)Zf!Kh1!<#{l{3jIP+Mh;o9XBf5tIw;ziaq#kh?jn@e6}OU$F{GwyCysR7 zN7YFXx+dm``i1;7Muhn4!@#XOiF6dpi%G2p^@lP+l^_@2N+!TQrX-Q`F#8S4$)01( z*V{TJdFy0@&&}gj^wKU-sm9Kv#G{?Or7=VURKYP3>s#cdDtpWZEiT>LrP)o(kmG~J z%-d67o}lWy_N_hiyl5w+agL`h&Rf)Qb*oN+Dq}!tqN(nTd{3P9NS2_3FGklLNsZgG#z)3 zrN!znM`}o0%4@#^l2gR5UsD0}3V2%}M=Whfa^(XS-a&v_q0!FXOK=UTf_Y1qN$xD$ zD_Mjt&J~URv%aeO?lW0x?xR7Fd+~ICF25Tpj_WwR+J>&rl3VZycqNS}D=Wv*G>V>SUiz5##MILE#QX|heYwyWYK4tAJ{~6K#d$|CkdN6L5COtMArpqzOB0vVSz0A{ z(64~g``Zg5L!mQ1T5WyVpe>W1#<&f3W3g5wN6dObtXaQ~Y+-CfCjuE9O(uWyNq4kP zyt#bG2NaQiQYxIC1lNX5LqgMNih8(7JSqb{F1`w$hm*25H$9n)hkMJ)hyobhP47n% z<;(6(h6YI79va@D?S@{)*c%^Y17R(wun_@o$pqLO9>S813zxSd_^r*~fr6${<>ka4K^%|f(9*mmu{ z?L5u#c9|70)OT8*&2MO8w5&OGE2C@^;}SbbUo0 z$l7D)%&Al+@y6fI-D#F|&7(ZCOzk+7`kVG<1MPK*Y!h#Co8gX#%?*p|{yx?%@T;fwR7VawZR=IGnVIyH%9+9d8_P=3jk z+P3O^{-VBtGUweDo_Xi!hE<`ui%FcqU|R2hZSKA<%Y)&X8WHraWPEVkm$BO%k+i`n z?z7-lqoE-dwDV%`Jy3gJuXx~OB67y6HJwz;XVi(+;8f|PA2bp^?eAj)Bz_q4=h2tR z`cB*S?StvOhFn}WjKcF69f;W=O6i&)l0NCTrKtnUS9cL}r{L>2dJK}k);l!>jAvJg zkTt_Jr6y-7u^97D!D=Ey&xJzi{+dnMhIJZAX?DuEz(ZYr@qMyO)<#RWg!6yyCS2BK zi3)nJ@r>e{jol^8s^E73L*pAEA(HJ$U3ek7*y}Pl#hb?q_n2Wk#MDZqidpDW!L+v^ zMUkn{Z53z;22mOfd9%l;_c7$XjW%a9w`yeI&N0|2&zsuWf5QdwYIS^%72H>$9qcz_ zNOrJIk;PQl`PB}6*klp>5~ZD z=nMG%<`3s_^j~!r3nnykbs5Qu1EOPa-I*PY_mG{x^G~w2)Qb{DPa+p_bi{1X0OX;_ zzhPgqOITDxP1z3suQt4v&YthDx1pyh(rb4i!ECB>*A<)h%%zjbdW>~$x7OLFppTP@ zM1pbZ8NZch;fcviBymKqwd5Ze3*M6xYuJlxA^X-9n4ZdtM4@$`)1@O(c_Gf26uVz( zC@@0YDfYWzlAmY8*&*YV>yoO%U89Fu*~5Eb)!Py;cK#y0Etyg#@Ghj^?K}%@kIg?A zAOX|y$#}Z=DI<^c?&s-CgY=_eFdtiW654YaQ(!s^v=`RfbcP?jW`}Y%ZWobD{v44cM zn*T1W{f8LO#m-2`#Kgo-$icy;3&Zg9UwQ0bJ|2ca*w8`ZpJ^!}J0}Ya!#{rJKeJjL zNf$#KOXHt*<~F8;|3!>v{d?fQ39yZv42@0y`4qrENB_+I|Mz5-`F~3BsUOw*7o z*#9$GW#i&x{HF*H#?Hmep6Yl3LIrRGS5disVwZ3)NWvur!wt<7PJ#d)``Hd*=1*ky zE3YFdAt?!^5J$9~OhicQrxdq}pk>lG*7NrFwcn1`PK#L;%gNUJ+WXe~){OJ?-tlYz z%;><}G88&13<)7vs03(4hJrB@5C}4`Fkye;=H{D36zYCWdeR2a-f@gbK_TE9Q*aI* zc)-9`iV+T@BwP&m3}4Pa4vLVJo{p3VJ^-j6>DOY9zXgY-AoOu~FldH>AYQakYoZfP zzOK(^oZA!D1^ah9xQFcv5D^s>^z5~R;5PPNXk$PgkSx|P{$AA99KnHkj^+PZ$ZSp7>9e2-T-}gP%TFD!JO&d!cG5f zzWL8syolx@kG@SLpyl1*#-F*Hb;$UXoc-{TdNp8`NgH_tXeM76U$ z3!l+n$xz{McyJAMKY2QO75F8R@C+hdgn-tmpZl=v;h_BUc67Wx9F>~<2EQ9P@7rw+p(GLnJZ3|L;>>mcd^R)$LP76Lk4x!!R<*6`|^qom0B?gh-K zD{PNS2t#_E%a43NQBmf00Sg!s2?|Q7pdq24Cxej|2K)O1%m8x%MBi$_ukxio#xdX} zKB+LgrM{_G@2@{Rzpa80|0b(+tSOC9{?7uq96`T++SFp^ecKm*BfRz?f2gN?V~%`x z5TYYelumr zUo&i@B_xFj{o9ebj$}(UZX2o<0maz(JB$f%f#^py1syK*CwD8p2cK@066&zWN5gZC z(};lJN<-_*ji~nQ^`v{85{LC8buxHp5I8LpXEF>e&@{0&4QrPoc!>me?=y4MpAai# z*gzP_CKlMAZaw;8MMG2s=%)?Z`uR+4E&n{=u;tdlc>pke!2w^J`EC8Fy#N)=(I5IS zz`B0y)+(&)aV{Cn8=2a>&bYVl52=WDFnGdyY;UN1H!cmA=2X&-OOjO9)nit%J$QxrBUdqGTrD~s&& zthzVj+kq4u^OZ&(TgvI8`4B6;v4fu>;6kL5Wu99T6UCR}HuL^hTi{dFUYR zBZNCHK6o9;(0o!bj!eijq9?{pB`L-<#ofCW$~!=m_w2F}O?b2sG)&L4(}X;CiRK+w zc^JR%*Hz$hFyU(%w`aeH{=}<@`egEMEjN@BH zSyISElzhTHOFU=aIB*-TBIon*1&${u>><<9g$zE9LX4_*!%VWMl`K zC<~Wp1i1OJ3$%is(@L2u_Q|IHIiK>p%@NRqes4at1^ZX3s|uU5kUzP;`vyeSxDDXX zrBjKKWyg@|ZwqgIq$YGE(kUNx}w9O|*l26vem06xL$UsJ7R zhvWxbvFVg!-g7g`nDdI9#BSYcG%x9d#B;rToURS?uh@d~o+kSn<*dk1Oz z6^-;;bPH~Y89>lnrrh;>@|EtmYzYqDTG`#4CJW`E^}4l^x5zfWRhn7cQdmNDpa~Fd z@ASa=?LFS#rB^L2?#;U|k!U?OMe8U@5e_%xVSP-n1v@PyL{qyx<88|~kwcG=@>{sdJJdna+20bi?tC14Hz!%s)b z$6@oUB1xj4EagNd_PK<5CKdCEJDPqD!;^cfm*i8OpaBGX>lME%8QV*@VJt*_=$`oE>EU=S@IkNKe<- zF9Q~Z3n)}iiIqV?mAOPrzxG#IP=W6TX*1%r2*p3D-)~BbYw^s1H+lvgkEa%l9pXrw zB7@)@bFDf&)?7TgJkDex$s@h0s36dlcRnhZs@*v?#J%4zolH;0ik$W7mRQf6ii*S{`qH;VZ|sVQFB*NXxC!m*Ocg5~xC zaH{+2^Y=)!koz<{*Lg5E3#=uTK1Dw9-K358Ri^Q&I=Enre8iVK4pAi(x~^L!sS^Mi zzpA-7t9W1dXPyef4jF>m(nVubBwxn2<8r0p1=M%m=(_zWh_P*{FCaX7@3x?FUr|Ad z=;lFEn1zk>wNb|r@OHq^=`~&==0aImS}NsVUYcf-%4OkT&aV!o>|anojqjB$#*{s2HnFN?HD!jf1pnu)2B?h?(T|*_dnyl`kN)(|Mq$)#zT-a_gW3xgH10S|)tEO7& zXqR@*8YSL~Cq{>crC>gQ-0|ZuxXoC6qO8d{Nm=)j#lGX(X9z2fKzxNf{Opwa{l#rH zuL&&{aV-BXs2D&;6c-C$Oj*I{C9?WPuf(8WpA=0x$Fyr_-OZ|657-o%D_7kSNu)FcD>USL3YVhuW6pp}r6L5dZaD(&9D z(;DaFSpSC_V!lVPzzrG0pr9BGh0@;MA0i}8)ew=aYjpl@(=I|JzSH@m6 zVT0Kw)VS6fN69LQ-du&u2$gCUUI>Z+zHH}>r7|6+9|_(|J%pEuXeFOv+ShDvK3L|& znu7fqhq(akd2Y;+es7z>9Y_L%<7QOt)t=!ZB4XdcS_dEP&RwO!!E!mW2^mTDK9MsI zp&x4&bkxj7Ly8O0eSWpu@0PXA)JGns4!gOBGI^9{q6{VP<(5nx`%A5*G7m2;x zCTuPcfI$+Pi75?R+6#&bv{UO&dE`FNi5kk*KvGlD)^-I8vFL8l>^Zax*l zQr3oWerUx*sLE%oq-=LD$XYpJ)$3fcU>k3GuFTpppzRZpNjrAp!eDP|Wq70_DM$bm zZumZcJm{PKPZf~~FWEdvZFJb!v$@%`OV?du^er^GqU~mih&gAStX2+e_>~(?Eqr`l z9oLx6K44)rodh~m1VU?PA`IPlVSpGZ6QI7P@ADj8;QNtw6pbv zhr1WUQz-;;Z}uC^3~#kqa&(M5==!Z5)T-Wu1hdqhGcj#hk*iALAVf<|M3!Qtes(7RWw-=ze=@`HwD8>Cyb448on1uO1U6#fcPn52^T&QJ-C4DS zJG2Qe!;)X%57^gb{{uLbV-h&gZoO~n(yrm!KO$~lf_c|iM?(pcFzQ6(I}70rHk?T zLemQ9$#?*9P+AAA7Tk&ME8$_h$=0)@(57VW6^<2hUyGTnwt_Z&TF{zPo*67AYjR!>^bfqE;;> zK+Zr{{A$n@g7hGeT*CCgMaqnnl$oi!mQRwOMd()GK5nRkD_SkLn_QM+c*~U}*@6xs zKc1C`UzuAg7m`k{8^?b2_qncsc174TVzynb)w1MtgjLlj*kn9_7H;z@cP=Js`$sd* z?ZaE;&cOlho#xfrqzu;GUgxT;$OS#Jb!9-~NO689u%v7eREPu17;;ju8J_CPA=PnH zY}mK~*?U#nS7|A;>OSifW%mMSv#86TLXK}ng+hB@cd6Ao%eYr$tN?YVOX#*dBSo@) z0TG2dI%-gUrA>0cQvVF9`pP!dqiz_dxsX^9ttm<2kcP|;-mG2p4Y67-K63+G}Qd<;nG=qlR@%Z*xqFdl(eSta?e&&BQ;Pxpee zjPa1;$1@f8hbQF$H_|DK^5tK|Mv5Wy8?z&cI|KD0+jfTc=}o5BM7`c&3E7_fh%Pru zpf;1$3Mso@zU)^e{+9I;E|N^qrH|2Yr1T39I71U*r{Pt~;LB~X~} zJc5&ZN^M8TZsG>&Ah&>t<@ax$tUb`K}i49X;L+6zNPr)J+T|M$;DD zHFm|7e07oV?7Ph8bXV(b0!n0p8+fHr7sRS@D|Y?>lu+|^*lZZ=m_n#WTh~K6$!6=T zyf4bS`{qhlzi4-tk3-JuF-#veO$XO!h*J7X0xI{>GVui);?JH5zi~oX4*uFg?+vbtmsfgnhyyQNlMQ@RuABQ?>^ucQu-CYeM<&8 zTL`WBaBQc$N2`6iqO3NsjVZb}#M_wb!8#(P5wb*G2L=(6{uG`l5sdab& z?hq`qPc@kRv#poBeOdR1%2KodksF&!xw>xEE&cWEWiUN1)=Hd)h1^B%6g!>+yqh1j z6Xq8w8sSI-bB+Bf7d-G8@oDj@90iw&KMTI7MeAw_gTx<_#JEPY^7p`})V6l9+szTJ z9lRwdXe9-B)EW`Y#6pD(?<@E#&0eVpR(6YgXH3ts(-; z2gcvll)TQ=8zhh-(VWRy$oH;;o*`E&?Gae@cjf1R%$7#n8V(Oj?ui^;bNZ{!;X+=~ zi1E~g+Dc1+`3v>yS4ATN?weKsbk3Txpw3E;DyK)gy%^t9KW)S7Fw6CrLNadc?A8%q zU^A+F%DAWJ%9147*l%bT0Q2$n5v$I0!(kV_a#B*>7N0*wo$QC2hq)ah%Pg zOliSBz6cJWeCFi=tiK^?besTPyFg=l_Y(1eZ9T(q`Cq(J$nCqX8m9`q`sn8WgR*lB z4kQfMY%z{-(A&jcUN`wcfRvH zJbB!|Ya;XFnV4YirS4sM>hX|Taff9$&wipm!^O*B&eg@WqOz0yGp@^cmI5I4g4>^l;#|Ub7#9l_4vEGbFu!mE7thR zoy{xlG#4!74Li}C>xlU)@01JSPVwJ4`AH-ur7!FsV=OJ&6MzPlmXKb3zh~OzO2Icp zpP;p&5e)O3G+jB@+F=`JTPg=@vS5w~MW{o|*E9CY?LwOJWzycZGEAYI3ZjhcBqPj< zMzOuwcM=$)<(ho8*Z(XfUx48n_LBipXl!>ePRu% zEaDnUT+nbcyo@4TBeIW=heDD(51U+iD&EO8Kr*>nf}I`iXvR|l=bh4%+sG49SfMjE z|50r}Rwg=c=dVugYq%PdP0@L2nZS7;P=19t_8=4%L;xanTVhV%9QcJ&XVVB;Dj9Qb zY-b7?QEdH-y{|TIBQd($pl&o+Pt6PEJ6JZ(m%|9XABH_1mD|4I$&Dhs4%`xB+CED|wjWfKE4FnEr{-`hH8X!aS#)$7V^oW95&s^_Af0^q$exyW!};S@kwLf)go$iMlAe z7K9;mQD>QG{CktS;9uCU3yRPF!=zFen1#6YKLCSYe=VqFL2J@~Ay{6J1Lci+WTD;l3vwbt|~ zl7^hit@+!n?m-thm_}j?&Bn-YZy+)8e1MYJAP3j8f;nIO*V~Crb~auy3Mp7W9^I_e zgeE{^5;e3uBDt_7FG1e|@l@itI0-^eC}MD}Tz(><9&04^V#Z)X^_WQ)r5=0OZ7@7M zzEi(jI@@yl&m>$29Z_e{qaqLNt)@$4yut#CTi8DE1Ta?=P)||00TrHUAGpkxx}s zLRR5FiQ<=~Dr~7|;(*WeU&xW4-^LYRgMt2wCo(a836V@+IxIW={|`?TbCmsWc_Q-{ z0Q?_#qMp6Ijmv*S5t;rsMTD;h$4*|G`u3yIum|iID_Oh=96lZ)7ZUiNsVSe7iU9wA z=-&!zUry(LGb8nXLesB!V|sd~|A3~f|9?aN=Zw1l2Q>Y{tN*tl{}Y=2Pvia{#xpxx zvdjk9Pb7w~r}V$ARC+cBCg%Tur$52jnORxlvvEm*h(`$7G>b(@m|g4s3{=XC3sjfI zogetBFUj7t(f*y&IK|otvMN>5QpjnHJCW7xfp!Og2i)DgD%4 z#=K@#U;(Kafl?s&*?HuH6Og(FyM}rOyS&-i)8Kq(KA*9I`UTD-bYzJRJI8<-S9 zC4(5CFjSh2yabAWX%3}(2wrvjz3LXGsv4ASY3b?H;JY&#i0I!IUn&rBDiF6SuqlW@ z;csV0$8a?@L2U=mlSDof>9}1Jlar%&jhwt|xJPgdtWF?gsr+TW50x0>Qs*F;x(+{n z>^$=j90imS{15?ER(5f5K~wNRN2{t${LX~}bm4$kLl%K)`Ak^z!glE-fQ}SAbO8zm zeA%F;>i(J^`BNYo{A*GfzCJ3xI78S+TQ?^=C%T}HkZs0LrbFc46tR5~J{gqXl0i|n zHpfA$YO6k3*E-ujVZiO5R+s12uq`i5Pqv`#tG=oFo%w+LG!sG#feL`uJ<+{R&MwXX zV4vnU=f+VDP0Sz6uUw7`K+NozeU2%6fm;W97f5z~O;t@^XTZ+zopQ_~EgzeTxa;A8 z7b*mHMCV@2FWvW`((BRi{c(GR!)G0*?bDx%4*@L+n69#QGMu*uVQ>DnPyA_hOTqt4 zRQrt|WX;mj(i7VgBnt)PNY8rwMdceHB_p!6DgMyeSBdS}j?*0lGOB{fs}nIA3L6s=Rpw3mdZw4QaNVO%y6r!P}3?FGXK;q@5KNrZxSo#`>F@iM<2qz~1h3@ls z-~9;e7X9`6&>H0N+{dQs2KfLIUsno06V4tkF|uAC{ieV^Sd$o@oa}u;T6p}ey9UOM zKVAktKHb(nou5Bh_W_}20O#&gBet$IV|~-T1;BXwJd!%+bI$y1aLv$E89GHH^VMNN7Lb)Pupq%JqBE;W6SKsAegIXh@2_#w^rodpLv z_T`-q;|O~oiV&?nA1!*??Mq7^(HBm`V^%sgNXd)SZyFGu>)D^52}4Nn%!Y)x(; z1rrkmnPinF?_o`#8)uaoW}tUZ9x0$@R0z65rLbFxxwKu#XAw7x-N214m}>tg@;mG` zi0bAiUmJ*WC{GAt7sazq-zcPR;)nkdXc+_WgVaaq0&(YC)yOAbC4J&Y)?&&C@Po%k zX}>e%lG*t~4WVA9Z% z4?xs8@}tq<|8_j4Da<5T3_iQp@O#2&vN30Gt{l_wby3$NUYBH{LpHO5AiU5crG1qS z*$^;IrZNpnk(nF2-`Vq4nN!lF@+YE-j96g|rs8_$%nKuVkMxVy-`_G!k1deUUs1HD znZ0sJ=TM4-z0^62KN#wb?Vgy%FL*3BO#3+LmgUL$VdcGyK?@ZrKv8e6-a>CAXSSg) zoX!=4Cl6tE81r%!ffqe=<(CycAAu>n-GAm|QO%e8R77cmJrDC9XZ1L@kT8m!Gz*^IW;o*h*O}oEQN6gIaB@YO)YA zj5YK!m>Xq<9eKqDX4-2IimI(hiq3%Y&~P!xYy zNjw*@TGSkrY^xcTK!wLYa>Lh<;iKbEm8+wn9`%Uv-+I-L1tmpdwKH3FP6hguPOa(Z zE2RNS4;avIPl*exq|T4TRMmuYf5^rIxd&;>UdT0)g{P`AQm8x=sMfU&-hQ1sdNyqN z{QfoS?p&^sCKpozJ`WyvP+=nny7T9FCQ5Q6+c2+SH?#XnPfWIxJ&GkY{#iESke*wl zr02G>=eBcnS&-!n^s~a&Hpq${TY(Zum?o#V!k3U zT3Qk63gs9l#?@MceFx;UUpcyDmPHd`sfTTa*LCLN!rHfw&0?U*wp4saVtZ~L^4{VK zeqVSGyR)Q1jo=&ql`SoB!TrU$9fu>F0+ablz_}NsgRFe- zc5hozc&nzd^g{~P-)GXs(9(hn2EEGFd-OgQncK%hCFbl~XFDJ_Wo)g${gis`T!EDS zz+&G>_HTnRs$cXwl-UjbyV1&!__DOd))~Gan$vM64b)?%{!Gx{{ZTEds6N8(tf5H_ z*u!#G9QRaht#s(zxIW7p-j8L9HIU2N1A?FJ(@UzfEWfEduw??h?&*ZV-eEZ zwKC81HJkh34ocvit0cVF{xWkuzbyIhiyq#PSQ=Os&ISjr$*bSrRi0J$;f~Qzlu)1T zrp}(Hl_5sRkchL#!ZRn=P}Thdyt}?vqK<2&)h3C(KA2{-y$}Z3sna(>Yo{p4yXC{Eph3!vP$M6?D3y z?==IGixRd;W?pGaN6=f9>2?rS#?XHxv{a5GavAE*dQBp1@bdugYe5e2Zdx z8T)K?#WCRf7t89NAz`2=K5f+UQN3(qRSx?$J0YgT_R*^|er5G@@W=z_KmJ+~i2asGuY6qCm(5WbF#c6_z@ukI5-1>w3(EFOFR6%`?s?jLl0>t~ko z*FW**I}FNW&kPSw25G!skamXgkY%dPMgbjB3KV@*&j)z&RRU%$IK)fQs7m0= zG5T=V%&oeA9KN2Dv>#ua2W)Jkd$_@L@Y}ffwz<-GgV3@SMzr};qbbo*t%%7>mt@_m zkxNG)#MFO(LfS7$biV?7wy*NWt_%Yc7Ia;bO`6U~2HG~?}0LNXEN1%L1;kHIAv*eQ~u5NJeF4z1r^C7|8m zt1G^VAf`*)n$05v)n2Br+~gI8PrdfSE+TcnL~qO=84T~)9cEz$~C&)cq!x7|4YX)Nz>y%wPIco0* ztoFkj(b(z;zz7P(t<&PY_i9Ounz!~MA!;|dfG8>#KYj>=Dl zEq?qK7~+bPsxVZHt6J4yzFvst_RGTNtj6se5ykWB8TT?C(DR1ORi1>u*NDtzz#4fe zI!7=Q(R3C0kIIa@TFVB(PnO-&=`r!7t0-Oheh01{k-*$+L9^4>i72iW#>KmX88T76 z)5x_P6$8GPx1{}b_ry^eZpGKu9z(O3RygXx7&V&Myclb^gZY57B`MCb)jP#0_L2~5 zWR)d$0GLuoKy^4Kmwc!iS$usna~T-6?N zHt5jk+>gocKwTqn!MRY~g`W9=bG_sIZ9v6Bl`W$agq9D9_Q>4qX64WHDf=*??hp|x z_2BZd9-6mAd&dOZy+do# zlaK*FbdE`2wfOP|ma;<(fXAB?c$ z)SE>RLczLDf4h3+a@fwcDfB^!YTc2O&|J}Uw0!@ZZY-9i5Drlz^zBHT#Ie^bHMn{RSu|sU^svXKkLT}_Q3U@SXel6PkM_ogtg;Cbf$zQjoizf7vrevEJ+hJ*$ zoQ>BBxRgzgM)dR<=JrhUmy=_1U3lu1+h@F4#6#3ImtnajqQc5tHOP7wXKi%P^;iegBpD zg{?lCI5xivXk*GQ$xlPoB6hh7c0vw>NixPUG*{4;Z0f{0g!gU`vLA3kS9#`6$&Vk+ zq>~>fc5mA+!0KFSx^(p~HD7KnJeXBFg_>)k8J4qUL;#^>E&z8ZUOlI>juZAUDk@phL|hAp->y>sLx{)R2F& zhJ~O3ms$xyQ6LS>*=*lXRV@}>R)4O*PYEdx=M=>k96}L!kK-s&n3Lr?xQM}4P5~z# z68GVVm`99kte8AjN~s~bWtuFdkh4Ax^~AjCYB5QO|1djEvq(OcaN%tTh>a!b6l*n| z!)hvU2#XS`83xWF+=Aq4c%Ic^Pduy>5kHv$6*Jc(gqq8>Q)TRl$u@1)NrjSsV^u#x z;}a<%x(-@nFq2g)D3vdr#!|pZhxBDz!I!5AE*~{Z8oXXh~93V+5C%NcU2^AjzDGe zZ&juiS@h(N$Lkw64_)Qv{yAhvye(Y(LyFeG^)WXOYYQf2yB$Bg1dR%pO$|b6PN}x5 zwQ8(c@5FoSH+ukBZTYwzQag`P=M!N7^-5c?Pw9&WgOrh9r{NrmP?uhWhppihKtk`g zb-Ou7>hyBuKxwa?>v)#P*)^}UK>UqkVxI3R9aa5%wgSlOaT#ucihH%K^NqeP`Loo) zmEp|&oE7_v>h4Bs(3Rdd)?Itp#$qLXN)5CU4}#S;Yda9$pjpe9P>|04X;G6v2JKs# zmn|B8@UKW6Y1)&E>%gU<5mfT=*Plj}=skwH)1Y#$?Y5NWu_PvfW%$>TTg)J3hfZ1Q~9_^RO#1XA!Y~^tRFs zVS1zv*j{50t7Ox3#Z(``k)UyQ_ zJIDrr{A2jE9q`HW%5ZVe-CY$OEf=+_H7UCQZ&F;MBpY7yiPdj(wPIpK*fT-mdN!a? zaeJw^I|?`YolB)>h%wRsDC=&c35Ixz=H%UbtCx{R46^nu|$R z7W$EGl}8eO>CF>W&3(2fj!P? z$Ws;-Je~qTf+YntIwGvX)iKB2*w{7_dd$tvrHBmEA(4Si+8nzVdD2g5x3te`G^)0z z8VG2en#I~irRvu5uYm2W5G<(KEq_ypJE~V>y#kwUd)nwp*@temE)V zWsrUvQu`a|YN8&UEoKx1g<%f`*y_Gq^qPoj)5HSZf>Sr%km?>WaeVA#DnLsIKsQX0 z?HSmeCwymj4XdwSVXhhgULq)Z8+{Aw-j6{(3{h5*|Bti}6VpIeS3e|dnRJiPA5~CF zZ{az3G#Dh=cX*?810ihaltZ+-NKm`JB%g`z!)b)>208qAT7@ID(V=uI&NxFwG>>Q# zDGz|*3OTegjl%qWALZUEjp~@WvozT$Qtr7vZa7~X7*cOkb@l4-Z?hTJsT4FzHg%j? z_uVTq-rtjbDr-cmKEgnF4A#9xBDBc#2+4?(7F+@xL7Mo?C_ePWoSh_1qDHjkY*&YF z;28I-lA_%MjUx0LbmZ^s2Jfd%r0$puju^n2@ls7TsV|;QD>V>Q?yR*>Ceu1-js#gb zus0(4)ZjMsmYA6Ah*B-yvp%^c)^6^dKEtj(RgY>(vTa{nxC@59z)Hlbn1XQ$PJBcZ zMa;{L=nePNQf*IK-luI}Y6A5LMt?W>L@Ija(Pl7x;{Wk@&J)PsfP`n2c6r$;yG=oI7*7k+ z3?ir%H^_pI{SN{j3weJDo-`8bZ2`EZuMJJnGanHaf*UAYLq7gUP5xSQ`?VQhrs(VEeXp}y8F$#e@fWcjBqTB23;V`vb zH2d`XM9%druNnO8ryfr}v#`^yS1>pFfu~^GvQbiCRvpTf0$u9zrqYZ<0x1w0vH`F2 zXP-0@sW9YMddxB!!n(1g7?7|-hgCnWsPF|yoN%Z%|rJW=cj!a3?h7caOI`N zKmK?#L?hNf!Ef>t6q>#*v>^aPw)>H`sc$2_*9@dft0RYgDw%uY=VMPfxX^i|gPDKy zX@v#xFk^$}?5n?9vytlvYU@$lrX`e}H1HzEtmqmqsj$=ZvK_70p!0b%6ZOvWL6}#* zn%KqF2}c}X=CSM9ZlNueD0>MWqs29PF}#ZSE>$i_B|_z=3dRwiV+G*x#P4F#hoCOQ z&)@0_cr9hZ8$a6~A-Bm$Qo zmx_&oA)xPO(irqX%{`Ga^DQ|HG79{9K%C&TO>n<&pbAON`#eCEdYF}9zvU}&z zL_|f_4x~fZWUOal4h?`ofc%KhE|sOaOkJBW)$$(qttQm9SVbJ;uW>-b`Z-$06xy1% zF4robnB0PDTIOx$Y#{gHtuq>}GEFfWhJ_W}yIBn!s-AIgXljs%kl4 zvYcT;ztj*)ZsMJWXIi0>ys!9Tov3pH1u{xM0E?BLPkEU=a{&nRun{vN_#Isc|NX=8 zQq!5F*y;K+Mw|Ov5<-mbaF{0djk-ur zFbs@n|Dk2FFa&JH04`;(L{Qb4B_<|F7^lY5M|Z{G&%2t>$a-hkZiS)Ql;fJ*gvEiS zMW+QgkGDH1uu4@(u8sh&NBUG6iuMOOmO!eC0X>V3!rJa#b1o#5rH;?2IEA(AVV$8e)`l$Y)#R4?O{YnTX-HF*P&oE`f?KD zh+*XekX{Yeo8#l7>1)?^Ft-k_M)HA?5Sa`XB~diQxAvvhM&as_oGKpZ-&X};phrED z=I8049YCE?2j`ruGbhpzD7Q%?R3VK$H&bi)KsPRP@B-0Lnmy?HI#)`{C@7;%ti|si zg6Yfql|s@1bOkXRFZ3sPTS1&`^Y^hymlL=o_u^SHB75hjLq<(B2UnXozfI(K*h3CF z%BApQgF)sx&qFT9=5*H9C3M2Ei$u1v*TJWMHv&26K3)+ai6bYDG`-Nt>ot?~+C#MI zVv3d%Pnlioq)S%>59-FEF@sK>zbWp2x(8Nmwl|rYX&H*e$wFw6_Drlp#&PIZocG){ z%TkOLjvUgA6&!kApPYb=;PJg;ln$GiCvawYP1qo~pNe zzXu3+;X|9xxLqTP&gIV zE$m3J69bmwj~lQDyJ5*u0uLq<1?kPG(W+-z6n@ORur6mkS zuvTCBuSSIlut>I<)t{Ri;IJ#+PoV3_PH$N(G=WUQ_L6?z&K(LgItg*IekzI(b^$U_ zr=d2aWe_En`OI5d!rGCs&=+Y&6Tcwf<2HSN;_G1UXFm_+N?Xi^2n?z6 zP(b9g>Y27UX?6C`ya#ODtzmvZssP*ns0CjZG%S=KsF!(#1_ft~pTnJ^_x^R(hKz+k zev?~-4j+jpP@Y$*9%&f!9enrWk8`m`ejCa&k%_;ABBHh26`3>-RZ;5$ec2-xMOV}* zqgF}ZWwaTx)=CSVamXb$iYKoe%oO!!(yI#CwFtEtFj3@ss1}OxsNEqJq6e_>2sqm~ z3SMwVRnp}pCp|>v6ZLNB6?lm$2c{7Ve1vx zxf4w}pCm&je9b@UoTS6!VmRO;BTo(h~{^HndY9rLls3 zH2HV==mz@k>%)8zwvwMeH5KfL8wr+-eNd{TgzS`?Gh=&0E)sJcIvCUuvh?0@yO@IB z?+0=<;e)q~8M30FQf@{J$9eKEn zKnvc{91`$CRZJP~M>cNZdz{U^Ve{-q4Ig#UWNxH3=()5X15wG9LD}3t3ew0{OfFyz zr@EE=WBY!=Knq+x0i`*#&%_ZioSy)E#%ZPIShMaFy%ttX4vhmKDU2tjhWM)VW% zo+JJ_&(3Fomz%o5<2Wo?%$vFAhp9ah)DgOh7!Tj01=BQp`_);F0 zO)dp3NP|C?p=#z2Op?@*B;Ix+y^y7)f&Z&A@ zVyG^NlJ&MMeqSPEYjg^_vs$4COTl7O(-^_4+B%Ww4A3`LJY7VSkB4#(LlT$BO+0;! z{4st4?r#bf0g0gYi=P9CtBZd_yzL1Uos1ih*+F0ld_)xCV0iNfW5cmZ46Sx>9fBx^ zNBW!W;o|j(GTXG?YA_Lj>N~N*$sTCc&>0m)uZ(3vHINoSw>GrQirZ8|gP|-NTA}=? zm@hAo2<+GMAR;yM(cTW$DZ&^tw}>_PU&)7(@VK=in{oy5ThDADk$|GR3L2aT^t{+& zOn2s(B=eeCtX*onf4@$JTxJ5rJ0cVL+SvZJLcwf;3U|~@q=gaUJRUieaguwaL)vEnhY;7y8ph3CdD)mKo~F6Ua1DkNu&I5iZ%7wm#*(8>h(On#l5~ z>QGrG1aAUF5Qh=hDljU^qK5HdvQ<}nQ?s*U4e|l&}vex=Vo{h6KGmzcUnr1 z9lT5O+g25sEFXEb%U$EiWIsb0A?iw3Bi5U7JU@%&5{}(!hNDR)hS3%#GW&^m{53gQ9igPJ}5(IpAE* zBjr7D5TYq)`>D1wd-E8vno37Vs8Nosam`>lY@-HmhfkPAn}?Yw$CUN8p~IPR7~b?| z41f;^$B)O1=+`(|oE!O;)d+4mu!&e!0QnJwzFJ;TM@zV`W*;lU?2@Uu&pjyh(B#EJ zwcS+?Phs&(^n_VS<#Y?b_jSyo0yyT&SWQ*)o9g*>?Vn6mPeI^8^sH+gSMu(hDV;Q8 z%U|Blkiw$q;UHxf!}&sS?(g?YF3J0os%mK7HiaIn*h7n_(B0G(pR?VulQb4j3n6Qt z#OX-^B@KSlfX6jfS0o{)e@K&BW{aq+ZdLg_e7vxfRMOv`ca&Y(`&Qzs3nj8GmafD` zxkoNiu8COGV}@#ZBp_$a-Vx3kVgD6rY=_A*5K_*0#wnD~+%KUtxa2|=4lDNGPwcgZ zCeGuy4GBny1F(1j)t7JO$qz|x*rEmb(`~rjc-7|VE~b~ub`^STwPVd(p8ECGLaX+e zP+ia=H#j*pc7)z~6O8(2dB9_%0XS5+9ObE_AaKv=f_74O?-hYjLW?*Jclox&t5s7x z&)TwrDS;u&IGo7UJk*)A_<0PzGQasUbIi{-&~sflr24%YB4Zn!j5zI%C^ZSGwV7r3 z_+On&hlwt?v=-#I5SficxXZh(*}?1CVAc|F8>!Tx??MKLuIP}fe*nHtu5@~Effoiw%bkWAs3%erb6rnfwz_D;z_TrDef>8z1o5{o7&xWXhYZDH5#h)`aT9ooIeLw!=;MzdiI#p~>4v=Scdcv@Vv}wy_FF&vr6?qAbod*Y z7rtQNL20X6{|WBIr^Tgr*33!5Z@&Aw3Ky$+5#6Gj!t<_J)Ii@kUX&j1ZMaV}Y#9yZ zE?`PD{Mb^XBT-Pf%Ugy7{ARiLJefti?Y!l~^t-^YwxQ0$!~l>mXU|6>g@P-f3438Z z?#AU4YX_O?in?e$EC>(DZdk`g3B|{6KXv9Y+-r`*ZedK9Pnd3Gv+OpT372cM^{Cb3 zYsz?UKvtGiTPqLEw`L8d-jd6_1RkxdqCV^1(Oi>Bm3zhvXKX{?KyM#64C?8f2^Fm5 z?)?iF$-@tRLIQZndY#&c&J?#{3uG`FLpLANrKM(o;bh49PKUVBV0P0eruZafkKkz- zm|=wxwRc1|hr+xCIUMVC(UeR}pU=rBxt7YiOQv?LMP`<}-IYxD#6_IPn1R+`e0}6G z9aS1rn42J;Q*ht&x1unWJp5Bb5h5wp+ag>(oe>=@#&Uwja5@XAH$(nh+ZrqVpNhzB+iD47R5+$S*jOuSW~%_=RALAPQ_xXy1b@Wiq4%TM;DD#Xq6eA5Oe{ zG^|=&ohFp9L;K9oCzY~E=vY%|_p3cIkBX*0&Jo&&+YeF-vDKT?#)BD2OSpxG?P3{T z6k+-Mp3f1Q)j*4fO4=%&l0drQ*y?NGqP)-iW2uk$hzUe_Lz&#`4maCxoqC)wz%r(y zCFSUp#P3pRHz^HOUjKHUUL7rK23M%obL)L>k|;1TZ@LdOQ!xD| z(`KIEoAlxF%fj}Llw{%i)WB`maG^{HM5jU^NjHDcJ9~-<%%yJ&MRV~Ib^247_ray4 z{!M?8S4`ky>}bw~{L%T6fp-_M-Sx)jAPfWq_=0H2HHT+KFRYj@&*Kw{Q9Y)=o1(Mw zn7Gk|NHh63N5XP%3n#*Vw9P2SB6;j5qBwq=lzX}H{3u`A-W#e@7U@*e{JRmp`a943 ztud)8ceHQgK|KrHZV(pY>=oaQ&z$XL$-z>?00dLE*wxeBsEXGnTY#wYgG$c;FbDXy zo_>2b8G1EZiJ86hYQITkZ!jZH_tCGp5mP?&`X0sIqi+Aj)J|egx|E=YAU-{9cQ`{w z3U_2)axt$ar%=_gT)Lt5^13_FAYC&&%xV`@C+~<2qQUaQL!x_a3DEAeONi)uL?d;V z={vI*-pFhoaR|*4L%tNjfGpj&69>4XSgr-;5*=fU&a@pJeOYb89HAFeK%sSF(`nQ> z*D!c>89$}oz48Q&sT$s=YGJ^w2T?ad!*9u;d|li)m@>Dj=HKK~DjY3H7%vP|a%caz zA756I|6x)|_89l`r9e`dNHt%F$Io>^H<=Zn^i|rH$_s&~O$P)e5uw8T z5^TH*8pg|liHFkm#KGG8O|6C1+Rg6-~U=@Hfcl{Yko3b|1mfuLfetLgpv8XLLbY*+HJ>Q z1X0GI2}2?>29a;>LB(SE^c@(=sOtK-YjcU%JgM8t{Fb!6BX^J`@(hV==s9&K;6x1` zBYKvuQJF@42mQjI^1gBCt!sXb$!8%#lH5Qb|7NY-HC-cMm1UJ5Eo8_~R$2x^Yipg5 zXrD*JWW_=dRmBzT0c8Vmxr7p*9ka2!@WK6UBkdeaJzx6vOV z`7fO7=oFu=pNT;Xm(!xZyeR37yf?=i`t}N&*bQ?j)yAXW>v~svLk7ghjiZ2?|9~@V zMcv7c{aU2}vaVwLt|CI@e!eO+$bn!c7Mq{c*%iKv1gWNCqbciH>)$*DMtT0ifCNG< zrfM};HBoc0TN*RUr9E(BzI;cZ#t}4lZhnnl>Z4|ilz(qczFn|)0DB&M<=v+nWUA8@ z{9t%rwSX4%E0>xzodU%J^;!-wQm=z8m7)y^PrU7vfwsx)-3#5wv?s+tt0ZjFbo;ul zU24bjAraiUWH`O0zBpd0?AuHNMjUgyx%#w0r&Ku6tGQ^CX(Iqy=2jY=Oa8ZLs8GUY zYTq40-D{`vhjn8M=9!6##knFpL_J0 z%iC!6mYn|ih#iM|Ct6LfNiB7@fW|lOd^ryf3%W32|9JV^iY0YM!kablNlU#xJI?_A zm%M>R7!!iL_r;x(-UXK*)jY0&-C75b z)n7UbkO7jVTWIn1+EKU)tl7!X4{=Q1C%fNw&Z4$$^*iua3P*5xmcy+*`rSSw$RrWe z$zkq>N?l#NRfvt%BSZy|8uD7@KxeXU$+8jPCU4Hxhl9Zr%7c~w-mNwHb@dR{(-@+8f40Ks@ zQD6~en@Wi=Zdg_(QCgvAP30XlY4Sdk0MR%Nv8jHwf0oAFkA)y7{+v#)lMqY*vq={E z3b1F9I>d8hMqe86T1HR>N4SWj+4238R+L~pz{e9hCV{s_?IR z^K}q6j}jlPo2SZQ_qGa}WbOIL+Yc`m48TsE*mTeUGta?-J0x7`g9L`h%Wf zIO!N-jWQ&XME5j(lV#tom+Xgtx)GgX(i$ zBOZmQDUGd~8x@^78^fOVHc}+(p0rr*ZkSJR4bEnNEyHr>zQ%ZLBn|&+IqAiQU-a=T z$c&_LV{h%#!F0t%^`U&QQ?|jXm{6Cx5+2CD&Or*C*`TYTX4Xan>S|}ofeJi-o47u+ zLsi3R{b>nxPxI}XJstD^S|sf zdFN^Wth2^>SIaYO>)cL?sjo@&QTeab=#b9xk)*<%z)H?GjaA?zT76JC25`>J%NA;X zEvX>i>$1*+RiMf5%BWQ!0sL5haNgFVA58NorK5HO(DIn@oqX{Kz_@oiIQJSQu2s`7 zm7?`7{75lkw+^JT&8JS_H|m4sn??SbWPNbtL;vBzm(0A>`Hjt7W7Sq}zRErZ2**UGF7R{*u^}yc38%H$oka0vNkh|LP)?q!2J5 zVw0k&TJ;%P<>iv)XKu?R%)1(*;y)?2LL0Ey5junfxHGRLU~z<7&ys&s=|gtsCCU5I6OM zUhqZ#cq^#8*ox}qu(WKF8=Hjd` zFDwvP1ROzDpz~@$->Ah!&v6mb%5v0jb&kdqcB86rEJ$D}^x1qeESQu}=7hA}cnEiT z=ZPPJ`3?~$fd}?z^ey8BS@;h2Uzi5o2eT#MrJKd9@7Woui78ew_flFf0l8J>XjqqtR_9!Q)7e>eqM!x&!Z|+2+Di2QioQo11waeFp2Izz0Wk^=(U%%@8m|j zbu#GO{P*IqlI!C|(RZ?#OlESAnmQR%c#^=Hqp8kU)N+}&cc48!# zVm0qlW8!abJP;EytBJE6EBL`7&OJEY+WaC2v_oW^^hw{Aau2KM^L~ z-z@{8-Sl=%ja#Z1r6Q{en>$;hA^TqdREQG8>ceB+B?uBfLC2U zMCV~Pys#btUMpI<5TY)gJ4ls&jr_ zXEUN}J=9n@X0IfYQO<>o%*WfeN~?1rV8P1JOVY+0Pu>vKpP_%4Gt9o#*cZy;8%0fQ zC4<+24wQ_0POJYo4YzpV*Uz8L_YfhO;2)W$O zd;UgwYwlW@oVl7XN$B>NPK_kjtQoTC$hqhbc%gXUDw5@!^IDV#4F=+s!P;sJAQrj! z5NvJneUHJ=W6cRT9$j`=CWmr?;|s5BfSKEweAHn3p7_U~jAV4UZT%kwcLz@7-k8Gw zBJ8fB@(9~5LE{d=9fAjcad&qK1b26rpoL3tcXxMpm*5&axCD1+=$`KBZ`RD;eNu_<)0(CB_~| zQ+=O>>iN0M2gQZX!`*F{XUp)e8TnV`XSN9M+7zG@0MiE&A$$4Fx!{m;*HrRj=o*GE z*R*7Kg<*37hW$#R)7nwDO*e1V&a95PEKfo>tP)HFXkpb5UFGo+Q0cDny}_>*P3=kM z{L1RzmYzz8clt$B-H#s*k z#+9K1sY@%S6^C{y4!+TC9vaTmOd39FhoXR0L7SnXW$(%;AD9xWA|pyzPf1Ey_p-FX z_$+(bv7E^qYS?rVN{XvzqYR=xDJ?Cx%VJ1!@-N!vh@QOV4BWB>H>S>a_DWeqSNDwc zz_4BEUSR~3Nwc|1n+~*X!;Tg0w4@wkF>T+VNKz`+qu~bSp9ZPE-K$pZ@EM)4ZmGaJ z=4m8{36si-XSvNwtiaX0k3_-mas#M`DuuEG60zYc-2}gGUfpEmoD{tt4OL0U7Y>Hg zQ*9&P`S38;t(V;UF^`v-jv> zag|6+yu1#?{;rzG%2?*2(g{yt{0O6S{6oY$>>iAh3^MWf?C=4oDXaX&CU*)fOCRRY zx+-ygG4GU7BB;?<<84@yN$sY;40E>*3T7{F5eoWTwQN$V(o?yXcenSmVRLj(q?#D< z4}B>?*drOv4x!WR&4w=}``zT;HfW}xn(mR;aiFCFA9o)#MrnaQqWJ`qq&3K;zS{1< z9@kmnt9TGrVboAlyesAjHNg#_SKeyQKdfGV@hpB={rPY#QbU!6DXs&i#;#rA!Fce( zmDz;sGK(I(IucIvx>JbRk7Jm&tRFQiw(ibwbI7A=(osk$>f)JOmVI)ov7Z>aqR`h& z{nhOW{VGdVFUR$d6=8qLZ5icVZXDA>l|`Z0yn_$1TYuuEIC0A?*?K3S-#fD(%WyrT z^gBJp7aY!OnQN|Pg=_Yk!IFrKyZCrXGy{7%#vNR$$vu{EqmbY#gst9PGknDoL%MG? zJ=f2n7`v0aZICaifzF<%IU8+G-)y*MbLJTc**5P_S>(|Edd4>qZ#47j-vvrl3Z{Qa ztSVRvzEy9iH3X>ENW+)_Zi`k&X4=CCzK(Bam?z^}S3ES0*4ZXR>NUzij}9lzG3$u{6TFNgJ9M}U*UqSiN4wq zwepo5nLfL_QNfgTZDD6b+Sq;Nl=}sSEPRi8RtA@2<>04H&FmX3aL0Tn+(9XDu1N(8 zcUusY*G@>O6k(de1bd!DE1TNzCFkMsK2S>F`z=<)gsfcoNOQipayR#P)5}N7-}h~^ zw1&(3&Foi%>1uUun?yOg#(e$&Pqd325=XknG`~HijpM650%jC-lJ;PZ)!IuAk z3F_#;sqAzyp4KPqstl8HD|wP^J!M7k#J*o`H}Bm00%H$n-Yw z@A$i$$X5IFs&`w9oj-r|{)efjwH!@%r15rIiTRk8o^ta#z<@=E%A$iNb73ZF1TrAk z+X9*C>@6e~z62}>@Q6F6i@$8gx3TUQorr!{o_Nfsx@r5(W`RgK%MwsI&cU!fnGC## zB*(CIA)tM!D2*TIZjJSQKapBScJh|AfT$8EM4^25p(oA5l5WdmtPqb zIokGvWO`0ne`FLXP9m+3t(BbzQyoGI*8Ck8t&E|pfna>WRW#Sh%Z{{>%{M{tT?E3r zc*F#uuS3tZy6N4meo~}-p=Z*XecgNtH#|~eOXaw}_|D%>1>6alDIet|=v=~YA%e_R z#@3L1P4O|9eDW!;(7vJTO3dtO-`(n8;{?+dDhWc^ef8+O2^RxTY1u>X8AXVD;RcQl z_ttP~0BFerw7RGVDy!cDiMdMu9u-8u98T_gkXkj4{#HYqbHPhCRvzs%Swr+*?TGs?%bj503la)uQPwWYbDijG3 z*C~_ZY;>(31ieFug5)rmIVVm@D{&i*rQy#lW9Ox?y7EFCb zP^y>nQgOxjfNV!^h=EO!IfEsYyOVOO4Chx4hi}K*P3MBYrF{-6_-g`qB$SpDXX8PT zl~^{-P5Xj$-=PNQHtvWU4YKKbItTiA!S;tP;;uDs-`Zm7YH=D{<-Wn(T1E=ot=yj- z0vZ|7i(9^i-LD7CGMUQWP4-NsaRnod+2cJb-8xQ2LmEttc<-~sS#Oe^RV`ykLo4Bk z(0v&xUV3xQ+PCBd>%#KHPQ8%0!;EoE9rP!=6CAv)OKF7@dmc!-N4?w3GvKj`A-`mC=}dgy|3B%^ z<}aYG{GyBE#&*{%2V!{e7G(vDz$Yo5!G0gC;5#?nFFQKesF}bei0CbhVK)JMhZQjP zfEM-1=~8W8(WIUMxPg%jv(67a(mYvf7qq7)iT-jp%Q|Z={0g@Px#BK4Rbh-DcQkR? zUNm<1kwnaje|MtLO_kEO9**i>fKiF3Fi;m+9Jp$&%`;0@U@T3vFp1)?V5wNS%Ddi3 zsjWgDLF4KPhin(-%O7s%1>5Wr%Z|eoGeIv`%OOO_WxDL8&*<0MKlUcbc1oi=dI~nE z+n+Bw!?D1VBR+KSve<4>y6BB&2gPJiAj^M@V<~z&p%k;#{w2Ank2OCzFREYHlB}W5R z62;m>e19~paxhH4v_jtBeCV8l=Zk$fhP6J#w$SgS0MURAh7J?rr5L)fIxQ^?hvZyc zcTxwA;?18nf>~Nwwu6E5^uQlE%kWq*lxdCXzdt>l5AlPcuOfdHAT>Yg-UOmTT(P$N z34VaAxdE(?qia5C*f2AE%#`O~zl3RxA*8DmD_oy-C5g$&QRd-@+Ru&n+exbCrRF`O z6yaHF2}Z%E?@2oc{p&B+#W(r+MO=Jo1cg|C8BR2o7impBrN3CLkO0H6B@%^BLmXoV z!Ct*>JlXuk!d&C-R0XS@?y9ma59*SQI8XAC@;rh#uO&9K7(BVZ^i@pLnwBZ5h1|&N zstgN3uD&pTA73ZEtHUAV z2KKjF$|URT%9lJ)^#d@Fpq-VIY%B}ipDuQZHN)>9Cok>VX`4j(GTjvUg}T!&`H{Sj z6)}Rh!BPkl&)(ylRT04D@_OkXF5pr_2`mUd@)?Il(9MK{20MQ@cJ{HLY5UtxUS&n? z9A0;Py!bo5tvlo{Mjpu7#QY9QmPZq4w^eZ)B!{?MaF#z#s|DnD=LqjM(ZV)!e}9J) z5eRd#)L8f~_8QM(8BOGkPX~F0$aCW?d@62Ey$DuGYnzD`(W6E;O7i2u&2h#J!^0!b z-rWx{Cih8S@qb5v3VDId0xPybu@8?w|P zu_7R;XSD2g`4`!h-LUsvxz};?e9qn;7Nn@G-iFO;s+wC^ELF4_2J>404(aoZxUJ#O z4W~NP-QRqoaY*Fd-{4Et1kb0$`Dmo&+I_TMk_W(~@*{w1h~b+Y^eGS^|%>vW2nFsn(R*yjerEyrxJj#_k5CrYY&3__&7$r&gG@SnX{ zdCfHsQQyY`aapvCPNYS^Y*JMI!QSK<(y82TCNJf88MQU=cN3%co!a)h?oz=al|@@p zFGA<`v@rqSoP#Dfb5z1(e|4`19<<+Dkr6zK1qnJRbfgm<|; z+vEQ53SMt^gsnUaa*$njF^I*4pQv~XbZ&VNXLJZaMLwqxF=?lV@>8x>2@}Q1a|vP9 z?jtV$5E_%T&GS*#rjmA)Dp~dNKto(i7rz`?se%RQPaXC4mXVadMu-N7vT(M#+@tsw zkMG5d6R6<)?FXI5KzQlIj(j|4_j`GfOuYGq3S5+&IvevJL!_%HA?TeO?Xo#zQ8k9b z9O=}9{VtuAEr_en?mxeq@Un7H$q*vwk7Oh?^=3@MLp)lu*~G8$HHE6fpRnK&(7SPA zMnwe5VBAlPSS=&*kq@)kSssbpbFxoSW&@XaI)XC2Si>dlAGx)n2}AYJUEEq_N7@vr zdvVRT6$Je?Iv;pLc#5)A`OE)0qiUvVwHp4I8tt;kNi~z%tE)Q=ACG%^6DB>@&~WLT z%ZxAm+eobmg;O3$vr&B{>{JGhH17iiaC@w;&eFJ}PAF7h-;3u%5>*|Gf=7$f7 z?0vF}XR7M^+ZHz;)33TN7MU*=u>ii-Ivt!BxHTlh;T~?cde~|s20=Nw<3~9Tiyi3A z(2lFT!d9_0YN4Mk2+<=(FVu2g;g*1V82Q)h%Z_6hIz~a6Z33Q!azx@NMnSbXQKbx^ zjHCvbvUizYxI9&lY~`Yq`P#f;^j!!0V^4qUj=P)y?m3IG zDkLHs*Dtx~+i}XHcT8;mX#VqajQ7OP?%?P@E_ifV5Ug@ar4ln25b z>2I6LYMpi|#E_=Wkh0*lWfkD99pnjlFk_1TrpjBJi0>^WQ!>zHh zUl^m!dO2uj&W=CvcpM?|zU>&f39SQa^Yxs!xfp|k5-<60o9GQ)F(8&f%&#WKni#bwn>#$cFYLF%N{fuo( zpx6-*H9#$$n6$0>8}W&gD;N`2>oj@s;2CP|FYav&3!TKEXTz#XfULI*1x$i<1B@Qh zYx^q~J+fN=TIQmyapB=Pguz1`>2*47YY0x|`e{xr5Rv;~=g05eOFnZ2tM$Q)z= zvhZ-QFtr0&f~-K+ARCY^$PQ#@X=e(u2ibo<9Y7AIPL}p2AV*hIXBW%Q^PE7=AZJrs z%m4dyXUm@;7m$mElc_1l#oZp{3UULvgMNZMK%S;f_Wy7Bi|c=M_8}mc+L`>f>*r=- zN~scrB7gh5-L%_5KOq&{&wAKTKBL6*zkH!ZSv*aG#B&|eDPVvw{zo% zB&8$>V&4OYh{i_8z)pfZ5z4A$rnZIBk(I&&ZvfxPj0dx`!=iu+3L*Pj4v?^kp;#c* zftQQ)3OPFFrdC$c`w^4|INS?~oSn`J=@m#0dqY430G_@@U{(C@czs!7!e@Vlh}T2u zph6tn0(xh;!akmJ!J#0;){TtY~)a;Y)T z3E;%R&tgfq@HrvbAmD-n4RJH{p&Wd*2kk|sq@X_c4R8khk4cp*Fmd5sB_JJt+^K$j z?ZdGBBJxol6|mDU6vV(d4+B2@YIW?61REHUFRa9c5Ejx}04&yr0ARMc)aJOOkm>}m z2a!SV#s0#=+in00Dij&18%ZHDQh>;|fy1Ak;v4gvUf>_`-YL?}qYwTS?>~LQTnkJn zGdd(xjFCmC0>`GaTnE3=8u3}bH8MY=eBjZRY3d`gO(eDlcJRg8{Lz6zhy#vm0@4Dq z4m#|JWTrJFx~D^-0KnE=@I|iBfj||zuseYYoGE6bWH=nzJC6FELSwH? zZkRZ!_(`&3;__zelDP;g&Fl!BEaY$uWweB%I;N1IEa zwwD<@<@~4K+BWtcSme6y0~CI}vpUTPJG-d3YVvd&3)<)>!C@)D>lv(6WqF;uP#y@|_&8?U|6Lep0@>F#lt{Tm(0th<|4E}~bAHnCU0@75I` zk9miA#x$`~Gm#2_r}ClnBQ==QdB?RI`#S3kj>JR|fiQRwlMc%wss z1myAyk`NsCd59?l0iY%xd9e$M3~?x|=50on4_avNNMC4TE=d&m&J-Vx72bX8+KCqx zi`Lt1mh?+F@9jIso$0nnQF+KiN8ffr89m+!YfVCJoV#c`iPV5y!y-A*jPCd&pza_u zgY#M9)&g5QFa=$eUQ#)C(IQ3*TtjQFgD=0(=T65AIewHW*fjZeHuOYa5*thD{7kX( z@Ujw1KfUE7*lx&)-hrj?4#A?k(qHc+JzfWn~ea3~DRh5o^ZH#AI< zfm1T2{M$HkT;IJlZseDz($?bsv^!>{d4-TL{$9}WLqsZ#cXtL5YU&`*)GvrxiqdXx z!Ra|Lxhx^JK3M_H@3NX9Hwq!OU1RfA(PtaRY8(Z{StBIP}C%;B! zsv7)obQiC>I#-ebp^>0+%~yVN$bn>=sd?-5DrS)svqyXBg&SE|bR4!;4bN(We=Gf0 zfNH4I#q-&>9HBLP@4!MfDYKrgd6jia2Dhl$5vZl=61y6Yzg~Z`gX!xStNQhxi=x+y zTNjJ&uiFpAOKRf(+_ptYdSGA~l5eCWZR@hvW1gInrw3&N!60)BX5x!>+v&n{9PJAj zC3J2mUgy(O&3ciB3^jTMXKQheVwg-bzjnv4muK~~99_AJrb6WMI|M3{y4|4WH=>q) z13`PX^b=8XoD*t_8#iZ;T{gB<%Z6xwNjkVzJP055M9r{%*KA*I!E_gc3ad{;=LEHgWs17 z?TUS}NLX{n%%e+JJ?2S#M4|eS_DH1m#-vwqNOeek6T9-<4nu!1#-t0Xmr6Ui7)C;`VD<4; zEdoLl-U+h(bSqh}(o5i0Wtr_cZHwf&Gzdf6w!qs<;`;`RT5TM6>cBj$t`6u*nI_^v zeb899Co+?=E{&_WizDzoZtnM@s(D}gK~N!3dtzymZ=WQjO*r7r8J^w;Bow%4< z;&xrs&3Ws7u*ww{?=m|9w%FOF#JFnL;`UAH;YyrwTtL5LV?NE?+Sub(eE~|&SC#}wck+dn2)z(!l=a-LQu{o%lKzKg6_!0-$~9L%;&zq_d$Jbsjhg&O|ua$ z1`&a2dfFc;ttvDonc-Djx}I@dcaNKOK|~)o$}MVUL|uob@%AoAWdWUgT3K{xu!|sD z28^1XB*Wt+0-ujxln86>e+X0xttIAw3*U94xIJa2xwHOttmAFI{e!sT?|#e@YavO> zu?f4HCx6G07wJ^U_;Ef*{CNPjYkL*{vS zO@p4Uy3;ic=ZY}d(HYZ6TCQX;AJSj{I=gR25Et^-uG(*v+hMDqbk5f&xVyUm9hXZ< ze9~VThnL5VcnV%O@q8mGT_-zOIa5pQONGypqq-9k5vKpm*AwDB8F}a`{$0c#T0MOC zG>@51(hmf!)=Y`2I`93Y>@}BXG-YpVSNuv{V9b|>RiE*7&v$g&b9dCS+(IOetcViz z9r|*(BhoCT)#&;}Ix#fT^l364I5gERTU?#1)_UvoXr?~kFY~ry&eK}>;Riy9shho% z-BJB%x?{zCFTQGUhPQ=ww_N3Z2VLMMNWu=|I>xCu`Ao(`fuJ^tEWT8Y$b;!9n3%Zd zs@e{p>K*-{skjQIoK_?GDleNSG$6c@UF{dW{#A#UXTAC|(78|c5Au;UFjU7ZJWMBq z!Iz^67JvS^xr2*>7q7gqsPmS{0%1g|HI`{f`9Z4A5>4%MGd`tr_9^|3rn20n9X%*1Xj~(ZgpFf@pU)$ z4{sfNfL$q*nCdCH_AE_jB$b&LMjJ}o=3*)q<#o5?1~TtLi|0Dg8@Uj9{-p9rI-^Rc znrzEisni-@kqyI$a;%~iM>nP%eGVw~+h(bPC6BhW_IgV(_bGiQaBK|cy*CysRq!0v zhw$pE`scU7sjW3Tg|q+MCV9X>&PDq-pJmLPAX&!pJtZk~eAVvpT(kYQAr;bcYT*e% zwfNVdsz=GI7IqXm_E**ncP7mbk(c>5PIg1^=L^>hoXhMC{ zwe?(J@Avz|P0%m>0qfs`SWsI9XO<1b0%R;vb~N3OmIp+$BTKpOPKI4+yU|X)-aSQ% zXe(lZgcJ{~GM)aSvOYycS>)ThQd~OzlD*ZKgAo?AYP;ET;Ep>RF}cRw^2w5}B|5ZH zx#LW#2ghXI1O~Myf2*f0MpX;5RDcW!imTnU83MpUK?kzs;HnVLPPf}`3snle0`yk z(Vs-1O&5t3ntdrpv25vJ8JB@Ja;*?oTC?^oGeeo421>F=x>iK}k7MFVk5O&?s4!kO zsGrIkK6PYOahF6iiXE*d{9&BzxH(NyLB`GU1`_-)KpwwCrU`ZAY4-HhsCeR^4I-8Juwx!ZTW8eP#$4@7SNKsu2sxt zwNYaP+(m;$!QJfBAxDG{&-QZ~tj=i6n6{|->%bZ&CuT3}+uS)e z{M-m$*mh6-%k@9pqWB!D##j$?8~t7%4Br0$iy!nR!SGt1S6CEeRs&8ISRVd9c!XL3jD@V z@xyzezMXiMfcq9U@#`lMJ0^E13g?eXJfiuULj6bA{tubb|WJ8%Q;| z8ePlpt26hf2=ypfg3IVmW$g58E+F|3fUiSC$@S-Palm0Riy2LUByEFuWyjeE#r?77U3@!mI$yAb8Gy$Y@{0!G# zg*aGq>VOh*PnT>Iqdy7 zWhxJSXsqdiM|1E1=zJ-zGtEJynxJ74fj*EUOsfl(7(QwTc;X%k&68Cb8X5Bnqf3jm2tE#M4Wo^0fs+3h%Wp^| zw^}Z37xd3Owj~BT{9d>-xDW$_xBuslfe)TLZJJe<^2JTtI<~y&lAncO5L-ox8o1xS z_&)tvDMeb$N~bK$fH4n0@gmg{4NM+!Bi+W;{bf(5#m3=90l$l#A@LfH24Fw7JKZaM zQ8uYp^g@<9ivP#L%m-EG9ZP`e{Sb)u6*Lw-NFA9|E{32R8KyW_`<(q8TDv|`N;tb| zA(8~S1Yg$f>vEvkJbqaAhopHOO;Znf2{C-QA34Su>Tf1G^d7Q+|WHETC%=w)gk=*{bz`x~&2BM;E^_Bl!G*fKM%DZocXO|0Y1A z#wGLJY{Y}eA3Kp#(LkRuW;PB_B|HFsZW`OF$LJSYB78 za9q6N6LEL~J$nshNLs}ga|yxF4~NDRm>JZLEYL~Ymrz8Z+VtREmiA1C(ja5}# zHF7@I5)R$R#KxJn05G^HA8~20mWVb_neasgBs3+Al~2u2U?LgI6Ui;&6+ZZ!X2mUW zRw%y{nS`w^IXehZCV!T$YvaY^fjO zeU^jW;`Di~^LL{)duXQ5+QfcYYk&HJ7^M+Kz!#PwDCXwF4p0O4&KeGNgLX$nax}ha z>8GscqcU`LGyV>t)7eoZrYZ9?#aJjHNREKlE58W>*62msi@L%{5;Q( z==1{D9`l5+|20t4Fp|$}QAm>2LCxzb+spt`-0NGFpCg*g_lz2>6sAj=Hr)6^E(=}V zWNSRvlpjxh(d;Q!k+JZUjMVs$N zpLg`Kfja@d7rRs3G?y8?cAfbk0~<|PfKKjLl?Np>ScG@uZ(4q?&XK>@;u2bfcbn|%4^?qX-;vO~%SJM~oCq8(%B30ENW6cP$ z%)s2{bWY=1c-)Vu)lL0oSYrG>N5QD5X^Z4P4(L*dK?}JV`XB!NuK$Tgm!Nekt&1Jl zzVBK6D_Oviy#W_-Eb>{=-F=Ttt6CbUpN|V2X3?jTQzB3kMo=TP-c_O}LB5e3w|wq+sgUNT{d1W31X9 z!sXfgZ|!W%9tW@~6FC7f>%v5Kz_9UhlPi6#T;k*+ z;oxE>;o|%cZ;6BDQxy7N*%CWD3j#>Y^nXT6EF6Xip#RL4m=HiJE~d6>B+N|A{~0ZP z5=f#JhE6J`E+o{S!I3e@2n{ z%$)38Z2uh{s%$e(EZUf(OmC)}%xbn><8WWCZj6#yOKP??SIeK{ptJqAfCx4HQZA=Z15put) z&lVOJ6}^Cd3zC9iOn)3db<7Wq_Y(_UJq&G3EcMM!O>EwQ20!j3ez3CoRTSa%u8%Jv zk(8GfGE|Yk=fjq z*{=8l_0gKs{Sk*$(mb>W%?|LA~xC3%@sLa4r=x`*pji-CsJ_5LTwBI5^G9r>b z3(1*tA-OU%ad|UV)7x5KgP$Va6y4t|6na0@y6OrFst$YHcwgyG0LNM-3B!0qO!9X%w`*Sb@v*(tLg~==6d3`eTW09mBFbjDG!5gc$tR@RuC?H~Y}Xj|-1?MGJUNZEa}djvmO% z3q+X9hY&}wQSkRRW1Fa~5B=?7H?`*Mk5J?fyi&`1`}mKqTyxdKKnAIe{gpZ@6-+Te zP^Cjr$u}XFRH@^i4CZXS)|2%Nr08yJE=;T}jepua`5#tPe%Wc^$AaEg$!bCbFM!tc zyM0Pp*D(=KBkXlt<67+E8~#4FD)ii2LRT)U^eifb^HMv*~&lD zcblWB?8@HE`NpgF@%u7{;OOA=Recf2dhCJzn7-?Q*_fCZK!R&&-vir2u2YyEcc>Z| zCrHDbCpt2Q`3mn!Z>vi8jHk3a^Dl?EZa~-aR*ztOhHdg@<-G0Z$)h8Qs5946sHN;m zhLxM9--WEq#s`LLLOzg?aL*Jrn~TZ3E5|zgVkK-xAQBoVz3brqU2`aRkLZ^{d%_~# z!AUre-@=h)3uKcIaAI3KLVE5R z=4AbG8pryIlDHcm@=J{C#jKkb#u_Ik87!^=O(*Thi&VPVq6#&3HO(guT`oA*w^x`4I)y&0ZDmqV@s zT5x1|`wMtXJ!FhUv(Jm!Y0KjBz)^9lfn2qw*wa^P#HXAj*XT(PXq zyAA@=o}zDtJJV{syC+r?pvfKK)^#{eN@Qfdj@8OS|15n{oAS}V@@(wusUYzX8zY0x zzv#m5O9W|#68kPjZ?eUTaFy2hb zYSKcD?*N6t`eh(K;v`DD8)aiGT1mFN#@tUDu(ii%Hg*d|$wLJFp<8gVT}wz)W9w?B z#!j5Lh_X^dZBAzeW{brv6lzXWTkseRCRt7J>+1$v8TQM@#qZCxgz0ZYow?WQ&5o+c z)gH%=XMOWtP(KLdnX4G+^E1Ej2+BIr=ZL#eyv=j3ohy+ibW zYdJ93@;YoO3du97v}4FQSFolnw56COO});NoS=UeoG0k4s!PR_&maJu48>bpyUr(q2CEd_iD?9 zyJmiGYxO4+k;=nSn4?wIdXT*KN2DM(cm%5`yss;;92d3fugAqAH09!y8)jdxNNewW zV^n%IJ5wL%Leig!gka+R#X#YKbBTq#oD1ai>(4{_A-GBrMeMaZU{s%tKqc8M5v zb<>p=t4LAvt_?bfRFgK6Dr(DZ68~(ZO}Ut6Sd?*O>Dlg8i6vl3gxEH1(t1=&cmR@2 zOw+ig?TWhWym1}J&c1Lst~AxMKjBhGBLOj#e4W{Mmov;4vV>97WA6tQrvp?s+~^}g zE1(L-%F5v;FZ1O)TO94PZ_^Q*Udl{haeGq9X>?)vZP6!ha>e{?LQpVAx8_m|2mbxU zj{MZjt_A0Yc(9Gwa>8ra!U0J&w}1#4{awb+%%2hpzOiS<6qbkVD$b`yYOYfsd8qPS zn4iJpI{Tb;1QRX&=j^Ajy}L5~hC~qz@%?>gD^5&iyD0Gqj3Qo%6(KPaA7WOX!5gS- z!{BI?Uc+ymqowU;jOwt*Oji~0?8O6vic-F}@1WcQdiR-_buywr#ALfcRRA$AEM8tU zXI8fDhaeUaq=ny`oS?{L$^ChaQf)cxAF(eRe=ZcoP4S02l-JVr^xU8OgDV+A@yNm* zGUmVLUG$K5_^TP0x+nKg4AHmcR zj!HP&ZjGD%49-%tnDN+C-xny~Un|aGv@tQSld%6)CgB55LbJ~Opz{z9l2TBqxvkHK zwh*Hs=YeiRGDEO@OeI5J$Wo+A@eezA$4lO@zL45RYaViUO@640wm%NU>Dww(Jr8KW zjD@=uco``^ljPZ2W!1!4qjRD#Km=8*oSD2Psjg<>sB@L~g)#HdBLIeY4V$KDbmoLU zaP!`(q<5nH_0-E>69%HKbh^w6nxHfxNkEv~`c`HLu82!#R?W#|%5B5w* z+cTTb>&&U7ejcR59|M9fRvOiqe--6dJDI*Nljt5Rl}0o_WypOGi-v1oLBE_-Cc3L> zS?5nf5t}?nYY1OS_oGlWPmQi?^y=wd{F`n*N7_Zu4b$p;O)nGCdWjKuh4^Vp7@!IB zou{L`j?W*>siT5jubnanjHCDSvCi;Pji@eiPNMmcqrc(3q5^UDk$sR9Lc7opZa$tO zO`@~K{C~QN^RpYl$k$G!V--M!-gN7_TTIuSVz6qyj!SZycP5N2Pj@$hO&Tt*;U1!; zYG;?Ql|<6I^|p_h&L70y4aLo@?e}#l)qFGA@6f00w8-;C;tlJqzaHAcNennCRkC&* zM&{By@i4~edXCM-v-`K`)D~QG&aQ3z@n#GEk)^b zR=L`Dg1?X|!8MC^`;R<9pwBi(Cz~19@BUB|nRb&@rgHCETXlcQ--*BLa3ZNk`mO!f zilTI2anXQT?87v%i-=-}jFOy&%tdk3Xqz|5iuV^G28V4lRX^`TC{?QWhOU`?=VGvF zU01>Ty)K}lryrgG9r)ZnJXZYp3tuOuN!@pE8L>vYRhiPU15oLNjSMw-RcLB5r+D#u2)+{*KB{cpyL`fN#Vrd zBQbCfUqKw`$n-6DDPxO5HgVcJg{pUyMe0`bC2~b*IbhC=yvbdgF*+3vyujMmpR{b~ ziA;w%D0A5_yfN*07p3v~M$(-U5RJ}2S*@0#-fezif z`*a3qw;k~R>WIVc{mOaZ(FN0~c{~-Dtt;{6#&Akj921SSwa7W2;0%waE%B{grT>XI zjiNEEXR9sbLyltwwG&?m`E9d?Ri36y?>ebg}>5X9#X0#Ecp_^ zXx1b{29EZ%e{3kUxUh$as8a-c|9}f(CPn^N`$I973hrmrla~3fZh5b*E7WYg_j|Z? zKOAgyV-{90@tr#d#R2NJu|9&M^0{>NW+KTJEnRKL1_rI4qlm+4bgMf zQ5$w~tuuNK<>*MP|g_BrLm&0cz5Fy)lu674S7$NlC5zuQ_eHu~^^iruaWf2m61YWtwAS;MQ=FCL8J zWN=9kKJ7R!K|TxF;ieQ|aBR=CSLM1D;$!X;Bkw?~670QQHg5hbH;ZyKlRX58A3nps z%ANmSL%aI6!-+1mlc#glHQu1{ZxeTpL-cWv`O;36@!a37y)xFGxGhVy9BR+HdbR+5I6O9`oZ*4hH#~)yT$y z%PessYj^cRq6zuvnK%zOM_?rOS;{{WSgraX<1A@Npwqyo2Yd<&AtD9b$GehB&uw#?2M`4P9&4zC??v z7YO<@|N4nCqLt8Vo6ytR%0sFp^w${Kd~Jx>-$P_nUGK<}6fA8PP|*Ci>)`Bn$nUk7zb|d1?*6iWDr0}#Zjrjdtad;nIGh$k zpMr#r)$LJ=3Zu-+uwEwlVHXzJFBgRsJ- zrL9C}83)N9a+GQx{z#a)j|JhH>1A%qSej%?xo}5Lw8Gn0FKo#TxQn;5l(H448;>uh zJvPVw$LopdwY^ZDc9`W+CG7Dmt)H1|^t7xQc&i;)^sgng5ZY* zL*$Bv1h$XR+EI&JKfgv3A>-L7V(e|LAVgx*-9*8WCgyHU01@;Is# zIjkNrP*U8h_*IUkDcwJ1T@|j!ozR3ef8jD%pyMSveqDW?Wz4EX__DAxnH|!hx)RA6 ze%Sc;5%`vl%}~W*8+T#C>H$8%#f@CL*n_XY?gX_g$OsL~g!fOGvylJvy0BD3dv5fr zhJTGtS$5odtN<0;h@j9Qaz zBH2JRH~T{G?e+04pO#s}Fju{W4Fp1mMB#yH6u=_;p@Bda@U}7pMe6p$S%yqUgFuwV zUbr@_ML8#Rff7su2`hFyaj`fB@dK&BUsTV)DPl1>=lZ3=tZtPJgDYKlTiPR|Z7Yb!{UlAl)D^sB{hu(p>@q(%s!5c_=|b1f(TIx)qQv z=@KacB?W1um6mT{z#H^_pZ9&fKRUC|Icr~QU2Cl!bJz=pC_W~s8GRk6F~wH~sD7_E zLfS{3f15yq3yJePzYWPJCZ*H>Ep)#-kF8PBXbE-- z6GTm?;1@Vs*Q;PmZHT7%eYTkqwmX;6PL*~R*w~~Me~`Z;^Pyp zu@?``XcdX9$Smcy1`)v4G&(l7yc4k`4z)nHJ}v%u}cP5i9#?CV+o}3FG6}Fi44{TJAPh(q-vCLk6VnxsX8>E+RC_0k_Td-0Q=O?3YF(v2f|^vHkP@VRPsk_SY{sbgge!-Ha?lA;vGkC%aMDg zNlGeDWwR@6_sIKW38Mz-Kyl2Z*CH_@_Z>6T733j76UsHouJyx@bsH)Ra(<`nVQiJR zt@J&1%!N&%~>GpJ2&<7 zQyDgSS>&knbjr?`o(OmEJZr&1@+W0k3|L!r^mL`)mcV;0cwz)6|7@Gm{~b(~9|_A3@Q z(7c?GtYspHZ_wStEcSq9jwJ>c_-R)+EG(v4i8QFL6umP-E*IPuZ;2V6EK^pwdu;P< z=G|klX@AEj9n!B?EJwD9S&a&p65WaxN9Movw%EUEY&ApbeZ`qGC7)dEm>GU+dRDFM z(a{!;e9vmWs6#tVc?1LFK{T@ry|E^_pPNdn-Xix@N%q$bbUM`ekV1*!Vqi9cr~47F zrc$be{_|I1uP9>-e%xSA{iFFmQ`2bgb;K1LB#Mq`6<{2SemEo*0LY&)@6kA7q& zpS;CSPAH<`41Wrri$0w^;Bga>%#nB#^c>uK^Zl2MA>)A*Hxd*checMsnn}5^YW*)$ zR<6Mei%M+x6A?g?f^G4B&jS|Gy&!Z05qhNuov6cJdX)-d4gw`QLABOKW%I+46vQqPStW7T%uytq~bHf(z zaU^&%)tb%SB%CQ+6WJnZ@>B-)v8jKzxf_*AclDe@Nca|}gy8bN*7S-WhzG0d^*arYPP+^rk4wbIRQcgap~nq(*v(gz-f zeMMfIeFek5QxPMR?uD8XI|lFwqvsdwI#ZCS#OT?pSW3U&>AU20i|{c?+=|R@~5{{{eC$yw7LVg<$BUo^DW

t4D_ljwhSUZ-`I;^Z?we!6p)AvV^|%*#`4 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 RyBdc#fAS}P^^2dr`9FqG-U|Q# From 966615479402d129e878a7ecd6a8aebb3308d073 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 6 Mar 2024 17:01:20 +0700 Subject: [PATCH 10/19] Optimize JsonPreprocessor code. --- JsonPreprocessor/CJsonPreprocessor.py | 548 ++++++++++---------------- test/testconfig/TestConfig.py | 6 +- 2 files changed, 204 insertions(+), 350 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index eb7e9f5d..95c1c1a6 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -180,6 +180,7 @@ def __init__(self, syntax: CSyntaxType = CSyntaxType.python , currentCfg : dict import builtins import keyword self.lDataTypes = [name for name, value in vars(builtins).items() if isinstance(value, type)] + self.specialCharacters = r'!@#$%^&*()+=[\]{}|;:\'",<>?/`~' self.lDataTypes.append(keyword.kwlist) self.jsonPath = '' self.lImportedFiles = [] @@ -273,18 +274,18 @@ def __processImportFiles(self, input_data : dict) -> dict: if self.bDuplicatedKeys: tmpOutdict = copy.deepcopy(out_dict) for k1, v1 in tmpOutdict.items(): - pattern2 = "\${\s*[0-9A-Za-z\.\-_]*\.*" + k1 + "\s*}$|\[\s*'" + k1 + "'\s*\]$" - if re.search(pattern2, key): + pattern2 = rf'\${{\s*[^{re.escape(self.specialCharacters)}]*\.*' + k1 + r'\s*}$|\[\s*\'' + k1 + r'\'\s*\]$' + if re.search(pattern2, key, re.UNICODE): bCheck = True dReplacements = {"${" : "", "}" : ""} tmpKey = self.__multipleReplace(key, dReplacements) items = [] if "." in tmpKey: items = tmpKey.split(".") - elif re.search("\['[0-9A-Za-z\.\-_]+'\]", tmpKey): + elif re.search(rf'\[\'[^{re.escape(self.specialCharacters)}]+\'\]', tmpKey, re.UNICODE): try: - rootKey = re.search("^\s*([0-9A-Za-z\.\-_]+)\['.+", tmpKey)[1] - items = re.findall("\['([0-9A-Za-z\.\-_]+)'\]", tmpKey) + rootKey = re.search(rf'^\s*([^{re.escape(self.specialCharacters)}]+)\[\'.+', tmpKey, re.UNICODE)[1] + items = re.findall(rf'\[\'([^{re.escape(self.specialCharacters)}]+)\'\]', tmpKey, re.UNICODE) items.insert(0, rootKey) except: pass @@ -379,8 +380,8 @@ def __checkParamName(self, sInput: str) -> str: / *Type*: str / """ - pattern = "\${\s*([0-9A-Za-z_]+[0-9A-Za-z\.\-_]*)\s*}" - lParams = re.findall(pattern, sInput) + pattern = rf'\${{\s*([^{re.escape(self.specialCharacters)}]+)\s*}}' + lParams = re.findall(pattern, sInput, re.UNICODE) for param in lParams: if "." not in param and param in self.lDataTypes: sInput = re.sub(param, CNameMangling.AVOIDDATATYPE.value + param, sInput, count=1) @@ -409,138 +410,96 @@ def __multipleReplace(self, sInput : str, dReplacements : str) -> str: sOutput = pattern.sub(lambda x: dReplacements[x.group()], sInput) return sOutput - def __nestedParamHandler(self, sInputStr : str, bKey = False) -> list: - """ -This method handles nested variables in parameter names or values. Variable syntax is ${Variable_Name}. + def __nestedParamHandler(self, sInputStr : str, bKey = False, bConvertToStr = False): + ''' + This method handles nested variables in parameter names or values. Variable syntax is ${Variable_Name}. **Arguments:** * ``sInputStr`` - / *Condition*: required / *Type*: str / - - Parameter name or value which contains a nested variable. - -**Returns:** - -* ``lNestedParam`` - - / *Type*: list / - - List of resolved variables which contains in the ``sInputStr``. - """ - def __referVarHandle(referVar : str, sInputStr : str) -> str: - if "." in referVar: - dotdictVariable = re.sub('\$\${\s*(.*?)\s*}', '\\1', referVar) - lDotdictVariable = dotdictVariable.split(".") - lParams = self.__handleDotdictFormat(lDotdictVariable, []) - rootElement = lParams[0] - sParam = '$${' + rootElement + '}' - lParams.pop(0) - for item in lParams: - sParam = sParam + "[" + item + "]" if re.match("^\d+$", item) else sParam + "['" + item + "']" - sInputStr = re.sub(referVar.replace("$", "\$"), sParam, sInputStr) - referVar = '$${' + rootElement + '}' - tmpReferVar = re.sub("\$", "\\$", referVar) - pattern = '(' + tmpReferVar + '\s*(\[+\s*.*?\s*\]+)*)' - variable = re.search(pattern, sInputStr) - return variable[0] - - pattern = "\$\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}" - referVars = re.findall("(" + pattern + ")", sInputStr) - while sInputStr.count("$$") > len(referVars): + Parameter name or value which contains a nested variable. + ''' + def __getNestedValue(sNestedParam : str): + dReplacements = {"$${" : "", "}" : ""} + sParameter = self.__multipleReplace(sNestedParam, dReplacements) + sExec = "value = " + sParameter + try: + ldict = {} + exec(sExec, globals(), ldict) + tmpValue = ldict['value'] + except: + self.__reset(bCleanGlobalVars=True) + raise Exception(f"The variable '{sNestedParam.replace('$$', '$')}' is not available!") + if bKey and (isinstance(tmpValue, list) or isinstance(tmpValue, dict)): + self.__reset(bCleanGlobalVars=True) + errorMsg = f"Found expression '{sNestedParam.replace('$$', '$')}' with at least one parameter of composite data type \ +('{sNestedParam.replace('$$', '$')}' is of type {type(tmpValue)}). Because of this expression is the name of a parameter, \ +only simple data types are allowed to be substituted inside." + raise Exception(errorMsg) + return tmpValue + + def __handleDotInNestedParam(sNestedParam : str) -> str: + ddVar = re.sub(r'\$\${\s*(.*?)\s*}', '\\1', sNestedParam, re.UNICODE) + lddVar = ddVar.split(".") + lElements = self.__handleDotdictFormat(lddVar, []) + sVar = '$${' + lElements[0] + '}' + lElements.pop(0) + for item in lElements: + sVar = sVar + "[" + item + "]" if re.match(r'^\d+$', item) else sVar + "['" + item + "']" + return sVar + + pattern = rf'\$\${{\s*[^{re.escape(self.specialCharacters)}]+\s*}}' + referVars = re.findall("(" + pattern + ")", sInputStr, re.UNICODE) + # Resolve dotdict in sInputStr + for var in referVars: + if var not in sInputStr: + continue + if "." in var: + sVar = __handleDotInNestedParam(var) + sInputStr = sInputStr.replace(var, sVar) + tmpPattern = pattern + rf'(\[\s*\d+\s*\]|\[\s*\'[^{re.escape(self.specialCharacters)}]+\'\s*\])*' + while re.search(tmpPattern, sInputStr, re.UNICODE) and sInputStr.count("$$")>1: + referVars = re.findall(r'(' + tmpPattern + r')[^\[]', sInputStr, re.UNICODE) for var in referVars: - if var not in sInputStr: - continue - if "." in var: - ddVar = re.sub('\$\${\s*(.*?)\s*}', '\\1', var) - lddVar = ddVar.split(".") - lElements = self.__handleDotdictFormat(lddVar, []) - sVar = '$${' + lElements[0] + '}' - lElements.pop(0) - for item in lElements: - sVar = sVar + "[" + item + "]" if re.match("^\d+$", item) else sVar + "['" + item + "']" - sInputStr = sInputStr.replace(var, sVar) - else: - sVar = var - rootVar = re.search('^\s*\$\${(\s*.*?)}', sVar).group(1) - tmpVar = re.sub("\$", "\\$", sVar) - tmpVar = re.sub("((\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)", "", tmpVar) - subPattern = tmpVar + "((\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" - subVar = re.search(subPattern, sInputStr).group(1) - sExec = "value = " + rootVar + subVar - try: - ldict = {} - exec(sExec, globals(), ldict) - tmpValue = ldict['value'] - except: - self.__reset(bCleanGlobalVars=True) - raise Exception(f"The variable '{var.replace('$$', '$')}' is not available!") - if bKey and (isinstance(tmpValue, list) or isinstance(tmpValue, dict)): - self.__reset(bCleanGlobalVars=True) - raise Exception(f"Overwrite the element '{sInputStr.replace('$$', '$')}' failed! \ -Due to the datatype of '{sVar.replace('$$', '$')}' is '{type(tmpValue)}'. Only simple data types are allowed to be substituted inside.") - subPattern = "(" + tmpVar + "(\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" - var = re.sub("\$", "\\$", re.search(subPattern, sInputStr).group(1)) - if re.search("\[.+\]", var): - dReplacements = {"[" : "\[", "]" : "\]"} - var = self.__multipleReplace(var, dReplacements) - sInputStr = re.sub(var, tmpValue, sInputStr) if isinstance(tmpValue, str) else \ - re.sub(var, str(tmpValue), sInputStr) - referVars = re.findall("(" + pattern + ")", sInputStr) - lNestedParam = [] - if len(referVars) > 1: - if not bKey: - for referVar in referVars: - lNestedParam.append(re.sub("\$\$", "$", __referVarHandle(referVar, sInputStr))) - return lNestedParam - else: - sUpdateVar = referVars[0] - referVars = referVars[1:] - tmpPattern = re.sub("\$", "\\$", sUpdateVar) - sInputStr = re.sub(tmpPattern, '', sInputStr, count=1) - for var in referVars[::-1]: - pattern = '(' + var.replace('$', '\$') + '\s*\[\s*.*?\s*\])' - variable = re.findall(pattern, sInputStr) - if variable == []: - sExec = "value = " + re.search('^\s*\$\${(\s*.*?)}', var).group(1) - try: - ldict = {} - exec(sExec, globals(), ldict) - tmpValue = ldict['value'] - except: - self.__reset(bCleanGlobalVars=True) - raise Exception(f"The variable '{var}' is not available!") - if re.search("\[\s*"+ var.replace('$', '\$') +"\s*\]", sInputStr) and isinstance(tmpValue, str): - sInputStr = sInputStr.replace(var, "'" + var + "'") - sInputStr = re.sub(var.replace('$', '\$'), tmpValue, sInputStr) if isinstance(tmpValue, str) else \ - re.sub(var.replace('$', '\$'), str(tmpValue), sInputStr) - continue - while variable != []: - fullVariable = variable[0] - pattern = pattern[:-1] + '\[\s*.*?\s*\])' - variable = re.findall(pattern, sInputStr) - if variable != []: - fullVariable = variable[0] - sExec = "value = " + re.sub('\$\${\s*(.*?)\s*}', '\\1', fullVariable) - try: - ldict = {} - exec(sExec, globals(), ldict) - tmpValue = ldict['value'] - except: - self.__reset(bCleanGlobalVars=True) - raise Exception(f"The variable '{fullVariable}' is not available!") - pattern = re.sub('\[', '\\[', fullVariable) - pattern = re.sub('\]', '\\]', pattern) - pattern = re.sub("\$", "\\$", pattern) - sInputStr = re.sub(pattern, '\'' + tmpValue + '\'', sInputStr) if isinstance(tmpValue, str) else \ - re.sub(pattern, '\'' + str(tmpValue) + '\'', sInputStr) - sKeyHandled = sUpdateVar + sInputStr - lNestedParam.append(re.sub("\$\$", "$", __referVarHandle(sUpdateVar, sKeyHandled))) - return lNestedParam - else: - lNestedParam.append(re.sub("\$\$", "$", __referVarHandle(referVars[0], sInputStr))) - return lNestedParam + sVar = __handleDotInNestedParam(var[0]) if "." in var[0] else var[0] + tmpValue = __getNestedValue(sVar) + while var[0] in sInputStr: + dReplacements = {"$" : "\$", "[" : "\[", "]" : "\]"} + varPattern = self.__multipleReplace(var[0], dReplacements) + if re.search(r"\[['\s]*" + varPattern + r"['\s]*\]", sInputStr): + if re.search(r"\[\s*'\s*" + varPattern + r"\s*'\s*\]", sInputStr): + sInputStr = re.sub(r"\[\s*'\s*" + varPattern + r"\s*'\s*\]", "['" + str(tmpValue) + "']", sInputStr) + elif isinstance(tmpValue, str): + sInputStr = re.sub(r"\[['\s]*" + varPattern + r"['\s]*\]", "['" + tmpValue + "']", sInputStr) + elif isinstance(tmpValue, int): + sInputStr = re.sub(r"\[['\s]*" + varPattern + r"['\s]*\]", "[" + str(tmpValue) + "]", sInputStr) + else: + sInputStr = sInputStr.replace("$$", "$") + var = var[0].replace("$$", "$") + errorMsg = f"Invalid index or dictionary key in parameter '{sInputStr}'. The datatype of variable \ +'{var}' have to 'int' or 'str'." + raise Exception(errorMsg) + else: + sInputStr = sInputStr.replace(var[0], str(tmpValue)) + if sInputStr.count("$$")==1: + tmpPattern = pattern + rf'(\[\s*\d+\s*\]|\[\s*\'[^{re.escape(self.specialCharacters)}]+\'\s*\])*' + if re.match("^" + tmpPattern + "$", sInputStr.strip(), re.UNICODE) and bKey and not bConvertToStr: + rootVar = re.search(pattern, sInputStr, re.UNICODE)[0] + sRootVar = __handleDotInNestedParam(rootVar) if "." in rootVar else rootVar + sInputStr = sInputStr.replace(rootVar, sRootVar) + dReplacements = {"$${" : "", "}" : ""} + return self.__multipleReplace(sInputStr, dReplacements) + var = re.search(tmpPattern, sInputStr, re.UNICODE) + rootVar = re.search(pattern, var[0], re.UNICODE)[0] + sRootVar = __handleDotInNestedParam(rootVar) if "." in rootVar else rootVar + sVar = var[0].replace(rootVar, sRootVar) + tmpValue = __getNestedValue(sVar) + if re.match(r"^\s*" + tmpPattern + r"\s*$", sInputStr, re.UNICODE) and not bKey: + return tmpValue + else: + sInputStr = sInputStr.replace(var[0], str(tmpValue)) + return sInputStr def __handleDotdictFormat(self, lInputListParams : list, lParams: list = []) -> list: """ @@ -590,8 +549,8 @@ def __checkAndCreateNewElement(self, sKey: str, value, bCheck=False, keyNested=' """ This method checks and creates new elements if they are not already existing. """ - rootKey = re.sub("\[.*\]", "", sKey) - subElements = re.findall("\[\s*'([0-9A-Za-z_]+[0-9A-Za-z\.\-_]*)'\s*\]", sKey) + rootKey = re.sub(r'\[.*\]', "", sKey, re.UNICODE) + subElements = re.findall(rf"\[\s*'([^{re.escape(self.specialCharacters)}]*)'\s*\]", sKey, re.UNICODE) if len(subElements) < 1: return True else: @@ -651,8 +610,8 @@ def __jsonUpdated(k, v, oJson, bNested, keyNested = '', bDuplicatedHandle=False) if keyNested != '': if not bDuplicatedHandle: del oJson[keyNested] - rootKey = re.sub("\[.*\]", "", k) - if re.search("^[0-9]+.*$", rootKey): + rootKey = re.sub(r'\[.*\]', "", k, re.UNICODE) + if re.search(r'^[0-9]+.*$', rootKey, re.UNICODE): oJson[f"{rootKey}"] = {} elif rootKey not in globals(): oJson[rootKey] = {} @@ -661,7 +620,7 @@ def __jsonUpdated(k, v, oJson, bNested, keyNested = '', bDuplicatedHandle=False) exec(sExec, globals()) except Exception as error: raise Exception(f"Could not set root key element '{rootKey}'! Reason: {error}") - if re.match("^[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\[.+\]+$", k): + if re.match(rf"^[^{re.escape(self.specialCharacters)}]+\[.+\]+$", k, re.UNICODE): self.__checkAndCreateNewElement(k, v, keyNested=keyNested) sExec = k + " = \"" + v + "\"" if isinstance(v, str) else k + " = " + str(v) try: @@ -695,78 +654,28 @@ def __jsonUpdated(k, v, oJson, bNested, keyNested = '', bDuplicatedHandle=False) globals().update({k:v}) def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): - varPattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}" - indexPattern = "\[\s*-*\d*\s*:\s*-*\d*\s*\]" - dictPattern = "(\[+\s*'[^\$\[\]\(\)]+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*" + varPattern + ".*\]+)*|" + indexPattern + varPattern = rf"\${{\s*[^{re.escape(self.specialCharacters)}]*\s*}}" + indexPattern = r"\[\s*-*\d*\s*:\s*-*\d*\s*\]" + dictPattern = r"(\[+\s*'[^\$\[\]\(\)]+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*" + varPattern + r".*\]+)*|" + indexPattern pattern = varPattern + dictPattern - bStringValue = False bValueConvertString = False if CNameMangling.STRINGCONVERT.value in sInputStr: bValueConvertString = True sInputStr = sInputStr.replace(CNameMangling.STRINGCONVERT.value, '') + sInputStr = re.sub("\$", "$$", sInputStr) initValue = initValue.replace(CNameMangling.STRINGCONVERT.value, '') - if re.search("(str\(\s*" + pattern + "\))", sInputStr.lower()): - sInputStr = re.sub("str\(\s*(" + pattern + ")\s*\)", "$\\1", sInputStr) - bStringValue = True - elif re.match("^\s*" + pattern + "\s*$", sInputStr): + elif re.match(r"^\s*" + pattern + r"\s*$", sInputStr, re.UNICODE): sInputStr = re.sub("\$", "$$", sInputStr) - else: + if sInputStr.count("${") > sInputStr.count("}"): self.__reset(bCleanGlobalVars=True) - while "str(" in initValue: - initValue = re.sub("str\(([\${}0-9A-Za-z\.\-_\[\]]+)\)", "\\1", initValue, count=1) raise Exception(f"Invalid syntax! One or more than one opened or closed curly bracket is missing in expression '{initValue}'.\n \ Please check the configuration file of the executed test!") sInputStr = self.__checkParamName(sInputStr) - valueAfterProcessed = self.__nestedParamHandler(sInputStr) if not bValueConvertString else \ - self.__nestedParamHandler(sInputStr, bKey=bKey) - for valueProcessed in valueAfterProcessed: - if re.search("'\${\s*(.*?)\s*}'", valueProcessed): - tmpNestedList = re.findall("'(\${\s*.*?\s*})'", valueProcessed) - for elem in tmpNestedList: - dReplacements = {"${" : "", "}" : ""} - tmpVar = self.__multipleReplace(elem, dReplacements) - tmpValue = None - try: - ldict = {} - exec(f"value = {tmpVar}", globals(), ldict) - tmpValue = ldict['value'] - del ldict - except: - pass - if tmpValue is not None: - tmpNestedParam = valueProcessed - valueProcessed = valueProcessed.replace(elem, str(tmpValue)) - if tmpNestedParam in self.lNestedParams: - self.lNestedParams.remove(tmpNestedParam) - self.lNestedParams.append(valueProcessed) - tmpValueAfterProcessed = re.sub("'*\${\s*(.*?)\s*}'*", '\\1', valueProcessed) - sExec = "value = " + tmpValueAfterProcessed if isinstance(tmpValueAfterProcessed, str) else \ - "value = " + str(tmpValueAfterProcessed) - try: - ldict = {} - exec(sExec, globals(), ldict) - if bStringValue: - pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}(\[+\s*'[^\$]+'\s*\]+|\[+\s*\d+\s*\]+)*" - sInputStr = re.sub("(\$" + pattern + ")", str(ldict['value']), sInputStr, count=1) - else: - sInputStr = re.sub("\$\$", "$", sInputStr) - sInputStr = str(ldict['value']) if bValueConvertString else ldict['value'] - except: - self.__reset(bCleanGlobalVars=True) - raise Exception(f"The variable '{valueProcessed}' is not available!") - if bKey and type(ldict['value']) in [list, dict]: - if CNameMangling.AVOIDDATATYPE.value in valueProcessed: - valueProcessed = valueProcessed.replace(CNameMangling.AVOIDDATATYPE.value, '') - self.__reset(bCleanGlobalVars=True) - while 'str(' in key: - key = re.sub("str\(([0-9A-Za-z\._\${}'\[\]]+)\)", "\\1", key) - errorMsg = f"Found expression '{key}' with at least one parameter of composite data type \ -('{valueProcessed}' is of type {type(ldict['value'])}). Because of this expression is the name of a parameter, \ -only simple data types are allowed to be substituted inside." - raise Exception(errorMsg) - if "${" not in str(sInputStr): - break - return sInputStr + handledValue = self.__nestedParamHandler(sInputStr) if not bValueConvertString else \ + self.__nestedParamHandler(sInputStr, bKey=bKey, bConvertToStr=bValueConvertString) + if bValueConvertString and not isinstance(handledValue, str): + handledValue = str(handledValue) + return handledValue if bool(self.currentCfg) and not recursive: for k, v in self.currentCfg.items(): @@ -775,7 +684,9 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): globals().update({k:v}) tmpJson = copy.deepcopy(oJson) - pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\$\{\}\-_]*\s*}(\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${.+\s*\]+)*" + sepecialCharacters = r'!@#%^&*()+=[\]|;:\'",<>?/`~' + pattern = rf"\${{\s*[^{re.escape(sepecialCharacters)}]+\s*}}" + pattern = pattern + r"(\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${.+\s*\]+)*" for k, v in tmpJson.items(): if "${" not in k and CNameMangling.DUPLICATEDKEY_01.value not in k: parentParams = k if parentParams=='' else parentParams + "['" + k + "']" @@ -783,10 +694,10 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): bStrConvert = False bImplicitCreation = False bDuplicatedHandle = False - if re.match("^.+" + CNameMangling.DUPLICATEDKEY_01.value + "\d+$", k): + if re.match(r"^.+" + CNameMangling.DUPLICATEDKEY_01.value + r"\d+$", k, re.UNICODE): del oJson[k] dupKey = k - k = re.sub(CNameMangling.DUPLICATEDKEY_01.value + "\d+$", "", k) + k = re.sub(CNameMangling.DUPLICATEDKEY_01.value + r"\d+$", "", k) value = tmpJson[k].pop(1) if "${" not in dupKey and "${" not in str(value): if parentParams != "": @@ -800,13 +711,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): except: pass bDuplicatedHandle = True - if re.search("(str\(" + pattern + "\))", k.lower()): - bStrConvert = True - keyNested = k - bNested = True - while "${" in k: - k = __loadNestedValue(keyNested, k, bKey=True, key=keyNested) - elif CNameMangling.STRINGCONVERT.value in k: + if CNameMangling.STRINGCONVERT.value in k: bStrConvert = True del oJson[k] keyNested = k.replace(CNameMangling.STRINGCONVERT.value, '') @@ -814,18 +719,14 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): bNested = True while "${" in k: k = __loadNestedValue(keyNested, k, bKey=True, key=keyNested) - elif re.match("^\s*" + pattern + "\s*$", k.lower()): + elif re.match(r"^\s*" + pattern + r"\s*$", k, re.UNICODE): keyNested = k - if re.search("\[\s*'*" + pattern + "'*\s*\]", keyNested) or \ - re.search("\." + pattern + "[\.}]+", keyNested): + if re.search(r"\[\s*'*" + pattern + r"'*\s*\]", keyNested, re.UNICODE) or \ + re.search(r"\." + pattern + r"[\.}]+", keyNested, re.UNICODE): bImplicitCreation = True k = re.sub("\$", "$$", k) k = self.__checkParamName(k) - keyAfterProcessed = self.__nestedParamHandler(k, bKey=True) - k = re.sub("\$\$", "$", k) - k = re.sub('^\s*\${\s*(.*?)\s*}', '\\1', keyAfterProcessed[0]) - # Temporary disable implicit creation of data structures based on nested parameters. - # In case check sub-element returns False -> reset() and raise an exception. + k = self.__nestedParamHandler(k, bKey=True) if bImplicitCreation and not self.__checkAndCreateNewElement(k, v, bCheck=True, keyNested=keyNested): self.__reset(bCleanGlobalVars=True) raise Exception(f"The implicit creation of data structures based on nested parameter is not supported. \ @@ -841,7 +742,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): if v[0] != CNameMangling.DUPLICATEDKEY_01.value: tmpValue = [] for item in v: - if isinstance(item, str) and re.search(pattern, item.lower()): + if isinstance(item, str) and re.search(pattern, item, re.UNICODE): bNested = True initItem = item while isinstance(item, str) and "${" in item: @@ -860,7 +761,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): else: i=1 while i str: Nested param ${abc}['xyz'] -> "${abc}['xyz']" - Nested param "${abc}['xyz']" -> "str(${abc}['xyz'])" + Nested param "${abc}['xyz']" -> "${abc}['xyz']__ConvertParameterToString__" """ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: """ @@ -933,10 +834,11 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: tmpList = [] for item in lNestedParam: item = re.sub(r'([$()\[\]])', r'\\\1', item) - pattern = "(\${\s*[0-9A-Za-z\.\-_]*" + item + "[0-9A-Za-z\.\-_]*\s*}(\[\s*.+\s*\])*)" - if re.search(pattern, sInputStr): - sInputStr = re.sub("(" + pattern + ")", "str(\\1)", sInputStr) - tmpResults = re.findall("(str\(" + pattern + "\))", sInputStr) + pattern = rf"(\${{\s*[^{re.escape(self.specialCharacters)}]*" + item + \ + rf"[^{re.escape(self.specialCharacters)}]*\s*}}(\[\s*.+\s*\])*)" + if re.search(pattern, sInputStr, re.UNICODE): + sInputStr = re.sub("(" + pattern + ")", "\\1" + CNameMangling.STRINGCONVERT.value, sInputStr, re.UNICODE) + tmpResults = re.findall("(" + pattern + CNameMangling.STRINGCONVERT.value + ")", sInputStr, re.UNICODE) for result in tmpResults: tmpList.append(result[0]) if tmpList != []: @@ -944,89 +846,40 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: return sInputStr - variablePattern = "[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*" - indexPattern = "\[\s*-*\d*\s*:\s*-*\d*\s*\]" - dictPattern = "\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}.*\]+|" + indexPattern - nestedPattern = "\${\s*" + variablePattern + "(\${\s*" + variablePattern + "\s*})*" + "\s*}(" + dictPattern +")*" - valueStrPattern = "[\"|\']\s*[0-9A-Za-z_\-\s*]+[\"|\']" - valueNumberPattern = "[0-9\.]+" + variablePattern = rf"[^{re.escape(self.specialCharacters)}]+" + indexPattern = r"\[\s*-*\d*\s*:\s*-*\d*\s*\]" + dictPattern = r"\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + r"\s*}.*\]+|" + indexPattern + nestedPattern = r"\${\s*" + variablePattern + r"(\${\s*" + variablePattern + r"\s*})*" + r"\s*}(" + dictPattern + r")*" + valueStrPattern = r"[\"|\']\s*[0-9A-Za-z_\-\s*]+[\"|\']" + valueNumberPattern = r"[0-9\.]+" if "${" in sInputStr: - if re.search("\[[0-9\s]*[A-Za-z_]+[0-9\s]*\]", sInputStr): + if re.search(r"\[[0-9\s]*[A-Za-z_]+[0-9\s]*\]", sInputStr, re.UNICODE): self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid syntax! A sub-element in {sInputStr.strip()} has to enclosed in quotes.") - if re.match("^\s*" + nestedPattern + "[\s,\]}]*$", sInputStr): - sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) - nestedParam = re.sub("^\s*\"(.+)\".*$", "\\1", sInputStr) + if re.match(r"^\s*" + nestedPattern + r"[\s,\]}]*$", sInputStr, re.UNICODE): + sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr, re.UNICODE) + nestedParam = re.sub(r"^\s*\"(.+)\".*$", "\\1", sInputStr) self.lNestedParams.append(nestedParam) - elif re.match("^\s*\"\s*" + nestedPattern + "\"[\s,\]}]*$", sInputStr.lower()): - nestedParam = re.sub("^\s*\"(.+)\".*$", "\\1", sInputStr) + elif re.match(r"^\s*\"\s*" + nestedPattern + r"\"[\s,\]}]*$", sInputStr, re.UNICODE): + nestedParam = re.sub(r"^\s*\"(.+)\".*$", "\\1", sInputStr) self.lNestedParams.append(nestedParam) sInputStr = sInputStr.replace(nestedParam, nestedParam + CNameMangling.STRINGCONVERT.value) - elif ((re.match("[\s{\[]*\".+\"\s*", sInputStr) and sInputStr.count("\"")==2) \ - or (re.match("^\s*\${.+}[,\s]*$", sInputStr) and sInputStr.count("{")==sInputStr.count("}") \ - and not re.search("(? 1: - tmpNested = nestedParam - if "[" in tmpNested: - pattern = "\[[\s']*(\${\s*[0-9A-Za-z\.\-_${}\[\]]*\s*})[\s']*\]" - lNestedBase.append(re.findall(pattern, tmpNested)[0]) - for item in re.findall(pattern, tmpNested): - tmpItem = item - while tmpItem.count("${") > 1: - newItem = re.sub("(\${\s*" + variablePattern + "\s*})", "str(\\1)", item) - tmpNested = tmpNested.replace(item, newItem) - item = newItem - tmpItem = re.sub("(str\(.+\))", "", item) - sInputStr = sInputStr.replace(nestedParam, tmpNested) - patternItem = re.sub(r'([$()\[\]])', r'\\\1', item) - tmpNested = re.sub("(" + patternItem + ")", "str(\\1)", tmpNested) - sInputStr = re.sub("(" + patternItem + ")", "str(\\1)", sInputStr) - pattern = re.sub(r'([$()\[\]])', r'\\\1', tmpNested) - sInputStr = re.sub("(" + pattern + ")", "str(\\1)", sInputStr) - tmpList.append("str(" + tmpNested + ")") - else: - pattern = "(\${\s*" + variablePattern + "\s*})" - lNestedBase.append(re.findall(pattern, tmpNested)[0]) - for item in re.findall(pattern, tmpNested): - patternItem = re.sub(r'([$()\[\]])', r'\\\1', item) - tmpNested = re.sub("(" + patternItem + ")", "str(\\1)", tmpNested) - sInputStr = re.sub("(" + patternItem + ")", "str(\\1)", sInputStr) - pattern = re.sub(r'([$()\[\]])', r'\\\1', tmpNested) - sInputStr = re.sub("(" + pattern + ")", "str(\\1)", sInputStr) - tmpList.append("str(" + tmpNested + ")") - else: - tmpList.append("str(" + nestedParam + ")") - nestedBasePattern = re.sub(r'([$()\[\]])', r'\\\1', nestedParam) - dReplacements = {"{" : "\{", "}" : "\}"} - nestedBasePattern = self.__multipleReplace(nestedBasePattern, dReplacements) - sInputStr = re.sub("(" + nestedBasePattern + ")", "str(\\1)", sInputStr) - lNestedBase.append(nestedParam) - for nestedBase in lNestedBase: - self.lNestedParams.append(nestedBase) - - sInputStr = __recursiveNestedHandling(sInputStr, tmpList) - if re.match("^\s*\${.+}[,\s]*$", sInputStr): - sInputStr = "\"" + sInputStr + "\"" + elif ((re.match(r"[\s{\[]*\".+\"\s*", sInputStr) and sInputStr.count("\"")==2) \ + or (re.match(r"^\s*\${.+}[,\s]*$", sInputStr) and sInputStr.count("{")==sInputStr.count("}") \ + and not re.search(r"(? str: for item in items: tmpItem = item if "${" in item: - if not re.match("^[\s\"]*" + nestedPattern + "[\"\]}\s]*$", item): + if not re.match(r"^[\s\"]*" + nestedPattern + r"[\"\]}\s]*$", item, re.UNICODE): self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid nested parameter format: {item}") - elif re.match("^\s*\".*" + nestedPattern + ".*\"\s*$", item): - item = re.sub("(" + nestedPattern + ")", "str(\\1)", item) + elif re.match(r"^\s*\".*" + nestedPattern + r".*\"\s*$", item, re.UNICODE): + item = re.sub("(" + nestedPattern + ")", "\\1" + CNameMangling.STRINGCONVERT.value, item) tmpList = [] - for subItem in re.findall("(str\(" + nestedPattern + "\))", item): + for subItem in re.findall("(" + nestedPattern + CNameMangling.STRINGCONVERT.value + ")", item, re.UNICODE): tmpList.append(subItem[0]) item = __recursiveNestedHandling(item, tmpList) - elif re.match("^\s*" + nestedPattern + "[\s\]}]*$", item): - item = re.sub("(" + nestedPattern + ")", "\"\\1\"", item) - nestedParam = re.sub("^\s*\"(.+)\".*$", "\\1", item) + elif re.match(r"^\s*" + nestedPattern + r"[\s\]}]*$", item, re.UNICODE): + item = re.sub("(" + nestedPattern + ")", "\"\\1\"", item, re.UNICODE) + nestedParam = re.sub(r"^\s*\"(.+)\".*$", "\\1", item) self.lNestedParams.append(nestedParam) newInputStr = newInputStr + item if tmpItem==items[len(items)-1] else newInputStr + item + "," sInputStr = newInputStr - elif re.search("\${\s*}", sInputStr) \ + elif re.search(r"\${\s*}", sInputStr) \ or (nestedKey and (sInputStr.count("{") != sInputStr.count("}") or sInputStr.count("[") != sInputStr.count("]"))): self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid parameter format: {sInputStr}") - elif nestedKey and re.match("^\s*\${[^\(\)\!@#%\^\&\-\+\/\\\=`~\?]+[}\[\]]+\s*$", sInputStr): - sInputStr = re.sub("^\s*(\${[^\(\)\!@#%\^\&\-\+\/\\\=`~\?]+[}\[\]]+)\s*$", "\"\\1\"", sInputStr) + elif nestedKey and re.match(r"^\s*\${[^\(\)\!@#%\^\&\-\+\/\\\=`~\?]+[}\[\]]+\s*$", sInputStr): + sInputStr = re.sub(r"^\s*(\${[^\(\)\!@#%\^\&\-\+\/\\\=`~\?]+[}\[\]]+)\s*$", "\"\\1\"", sInputStr) else: self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") @@ -1085,6 +938,23 @@ def __checkDotInParamName(self, oJson : dict): if isinstance(v, dict): self.__checkDotInParamName(v) + def __checkNestedParam(self, sInput : str) -> bool: + ''' + Checks nested parameter format. + +**Args:** + + **sInput** (*string*) + ''' + pattern1 = rf"\${{[^{re.escape(self.specialCharacters)}]+\['*.+'*\].*}}" + if re.search(pattern1, sInput, re.UNICODE): + if CNameMangling.STRINGCONVERT.value in sInput: + sInput = sInput.replace(CNameMangling.STRINGCONVERT.value, "") + raise Exception(f"Invalid nested parameter format: '{sInput}'." + "The '[]' or '[]' have to \ +be outside of '${}'.") + else: + return True + def jsonLoad(self, jFile : str, masterFile : bool = True): """ This method is the entry point of JsonPreprocessor. @@ -1150,9 +1020,9 @@ def __checkKeynameFormat(oJson : dict): """ This function checks key names in JSON configuration files. """ - pattern1 = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\['*.+'*\]\s*}" + pattern1 = rf"\${{\s*[^{re.escape(self.specialCharacters)}]*\['*.+'*\]\s*}}" for k, v in oJson.items(): - if re.search(pattern1, k): + if re.search(pattern1, k, re.UNICODE): errorMsg = f"Invalid syntax: Found index or sub-element inside curly brackets in the parameter '{k}'" self.__reset(bCleanGlobalVars=True) raise Exception(errorMsg) @@ -1172,7 +1042,7 @@ def __checkKeynameFormat(oJson : dict): self.__reset(bCleanGlobalVars=True) raise Exception(f"Could not read json file '{jFile}' due to: '{reason}'!") - pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}(\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+)*" + pattern = rf"\${{\s*[^{re.escape(self.specialCharacters)}]*\s*}}(\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+)*" sJsonDataUpdated = "" for line in sJsonData.splitlines(): if line == '' or line.isspace(): @@ -1183,15 +1053,15 @@ def __checkKeynameFormat(oJson : dict): self.__reset(bCleanGlobalVars=True) raise Exception(f"\n{str(error)} in line: '{line}'") - if re.search(pattern, line): - lNestedVar = re.findall("\${\s*([0-9A-Za-z_]+[0-9A-Za-z\.\-_]*)\s*}", line) + if re.search(pattern, line, re.UNICODE): + lNestedVar = re.findall(rf"\${{\s*([^{re.escape(self.specialCharacters)}]+)\s*}}", line, re.UNICODE) for nestedVar in lNestedVar: if nestedVar[0].isdigit(): self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid parameter format in line: {line.strip()}") - tmpList = re.findall("(\"[^\"]+\")", line) - line = re.sub("(\"[^\"]+\")", CNameMangling.COLONS.value, line) - indexPattern = "\[\s*-*\d*\s*:\s*-*\d*\s*\]" + tmpList = re.findall(r"(\"[^\"]+\")", line) + line = re.sub(r"(\"[^\"]+\")", CNameMangling.COLONS.value, line) + indexPattern = r"\[\s*-*\d*\s*:\s*-*\d*\s*\]" if re.search(indexPattern, line): indexList = re.findall(indexPattern, line) line = re.sub("(" + indexPattern + ")", CNameMangling.LISTINDEX.value, line) @@ -1200,7 +1070,7 @@ def __checkKeynameFormat(oJson : dict): i=0 for item in items: nestedKey = False - nestedKeyPattern = "^\s*,\s*\${.+[\]}]\s*$" + nestedKeyPattern = r"^\s*,\s*\${.+[\]}]\s*$" if i==0 or re.match(nestedKeyPattern, item): nestedKey = True if CNameMangling.COLONS.value in item: @@ -1213,29 +1083,29 @@ def __checkKeynameFormat(oJson : dict): indexList.pop(0) i+=1 newSubItem = "" - if re.search("^\s*\[.+\][\s,]*$", item) and item.count('[')==item.count(']'): + if re.search(r"^\s*\[.+\][\s,]*$", item) and item.count('[')==item.count(']'): item = item.strip() bLastElement = True if item.endswith(","): bLastElement = False - item = re.sub("^\[", "", item) - item = re.sub("\s*\][\s,]*$", "", item) + item = re.sub(r"^\[", "", item) + item = re.sub(r"\s*\][\s,]*$", "", item) newSubItem = __handleListElements(item) newSubItem = "[" + newSubItem + "]" if bLastElement else "[" + newSubItem + "]," - elif re.search("^\s*\[.*\${.+", item): + elif re.search(r"^\s*\[.*\${.+", item): item = item.strip() - item = re.sub("^\[", "", item) + item = re.sub(r"^\[", "", item) newSubItem = __handleListElements(item) newSubItem = "[" + newSubItem - elif re.search("]\s*,*\s*", item) and item.count('[') < item.count(']'): + elif re.search(r"]\s*,*\s*", item) and item.count('[') < item.count(']'): item = item.rstrip() bLastElement = True if item.endswith(","): bLastElement = False - item = re.sub("\s*\][\s,]*$", "", item) + item = re.sub(r"\s*\][\s,]*$", "", item) newSubItem = __handleListElements(item) newSubItem = newSubItem + "]" if bLastElement else newSubItem + "]," - elif re.match("^[\s\"]*\${.+[}\]]+[\"\s]*,[\s\"]*\${.+[}\]]+[\"\s]*$", item): + elif re.match(r"^[\s\"]*\${.+[}\]]+[\"\s]*,[\s\"]*\${.+[}\]]+[\"\s]*$", item): subItems = re.split("\s*,\s*", item) subItem1 = self.__checkAndUpdateKeyValue(subItems[0], nestedKey) subItem2 = self.__checkAndUpdateKeyValue(subItems[1], nestedKey=True) @@ -1249,14 +1119,14 @@ def __checkKeynameFormat(oJson : dict): for nestedParam in self.lNestedParams: dReplacements = {"$" : "\$", "[" : "\[", "]" : "\]"} tmpNestedParam = self.__multipleReplace(nestedParam, dReplacements) - if re.search("(\s*\"str\(" + tmpNestedParam + "\)\"\s*:)", newLine.replace(CNameMangling.STRINGCONVERT.value, '')) \ - or re.search("(\s*\"" + tmpNestedParam + "\"\s*:)", newLine.replace(CNameMangling.STRINGCONVERT.value, '')): + if re.search(r"(\s*\"str\(" + tmpNestedParam + "\)\"\s*:)", newLine.replace(CNameMangling.STRINGCONVERT.value, '')) \ + or re.search(r"(\s*\"" + tmpNestedParam + r"\"\s*:)", newLine.replace(CNameMangling.STRINGCONVERT.value, '')): self.lNestedParams.remove(nestedParam) sJsonDataUpdated = sJsonDataUpdated + newLine + "\n" else: if "${" in line: self.__reset(bCleanGlobalVars=True) - invalidPattern1 = "\${\s*[0-9A-Za-z\._]*\[.+\][0-9A-Za-z\._]*\s*}" + invalidPattern1 = r"\${\s*[0-9A-Za-z\._]*\[.+\][0-9A-Za-z\._]*\s*}" if re.search(invalidPattern1, line): raise Exception(f"Invalid syntax: Found index inside curly brackets in line '{line.strip()}'. \ Indices in square brackets have to be placed outside the curly brackets.") @@ -1299,7 +1169,7 @@ def __checkKeynameFormat(oJson : dict): if masterFile: oJson = __handleDuplicatedKey(oJson) for k, v in oJson.items(): - if re.match("^[0-9]+.*$", k) or re.match("^[\s\"]*\${.+}[\s\"]*$", k) \ + if re.match(r"^[0-9]+.*$", k) or re.match(r"^[\s\"]*\${.+}[\s\"]*$", k) \ or CNameMangling.DUPLICATEDKEY_01.value in k: continue if k in self.lDataTypes: @@ -1330,21 +1200,6 @@ def __checkKeynameFormat(oJson : dict): exec(sExec) except: pass - - # Checking availability of nested parameters before updating and replacing. - for param in self.lNestedParams: - param = self.__checkParamName(param) - param = re.sub("\${", "$${", param) - parseNestedParam = self.__nestedParamHandler(param) - tmpParseNestedParam = re.sub("'*\${\s*(.*?)\s*}'*", '\\1', parseNestedParam[0]) - sExec = "value = " + tmpParseNestedParam if isinstance(tmpParseNestedParam, str) else \ - "value = " + str(tmpParseNestedParam) - try: - ldict = {} - exec(sExec, globals(), ldict) - except: - self.__reset(bCleanGlobalVars=True) - raise Exception(f"The variable '{parseNestedParam[0]}' is not available!") self.__reset() __removeDuplicatedKey(oJson) @@ -1374,7 +1229,6 @@ def jsonDump(self, oJson : dict, outFile : str) -> str: Normalized path and name of the JSON output file. """ - outFile = CString.NormalizePath(outFile, sReferencePathAbs=os.path.dirname(os.path.abspath(sys.argv[0]))) jsonObject = json.dumps(oJson, ensure_ascii=False, indent=4) try: diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 10422148..fba019ba 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -2445,7 +2445,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1053.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Only simple data types are allowed to be substituted inside" +dictUsecase['EXPECTEDEXCEPTION'] = "only simple data types are allowed to be substituted inside" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -2459,7 +2459,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1054.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Only simple data types are allowed to be substituted inside" +dictUsecase['EXPECTEDEXCEPTION'] = "only simple data types are allowed to be substituted inside" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -2473,7 +2473,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1055.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Only simple data types are allowed to be substituted inside" +dictUsecase['EXPECTEDEXCEPTION'] = "only simple data types are allowed to be substituted inside" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase From ce226c15d5a0e357ba3d7df85db2551c8d41c747 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 6 Mar 2024 19:13:45 +0700 Subject: [PATCH 11/19] Update a interface descriptions --- JsonPreprocessor/CJsonPreprocessor.py | 34 ++++++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 95c1c1a6..e4e7f8ef 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -411,15 +411,25 @@ def __multipleReplace(self, sInput : str, dReplacements : str) -> str: return sOutput def __nestedParamHandler(self, sInputStr : str, bKey = False, bConvertToStr = False): - ''' - This method handles nested variables in parameter names or values. Variable syntax is ${Variable_Name}. + """ +This method handles nested variables in parameter names or values. Variable syntax is ${Variable_Name}. **Arguments:** * ``sInputStr`` - Parameter name or value which contains a nested variable. - ''' + / *Condition*: required / *Type*: str / + + Parameter name or value which contains a nested variable. + +**Returns:** + +* ``lNestedParam`` + + / *Type*: list / + + List of resolved variables which contains in the ``sInputStr``. + """ def __getNestedValue(sNestedParam : str): dReplacements = {"$${" : "", "}" : ""} sParameter = self.__multipleReplace(sNestedParam, dReplacements) @@ -939,13 +949,19 @@ def __checkDotInParamName(self, oJson : dict): self.__checkDotInParamName(v) def __checkNestedParam(self, sInput : str) -> bool: - ''' - Checks nested parameter format. + """ +Checks nested parameter format. -**Args:** +**Arguments:** - **sInput** (*string*) - ''' +* ``sInput`` + + / *Condition*: required / *Type*: str / + +**Returns:** + + *raise exception if nested parameter format invalid* + """ pattern1 = rf"\${{[^{re.escape(self.specialCharacters)}]+\['*.+'*\].*}}" if re.search(pattern1, sInput, re.UNICODE): if CNameMangling.STRINGCONVERT.value in sInput: From 7bff0b411af9a41962ae4bffb93ea041f73db621 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Wed, 6 Mar 2024 15:34:53 +0100 Subject: [PATCH 12/19] Activated self test JPP_0515 --- test/JPP_TestUsecases.csv | 1 + test/JPP_TestUsecases.html | 83 +++++++++++++------ test/JPP_TestUsecases.rst | 12 ++- test/JPP_TestUsecases.txt | 6 +- test/component_test.py | 4 +- .../test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py | 10 ++- test/testconfig/TestConfig.py | 18 +++- test/testfiles/jpp-test_config_0515.jsonp | 13 ++- 8 files changed, 110 insertions(+), 37 deletions(-) diff --git a/test/JPP_TestUsecases.csv b/test/JPP_TestUsecases.csv index 5bf2f164..2b0eadb0 100644 --- a/test/JPP_TestUsecases.csv +++ b/test/JPP_TestUsecases.csv @@ -75,6 +75,7 @@ JPP_0510|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several parameter a JPP_0511|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing a list; list index is defined by a parameter JPP_0512|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing a nested use of lists and dictionaries, with the same parameter used several times within the same expression JPP_0513|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several square bracket expressions (as list index and dictionary key) with and without single quotes +JPP_0515|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing nested dollar operator expressions JPP_0550|COMPOSITE_EXPRESSIONS|BADCASE|JSON file with composite data structure (nested lists and dictionaries / some key names with dots inside) JPP_0551|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter and wrapped in single quotes JPP_0552|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax) diff --git a/test/JPP_TestUsecases.html b/test/JPP_TestUsecases.html index 87519d94..8e45afc4 100644 --- a/test/JPP_TestUsecases.html +++ b/test/JPP_TestUsecases.html @@ -2539,6 +2539,39 @@ 76 + + + +JPP_0515 + + + + +COMPOSITE_EXPRESSIONS + + + + +GOODCASE + + + + +JSON file containing nested dollar operator expressions
+Expected: JsonPreprocessor returns expected value + + +
+ + + + + + + +77 + + @@ -2570,7 +2603,7 @@ -77 +78 @@ -2604,7 +2637,7 @@ -78 +79 @@ -2637,7 +2670,7 @@ -79 +80 @@ -2670,7 +2703,7 @@ -80 +81 @@ -2703,7 +2736,7 @@ -81 +82 @@ -2736,7 +2769,7 @@ -82 +83 @@ -2769,7 +2802,7 @@ -83 +84 @@ -2802,7 +2835,7 @@ -84 +85 @@ -2835,7 +2868,7 @@ -85 +86 @@ -2868,7 +2901,7 @@ -86 +87 @@ -2901,7 +2934,7 @@ -87 +88 @@ -2934,7 +2967,7 @@ -88 +89 @@ -2967,7 +3000,7 @@ -89 +90 @@ -3000,7 +3033,7 @@ -90 +91 @@ -3033,7 +3066,7 @@ -91 +92 @@ -3066,7 +3099,7 @@ -92 +93 @@ -3099,7 +3132,7 @@ -93 +94 @@ -3132,7 +3165,7 @@ -94 +95 @@ -3165,7 +3198,7 @@ -95 +96 @@ -3198,7 +3231,7 @@ -96 +97 @@ -3231,7 +3264,7 @@ -97 +98 @@ -3264,7 +3297,7 @@ -98 +99 @@ -3297,7 +3330,7 @@ -99 +100 @@ -3330,7 +3363,7 @@ -100 +101 @@ -3364,7 +3397,7 @@

 

-
Generated: 24.01.2024 - 13:56:16
+
Generated: 06.03.2024 - 15:28:57
 
diff --git a/test/JPP_TestUsecases.rst b/test/JPP_TestUsecases.rst index adf38a52..3490739e 100644 --- a/test/JPP_TestUsecases.rst +++ b/test/JPP_TestUsecases.rst @@ -825,6 +825,16 @@ Test Use Cases ---- +* **Test JPP_0515** + + [COMPOSITE_EXPRESSIONS / GOODCASE] + + **JSON file containing nested dollar operator expressions** + + Expected: JsonPreprocessor returns expected value + +---- + * **Test JPP_0550** [COMPOSITE_EXPRESSIONS / BADCASE] @@ -1081,5 +1091,5 @@ Test Use Cases ---- -Generated: 24.01.2024 - 13:56:16 +Generated: 06.03.2024 - 15:28:57 diff --git a/test/JPP_TestUsecases.txt b/test/JPP_TestUsecases.txt index da3890e1..a0b5c92b 100644 --- a/test/JPP_TestUsecases.txt +++ b/test/JPP_TestUsecases.txt @@ -345,6 +345,10 @@ Test JPP_0513 / COMPOSITE_EXPRESSIONS / GOODCASE Description: JSON file containing several square bracket expressions (as list index and dictionary key) with and without single quotes Expectation: JsonPreprocessor returns expected value ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0515 / COMPOSITE_EXPRESSIONS / GOODCASE +Description: JSON file containing nested dollar operator expressions +Expectation: JsonPreprocessor returns expected value +------------------------------------------------------------------------------------------------------------------------ Test JPP_0550 / COMPOSITE_EXPRESSIONS / BADCASE Description: JSON file with composite data structure (nested lists and dictionaries / some key names with dots inside) Expectation: No values are returned, and JsonPreprocessor throws an exception @@ -448,5 +452,5 @@ Description: Relative path to JSON file Expectation: JsonPreprocessor resolves the relative path and returns values from JSON file Hint.......: Works with raw path to JSON file (path not normalized internally) ------------------------------------------------------------------------------------------------------------------------ -Generated: 24.01.2024 - 13:56:16 +Generated: 06.03.2024 - 15:28:57 diff --git a/test/component_test.py b/test/component_test.py index c2cac44b..2ece13a1 100644 --- a/test/component_test.py +++ b/test/component_test.py @@ -22,8 +22,8 @@ # # -------------------------------------------------------------------------------------------------------------- # -VERSION = "0.26.0" -VERSION_DATE = "05.02.2024" +VERSION = "0.27.0" +VERSION_DATE = "06.03.2024" # # -------------------------------------------------------------------------------------------------------------- #TM*** diff --git a/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py b/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py index 39b14554..1db70a44 100644 --- a/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py +++ b/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 15.01.2024 - 16:29:04 +# 06.03.2024 - 15:28:57 # # -------------------------------------------------------------------------------------------------------------- @@ -133,4 +133,12 @@ def test_JPP_0512(self, Description): def test_JPP_0513(self, Description): nReturn = CExecute.Execute("JPP_0513") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: JsonPreprocessor returns expected value + @pytest.mark.parametrize( + "Description", ["JSON file containing nested dollar operator expressions",] + ) + def test_JPP_0515(self, Description): + nReturn = CExecute.Execute("JPP_0515") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index fba019ba..f768a0e6 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -22,7 +22,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -# 04.03.2024 +# 06.03.2024 # # !!! Temporarily tests are deactivated by the following line commented out: # # # listofdictUsecases.append(dictUsecase) @@ -2099,8 +2099,20 @@ dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0515.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = None -dictUsecase['EXPECTEDRETURN'] = None # freeze -# # # listofdictUsecases.append(dictUsecase) +dictUsecase['EXPECTEDRETURN'] = """ +[DICT] (12/1) > {keyP} [STR] : 'A' +[DICT] (12/2) > {B} [STR] : 'keyP' +[DICT] (12/3) > {dictP} [DICT] (1/1) > {A} [STR] : 'B' +[DICT] (12/4) > {newparam_1} [STR] : 'B' +[DICT] (12/5) > {newparam_2} [STR] : 'keyP' +[DICT] (12/6) > {newparam_3} [STR] : 'A' +[DICT] (12/7) > {newparam_4} [STR] : 'B' +[DICT] (12/8) > {newparam_5} [STR] : 'keyP' +[DICT] (12/9) > {newparam_6} [STR] : 'A' +[DICT] (12/10) > {newparam_7} [STR] : 'B' +[DICT] (12/11) > {newparam_8} [STR] : 'keyP' +[DICT] (12/12) > {newparam_9} [STR] : 'A'""" +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- diff --git a/test/testfiles/jpp-test_config_0515.jsonp b/test/testfiles/jpp-test_config_0515.jsonp index a3835990..14251b52 100644 --- a/test/testfiles/jpp-test_config_0515.jsonp +++ b/test/testfiles/jpp-test_config_0515.jsonp @@ -17,9 +17,14 @@ "B" : "keyP", "dictP" : {"A" : "B"}, // - "newparam_1" : "${dictP}['${keyP}']", // => "${dictP}['A']" -> 'B' - "newparam_2" : "${${dictP}['${keyP}']}", // => "${B}" -> 'keyP' - "newparam_3" : "${${${dictP}['${keyP}']}}", // => "${keyP}" -> 'A' - "newparam_4" : "${dictP}['${${${dictP}['${keyP}']}}']" // => "${dictP}['A']" -> !!! freeze !!! + "newparam_1" : "${dictP}['${keyP}']", // => "${dictP}['A']" -> 'B' + "newparam_2" : "${${dictP}['${keyP}']}", // => "${B}" -> 'keyP' + "newparam_3" : "${${${dictP}['${keyP}']}}", // => "${keyP}" -> 'A' + "newparam_4" : "${dictP}['${${${dictP}['${keyP}']}}']", // => "${dictP}['A']" -> 'B' + "newparam_5" : "${${dictP}['${${${dictP}['${keyP}']}}']}", // => "${B}" -> 'keyP' + "newparam_6" : "${${${dictP}['${${${dictP}['${keyP}']}}']}}", // => "${keyP}" -> 'A' + "newparam_7" : "${dictP}['${${${dictP}['${${${dictP}['${keyP}']}}']}}']", // => "${dictP}['A']" -> 'B' + "newparam_8" : "${${dictP}['${${${dictP}['${${${dictP}['${keyP}']}}']}}']}", // => "${B}" -> 'keyP' + "newparam_9" : "${${${dictP}['${${${dictP}['${${${dictP}['${keyP}']}}']}}']}}" // => "${keyP}" -> 'A' } From c116c0974f3af6ca9d77fdcdd91c97b96ae33837 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Wed, 6 Mar 2024 15:40:26 +0100 Subject: [PATCH 13/19] documentation update after stabi branch merge --- JsonPreprocessor/JsonPreprocessor.pdf | Bin 328888 -> 329303 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/JsonPreprocessor/JsonPreprocessor.pdf b/JsonPreprocessor/JsonPreprocessor.pdf index e5259fc448cf18d76b225a39658dee49da7d3d98..4aa26fec4dd3cf28c4756cfc7f1bcbc5f9531016 100644 GIT binary patch delta 31458 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 F{~th($kYG; delta 31047 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 From 3691dc8aaafb6c778577a699f9257a001d219e34 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Wed, 6 Mar 2024 15:53:35 +0100 Subject: [PATCH 14/19] Activated self tests: JPP_0554, JPP_0555 --- test/JPP_TestUsecases.csv | 2 + test/JPP_TestUsecases.html | 108 ++++++++++++++---- test/JPP_TestUsecases.rst | 22 +++- test/JPP_TestUsecases.txt | 10 +- .../test_08_COMPOSITE_EXPRESSIONS_BADCASE.py | 18 ++- test/testconfig/TestConfig.py | 8 +- 6 files changed, 140 insertions(+), 28 deletions(-) diff --git a/test/JPP_TestUsecases.csv b/test/JPP_TestUsecases.csv index 2b0eadb0..3a4715df 100644 --- a/test/JPP_TestUsecases.csv +++ b/test/JPP_TestUsecases.csv @@ -80,6 +80,8 @@ JPP_0550|COMPOSITE_EXPRESSIONS|BADCASE|JSON file with composite data structure ( JPP_0551|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter and wrapped in single quotes JPP_0552|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax) JPP_0553|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax) +JPP_0554|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a dictionary; the dictionary key is defined by a parameter and placed inside the curly brackets (invalid syntax) +JPP_0555|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a dictionary; the dictionary key is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax) JPP_0600|CODE_COMMENTS|GOODCASE|JSON file with several combinations of code comments JPP_0950|COMMON_SYNTAX_VIOLATIONS|BADCASE|JSON file with syntax error (1) JPP_0951|COMMON_SYNTAX_VIOLATIONS|BADCASE|JSON file with syntax error (2) diff --git a/test/JPP_TestUsecases.html b/test/JPP_TestUsecases.html index 8e45afc4..41906e0a 100644 --- a/test/JPP_TestUsecases.html +++ b/test/JPP_TestUsecases.html @@ -2706,6 +2706,72 @@ 81
+ + + +JPP_0554 + + + + +COMPOSITE_EXPRESSIONS + + + + +BADCASE + + + + +JSON file containing a dictionary; the dictionary key is defined by a parameter and placed inside the curly brackets (invalid syntax)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +82 + + + + + +JPP_0555 + + + + +COMPOSITE_EXPRESSIONS + + + + +BADCASE + + + + +JSON file containing a dictionary; the dictionary key is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +83 + + @@ -2736,7 +2802,7 @@ -82 +84 @@ -2769,7 +2835,7 @@ -83 +85 @@ -2802,7 +2868,7 @@ -84 +86 @@ -2835,7 +2901,7 @@ -85 +87 @@ -2868,7 +2934,7 @@ -86 +88 @@ -2901,7 +2967,7 @@ -87 +89 @@ -2934,7 +3000,7 @@ -88 +90 @@ -2967,7 +3033,7 @@ -89 +91 @@ -3000,7 +3066,7 @@ -90 +92 @@ -3033,7 +3099,7 @@ -91 +93 @@ -3066,7 +3132,7 @@ -92 +94 @@ -3099,7 +3165,7 @@ -93 +95 @@ -3132,7 +3198,7 @@ -94 +96 @@ -3165,7 +3231,7 @@ -95 +97 @@ -3198,7 +3264,7 @@ -96 +98 @@ -3231,7 +3297,7 @@ -97 +99 @@ -3264,7 +3330,7 @@ -98 +100 @@ -3297,7 +3363,7 @@ -99 +101 @@ -3330,7 +3396,7 @@ -100 +102 @@ -3363,7 +3429,7 @@ -101 +103 @@ -3397,7 +3463,7 @@
 

-
Generated: 06.03.2024 - 15:28:57
+
Generated: 06.03.2024 - 15:51:02
 
diff --git a/test/JPP_TestUsecases.rst b/test/JPP_TestUsecases.rst index 3490739e..fd3cb617 100644 --- a/test/JPP_TestUsecases.rst +++ b/test/JPP_TestUsecases.rst @@ -879,6 +879,26 @@ Test Use Cases ---- +* **Test JPP_0554** + + [COMPOSITE_EXPRESSIONS / BADCASE] + + **JSON file containing a dictionary; the dictionary key is defined by a parameter and placed inside the curly brackets (invalid syntax)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_0555** + + [COMPOSITE_EXPRESSIONS / BADCASE] + + **JSON file containing a dictionary; the dictionary key is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + * **Test JPP_0600** [CODE_COMMENTS / GOODCASE] @@ -1091,5 +1111,5 @@ Test Use Cases ---- -Generated: 06.03.2024 - 15:28:57 +Generated: 06.03.2024 - 15:51:02 diff --git a/test/JPP_TestUsecases.txt b/test/JPP_TestUsecases.txt index a0b5c92b..f352155a 100644 --- a/test/JPP_TestUsecases.txt +++ b/test/JPP_TestUsecases.txt @@ -367,6 +367,14 @@ Test JPP_0553 / COMPOSITE_EXPRESSIONS / BADCASE Description: JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax) Expectation: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0554 / COMPOSITE_EXPRESSIONS / BADCASE +Description: JSON file containing a dictionary; the dictionary key is defined by a parameter and placed inside the curly brackets (invalid syntax) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0555 / COMPOSITE_EXPRESSIONS / BADCASE +Description: JSON file containing a dictionary; the dictionary key is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ Test JPP_0600 / CODE_COMMENTS / GOODCASE Description: JSON file with several combinations of code comments Expectation: JsonPreprocessor returns remaining content of JSON file (valid parameters) @@ -452,5 +460,5 @@ Description: Relative path to JSON file Expectation: JsonPreprocessor resolves the relative path and returns values from JSON file Hint.......: Works with raw path to JSON file (path not normalized internally) ------------------------------------------------------------------------------------------------------------------------ -Generated: 06.03.2024 - 15:28:57 +Generated: 06.03.2024 - 15:51:02 diff --git a/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py b/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py index ef966733..f3762099 100644 --- a/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py +++ b/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 24.01.2024 - 13:56:16 +# 06.03.2024 - 15:51:02 # # -------------------------------------------------------------------------------------------------------------- @@ -61,4 +61,20 @@ def test_JPP_0552(self, Description): def test_JPP_0553(self, Description): nReturn = CExecute.Execute("JPP_0553") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file containing a dictionary; the dictionary key is defined by a parameter and placed inside the curly brackets (invalid syntax)",] + ) + def test_JPP_0554(self, Description): + nReturn = CExecute.Execute("JPP_0554") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file containing a dictionary; the dictionary key is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)",] + ) + def test_JPP_0555(self, Description): + nReturn = CExecute.Execute("JPP_0555") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index f768a0e6..03e2c615 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -2181,9 +2181,9 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0554.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = None +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid nested parameter format" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -2195,9 +2195,9 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0555.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = None # !!! currently freeze pf JPP !!! https://github.com/test-fullautomation/python-jsonpreprocessor/issues/226 +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid nested parameter format" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- From 03b51126e8e2bd810a095f105e5dfe9db7fb73d8 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Thu, 7 Mar 2024 16:55:41 +0700 Subject: [PATCH 15/19] Added machenism to avoid Python run freezes. --- JsonPreprocessor/CJsonPreprocessor.py | 45 ++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index e4e7f8ef..90f8b067 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -469,12 +469,15 @@ def __handleDotInNestedParam(sNestedParam : str) -> str: sVar = __handleDotInNestedParam(var) sInputStr = sInputStr.replace(var, sVar) tmpPattern = pattern + rf'(\[\s*\d+\s*\]|\[\s*\'[^{re.escape(self.specialCharacters)}]+\'\s*\])*' + sNestedParam = sInputStr.replace("$$", "$") while re.search(tmpPattern, sInputStr, re.UNICODE) and sInputStr.count("$$")>1: + sLoopCheck = sInputStr referVars = re.findall(r'(' + tmpPattern + r')[^\[]', sInputStr, re.UNICODE) for var in referVars: sVar = __handleDotInNestedParam(var[0]) if "." in var[0] else var[0] tmpValue = __getNestedValue(sVar) while var[0] in sInputStr: + sLoopCheck1 = sInputStr dReplacements = {"$" : "\$", "[" : "\[", "]" : "\]"} varPattern = self.__multipleReplace(var[0], dReplacements) if re.search(r"\[['\s]*" + varPattern + r"['\s]*\]", sInputStr): @@ -492,6 +495,12 @@ def __handleDotInNestedParam(sNestedParam : str) -> str: raise Exception(errorMsg) else: sInputStr = sInputStr.replace(var[0], str(tmpValue)) + if sInputStr==sLoopCheck1: + self.__reset(bCleanGlobalVars=True) + raise Exception(f"Infinity loop detection while handling the parameter '{sNestedParam}'.") + if sInputStr==sLoopCheck: + self.__reset(bCleanGlobalVars=True) + raise Exception(f"Infinity loop detection while handling the parameter '{sNestedParam}'.") if sInputStr.count("$$")==1: tmpPattern = pattern + rf'(\[\s*\d+\s*\]|\[\s*\'[^{re.escape(self.specialCharacters)}]+\'\s*\])*' if re.match("^" + tmpPattern + "$", sInputStr.strip(), re.UNICODE) and bKey and not bConvertToStr: @@ -728,7 +737,11 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): oJson[keyNested] = v bNested = True while "${" in k: + sLoopCheck = k k = __loadNestedValue(keyNested, k, bKey=True, key=keyNested) + if k == sLoopCheck: + self.__reset(bCleanGlobalVars=True) + raise Exception(f"Infinity loop detection while handling the parameter '{keyNested}'.") elif re.match(r"^\s*" + pattern + r"\s*$", k, re.UNICODE): keyNested = k if re.search(r"\[\s*'*" + pattern + r"'*\s*\]", keyNested, re.UNICODE) or \ @@ -756,8 +769,11 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): bNested = True initItem = item while isinstance(item, str) and "${" in item: + sLoopCheck = item item = __loadNestedValue(initItem, item) - + if item==sLoopCheck: + self.__reset(bCleanGlobalVars=True) + raise Exception(f"Infinity loop detection while handling the parameter '{initItem}'.") tmpValue.append(item) v = tmpValue del tmpValue @@ -766,16 +782,25 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): v = v[1] if "${" in str(v): bNested = True - while isinstance(v, str) and "${" in v: - v = __loadNestedValue(initValue=v, sInputStr=v) + initValue = v + while isinstance(v, str) and "${" in v: + sLoopCheck = v + v = __loadNestedValue(initValue=v, sInputStr=v) + if v == sLoopCheck: + self.__reset(bCleanGlobalVars=True) + raise Exception(f"Infinity loop detection while handling the parameter '{initValue}'.") else: i=1 while i Date: Thu, 7 Mar 2024 17:40:18 +0700 Subject: [PATCH 16/19] Handle a value string which contains '$' --- JsonPreprocessor/CJsonPreprocessor.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 90f8b067..8b696170 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -473,6 +473,8 @@ def __handleDotInNestedParam(sNestedParam : str) -> str: while re.search(tmpPattern, sInputStr, re.UNICODE) and sInputStr.count("$$")>1: sLoopCheck = sInputStr referVars = re.findall(r'(' + tmpPattern + r')[^\[]', sInputStr, re.UNICODE) + if len(referVars)==0: + referVars = re.findall(r'(' + tmpPattern + r')$', sInputStr, re.UNICODE) for var in referVars: sVar = __handleDotInNestedParam(var[0]) if "." in var[0] else var[0] tmpValue = __getNestedValue(sVar) @@ -501,7 +503,7 @@ def __handleDotInNestedParam(sNestedParam : str) -> str: if sInputStr==sLoopCheck: self.__reset(bCleanGlobalVars=True) raise Exception(f"Infinity loop detection while handling the parameter '{sNestedParam}'.") - if sInputStr.count("$$")==1: + if sInputStr.count("$${")==1: tmpPattern = pattern + rf'(\[\s*\d+\s*\]|\[\s*\'[^{re.escape(self.specialCharacters)}]+\'\s*\])*' if re.match("^" + tmpPattern + "$", sInputStr.strip(), re.UNICODE) and bKey and not bConvertToStr: rootVar = re.search(pattern, sInputStr, re.UNICODE)[0] @@ -518,7 +520,7 @@ def __handleDotInNestedParam(sNestedParam : str) -> str: return tmpValue else: sInputStr = sInputStr.replace(var[0], str(tmpValue)) - return sInputStr + return sInputStr.replace("$$", "$") if "$$" in sInputStr else sInputStr def __handleDotdictFormat(self, lInputListParams : list, lParams: list = []) -> list: """ From 5437be0fb052ca2a00dce2e5aa07fef16fe284a7 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Thu, 7 Mar 2024 15:04:35 +0100 Subject: [PATCH 17/19] New self tests: JPP_0514, JPP_0516, JPP_1003 --- test/JPP_TestUsecases.csv | 3 + test/JPP_TestUsecases.html | 155 ++++++++++++++---- test/JPP_TestUsecases.rst | 32 +++- test/JPP_TestUsecases.txt | 14 +- test/component_test.py | 4 +- .../test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py | 18 +- .../test_11_IMPLICIT_CREATION_GOODCASE.py | 10 +- test/testconfig/TestConfig.py | 48 +++++- ..._0956.jsonp => jpp-test_config_0516.jsonp} | 12 +- test/testfiles/jpp-test_config_1003.jsonp | 6 +- 10 files changed, 256 insertions(+), 46 deletions(-) rename test/testfiles/{jpp-test_config_0956.jsonp => jpp-test_config_0516.jsonp} (61%) diff --git a/test/JPP_TestUsecases.csv b/test/JPP_TestUsecases.csv index 3a4715df..128e0e46 100644 --- a/test/JPP_TestUsecases.csv +++ b/test/JPP_TestUsecases.csv @@ -75,7 +75,9 @@ JPP_0510|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several parameter a JPP_0511|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing a list; list index is defined by a parameter JPP_0512|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing a nested use of lists and dictionaries, with the same parameter used several times within the same expression JPP_0513|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several square bracket expressions (as list index and dictionary key) with and without single quotes +JPP_0514|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing nested dollar operator expressions JPP_0515|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing nested dollar operator expressions +JPP_0516|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing string expressions with additional curly brackets and dollar characters (that must not cause syntax issues!) JPP_0550|COMPOSITE_EXPRESSIONS|BADCASE|JSON file with composite data structure (nested lists and dictionaries / some key names with dots inside) JPP_0551|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter and wrapped in single quotes JPP_0552|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax) @@ -91,6 +93,7 @@ JPP_0954|COMMON_SYNTAX_VIOLATIONS|BADCASE|JSON file with syntax error (5): file JPP_1000|IMPLICIT_CREATION|GOODCASE|JSON file with dictionary keys to be created implicitly JPP_1001|IMPLICIT_CREATION|GOODCASE|JSON file with dictionary keys to be created implicitly (same key names at all levels) JPP_1002|IMPLICIT_CREATION|GOODCASE|JSON file with combinations of implicit and explicit creation / with and without initialization +JPP_1003|IMPLICIT_CREATION|GOODCASE|JSON file with combinations of implicit and explicit creation / access to implicitly created keys by parameters / dict assignment by reference JPP_1050|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (1) JPP_1051|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (2) JPP_1052|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (3) diff --git a/test/JPP_TestUsecases.html b/test/JPP_TestUsecases.html index 41906e0a..0d6a24ac 100644 --- a/test/JPP_TestUsecases.html +++ b/test/JPP_TestUsecases.html @@ -2542,7 +2542,7 @@ -JPP_0515 +JPP_0514 @@ -2572,6 +2572,72 @@ 77
+ + + +JPP_0515 + + + + +COMPOSITE_EXPRESSIONS + + + + +GOODCASE + + + + +JSON file containing nested dollar operator expressions
+Expected: JsonPreprocessor returns expected value + + +
+ + + + + + + +78 + + + + + +JPP_0516 + + + + +COMPOSITE_EXPRESSIONS + + + + +GOODCASE + + + + +JSON file containing string expressions with additional curly brackets and dollar characters (that must not cause syntax issues!)
+Expected: JsonPreprocessor returns expected value + + +
+ + + + + + + +79 + + @@ -2603,7 +2669,7 @@ -78 +80 @@ -2637,7 +2703,7 @@ -79 +81 @@ -2670,7 +2736,7 @@ -80 +82 @@ -2703,7 +2769,7 @@ -81 +83 @@ -2736,7 +2802,7 @@ -82 +84 @@ -2769,7 +2835,7 @@ -83 +85 @@ -2802,7 +2868,7 @@ -84 +86 @@ -2835,7 +2901,7 @@ -85 +87 @@ -2868,7 +2934,7 @@ -86 +88 @@ -2901,7 +2967,7 @@ -87 +89 @@ -2934,7 +3000,7 @@ -88 +90 @@ -2967,7 +3033,7 @@ -89 +91 @@ -3000,7 +3066,7 @@ -90 +92 @@ -3033,7 +3099,7 @@ -91 +93 @@ -3066,7 +3132,40 @@ -92 +94 + + + + + +JPP_1003 + + + + +IMPLICIT_CREATION + + + + +GOODCASE + + + + +JSON file with combinations of implicit and explicit creation / access to implicitly created keys by parameters / dict assignment by reference
+Expected: JsonPreprocessor returns values + + +
+ + + + + + + +95 @@ -3099,7 +3198,7 @@ -93 +96 @@ -3132,7 +3231,7 @@ -94 +97 @@ -3165,7 +3264,7 @@ -95 +98 @@ -3198,7 +3297,7 @@ -96 +99 @@ -3231,7 +3330,7 @@ -97 +100 @@ -3264,7 +3363,7 @@ -98 +101 @@ -3297,7 +3396,7 @@ -99 +102 @@ -3330,7 +3429,7 @@ -100 +103 @@ -3363,7 +3462,7 @@ -101 +104 @@ -3396,7 +3495,7 @@ -102 +105 @@ -3429,7 +3528,7 @@ -103 +106 @@ -3463,7 +3562,7 @@
 

-
Generated: 06.03.2024 - 15:51:02
+
Generated: 07.03.2024 - 14:58:30
 
diff --git a/test/JPP_TestUsecases.rst b/test/JPP_TestUsecases.rst index fd3cb617..6df52fa5 100644 --- a/test/JPP_TestUsecases.rst +++ b/test/JPP_TestUsecases.rst @@ -825,6 +825,16 @@ Test Use Cases ---- +* **Test JPP_0514** + + [COMPOSITE_EXPRESSIONS / GOODCASE] + + **JSON file containing nested dollar operator expressions** + + Expected: JsonPreprocessor returns expected value + +---- + * **Test JPP_0515** [COMPOSITE_EXPRESSIONS / GOODCASE] @@ -835,6 +845,16 @@ Test Use Cases ---- +* **Test JPP_0516** + + [COMPOSITE_EXPRESSIONS / GOODCASE] + + **JSON file containing string expressions with additional curly brackets and dollar characters (that must not cause syntax issues!)** + + Expected: JsonPreprocessor returns expected value + +---- + * **Test JPP_0550** [COMPOSITE_EXPRESSIONS / BADCASE] @@ -989,6 +1009,16 @@ Test Use Cases ---- +* **Test JPP_1003** + + [IMPLICIT_CREATION / GOODCASE] + + **JSON file with combinations of implicit and explicit creation / access to implicitly created keys by parameters / dict assignment by reference** + + Expected: JsonPreprocessor returns values + +---- + * **Test JPP_1050** [IMPLICIT_CREATION / BADCASE] @@ -1111,5 +1141,5 @@ Test Use Cases ---- -Generated: 06.03.2024 - 15:51:02 +Generated: 07.03.2024 - 14:58:30 diff --git a/test/JPP_TestUsecases.txt b/test/JPP_TestUsecases.txt index f352155a..cbb9dd45 100644 --- a/test/JPP_TestUsecases.txt +++ b/test/JPP_TestUsecases.txt @@ -345,10 +345,18 @@ Test JPP_0513 / COMPOSITE_EXPRESSIONS / GOODCASE Description: JSON file containing several square bracket expressions (as list index and dictionary key) with and without single quotes Expectation: JsonPreprocessor returns expected value ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0514 / COMPOSITE_EXPRESSIONS / GOODCASE +Description: JSON file containing nested dollar operator expressions +Expectation: JsonPreprocessor returns expected value +------------------------------------------------------------------------------------------------------------------------ Test JPP_0515 / COMPOSITE_EXPRESSIONS / GOODCASE Description: JSON file containing nested dollar operator expressions Expectation: JsonPreprocessor returns expected value ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0516 / COMPOSITE_EXPRESSIONS / GOODCASE +Description: JSON file containing string expressions with additional curly brackets and dollar characters (that must not cause syntax issues!) +Expectation: JsonPreprocessor returns expected value +------------------------------------------------------------------------------------------------------------------------ Test JPP_0550 / COMPOSITE_EXPRESSIONS / BADCASE Description: JSON file with composite data structure (nested lists and dictionaries / some key names with dots inside) Expectation: No values are returned, and JsonPreprocessor throws an exception @@ -411,6 +419,10 @@ Test JPP_1002 / IMPLICIT_CREATION / GOODCASE Description: JSON file with combinations of implicit and explicit creation / with and without initialization Expectation: JsonPreprocessor returns values ------------------------------------------------------------------------------------------------------------------------ +Test JPP_1003 / IMPLICIT_CREATION / GOODCASE +Description: JSON file with combinations of implicit and explicit creation / access to implicitly created keys by parameters / dict assignment by reference +Expectation: JsonPreprocessor returns values +------------------------------------------------------------------------------------------------------------------------ Test JPP_1050 / IMPLICIT_CREATION / BADCASE Description: JSON file with implicit creation of data structures based on parameters (1) Expectation: No values are returned, and JsonPreprocessor throws an exception @@ -460,5 +472,5 @@ Description: Relative path to JSON file Expectation: JsonPreprocessor resolves the relative path and returns values from JSON file Hint.......: Works with raw path to JSON file (path not normalized internally) ------------------------------------------------------------------------------------------------------------------------ -Generated: 06.03.2024 - 15:51:02 +Generated: 07.03.2024 - 14:58:30 diff --git a/test/component_test.py b/test/component_test.py index 2ece13a1..07c4b497 100644 --- a/test/component_test.py +++ b/test/component_test.py @@ -22,8 +22,8 @@ # # -------------------------------------------------------------------------------------------------------------- # -VERSION = "0.27.0" -VERSION_DATE = "06.03.2024" +VERSION = "0.28.0" +VERSION_DATE = "07.03.2024" # # -------------------------------------------------------------------------------------------------------------- #TM*** diff --git a/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py b/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py index 1db70a44..7f7e18bc 100644 --- a/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py +++ b/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 06.03.2024 - 15:28:57 +# 07.03.2024 - 14:58:30 # # -------------------------------------------------------------------------------------------------------------- @@ -133,6 +133,14 @@ def test_JPP_0512(self, Description): def test_JPP_0513(self, Description): nReturn = CExecute.Execute("JPP_0513") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: JsonPreprocessor returns expected value + @pytest.mark.parametrize( + "Description", ["JSON file containing nested dollar operator expressions",] + ) + def test_JPP_0514(self, Description): + nReturn = CExecute.Execute("JPP_0514") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- # Expected: JsonPreprocessor returns expected value @pytest.mark.parametrize( @@ -141,4 +149,12 @@ def test_JPP_0513(self, Description): def test_JPP_0515(self, Description): nReturn = CExecute.Execute("JPP_0515") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: JsonPreprocessor returns expected value + @pytest.mark.parametrize( + "Description", ["JSON file containing string expressions with additional curly brackets and dollar characters (that must not cause syntax issues!)",] + ) + def test_JPP_0516(self, Description): + nReturn = CExecute.Execute("JPP_0516") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_11_IMPLICIT_CREATION_GOODCASE.py b/test/pytest/pytestfiles/test_11_IMPLICIT_CREATION_GOODCASE.py index 3e708064..996c5720 100644 --- a/test/pytest/pytestfiles/test_11_IMPLICIT_CREATION_GOODCASE.py +++ b/test/pytest/pytestfiles/test_11_IMPLICIT_CREATION_GOODCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 16.01.2024 - 13:22:08 +# 07.03.2024 - 14:58:30 # # -------------------------------------------------------------------------------------------------------------- @@ -53,4 +53,12 @@ def test_JPP_1001(self, Description): def test_JPP_1002(self, Description): nReturn = CExecute.Execute("JPP_1002") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: JsonPreprocessor returns values + @pytest.mark.parametrize( + "Description", ["JSON file with combinations of implicit and explicit creation / access to implicitly created keys by parameters / dict assignment by reference",] + ) + def test_JPP_1003(self, Description): + nReturn = CExecute.Execute("JPP_1003") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 03e2c615..221df1ba 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -22,7 +22,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -# 06.03.2024 +# 07.03.2024 # # !!! Temporarily tests are deactivated by the following line commented out: # # # listofdictUsecases.append(dictUsecase) @@ -1855,7 +1855,7 @@ dictUsecase['SUBSECTION'] = "GOODCASE" dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None -dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0504.jsonp" +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0504.jsonp" # current issue: Expecting value: line 20 column 14 (char 1088)'! dictUsecase['EXPECTEDEXCEPTION'] = None dictUsecase['EXPECTEDRETURN'] = """ [DICT] (20/1) > {param1} [DICT] (1/1) > {A} [DICT] (1/1) > {B} [DICT] (1/1) > {C} [DICT] (1/1) > {D} [FLOAT] : 1.23 @@ -2085,8 +2085,14 @@ dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0514.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = None -dictUsecase['EXPECTEDRETURN'] = None # list index out of range -# # # listofdictUsecases.append(dictUsecase) +dictUsecase['EXPECTEDRETURN'] = """ +[DICT] (5/1) > {keyP} [STR] : 'A' +[DICT] (5/2) > {B} [INT] : 1 +[DICT] (5/3) > {dictP} [DICT] (2/1) > {A} [STR] : 'B' +[DICT] (5/3) > {dictP} [DICT] (2/2) > {C} [INT] : 2 +[DICT] (5/4) > {newparam_1} [STR] : '1' +[DICT] (5/5) > {newparam_2} [STR] : '1'""" +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -2115,6 +2121,32 @@ listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_0516" +dictUsecase['DESCRIPTION'] = "JSON file containing string expressions with additional curly brackets and dollar characters (that must not cause syntax issues!)" +dictUsecase['EXPECTATION'] = "JsonPreprocessor returns expected value" +dictUsecase['SECTION'] = "COMPOSITE_EXPRESSIONS" +dictUsecase['SUBSECTION'] = "GOODCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0516.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = None +dictUsecase['EXPECTEDRETURN'] = """ +[DICT] (9/1) > {listparam} [LIST] (3/1) > [STR] : 'A' +[DICT] (9/1) > {listparam} [LIST] (3/2) > [STR] : 'B' +[DICT] (9/1) > {listparam} [LIST] (3/3) > [STR] : 'C' +[DICT] (9/2) > {param_1} [STR] : '}A{' +[DICT] (9/3) > {param_2} [STR] : '{A}' +[DICT] (9/4) > {param_3} [STR] : '$}A$}' +[DICT] (9/5) > {param_4} [STR] : '{$}A{$}' +[DICT] (9/6) > {param_5} [STR] : '}{$}A{$}{' +[DICT] (9/7) > {param_6} [STR] : '{}{$}A{$}{}' +[DICT] (9/8) > {param_7} [STR] : '{}A{$}B{$}C{}' +[DICT] (9/9) > {param_8} [STR] : '{}$A{$$}$B{$$}$C{}' +""" +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} dictUsecase['TESTID'] = "JPP_0550" @@ -2383,9 +2415,9 @@ del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} -# >>>>>>>>>>>>>>>>>>>>>>>>> currently fail +# ====== still one line in jpp-test_config_1003.jsonp commented out; remaining code run properly dictUsecase['TESTID'] = "JPP_1003" -dictUsecase['DESCRIPTION'] = "JSON file with combinations of implicit and explicit creation / access to implicitly created keys by parameters" +dictUsecase['DESCRIPTION'] = "JSON file with combinations of implicit and explicit creation / access to implicitly created keys by parameters / dict assignment by reference" dictUsecase['EXPECTATION'] = "JsonPreprocessor returns values" dictUsecase['SECTION'] = "IMPLICIT_CREATION" dictUsecase['SUBSECTION'] = "GOODCASE" @@ -2400,9 +2432,9 @@ [DICT] (7/4) > {param3} [STR] : 'subKey3' [DICT] (7/5) > {param4} [STR] : 'subKey4' [DICT] (7/6) > {param5} [INT] : 3 -[DICT] (7/7) > {testdict1} [DICT] (1/1) > {subKey1} [DICT] (1/1) > {subKey2} [DICT] (1/1) > {subKey3} [DICT] (1/1) > {subKey4} [INT] : 2 +[DICT] (7/7) > {testdict1} [DICT] (1/1) > {subKey1} [DICT] (1/1) > {subKey2} [DICT] (1/1) > {subKey3} [DICT] (1/1) > {subKey4} [INT] : 3 """ -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- diff --git a/test/testfiles/jpp-test_config_0956.jsonp b/test/testfiles/jpp-test_config_0516.jsonp similarity index 61% rename from test/testfiles/jpp-test_config_0956.jsonp rename to test/testfiles/jpp-test_config_0516.jsonp index ce198816..7ce4a176 100644 --- a/test/testfiles/jpp-test_config_0956.jsonp +++ b/test/testfiles/jpp-test_config_0516.jsonp @@ -13,6 +13,14 @@ // limitations under the License. //************************************************************************** { - "param1" : "value", - "param2" : ${param1}[0] + "listparam" : ["A","B","C"], + "param_1" : "}${listparam}[0]{", + "param_2" : "{${listparam}[0]}", + "param_3" : "$}${listparam}[0]$}", + "param_4" : "{$}${listparam}[0]{$}", + "param_5" : "}{$}${listparam}[0]{$}{", + "param_6" : "{}{$}${listparam}[0]{$}{}", + "param_7" : "{}${listparam}[0]{$}${listparam}[1]{$}${listparam}[2]{}", + "param_8" : "{}$${listparam}[0]{$$}$${listparam}[1]{$$}$${listparam}[2]{}" } + diff --git a/test/testfiles/jpp-test_config_1003.jsonp b/test/testfiles/jpp-test_config_1003.jsonp index fffc84a2..b0c5715a 100644 --- a/test/testfiles/jpp-test_config_1003.jsonp +++ b/test/testfiles/jpp-test_config_1003.jsonp @@ -16,7 +16,7 @@ { // implicitly created data structure ${testdict1.subKey1.subKey2.subKey3} : {"subKey4" : 1}, - "testdict2" : ${testdict1}, // by value + "testdict2" : ${testdict1}, // by reference // // parameters containing names of existing keys "param1" : "subKey1", @@ -30,6 +30,8 @@ ${testdict2.${param1}.subKey2.${param3}.subKey4} : 3, // assign modified values to new parameters "param5" : ${testdict1}[${param1}]['${param2}']['subKey3'][${param4}] - // "param6" : ${testdict2.${param1}.subKey2.${param3}.subKey4} // 'Invalid nested parameter format: ${testdict2.${param1}.subKey2.${param3}.subKey4} - The double quotes are missing!!!'! + + // still issue: + // "param6" : ${testdict2.${param1}.subKey2.${param3}.subKey4} // Expecting value: line 11 column 15 (char 412)'! } From 6cf77b78bea1271e8d61d5a67d4989a551e77028 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 8 Mar 2024 10:26:38 +0700 Subject: [PATCH 18/19] Fix bugs during optimize JsonPreprocessor code --- JsonPreprocessor/CJsonPreprocessor.py | 157 +++++++++++++------------- 1 file changed, 80 insertions(+), 77 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 8b696170..30a4685a 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -63,6 +63,7 @@ class CSyntaxType(): class CNameMangling(Enum): AVOIDDATATYPE = "JPavoidDataType_" COLONS = "__handleColonsInLine__" + DUPLICATEDKEY_00 = "__handleDuplicatedKey__00" DUPLICATEDKEY_01 = "__handleDuplicatedKey__" STRINGCONVERT = "__ConvertParameterToString__" LISTINDEX = "__IndexOfList__" @@ -629,7 +630,7 @@ def __updateAndReplaceNestedParam(self, oJson : dict, bNested : bool = False, re def __jsonUpdated(k, v, oJson, bNested, keyNested = '', bDuplicatedHandle=False): if keyNested != '': - if not bDuplicatedHandle: + if not bDuplicatedHandle and keyNested in oJson.keys(): del oJson[keyNested] rootKey = re.sub(r'\[.*\]', "", k, re.UNICODE) if re.search(r'^[0-9]+.*$', rootKey, re.UNICODE): @@ -716,22 +717,15 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): bImplicitCreation = False bDuplicatedHandle = False if re.match(r"^.+" + CNameMangling.DUPLICATEDKEY_01.value + r"\d+$", k, re.UNICODE): - del oJson[k] + bDuplicatedHandle = True if CNameMangling.DUPLICATEDKEY_00.value not in k else False dupKey = k - k = re.sub(CNameMangling.DUPLICATEDKEY_01.value + r"\d+$", "", k) - value = tmpJson[k].pop(1) - if "${" not in dupKey and "${" not in str(value): - if parentParams != "": - sExec = parentParams + "['" + k + "'] = \"" + value + "\"" if isinstance(value, str) else \ - parentParams + "['" + k + "'] = " + str(value) - else: - sExec = k + " = \"" + value + "\"" if isinstance(value, str) else \ - k + " = " + str(value) - try: - exec(sExec, globals()) - except: - pass - bDuplicatedHandle = True + if CNameMangling.DUPLICATEDKEY_00.value in k: + origKey = re.sub(CNameMangling.DUPLICATEDKEY_01.value + r"\d+$", "", k) + oJson = self.__changeDictKey(oJson, k, origKey) + k = origKey + else: + del oJson[k] + k = re.sub(CNameMangling.DUPLICATEDKEY_01.value + r"\d+$", "", k) if CNameMangling.STRINGCONVERT.value in k: bStrConvert = True del oJson[k] @@ -764,50 +758,20 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): if isinstance(v, dict): v, bNested = self.__updateAndReplaceNestedParam(v, bNested, recursive=True, parentParams=parentParams) elif isinstance(v, list): - if v[0] != CNameMangling.DUPLICATEDKEY_01.value: - tmpValue = [] - for item in v: - if isinstance(item, str) and re.search(pattern, item, re.UNICODE): - bNested = True - initItem = item - while isinstance(item, str) and "${" in item: - sLoopCheck = item - item = __loadNestedValue(initItem, item) - if item==sLoopCheck: - self.__reset(bCleanGlobalVars=True) - raise Exception(f"Infinity loop detection while handling the parameter '{initItem}'.") - tmpValue.append(item) - v = tmpValue - del tmpValue - else: - if len(v)==2: - v = v[1] - if "${" in str(v): - bNested = True - initValue = v - while isinstance(v, str) and "${" in v: - sLoopCheck = v - v = __loadNestedValue(initValue=v, sInputStr=v) - if v == sLoopCheck: - self.__reset(bCleanGlobalVars=True) - raise Exception(f"Infinity loop detection while handling the parameter '{initValue}'.") - else: - i=1 - while i bool: be outside of '${}'.") else: return True + + def __changeDictKey(self, dInput : dict, sOldKey : str, sNewKey : str) -> dict: + """ +Replace an existing key in a dictionary with a new key name. The replacement is done by preserving the original order of the keys. + +**Arguments:** + +* ``dInput`` + + / *Condition*: required / *Type*: dict / + +* ``sOldKey`` + + / *Condition*: required / *Type*: str / + +* ``sNewKey`` + + / *Condition*: required / *Type*: str / + +**Returns:** + +* ``dOutput`` + + / *Type*: dict / + """ + listKeys = list(dInput.keys()) + index = listKeys.index(sOldKey) + listKeys.insert(index, sNewKey) + listKeys.pop(index + 1) + dOutput = {} + for key in listKeys: + dOutput[key] = dInput[sOldKey] if key==sNewKey else dInput[key] + return dOutput def jsonLoad(self, jFile : str, masterFile : bool = True): """ @@ -1024,7 +1023,6 @@ def jsonLoad(self, jFile : str, masterFile : bool = True): Preprocessed JSON file(s) as Python dictionary """ - def __handleListElements(sInput : str) -> str: items = re.split("\s*,\s*", sInput) j=0 @@ -1038,17 +1036,22 @@ def __handleListElements(sInput : str) -> str: return newItem def __handleDuplicatedKey(dInput : dict) -> dict: - tmpDict = copy.deepcopy(dInput) - listKeys = list(tmpDict.keys()) + listKeys = list(dInput.keys()) dictValues = {} for key in listKeys: if CNameMangling.DUPLICATEDKEY_01.value in key: origKey = re.sub(CNameMangling.DUPLICATEDKEY_01.value + "\d+\s*$", "", key) - dictValues[origKey] = copy.deepcopy(tmpDict[origKey]) + dictValues[origKey] = copy.deepcopy(dInput[origKey]) + for key in dictValues.keys(): + dInput = self.__changeDictKey(dInput, key, key + CNameMangling.DUPLICATEDKEY_01.value + "00") + tmpDict = copy.deepcopy(dInput) for k, v in tmpDict.items(): if CNameMangling.DUPLICATEDKEY_01.value in k: origK = re.sub(CNameMangling.DUPLICATEDKEY_01.value + "\d+\s*$", "", k) dInput[k] = dictValues[origK].pop(1) + if isinstance(v, list) and v[0]==CNameMangling.DUPLICATEDKEY_01.value: + v = v[-1] + dInput[k] = v if isinstance(v, dict): dInput[k] = __handleDuplicatedKey(v) del tmpDict From 194a74ab12b4de50f9902a998d29e9978d0558f2 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 8 Mar 2024 16:36:29 +0700 Subject: [PATCH 19/19] Ticket 222, execution interdependendies when call same json file in same Python process. --- JsonPreprocessor/CJsonPreprocessor.py | 21 +++++++++++-- .../jsonpreprocessor/test_jsonpreprocessor.py | 30 ++++--------------- .../05_sub_datastructure/json_update_01.jsonp | 1 + .../05_sub_datastructure/json_update_02.jsonp | 1 + .../05_sub_datastructure/json_update_03.jsonp | 1 + .../05_sub_datastructure/json_update_04.jsonp | 1 + .../05_sub_datastructure/json_update_05.jsonp | 1 + .../05_sub_datastructure/json_update_06.jsonp | 1 + 8 files changed, 30 insertions(+), 27 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 30a4685a..87e4d996 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -628,7 +628,7 @@ def __updateAndReplaceNestedParam(self, oJson : dict, bNested : bool = False, re Output JSON object as dictionary with all variables resolved. """ - def __jsonUpdated(k, v, oJson, bNested, keyNested = '', bDuplicatedHandle=False): + def __jsonUpdated(k, v, oJson, bNested, keyNested = '', bDuplicatedHandle=False, recursive = False): if keyNested != '': if not bDuplicatedHandle and keyNested in oJson.keys(): del oJson[keyNested] @@ -654,8 +654,23 @@ def __jsonUpdated(k, v, oJson, bNested, keyNested = '', bDuplicatedHandle=False) if CNameMangling.AVOIDDATATYPE.value in k: k = re.sub(CNameMangling.AVOIDDATATYPE.value, "", k) + if not recursive: + checkVar = "oJson['" + k.split('[', 1)[0] + "'][" + k.split('[', 1)[1] + subElements = re.findall(rf"\[\s*'([^{re.escape(self.specialCharacters)}]*)'\s*\]", checkVar, re.UNICODE) + checkVar = "oJson" + for element in subElements: + checkVar = checkVar + "['" + element + "']" + sExec = "dummyData = " + checkVar + try: + exec(sExec) + except: + sExec = checkVar + " = {}" + try: + exec(sExec) + except: + pass if isinstance(v, str): - sExec = "oJson['" + k.split('[', 1)[0] + "'][" + k.split('[', 1)[1] + " = \"" + v + "\"" + sExec = "oJson['" + k.split('[', 1)[0] + "'][" + k.split('[', 1)[1] + " = '" + v + "'" else: sExec = "oJson['" + k.split('[', 1)[0] + "'][" + k.split('[', 1)[1] + " = " + str(v) try: @@ -794,7 +809,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): except: pass continue - __jsonUpdated(k, v, oJson, bNested, keyNested, bDuplicatedHandle) + __jsonUpdated(k, v, oJson, bNested, keyNested, bDuplicatedHandle, recursive) if keyNested != '' and not bStrConvert: transTable = str.maketrans({"[":"\[", "]":"\]"}) tmpList = [] diff --git a/atest/jsonpreprocessor/test_jsonpreprocessor.py b/atest/jsonpreprocessor/test_jsonpreprocessor.py index a8d3004f..d56efcdb 100644 --- a/atest/jsonpreprocessor/test_jsonpreprocessor.py +++ b/atest/jsonpreprocessor/test_jsonpreprocessor.py @@ -249,12 +249,9 @@ def test_sub_data_structure_01(self): ''' Updated 1 parameter without nested variable. ''' - sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/sub_data_structure_01.jsonp") oJsonPreprocessor = CJsonPreprocessor(syntax="python") + sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_01.jsonp") oJsonData = oJsonPreprocessor.jsonLoad(sJsonfile) - sUpdateJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_01.jsonp") - oUpdateJsonData = oJsonPreprocessor.jsonLoad(sUpdateJsonfile) - oJsonData.update(oUpdateJsonData) assert oJsonData['preprocessor']['definitions']['preproFloatParam'] == SUBDATASTRUCTURE['testcase_01'] @@ -262,12 +259,9 @@ def test_sub_data_structure_02(self): ''' Updated more than 1 parameter without nested variable. ''' - sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/sub_data_structure_01.jsonp") oJsonPreprocessor = CJsonPreprocessor(syntax="python") + sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_02.jsonp") oJsonData = oJsonPreprocessor.jsonLoad(sJsonfile) - sUpdateJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_02.jsonp") - oUpdateJsonData = oJsonPreprocessor.jsonLoad(sUpdateJsonfile) - oJsonData.update(oUpdateJsonData) assert oJsonData['params']['glo']['globalString'] == SUBDATASTRUCTURE['testcase_02a'] assert oJsonData['preprocessor']['definitions']['preproStructure']['variable_01'] == SUBDATASTRUCTURE['testcase_02b'] @@ -277,12 +271,9 @@ def test_sub_data_structure_03(self): ''' Updated 1 parameter with nested variable in element name. ''' - sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/sub_data_structure_01.jsonp") oJsonPreprocessor = CJsonPreprocessor(syntax="python") + sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_03.jsonp") oJsonData = oJsonPreprocessor.jsonLoad(sJsonfile) - sUpdateJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_03.jsonp") - oUpdateJsonData = oJsonPreprocessor.jsonLoad(sUpdateJsonfile) - oJsonData.update(oUpdateJsonData) assert oJsonData['preprocessor']['definitions']['preproStructure']['general'] == SUBDATASTRUCTURE['testcase_03'] @@ -290,12 +281,9 @@ def test_sub_data_structure_04(self): ''' Updated 1 parameter with nested variable in element value. ''' - sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/sub_data_structure_01.jsonp") oJsonPreprocessor = CJsonPreprocessor(syntax="python") + sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_04.jsonp") oJsonData = oJsonPreprocessor.jsonLoad(sJsonfile) - sUpdateJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_04.jsonp") - oUpdateJsonData = oJsonPreprocessor.jsonLoad(sUpdateJsonfile) - oJsonData.update(oUpdateJsonData) assert oJsonData['params']['glo']['globalString'] == SUBDATASTRUCTURE['testcase_04'] @@ -303,12 +291,9 @@ def test_sub_data_structure_05(self): ''' Updated 1 parameter with nested variable in both element name and value. ''' - sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/sub_data_structure_01.jsonp") oJsonPreprocessor = CJsonPreprocessor(syntax="python") + sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_05.jsonp") oJsonData = oJsonPreprocessor.jsonLoad(sJsonfile) - sUpdateJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_05.jsonp") - oUpdateJsonData = oJsonPreprocessor.jsonLoad(sUpdateJsonfile) - oJsonData.update(oUpdateJsonData) assert oJsonData['preprocessor']['definitions']['preproTest']['checkParam'] == SUBDATASTRUCTURE['testcase_05'] @@ -316,12 +301,9 @@ def test_sub_data_structure_06(self): ''' Updated more than 1 parameter with nested variable. ''' - sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/sub_data_structure_01.jsonp") oJsonPreprocessor = CJsonPreprocessor(syntax="python") + sJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_06.jsonp") oJsonData = oJsonPreprocessor.jsonLoad(sJsonfile) - sUpdateJsonfile = os.path.abspath("../testdata/config/05_sub_datastructure/json_update_06.jsonp") - oUpdateJsonData = oJsonPreprocessor.jsonLoad(sUpdateJsonfile) - oJsonData.update(oUpdateJsonData) assert oJsonData['sWelcome'] == SUBDATASTRUCTURE['testcase_06a'] assert oJsonData['params']['glo'] == SUBDATASTRUCTURE['testcase_06b'] diff --git a/atest/testdata/config/05_sub_datastructure/json_update_01.jsonp b/atest/testdata/config/05_sub_datastructure/json_update_01.jsonp index 8732d65e..1dac58a0 100644 --- a/atest/testdata/config/05_sub_datastructure/json_update_01.jsonp +++ b/atest/testdata/config/05_sub_datastructure/json_update_01.jsonp @@ -14,5 +14,6 @@ //************************************************************************** { + "[import]" : "./sub_data_structure_01.jsonp", ${preprocessor}['definitions']['preproFloatParam']: 1999 } diff --git a/atest/testdata/config/05_sub_datastructure/json_update_02.jsonp b/atest/testdata/config/05_sub_datastructure/json_update_02.jsonp index b8e373c5..1ca57e98 100644 --- a/atest/testdata/config/05_sub_datastructure/json_update_02.jsonp +++ b/atest/testdata/config/05_sub_datastructure/json_update_02.jsonp @@ -14,6 +14,7 @@ //************************************************************************** { + "[import]" : "./sub_data_structure_01.jsonp", ${params}['glo']['globalString']: "Welcome to Jsonpreprocessor Acceptance Test", ${preprocessor}['definitions']['preproStructure']['variable_01']: 0.192, ${Project}: "Acceptance Testing" diff --git a/atest/testdata/config/05_sub_datastructure/json_update_03.jsonp b/atest/testdata/config/05_sub_datastructure/json_update_03.jsonp index 32657a88..abac6f49 100644 --- a/atest/testdata/config/05_sub_datastructure/json_update_03.jsonp +++ b/atest/testdata/config/05_sub_datastructure/json_update_03.jsonp @@ -14,6 +14,7 @@ //************************************************************************** { + "[import]" : "./sub_data_structure_01.jsonp", ${preprocessor}['definitions']['preproStructure'][${params}['glo']['globalStructure']['general']]: 0.92 } diff --git a/atest/testdata/config/05_sub_datastructure/json_update_04.jsonp b/atest/testdata/config/05_sub_datastructure/json_update_04.jsonp index 36d98296..867c3373 100644 --- a/atest/testdata/config/05_sub_datastructure/json_update_04.jsonp +++ b/atest/testdata/config/05_sub_datastructure/json_update_04.jsonp @@ -14,5 +14,6 @@ //************************************************************************** { + "[import]" : "./sub_data_structure_01.jsonp", ${params}['glo']['globalString']: ${preprocessor}['definitions']['preproTest']['checkParam'] } diff --git a/atest/testdata/config/05_sub_datastructure/json_update_05.jsonp b/atest/testdata/config/05_sub_datastructure/json_update_05.jsonp index c4fe7484..d952989f 100644 --- a/atest/testdata/config/05_sub_datastructure/json_update_05.jsonp +++ b/atest/testdata/config/05_sub_datastructure/json_update_05.jsonp @@ -14,5 +14,6 @@ //************************************************************************** { + "[import]" : "./sub_data_structure_01.jsonp", ${preprocessor}['definitions']['preproTest'][${preprocessor}['definitions']['preproStructure']['variable_02']]: ${params}['glo']['globalString'] } diff --git a/atest/testdata/config/05_sub_datastructure/json_update_06.jsonp b/atest/testdata/config/05_sub_datastructure/json_update_06.jsonp index 39435ae4..52cbd534 100644 --- a/atest/testdata/config/05_sub_datastructure/json_update_06.jsonp +++ b/atest/testdata/config/05_sub_datastructure/json_update_06.jsonp @@ -14,6 +14,7 @@ //************************************************************************** { + "[import]" : "./sub_data_structure_01.jsonp", ${sWelcome}: ${Project}, ${params}['glo']['globalIntParam']: 69, "params": {