From 21b4fc5202b1e286565d776ccf4331c56d8cbc0d Mon Sep 17 00:00:00 2001 From: s_ranjbar Date: Wed, 11 Sep 2024 09:36:30 -0400 Subject: [PATCH] feat: single objective optimization started --- .../energy_system_sizing_factory.py | 4 +- ...ergy_system_archetype_modelling_factory.py | 5 +- .../system_sizing_methods/heuristic_sizing.py | 159 +++++++++++++++++- .../energy_system_retrofit_report.py | 9 +- energy_system_retrofit.py | 2 +- .../energy_systems/energy_storage_system.py | 11 +- .../energy_systems/thermal_storage_system.py | 5 +- .../montreal_future_system_catalogue.py | 4 + .../energy_systems/energy_storage_system.py | 17 ++ ... with Independent Water Heating and PV.jpg | Bin 0 -> 79991 bytes ...ntreal_future_energy_systems_parameters.py | 1 + main.py | 70 ++++++++ 12 files changed, 271 insertions(+), 16 deletions(-) create mode 100644 hub/data/energy_systems/schemas/Central 4 Pipes Air to Water Heat Pump and Gas Boiler with Independent Water Heating and PV.jpg diff --git a/energy_system_modelling_package/energy_system_modelling_factories/energy_system_sizing_factory.py b/energy_system_modelling_package/energy_system_modelling_factories/energy_system_sizing_factory.py index eab3c9f2..3ec9b7dc 100644 --- a/energy_system_modelling_package/energy_system_modelling_factories/energy_system_sizing_factory.py +++ b/energy_system_modelling_package/energy_system_modelling_factories/energy_system_sizing_factory.py @@ -30,11 +30,11 @@ class EnergySystemsSizingFactory: for building in self._city.buildings: building.level_of_detail.energy_systems = 1 - def _heurisitc_sizing(self): + def _heuristic_sizing(self): """ Size Energy Systems using a Single or Multi Objective GA """ - HeuristicSizing(self._city).enrich_buildings() + HeuristicSizing(self._city).genetic_algorithm() self._city.level_of_detail.energy_systems = 1 for building in self._city.buildings: building.level_of_detail.energy_systems = 1 diff --git a/energy_system_modelling_package/energy_system_modelling_factories/montreal_energy_system_archetype_modelling_factory.py b/energy_system_modelling_package/energy_system_modelling_factories/montreal_energy_system_archetype_modelling_factory.py index dee467f4..9fe1176b 100644 --- a/energy_system_modelling_package/energy_system_modelling_factories/montreal_energy_system_archetype_modelling_factory.py +++ b/energy_system_modelling_package/energy_system_modelling_factories/montreal_energy_system_archetype_modelling_factory.py @@ -13,17 +13,18 @@ class MontrealEnergySystemArchetypesSimulationFactory: EnergySystemsFactory class """ - def __init__(self, handler, building, output_path): + def __init__(self, handler, building, output_path, csv_output=True): self._output_path = output_path self._handler = '_' + handler.lower() self._building = building + self._csv_output = csv_output def _archetype_cluster_1(self): """ Enrich the city by using the sizing and simulation model developed for archetype13 of montreal_future_systems """ dt = 900 - ArchetypeCluster1(self._building, dt, self._output_path, csv_output=True).enrich_building() + ArchetypeCluster1(self._building, dt, self._output_path, self._csv_output).enrich_building() self._building.level_of_detail.energy_systems = 2 self._building.level_of_detail.energy_systems = 2 diff --git a/energy_system_modelling_package/energy_system_modelling_factories/system_sizing_methods/heuristic_sizing.py b/energy_system_modelling_package/energy_system_modelling_factories/system_sizing_methods/heuristic_sizing.py index 5cf9c167..9d87c6d2 100644 --- a/energy_system_modelling_package/energy_system_modelling_factories/system_sizing_methods/heuristic_sizing.py +++ b/energy_system_modelling_package/energy_system_modelling_factories/system_sizing_methods/heuristic_sizing.py @@ -1,6 +1,159 @@ +import copy +import random +import hub.helpers.constants as cte +from costing_package.constants import SYSTEM_RETROFIT +from costing_package.cost import Cost +from energy_system_modelling_package.energy_system_modelling_factories.montreal_energy_system_archetype_modelling_factory import \ + MontrealEnergySystemArchetypesSimulationFactory + + class HeuristicSizing: - def __init__(self, city): - pass + def __init__(self, city, population_size=20, generations=100, crossover_rate=0.8, mutation_rate=0.1, + optimization_scenario='cost', output_path=None): + self.city = city + self.population_size = population_size + self.generations = generations + self.crossover_rate = crossover_rate + self.mutation_rate = mutation_rate + self.optimization_scenario = optimization_scenario + self.output_path = output_path + +# Main Genetic Algorithm function + def genetic_algorithm(self): + best_individuals = [] + min_fitness_scores = [] + for building in self.city.buildings: + population = self.initialize_population(building) + for generation in range(self.generations): + fitness_scores = self.evaluate_population(building, population) + print(f"Generation {generation}, Best Fitness: {min(fitness_scores)}") + selected_population = self.tournament_selection(population, fitness_scores) + next_population = [] + for i in range(0, self.population_size, 2): + parent1, parent2 = selected_population[i], selected_population[i + 1] + child1, child2 = self.crossover(parent1, parent2) + next_population.extend([self.mutate(child1), self.mutate(child2)]) + population = next_population + # Evaluate final population + fitness_scores = self.evaluate_population(building, population) + best_index = fitness_scores.index(min(fitness_scores)) + best_individual = population[best_index] + best_individuals.append(best_individual) + min_fitness_scores.append(min(fitness_scores)) + return best_individuals, min_fitness_scores + + @staticmethod + def system_components(building): + system_components = {} + energy_systems = building.energy_systems + for energy_system in energy_systems: + if cte.HEATING in energy_system.demand_types: + if cte.DOMESTIC_HOT_WATER in energy_system.demand_types: + break + else: + system_components['heating_system'] = {'generation_components': []} + for generation_system in energy_system.generation_systems: + system_components['heating_system']['generation_components'].append({'type': generation_system.system_type, + 'efficiency': + generation_system.heat_efficiency, + 'capacity': 0}) + if generation_system.energy_storage_systems is not None: + system_components['heating_system']['storage_components'] = [] + for storage_system in generation_system.energy_storage_systems: + if storage_system.type_energy_stored == cte.THERMAL: + system_components['heating_system']['storage_components'].append({'storage_type': + storage_system.type_energy_stored, + 'volume': 0}) + return system_components + + def initialize_population(self, building): + system_components = self.system_components(building) + heating_system_population = [] + for _ in range(self.population_size): + individual_components = copy.deepcopy(system_components['heating_system']) + for heat_generation_component in individual_components['generation_components']: + heat_generation_component['capacity'] = random.uniform(0, building.heating_peak_load[cte.YEAR][0]) + for storage_component in individual_components['storage_components']: + if storage_component['storage_type'] == cte.THERMAL: + max_available_space = 0.01 * building.volume / building.storeys_above_ground + storage_component['volume'] = random.uniform(0, max_available_space) + heating_system_population.append(individual_components) + return heating_system_population + +# Evaluate fitness of the population + def evaluate_population(self, building, population): + fitness_scores = None + if self.optimization_scenario == 'cost': + lcc = self.life_cycle_cost(building, population) + fitness_scores = lcc + return fitness_scores + +# Selection (Tournament Selection) + @staticmethod + def tournament_selection(population, fitness_scores): + selected = [] + for _ in range(len(population)): + i, j = random.sample(range(len(population)), 2) + if fitness_scores[i] < fitness_scores[j]: + selected.append(population[i]) + else: + selected.append(population[j]) + return selected + +# Crossover (Uniform Crossover) + def crossover(self, parent1, parent2): + if random.random() < self.crossover_rate: + child1, child2 = parent1[:], parent2[:] + for i in range(len(parent1)): + if random.random() < 0.5: + child1[i], child2[i] = child2[i], child1[i] + return child1, child2 + else: + return parent1, parent2 + +# Mutation + def mutate(self, individual): + for i in range(len(individual)): + if random.random() < self.mutation_rate: + if i == 3: # cutoff_temp + individual[i] = random.uniform(40, 60) + else: + individual[i] = random.uniform(0.1, 10.0) + return individual + + def life_cycle_cost(self, building, population): + costs = [] + for individual in population: + self.run_system_archetype_simulation(building, individual) + cost_retrofit_scenario = SYSTEM_RETROFIT + lcc_dataframe = Cost(building=building, + retrofit_scenario=cost_retrofit_scenario, + fuel_tariffs=['Electricity-D', 'Gas-Energir']).life_cycle + total_lcc = (lcc_dataframe.loc['total_capital_costs_systems', f'Scenario {cost_retrofit_scenario}'] + + lcc_dataframe.loc['total_operational_costs', f'Scenario {cost_retrofit_scenario}'] + + lcc_dataframe.loc['total_maintenance_costs', f'Scenario {cost_retrofit_scenario}'] + + lcc_dataframe.loc['end_of_life_costs', f'Scenario {cost_retrofit_scenario}']) + individual['lcc'] = total_lcc + costs.append(total_lcc) + return costs + + def run_system_archetype_simulation(self, building, individual): + if building.energy_systems_archetype_cluster_id == '1': + building.energy_systems[1].generation_systems[0].nominal_heat_output = ( + individual)['generation_components'][0]['capacity'] + building.energy_systems[1].generation_systems[1].nominal_heat_output = ( + individual)['generation_components'][1]['capacity'] + building.energy_systems[1].generation_systems[0].energy_storage_systems[0].volume = ( + individual)['storage_components'][0]['volume'] + MontrealEnergySystemArchetypesSimulationFactory( + handler=f'archetype_cluster_{building.energy_systems_archetype_cluster_id}', + building=building, + output_path=self.output_path, + csv_output=False).enrich() def enrich_buildings(self): - pass + best_individuals, best_fitness_scores = self.genetic_algorithm() + for building in self.city.buildings: + energy_systems = building.energy_systems + + diff --git a/energy_system_modelling_package/energy_system_retrofit/energy_system_retrofit_report.py b/energy_system_modelling_package/energy_system_retrofit/energy_system_retrofit_report.py index 9bbc4b23..1c211eba 100644 --- a/energy_system_modelling_package/energy_system_retrofit/energy_system_retrofit_report.py +++ b/energy_system_modelling_package/energy_system_retrofit/energy_system_retrofit_report.py @@ -22,7 +22,7 @@ class EnergySystemRetrofitReport: self.retrofit_scenario = retrofit_scenario self.report = LatexReport('energy_system_retrofit_report', 'Energy System Retrofit Report', self.retrofit_scenario, output_path) - self.system_schemas_path = (Path(__file__).parent.parent / 'hub' / 'data' / 'energy_systems' / 'schemas') + self.system_schemas_path = (Path(__file__).parent.parent.parent / 'hub' / 'data' / 'energy_systems' / 'schemas') self.charts_path = Path(output_path) / 'charts' self.charts_path.mkdir(parents=True, exist_ok=True) files = glob.glob(f'{self.charts_path}/*') @@ -233,7 +233,7 @@ class EnergySystemRetrofitReport: for archetype, buildings in energy_system_archetypes.items(): buildings_str = ", ".join(buildings) text += f"Figure 4 shows the schematic of the proposed energy system for buildings {buildings_str}.\n" - if archetype in ['PV+4Pipe+DHW', 'PV+ASHP+GasBoiler+TES']: + if archetype in ['PV+4Pipe+DHW', 'PV+ASHP+GasBoiler+TES', 'Central 4 Pipes Air to Water Heat Pump and Gas Boiler with Independent Water Heating and PV']: text += "This energy system archetype is formed of the following systems: \par" items = ['Rooftop Photovoltaic System: The rooftop PV system is tied to the grid and in case there is surplus ' 'energy, it is sold to Hydro-Quebec through their Net-Meterin program.', @@ -257,8 +257,7 @@ class EnergySystemRetrofitReport: for i in range(len(months)): tilted_radiation = 0 for building in self.city.buildings: - tilted_radiation += (building.roofs[0].global_irradiance_tilted[cte.MONTH][i] / - (cte.WATTS_HOUR_TO_JULES * 1000)) + tilted_radiation += (building.roofs[0].global_irradiance_tilted[cte.MONTH][i] / 1000) monthly_roof_radiation.append(tilted_radiation) def plot_bar_chart(ax, months, values, color, ylabel, title): @@ -565,7 +564,7 @@ class EnergySystemRetrofitReport: placement='H') self.report.add_section(f'{self.retrofit_scenario}') self.report.add_subsection('Proposed Systems') - # self.energy_system_archetype_schematic() + self.energy_system_archetype_schematic() if 'PV' in self.retrofit_scenario: self.report.add_subsection('Rooftop Photovoltaic System Implementation') self.pv_system() diff --git a/energy_system_retrofit.py b/energy_system_retrofit.py index 22c5586b..ef0affd2 100644 --- a/energy_system_retrofit.py +++ b/energy_system_retrofit.py @@ -49,7 +49,7 @@ ExportsFactory('sra', city, sra_output_path).export() sra_path = (sra_output_path / f'{city.name}_sra.xml').resolve() subprocess.run(['sra', str(sra_path)]) ResultFactory('sra', city, sra_output_path).enrich() -pv_feasibility(-73.5681295982132, 45.49218262677643, 0.0001, selected_buildings=city.buildings) +# pv_feasibility(-73.5681295982132, 45.49218262677643, 0.0001, selected_buildings=city.buildings) energy_plus_workflow(city, energy_plus_output_path) random_assignation.call_random(city.buildings, random_assignation.residential_systems_percentage) EnergySystemsFactory('montreal_custom', city).enrich() diff --git a/hub/catalog_factories/data_models/energy_systems/energy_storage_system.py b/hub/catalog_factories/data_models/energy_systems/energy_storage_system.py index 909fb1ef..3e9568c7 100644 --- a/hub/catalog_factories/data_models/energy_systems/energy_storage_system.py +++ b/hub/catalog_factories/data_models/energy_systems/energy_storage_system.py @@ -14,9 +14,10 @@ class EnergyStorageSystem(ABC): Energy Storage System Abstract Class """ - def __init__(self, storage_id, model_name=None, manufacturer=None, + def __init__(self, storage_id=None, name=None, model_name=None, manufacturer=None, nominal_capacity=None, losses_ratio=None): self._storage_id = storage_id + self._name = name self._model_name = model_name self._manufacturer = manufacturer self._nominal_capacity = nominal_capacity @@ -30,6 +31,14 @@ class EnergyStorageSystem(ABC): """ return self._storage_id + @property + def name(self): + """ + Get storage name + :return: string + """ + return self._name + @property def type_energy_stored(self): """ diff --git a/hub/catalog_factories/data_models/energy_systems/thermal_storage_system.py b/hub/catalog_factories/data_models/energy_systems/thermal_storage_system.py index ca773e09..c7f1dc99 100644 --- a/hub/catalog_factories/data_models/energy_systems/thermal_storage_system.py +++ b/hub/catalog_factories/data_models/energy_systems/thermal_storage_system.py @@ -15,11 +15,11 @@ class ThermalStorageSystem(EnergyStorageSystem): Energy Storage System Class """ - def __init__(self, storage_id, type_energy_stored=None, model_name=None, manufacturer=None, storage_type=None, + def __init__(self, storage_id=None, name=None, type_energy_stored=None, model_name=None, manufacturer=None, storage_type=None, nominal_capacity=None, losses_ratio=None, volume=None, height=None, layers=None, maximum_operating_temperature=None, storage_medium=None, heating_coil_capacity=None): - super().__init__(storage_id, model_name, manufacturer, nominal_capacity, losses_ratio) + super().__init__(storage_id, name, model_name, manufacturer, nominal_capacity, losses_ratio) self._type_energy_stored = type_energy_stored self._storage_type = storage_type self._volume = volume @@ -109,6 +109,7 @@ class ThermalStorageSystem(EnergyStorageSystem): 'Storage component': { 'storage id': self.id, + 'name': self.name, 'type of energy stored': self.type_energy_stored, 'model name': self.model_name, 'manufacturer': self.manufacturer, diff --git a/hub/catalog_factories/energy_systems/montreal_future_system_catalogue.py b/hub/catalog_factories/energy_systems/montreal_future_system_catalogue.py index 4a9672ad..74e6b254 100644 --- a/hub/catalog_factories/energy_systems/montreal_future_system_catalogue.py +++ b/hub/catalog_factories/energy_systems/montreal_future_system_catalogue.py @@ -278,6 +278,7 @@ class MontrealFutureSystemCatalogue(Catalog): template_storages = self._archetypes['EnergySystemCatalog']['energy_storage_components']['templateStorages'] for tes in thermal_storages: storage_id = tes['storage_id'] + storage_name = tes['name'] type_energy_stored = tes['type_energy_stored'] model_name = tes['model_name'] manufacturer = tes['manufacturer'] @@ -302,6 +303,7 @@ class MontrealFutureSystemCatalogue(Catalog): losses_ratio = tes['losses_ratio'] heating_coil_capacity = tes['heating_coil_capacity'] storage_component = ThermalStorageSystem(storage_id=storage_id, + name=storage_name, model_name=model_name, type_energy_stored=type_energy_stored, manufacturer=manufacturer, @@ -318,6 +320,7 @@ class MontrealFutureSystemCatalogue(Catalog): for template in template_storages: storage_id = template['storage_id'] + storage_name = template['name'] storage_type = template['storage_type'] type_energy_stored = template['type_energy_stored'] maximum_operating_temperature = template['maximum_operating_temperature'] @@ -342,6 +345,7 @@ class MontrealFutureSystemCatalogue(Catalog): volume = template['physical_characteristics']['volume'] heating_coil_capacity = template['heating_coil_capacity'] storage_component = ThermalStorageSystem(storage_id=storage_id, + name=storage_name, model_name=model_name, type_energy_stored=type_energy_stored, manufacturer=manufacturer, diff --git a/hub/city_model_structure/energy_systems/energy_storage_system.py b/hub/city_model_structure/energy_systems/energy_storage_system.py index 8951da02..94a0f3a7 100644 --- a/hub/city_model_structure/energy_systems/energy_storage_system.py +++ b/hub/city_model_structure/energy_systems/energy_storage_system.py @@ -14,6 +14,7 @@ class EnergyStorageSystem(ABC): Energy storage System class """ def __init__(self): + self._name = None self._type_energy_stored = None self._storage_type = None self._model_name = None @@ -21,6 +22,22 @@ class EnergyStorageSystem(ABC): self._nominal_capacity = None self._losses_ratio = None + @property + def name(self): + """ + Get name of storage system + :return: string + """ + return self._name + + @name.setter + def name(self, value): + """ + Set name of storage system + :return: string + """ + self._name = value + @property def type_energy_stored(self): """ diff --git a/hub/data/energy_systems/schemas/Central 4 Pipes Air to Water Heat Pump and Gas Boiler with Independent Water Heating and PV.jpg b/hub/data/energy_systems/schemas/Central 4 Pipes Air to Water Heat Pump and Gas Boiler with Independent Water Heating and PV.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7daad9875de9fc55791c58b97f36bbcef48aa9a8 GIT binary patch literal 79991 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%0AYW(ILm zpcoz=0lBQ5_|gg{M|nF##`vf(-1r^sgkR&u0(W5jJnPUO&ec>Ing?mOz&NT`0_7b8 zR9}=q@MqG}hCVdKO9cWl@^8rP1LI0LZ#ra5Cd?WSlh#kwuCM%3yw@k49v6qNusQ_E zx4d|xuy9i#2u#BNzFTtUbX7pl8C@Qn5;K#*K^6!Gp_3%5&a#Ks=XwQHa*l0Jy!BE$ zDPRpf?8y*QBn!<7Q2F}mgN3Slp7rg$oQmz5KjZ8$BsF)vL^tdW=5I%>uMtlmS>mk8^~8C@V73^PEee7O!?RvwTnJ4J8#_Td5pW8;q@;$05zK3^2*5A3> z>vwVc_9r5G!XZbpr+wK_M%2qZM&1XQGDQSRdp`mUQqDq4>Y8x0iel#Z$>;YZ6epECcddPcCoaz@u^}a@ z1w+#lm=zm?)!0zoG@7Lk)}RI@junZP0^-mY*aqAC2FuL;X($@|&$G^hS^UFO4gc5# zq1^eeI^K-=J34NS42?)e1WQesxd!j0?oA@wsk=m!`K5hhT)a`8Yjykb*j29B?2O9K zVwo*(2#6ah47FsXivo6~8L)v{o&Q47A_xNh$0T*2D81e zKq<`ROMAc)oFgJte>{iig0aXV-~_q`8|uiaV7XfLS6{7J1J7gX=TXCwP z`*e4OyT*e=-b8KMS@B0nR}EUuaIA*Y%$V_NaGd=POcJT=CYWZUQ4@!&( zhNmST@s4g4el2<@JoVc)t)u(hbro5?=!*TK4DDBO!-fq*A-E#HvkE^YJLNPC=zfpm zH(j}4_HNO-Mw0Bu5W$l%k;^;#g17yYYHe;8JN^A?^GftyyG#CB7559Rh_eOnF|NBK z&O&uEkdiZJI>odR!;4dUNte7`y+0ed*1dV(l=^-f<)Guc-mj>2{Z%%$T94z!i)TMH za#=bGPuVL{^=L}SHfor35^}Ou#u@MSP(4*&r{Dsu`Or?e;f zSe9$4x7mCx78(D19Nl|t?}3Ch;l_0bc5!w*P1A~YNL94Da#v3w`q;&D2YBS4=k-lU z&M-&kx3KDf*>|XYfIi}pzY|m=HQf{*CW_kLQ0afk&nXgYzUM=N+?iI#%L}@0OSk?< z6cOnH0UQdMS1HnjVV}Bq;B+p<1x&;{XUa zLP!VFGX}k&hYJFl3Y5ZhSw81na*b6UM-7$ITB@0eI7M>Mwe|)I_Gx+gl#0}rd8z&r z5<2uyo`Lq$XSut-Sb(R@kbqI<+Ec5IyFqyn;)J+g&2B8VlfG7)WZ`cuW6*vlavT0_ zVs=sR9pDP!=yZ?ZFMgO;=muq!lr=U0CDP_ysF$05q&T7KIrdp{@Nm()g_3w!9Cw%E z$>J9+#GOMbhKU=DDGjY>;+ix+W!~?LDXdO_G9BaJoagy!Ff%HDc={+R?~s|j3LO*N z;fE^auKQ-uN~_vqzcuZ{_#lUaT74+yQ_6X*hS&QaFFg@*$s#IiZv&mq@2xf)`6O!K z8KEvQ{hV~n`I?=3|C4+ACjATkE#9%r^H0_hH={4ZtEc>80iB8?Xr`bm6HjOn>c_Co zWsDH%yhswrT~7-^JAn+Df2ddrDPZxv2eUCnZl_Dl5|)n?4X z9yiqTga#|b?c8%W+AET?W=gektxHi(g5=h#v3E9@*4&U){L#t~#n1*2RSGxlCd`kl zw7~tEQ@zE-%>ZF+A;g)V+d0Tpn~%~Lv{3>2URfA?1> zZHq*P0P`M839CW#Vm{YaEd`VKaB-ssLTqW9R&Dfj^?$g^W8zoTFe0RU{L93ok z?i5j$>|Js{gTT{9Ew(aOd0=egUF=Wtz%jGim~-u=z#g+%Sa>+$9{eV_T|HC&B_d2& zBQ?+7_`WOd*ees`S@$Z>G9C-;os}Cmd6z$7S7x;6%2R0WT5e=3@|N5l<&zY%hC3hk z&3H!L8_ehV6{d!GZcjs9i`TxQ)m^gF_V|Bz@-nr38z**9POpCg-L{QuExr0@t6bcG+6dPd^=T z?8H~^8vpT17*R@^@unovVCG|n>Ij|_E6)BklY{gP$nyFf;UkOYbvTi&>rm9((Q`iws1P_63P~hR8Se-e9$ngy%0;bQg^nKXE~jYu{mffc5jTXk9+v6LIm;r|kd;%H?mRfnQKyY63XZXOhuVz(u>%9aGd8^d zgH2gx{;38k*q=3Y5sZr@(Q|&Fk!tSRUssS%E)ftpEag6dKVyfb^_GB-M{xLqY{!Z1z>z~ZCNZ=@wf8;@! zkEaCo8cWCYcu!I9c<=bZ9@Ddilvj@nl*Tq48#~Lb|G&X?xSIj4OoIBc>9i9)+Qz&0 z1XSE!mR6=q=Wf2MJrq5g!RZUdgbROd$$Lq7#@c{XO#`ELJqv|oA#*joVB6N8=N~&9 zFmabjSSulf0`2q)UlxqdMI=un8adzgtbNYcw$6NY_YL}5dHh_YhHRRV`WxA!(K44q z39pHc^Q&t3aG18!nY5-S00k8N9}i_+(15Aa8uSFlbIuXd1W@d*%7xWv>dV}Oc$14T zBXHc4N3*yL&7H=cN6zp?^0n{ek^f=qRj<}yI0EY3=0{(;ECul&NAz<}>z(k-j`3KB zGTW81xU8?%1lQ~06h~D>aMH{yQS!6wXGq|POs)JTm%-kr9x^8?_e{NY+r&55x_;fU zdP2A7x`F8`zpy1Oj2LFTeyl;krgQn3XNwX&E$-ae1 zDeYx-hl=}Cx48W4^B%*I>(5#}iq&?7pvR-)hV{gf`B`bOR;-X@U<$n!U_&uwZ_5u@ ze=~Y+-@g8hf{aA!u`j~i&k3C*5v-pH6^>e#6|yRgGwbq|_E+(k-MPgm%XjyOpy-{Y z!LkfZ%0vUqJ;josWTptlJ?U3gsd>C*clyIpnG%J2P4|rEkD@pM?sir+%x&Tk15Ncb ziK&cM*m*OYaEyO~>abh{yc)n&D$-~AvMGHn?a(yL@B6J@&P8SH-hk2JuOB|V+P(5l z0E4sJLvY_+H!bsnCt<*k>-vq8a|bbxKv8p4Sg-=(M-%92Z;|ygr255WQytG){gm{;3H@Eut@4Tvky}R-d2qH zt{0B?eb_^s4IPOQ zVQ7(w8!*QgE&Gj2c9@MfPWCM6jcU&iUb^=|_@rZlM3~mSqGClF#lUxp%7gP;|;O`Js1%q*b17;PoB@GUq6IvK;HlVgV>+x%`(9--sJB!bOvN-x6ZVyhf&?PM|gyH3< zI55(!X1OR<>cF&q2Q`X5R(`Q|(``nIQ32?9iuJRrWflP=3@56SnK0^p?Dj>??5rm? z#Bzg|@8#XEM_kd2teeI7vp(rcBX}}8;#L6MOcL%#vRjn3i*~RwADZsM-! z2P9(}%%v;9INqu4LVhcIO~u>rVY};!RJzgTE4lvXj*t_A%#WhD;Cd(G*q1}5bm{9r zX{OE*m57d*RZU_zk#^Vxy=Em2A4Qi*&dd+9p+Tp5b(R>lS|fQ%Vx{vZ&ufbf+>3W* z#pXDlDR}6njAU|wk+x;rv^lMxSO5KQb%Q!C(KdD!&g%H@fd)Y=u%iiX#boAV1)q*1&o#A^8 zj%-<1+xmZ-p$@!-Va?-z*pgN#1U+01FSzLfOQ+;>9~(O9S@4q>=TAj72}RnA*tID6 z8fhQHic!ZbpE$Nx4Ca{(mz)SgKlI}bP>rM$t4qG(g>jh zA5}qH8?~a;bf;Snb{BSoi9DG=d*CIN@#b^Sla1&><3^%LHRp(`D9(Zsm9S)|CYa!s zGdQ^x8RqGfcKJ}IN%a9=65}YZmP&iZv0aZ+^Ic0@znM8ece8n87a7-?w%#l)>8Zs_a>=In{31RrGpwrEf83 zlm6SId~b7Zir@Sw=D2WDc6#X*Q6+dU?qC<|AYhlXYJ~M}-rudKtSjzLe7ZE5Oi0O6 zXe+CF6<>BqCVx0H!!7IaiN#23V2pUW=f-B(-;Q5t*}JzrM-6FOhkvosX?uz2Q~l>?luBu^oHG*M;o){mma7-y-1_-kEQ@48;i z_+DCCOLXv%~FYKGl`Pdd$(A<)kP(V|F7CngWW$-IS#}a&Jon zhVpfmDv7M~isANsvXKD7TJ^`5i5&fi2tPhtSAjxm$k;A`K2AkN`%YVwC!eWu6jr?- z6&1r5pZuPC^Z7E3N$r~oorQN_RbS^+R(iK}X=~qSHdK~cLnb8PUlNkE^@NjI!n2qL zNvZPm?+sVHUW*>uXjUmub2bTgrK){^+lol#o++o~o$cY*S^6$razKkY(X^Wr^&Day z;ut0U(F?(aQo~v2%qiTg<{Gd>^^Gu?4i5cbumBpLp?|)Bf4pTw-!6c7!@r)G{|Iu} z0^(dC3~&H_l+{cou1T|@AAI=n;M-=HOb}(7N?Ln?U-e)^E9R)bIk9YkJJ77t;dDu0 zk4$>9q5HexM{C0W?&B`}4UU!S z(b^7)1U+ooH0SgAR0bg8-u{k0-(fh~UJ6Nh+FFRUu_^64G%@YKKv#%odBy*V=Wcgr`X$P}b0nGs;%AEJ97uaz zzz=*Z!*rCto!72dny%Pb!TI@)?|^poQ`_aEGMj=a#jeAyy0@fL#oL65YYF!d_zDrGL-FF+ifv-C! z$76U(_O$zDJI(7J-La2*t%Gmh zSp~jZ<+m`K5wMWnF?hGMGt3@n1J^|MS}hy8x-m!i4t8r_b?|9_?io7W3U`3{?2zTW zw&=*Ny=okr?@gR|yIuBp-xqC#u@LO{w|8g`_Vt+Uj9Z|wYdB@3yig+sr|t<>z{ewx z)L{O*V(v=qpD7#n-Za{IP+G*_!QM)MI7_4}zuOvGMjAxbcZ|uOZgO?bcx7Z2hc6rn zLF+ja!VX~&Wv57n)^q(_oGo|>3OZ7%;6|I5t5eL$pJ$e1PY21n((u3_sy_j?VK&`- zT>=&>OE>f+_gu+rbZNP9n)+mRIu=^fj2$i`CXqI(eabUIlE^AY56oj;O{c#45o9nR zB;GNAOg9GH-tLCk7BK>euO$AF9Y)Z8`~WP@A|H{2i=Y$(Ay8py-HBI_LOZTKct*joh1dZ>MgI z&RXvaqK%Eu46kskaRmjr=MJ>{`+JG!=I}VC`hQjMdcI}PM=T^bUMqzxf(E4Ay_-}h z?X>G%m=Vt=GA>VVulV-B!@K&f2*p^PuU7!i5S;*=G%M;WmrplhT>YZD z=h5x(275^_*+Sgdx?6>(3?Qv5S72g`+YBKb12H)0XvCW?T4%qdv_l2ul6mq%^~xS@ zfjx!B@BGo&$4>D8=g??H_vbJ;nGq~iWTmwV&j8TO=4yRr#?HJV<83MK=F2t)&R4E& zQF!cu+c*rZON5W1|JH5y$1}t}uh2DUJCSg|(vNiQ!P9RKCJg!79E_(;VbmFlfVo`Y zh7QDHn6w3MXk~o_OFGV=w1?Hqj2dU+XE!O-+JoUNo_$Mw>-_m(XxE$R9)d~kDZIuf z)sJhZ3pi6o$Vv{>+WNdK+RcolN^EWsCpEFJVuUKccD@~?ihQn|aOOYz`QtgYi?gQWF+C25v z$HYvwoi#mvYgBic()w2d3?xQ1sUkbKP*5S-CL`v^9p4R|Wo<<#tP;4}4zBJ$lxaU- zmhtxW=;6cddS-jh?AIq=_N4pEZpI}=DOwA&ddA;c2TH}R%?3^dkE=37lSU;YYS%Lk zBU434srl;?-hB190x^$*yS+W+J(rChmwGe|`zSbt34mPW=J_FGTGgvcYG0#cr#8p1 z18^R%+F*DZ?Owdo3JD>NBjZJsye5?3@-ct!XF9ES_G-UA9J4Qb zzeC88t8Gf{8_McNl=~8X|N2EM!#&2EUQ}*5($0y`(B(p2pa&NLg7zF|PI1p@3g)C_ zCet?bWFFjH4Xccv4*&Ks{;2j$yl7$yP+45OfuvBlyszFg$vX0pR{>Vlczfg7eb2y) zlMcHaX}zYTboKLr&XF3u;dlV`meQ7yZR7!61#GMdXS0+_RuJJlWl6YEeyHxq^+MMi zNb})9G?W?ALl{aQor|Lz1FKBkUE43~L~qG=H+3&NtCKfr6+ANv(V2*L_}5K=z4#cS z3n_#R@j4W-SMa$`dR$mGXJ;)C6cLF?w=jA@`TDQ`igeYyJKA33%dx%{_EDEMH z6LX(hPhDJDk;G4{M>o7H*?jEM&|zq0+J;yPYz~^~zyui`&JrWxw)K|lcp8QlMXkAn zS+#vwSoiXwu@EudyQ>P1DCy*=<6pru6C*rVEX&)B3b%)!HH*nME%6*g6>DsNt)uUY zr<`lE^dTnTONCR6yy!>EPxwjz5l$D~ohPR#TJ}M< zA_8GQ{qb8JlT>HuRo>mX5@?Fmk1yp%e1_1WYqQ_81?LZR37F#YE9S3q)f#Axd0C@h z3#8P75DC{IW_r1fx>(5!}omNi+8@AOAY=&fw@JUapg$H_OP#4Tml$HVjF_ z{BZphUHPfB6H0k5eSWMV`YnCh*S0oGg;tJ~V(!8%J9 zXX_KCA?`6Yv%9fob@bV#Pf%detSVg*Ng6erRiPM;>`Zy#LJKerBj~qed-~X#Y%hGj zZz1Fyua^3P!NIh(tlC}7m%%#N33BT!Oh1AcHdc+L`9)RhJueI>x@VB<(K9C>U2yMU zNTF9^R2tp>pHeseYf~p`vCLP*>n0jBElPWoZ-#NBpS^;~wFTo7vAsVo?@uwI$6P%^ zcsjjk!Q%G^ufHLX^O%vv=%u4i1iOb-!Hbj{NwUClcBs3E7xLBFIbmC=J{72*EfXWm z(|+$M2imW%CTJGZ4w6z^S*FHh3+C-10CE^(I+h`9)T}?<%rf{rntz7j^n6l7cYD~x zg*ao0)Y8H|h19mKK_7YQ7NT2gaIF*&p5`YLVlkrCio^Z7(m$(ktgSunKF{ZJzGV4E za^96s7~ePRotONw-kSS&G*as}@T2KO%9pBHCC{iaRunoJKJjfqFSBrc|` zTli1cae#Eg|2XYp0`g3I`M}?i1~PB%gX*tMG*16Cr)DdF`xm z!*@=}?_1*)<8b=EJKq+?PqbCxx!-ZqU$$%yg$Hh1y#FIM+q1&NaRA9v0LZnXR4@~7 z5!dvBj-uec2^3>onE{~B8ccS|Dv0eKi3Kk(T2i$L7G>GP5s!OVtuN4qAc62N=(kWB zdN_x);0TKmr@H_<8*e3eA~s-gv^Jn<+@%10RkHO2@0&~oU})aV)F_eDO71@4 zTCz&LGyJeWK0Mw##Pl4;6#lhFJ-qp6T3@*C0i1G}7BNPb^PYj-ZiB(9&-krPG*B=V z$OVX~?q7`sZz#UbEYRf-?#1)_0C|cKMr2p&-(Tt}@~Ac=XZV>s@|fFtJM~`M4QOL+ zgN!31Txqa|ZF{pI!ey?%q5e z>bLD59;sAFvS*o!C`+=ZFqJGNCWIoUl08(m!I-gx5JD(olC82#mLZX`ODfqJ>zHKE z3>w2MJ!jwNzOL)LT=#ul_w&1--}CxCfAq@oG4uJHbDYO{9Pi`(J`PYt!VWJ_Ssu*~ zrc|`*$-6#ns}7LjiKXN!TkXE`+Nb~tAj11tK^)Bc#jX0?D8XLuwdH#riYoNnc1v5` z65P<#HG`~-H`|_6aeVQGgw|-RXGi1=BOUd7D?>E5;d?6?u1iYK9Fki1MH)a)L2wU1 zRVBQbx%Z1N<8cn9E533;QYlUR9-L3n+*alIrQ3%%cItApdW>QkE%Zc&hdTnm*(lxU zu}{n)P)FTL2-0z*?E*)F&nW@aH2}_~{<4QMZ(HzbS=bEzpe#2g?(slWaV>e02=N)- zks1hY)Gwh@cA*f|P4MC! zD1elgsm=gbx1jOM^r$Ip%R>}7c1tIgB~Uy#vG!|wa~RovshrsBwld^S3@Lr-sJz#9 zyrBYsLRQyK|8aasxW`L`bMwq+gmXPeTo790C297R`Z4i$k8h@oay^=~Yc$H(`?%6G{IXL?0 zB3BCyMln_%{@!yu%}$x$;gPm8*5(@G>Exo7)Tra;pc{!mmo-`(A-&Xj&z5L?VS**R zbhioMoGZ&8*>tYYdmefmx{V2;J5jz(oy2mZbSdr8-^tTnl}iVAI7_i_6f6(a&i~&t z4Ea(4lNY$X8yEr1cL1&ynwujlP~%cZxt6BkFA z%m%z`Oc;6xx_jSDn2w^3+f*h(P~pmK0YbT}qgmp|$x9X2?%s)IDN>G>6fM+qfB6C3 z;|3c#G2Q>v65$qZE;sCaa~pZ|#FDlc?b!}JC{qiNfpNTz&yf13%P8ODcOFt)JiuQ- z?oZHm)*bqq@r9}txrW*2YLju4P+;qE!eC1DyP|i_l^dyWXX~x|`hejeDP2r~1sWKQ z9Fse^HW6iexzF*T36z+hF(o=A5ng7zB-%K)LUphQA4=dwLfN~O7aWEa*C3KyANy%p zeaQx%YRw{9@;OJO{FkpC7h6g}WWuTg64?h(hOAKhn8_48%&3`l7bfH6^YU%L9oSf`k*8$bch5^G2_D8cHYJm9D61Q;}QNhKE1}v@as{R$DC2wjG zSuPRd0_saApb7QDi93*p3mL+x#=`Z@IAy&y&W7}Lqo>5{gAR0l&L2irlm zFjC!AuU=0-qsTr)oXa-A-t+HdC-J2oUe%*5zx^Bp>Sd4+*d$@&!g>N`@oFNdV|u!K z4-K*{EE#4$A#W!(%_UJ4q@R#P7@*yGWBHNegQOjA=-4~?iXsktErd7s?3$j#-_?GX z*FsEz)2jm0uAHzBx|BpUX_11`&%RxLfbXyZNg1CAvh8ufO~nA=joYWhZiQt)HuY)X zsZwaHM}$Q=K6bi3;`xt_Fz}fg4E~tlLHAEolva@5K^Xxp{z|k=Ubz%nQRLhEc~^Z_ zk8vj2GOB5w)aAr_8I&@90I2;Gk$f%XSI@`i#c-qN;2p9%58XW}kgYq*+4lnQNH+%m z4W@3<93TB~0P~4=D}u3InVlG0?+rY<3?RwzQrB4z96@XU8_)Q--^Qn++5)aZ6UBd<91X(X&9zZP65wts|i2k|javi?^yTibk zZ!q%P?fJ}@Yb&zbb$34F1bgzZ(!L4Zs4RTWBfwAqQXGdqW+l3}EpcFS*Jh2@ui)1us@9C+;it4{y zAja1}@i;V&^(s@WFfPlvTfH@Mv{{C;-5tWPs3Xvl>72RjUf3=TJ`Rt!@wC)}aro9{ zpTb+Kk6QQN-u~lyxRH*{3!6;#7lf3KE<=;4_KrFj>xt(s+4tG?TC(m@nY56e;|2%p zzc|XcWI#3qnlThZOca=yE1X_@nv40e<;YB(O3bC7Uqf%K~u-*{bb z2R+51*Eh~yye-ZT<0DyYdNk|So|A8^Wa3i7l26)fqAXWS=k(xgnq$_BCmCG0$>c5ZMIjG>&5aOIvPWTCN z#fI8)MX{x35tN4>*7dU0eX>=ItHLAK?CjnQubUn`(rhBypuO?-n#66;fEzZMgIzm= zhJugP7skZn2(!-s*Mf8x)2I)dy~hNZNW&~|U6^zWOtaae@`iVRgQzrD zso`zC&fjLtoLnAW@fLR{0&S94{eF6Nn@G3Ad{Ap^_!R}w?$j+!rIQkBH^0v$Y*&b3 z<-%_8dXPn0B`w?7{B&F}Wq$oCWrH$MeJevJ=w3k8&E$(-Nj!mETw=4wjI<#u@CaD> z=NiU2bUSu0K9L`p@OiKmwy$(QRhFUPZ(_1NX21mbA^CE6N7O>7p{gM~euCWxN zv!E{}?`*#{RlD!6Q>pnv^;9t*Zq{!FDeV(*l0Ns#V6Xx8sRL}?WV!%2TAjMsF#{gU zoBt3S;8K{T3~yw_6?zA7$XKrWJrgLKI!c_PEsHW(Qu$aZUnWAr*~wcyytMFp*87Gn z+vj`f42GLMYA4;4vf5@t*p255oO)-iB=5;(^-fspgvZ;O8()p~qeMSL+D>yF4Aske zUS~uvl~tsBCgty}Lyy@JWdpYfjmkC0OjM5y7p;HZjW0>0N97j~ACLOOoc*r-3~@v(eq5cjg>A5!o0D z@Ut5nOhCOWD+az*36b;YH-~1^3Z>W(Hq=0L&fo>W+^i|WWAHCOJ0%4kb=xrzbSSW} zgoSzVrpEi;cF~V?!zix_PT+6(+JTD4vnT~D=3`7pD!Xgq#}5#TG@)>ZH)>*^CDj%*8EhB9XGGGVRc zC0Z8q;Rad)*kL^wBJnL$pb@k3Wcke=s*2>;*Y{K+puDLE@i->kj(u)A=8bf0+GXdB!mv3UoKH7)6P!Jql~D>b=2g zI3h8(61nN#hMBF&$P2E6$@Ve1y{!|O?=(FdlQhYtcU?KD?d+XoFpW7MU}jC8U_Tzh z%?1(lU@l#Bnbg7t#Dj5RDib3pJAge?qa_XZ+;K|wgQ_EjDDFMpHKwbuCKaj&s0sfH zLt_oH%3)4#2p+gdYX|PkmPC?MRew&u9x?6AY?*O>qI2^>M?EheENSi&s)CZj-ZA4u z!A%uLFr5iPr5c(P8qVWYob)rrGd^33_Ja-O>RB`LV3MqRm~+j){segc3QWf%Fmb49 zABO!XKO_zubT;TNH^xP#XkR_FqqI7DFKuev=Y>)s@%)AbSKFt#r)04%K@KK`DGLZ! zFDEA$yjL)@Yq+^hf@<9n5dK+|QwXu@AvaMDZ)#5Xebu@lK3$9&{7_d#ahuB zUpW2(#i6?f{~Cpyf>x~kPFE=SZ+wmVmEQtjAjOw5!;1Hx*fa`67@u*FL~ zKujgS(f+UHRTHrF%Rv7!o+v}Hua2vnLzzpqRK*uWAB3OKP?8Ch-j;g$ z(CM!2wYX|KOjiqHedyWF*%#I;V~;s>Zf1ubfBE8{bx-D;Z!d7>N!qsd+c-XrT5 zSqJyePL98e6ZJS*&tNx|V}Rd6A3&~>af=M{k1x0%hrjk~OzfIBSFjrwnM~LY z+?H@Bz>g03ASweE!N?aPhLktXMYS3)bj&yLSCy5cYOzV!P2WnK6)T1CbpXx#>y*#M%<-sm%vS=#zeC`! zKSoz0DFy}82`!o#d;0bn;6)C_JbuQ*I1_I6<+R?Dk|mMWeMa}!f+cM(^p$v5j?C`; zMw}PZmnnN2Wn($I=QK`{Uf!ywjZ%}pjVZ4?{T|F$)a-9#f5ue6o8I|=B4*YZ5bmB3 z8e1BSUUbe5yw#s=(XSJk?Q+#d5cq^c7~ zm#e;~gCKW>5h|@CC*guXpDi*~L=bp2yx?%fdw)cl#9gh!3UBVJB_Zq=y1#kinJ1Q_c#*5L`!ZXAnh;6;w0*>uGLCa9ofDB(ahO{z z?uM0$ofDJFdi4!gd>M(kP}ApUG7@qUUZpRyZevkwem1vAO$EXSP}_U8u5+bi`1AXkuai-F z5&m2dn<2Cqt5S~(+1%1WVo6V7qDz0cVC0YM^}aS9ZtL^sxSaCkh&GNN95?SU9ZwO! zw%tK|a>gCP{0U)|)bC_EQTQ65Q9;WI_41e|N0O(7hf|L)M%9_Ytx@KC+z;XjPfxTR zVU@DCFz?bsrV{T7kL%Du1hX^sd)X_+eUj~&Co#?!9QGXA=;QA^K*pxM>-?ACS0Bf! z+!6y&L zQ34oh#1cl}=vsv?Hm+_MAZetP0zC)+?~GUEu*8h|=l_VOfZsV!OrLUL7RZshSaCA| zdin0kIsJ}n654Kp8yReI;KI`hG)$~8(W1+b%%_Q&X!0ao7xw>75)(;EOva%gTiDa^f+2Wj{FJ#8eH`8R>T0RG|?|x z&VYz^w%}50Gy0}2$N`?S(Y%s3paoQuycd^pkseprja121aZi|ar}D7ZzWM#h%({30 zFZ9$evND)}^BaZb_Ed+*NT~x--Fi!Rmtta(=XFNat-RpJ+i&gu>hjbdv}N$dZos^U zP1sGhK}pb8V^jGz;2sJBjYfUK*G@F>i9;%wHI&sVhRH9-Hug>=EIL9rO@u-Y0QU{R zl|Qua`2^~JXR#Xx>h(aF`~Wkjc!^_E!@-8SPRpQU7^<_I)`eu2Maa=E%dC_vh_Cj>QkS=ZC%%A&Fi%mVqDk>0ty+Wo+VH`*htD6z;{F zs9rzq%qbV<@ay2p22Xym8@A{Pc7BiDTV??(3G;QH4HjgGln0jb<|Pi6oDCl}ovam! z=AiFhZqrkHmk$4;_>CU`8I|Nmtv)zW@I!`XS)E7dCr z5UEPY{8yAY)w{8tyI%N2dyG26)F6slq zH;nXYwN-wg-ruJ#>CkTb+Pl`Ta5RsKrSILVVEv|xA0_t%|H%L!te(u)E5F5-Cy8$a{BvlGsw|(rG(Svu*p;%U;Ul zzEr3`Xy-M3;PEky;Y%9V3vd4sqgv^j0`R-*Z+(s6KbA$|1r8o6Zsv+5jyE_mOo@97 z#b$HS-*i(iPm+ZOqo2C973VEJx@^Q}BVwJpOQkMfCK+aV7}rinfL43A;2vOI%c?;c z;GR))xf7>i!(g_mJ8jo*|nItFK%yI{~D*rdz^xF;A0WixW$Ui;t5LuQ%96nQzZt@FtF++32}B zhgU^haN@)mo^8}%!V#08HoqJ8?%P-VU~91LdKJstTkY+0f-aCPF8+l4I1fr}V3EFq zE=+&;b`|*2W0)>FY(=k`b$SZE34B1u9Jtu%Kd5|sE`SUS;M8>B#P1IJP+;s`DgXt{ zoGOfFih*EtodIRo+QcnQj5uIYtF%yyj1%7(j~UG+mwXguzUGR}GqD?@Hj@ean=P_} z-gp=usoEetKfmneFO$+lG>XSB^SHicXL=XSX+cHm&Nx-nno?`*PSPxl%D%lDVT;+2 zxL5*MKFs9aK`a9OQA({J<;IgpUI>9URgKFNs35{pl#;ZUsflv^2y+dTQi|xhg;kK@ zxie6TbZH-#qj)baP{l8^2i{OMYe*$Fw)m>rfityv*6S8Brdnw)-^iT4I=SW4!e@_O zJ<%!lQIsD2fH;Eg(yX^P6=mck&pm?Mfz-wqye0>vYaT>)KY@>Zrf5TM?jtd!r*Ohd z;Y8CxCbZN5tnJpT1aP1AgCLrZP?Ts_-2ep!W1kW9Wt2n$u{)Dji zP7HUFozvKRsl17?btbsWV;*W(hUlJCC;AufDOy)=={dbOE?hS0sEmc9X346M;_kN0 zK=O9@eY6Ob9kV^NfZp4**%hlHQnMrdi$g;ib!W?++G63^>mUyQC!z2E?P?+D}yagjO*G3 z<=3p3;x%o75uuL42?xsGWEp+W8+)=Wx7Ns2ii~4Rb^U}~!u^CCRc24)^h&Qs{*hN_RPsm53B{U{$ z2Ge_(wzLwmT3e;Px%b^JtLwJA^0j=s5fHr`oV7@}< z`SxPID6`>kfHWvFL0bQ>>-|6GvDn{eG(t_xn{(;*Gxk);WIv*Aj zUWg=bsd&I&p>vU|t{cc2v{~=aP?SC$f1R>o&)256XHdhH=qZd4a`krHjuYi+Te|~h1gIsG@GNBPBTwABS!a4wf2-)OH{gi0D0^?zL%s$|0|)b@-^AwBSwSXdiMFV zV~O!>$gjv#<5zIs4>rLbBzmsJU* z5E0wwc4A;<8cx;2sdc?^uUE}Cp3d&pq6S}S0#oSctsU-fRGZXL5lh;Wgs2H2)B(Lj z67PA15DSrBzc+{aa#TJ}aYn^Yo{S!Db`jkuOHeaMDboW=ncL`L6l|jf^VDFSQGqF` zlM$S0f2x^gn9;8!thQ@MvmqqeLa_Gs_H%6>b3v<#@o4S=9fSPY&GpDM5o&bgvf;}D z{gWGa#+dOEG*BmNsyO>S?5)Br$8`^4?44MPfRL__RDnW^${9n6Bu~8f_=in}clK%N z^Qbw-Iok!aW)E5h`C-+nXQ_Z57;-2o`q`(vogfNQnmlYhZSN(WHeFz#&wW(y^s2-l z?<>?LdUFv{ud7`S9(}b(htowiKL=T4**jrY(VsY6SK~Dkd*#Bn8;Kfq7oSJE$*f+f zinLwF@FTUF5O{xVAQ(K>9N>D6{T*KSs(D$6BIS?LhhUIY2*L!$3xw)?sh zruZUkwZeQ~h__AfqZ02CC6{Sg)zLU|ERp~4!%q^Hqb|ObcDYXy#~rLV1H(?e((Z!w zc!`{5;d!bwS8VkIbb7~#O_5J*L!`97-yojAst$ZU1L<&6>n{SShwC!^@On&Th%FER z>g}X_8jLJ08EVzcnNqN?jt#LGuD?W6uHDb-c35SoGPU~fd?FqQ0X)gS{h~)$URC}r z&r&bz0K*KL@lILD9B<{ZmiD{)UitNIqI`Dr!ryFM9s3$dXr{e=ZKc55d9?FBY~g89 zltW;{aoxsJMbIMYy1T$MX3!zJ?>76SV#AHptG&ESISbX;qdjY0?O~WkEtFF!eVqi4 z^GoEPU(XmQ)Vlw5!Y^3On9k6s7Zm6=x^`UhRdky&{cu|rC3?!4Fu763>-VxF@AH0- z%06oqS#!Gs7hIshgZN-@wlj3yuoa2XexJAu`;P+J@K1=Pry;cJV9a%1!8;qbIz#Cz ztF_#Nz|4CJzN{@gvAt5sxN_6$%D9jW>zq*hiQ|#cks5kel-6qI9MyEP3w-XkUTS8z ztI{n}3O#F&W)$5*fk2P%S`TLSsRL$m7)I}hQfRz#?3mUWHZM5$;%!Dj!j~`yTjK^% zVS_ISiC`p2aJdKwoI>Z=LNJ>)3^+BJsp1%q+k>oK6YSmC4JZ$$c}N|*DJO!ZYr@$Y z2uGA8Jqg-65f#Ms;6RzDs;({P38GH8zLaG8wooxfebzz_h)4s@0gS~S%Le6KtD$QN z#6z*71BVAA&t8OVa@Y$V8N8QSWceiMGPUA@zh!K`=rmo+@Z3Bruh7r4cyKDPYiTF- zIW!c;v#fLdPX4*#c5j_y;>I(3(pDvo1_&<#KHU@+O zFMbg4Z#>wM-XKJPGZP;ZTnHmm&E)l#P8in+U311Td1_~&$X!HnBdSs<{<+Ga6#j>w zWmWg0;`H8;p^?-3Cv|SW!hYOUW8dd!!H>V{Yc45Qq_ zGTrOvGxd8*o!p#zmzojb{QOZ-MsC5DQ-qUSF@J+|R< zkLaI{PpOz)^7I_4K}e!*0C@0$+r$pEtOuJfvtiKoX~u=A?X{)`j(eSi$_3l*tiKDk z8NwTS@|o47=4Zn3X@=8TBnx<7lD!ql`p)@B8;JZaZiSY~V|XXUX1=B8194B9J~PJ9 zMool2`kDWhJzPcn&Fer-StZSgH3ba)1m-IWq;7vSs(4Dk)LD!OT5MM8SX67}`yZ}6 z3$80Wd652Bg&{8AHv>wee{W|t*TYY`rX6;?oa-ROe~NQ%64n8zC%_B(xK z5ZgPQkq?Ar-)3)#E{m*}a#8XdSYFXPK?ix!HqqYtJQdJPrkT z+Lz=r{(KsNhTjq3qK(9C=MM>GJ`lZ^y5Gmk)C3dACngx+>;Ilt!!u z$y^Yk7iw|!PbZQ?!~+&qKK-31lQBf6TQ@7Z;8PWPz7Y;hG-IMOLn;X$>3>=C|-+XV8zz2|Ef~`JRnE|DU@drW*@*CpRTa zS}@&_ia7nn^D#1_O{?7D@&fl^^MZ;aR~H+{8&vjxy}QkVmEnor>bm5Zi!!Bq7NgEm zweD+dtA0C3{PETGYli77$FTEHw=`4;D+cQIFN03;uzQ=(w&e&yB|PE>z50rK1~U!o zYPH=Cl`Dkon6(PMzV@O{fP@$kr)lET8^%Q`dNEXZ^TqdMqXC)w=V|X-o`%a9o&M}! ze`;oH>>KmewsRlwgIZdB+&U!J+$JpEa~jp#67)|HFLS38=}0w{|BodV6G?9A!P zq<0qc4AOG!TG!HH^@SLosBUJJugp(K;03SRx2aBD2de-bZP1p`u1t)ZTwkPU1jh?B z1r3XA7B%>1CO-MBEBfl}$Z4`q#E{K1bQ`7|*22p-)kdHWlGAc|*IP<%$cB%=tNnam z$AoenLSOWMVPN&%s!JyO1OoJIJw3?Q#WX3CanUErT@iwHQ01%wxJB0apvo=AGqjo3U~<&1I`K(Qm&STE%C^uf9ZRju>8t0Z51n(qD`R1# zZS`ITcb*CpLOBkil|d9D^9^j5*l!*z{pNaws%~qVzvAkdu$vDmr1Gs#Jz1`L7uN#H z7PV+?q}L4T-Arg@;qn}Ww9FQ7qWmQVcYk;ustTJdfUW?1ah(-%88gRea|LXFP;y9) zWE{f`pPs9=QmyGr$Wh#v15~hLKhf?u8Ny3IJE_q)wzIMdp&c5gJpVY*-vpT|7 zl0s)7&Q(nNDFiW*Rz;0&PK<+5USg{1w4a$sevdAgqm<9}Jf7ZKA)x$t7})^RGH3u0 zkrv|?=7SNzX<~DMkDZ!zN4#M_dqwj7gC7)VqmBqR+uD3JHwAz&{Co72)v5r;2CMG8{?^gLIRXQKz zx41YVU*YGN-10O7vi_^g@WG|d2avzMVm9?X5LQeTR&E_HRh&H2;vH=(^~BF}3deo_ z^UIJ!uVex)AJDVm^0}ob@{MyOmN`K8Ed9{q*gJp^kR=3E?ZZ6+;m$Ky8T%dM8WPr&p%+m)_g0Xo z%dEcJ@gna*xq{K_Z9{z8KX63~(ey%UZ3A|zFGGA;5}DoJteM_Zso9HAu}W>|Fb@sn z%z!XitjFN>9!Y7@MW{24<2rqH9wgTJcKuq97*Ed|Pfhl#yuEI6Sgdn5e$&rEZE|8n zda|%ZSzwMWNttNz6tNl9*r`)wCmtx;p>XXf5AK;91?T*X? zQ1mtF3~}c*E!EiO|KPd4x|3mp*||s1hQW5|R`B)@^>pY6YGT8<3g84sdn+a;;?)#X3n43K zRG7Tr2#Nyp?Qmg0DX~2>XBIRa)YZ4?D|M`>sEjh4Q13Z*$zUTWZ9iWLB-jt>y_7@Y zv|<(1bIgx(bmLFz9^9nO5BR;U-+jYe@YUBn&z?S1ahSe3*aDAn5T(OOflQ+*mh;G| zFO$9rb_?ZaT|YNo+RHI-EXc9pGTB9!hPFU?=*?#aWU1>>1<`Oq_!2omJpNdV$In7UAfcq=eE3?3f;xL#)<^M=aF%c zO1{S42mCedA{zRyt(YM!?Em_Bhkqv9`wXL4!vQ&YH)d$i6R_g~Qr7|&2Y+>Irc|(7 zO~Gv$PnCjz=WTQU({8rrUMeZxq{>FJYf9g|5DjNlbzd&@?f*q)@Z z@ef~f_y2@AYrA-#^5}Pc#wQ47>vZj4Uh2h^S4yHKm8XQU`}-0IBpsZI{&%#Rww>rPU4S)D7sYP;kqm|t+F4ib<|Ijb;ym5C? zfW)cbTL!Ieb-FtlMg{-5)X?EKso~>aoUBcKa`d7cWsodKR4!R0koc*BPrR3u4r*LV zdgl~z4;?7u={Qz2`{6K7UeK*K<&m`Wx^A(VV_cg>p+3L)XZ7XIfMAEgigBWnrakau zC5gxXMj%yasypY4__%X>Ix z24Lk;nIWa^Q;FP6!+rr%Q$3>OmgCI0_v&EUg?~mrIbFOUW@|+o|IoK1PqeNb)lQ7d z=8rJI_p6Jc;IJ0uIJQb~aPYem<69F<;!nsbDmF>;7Y;eaq**IoaWJzVz9Tf)$T~Ci z?HovboogkbAGMK{FsNoGclOivTV**+12?2H2^OcG7$e2gucJjtF`!=&#`+v|-^?m~ zCp6rrz9IPJ+LOKeSGAKIeFMCc(zP3}ozk6|1dvECrJ2Oe$}#oT;5{pL6fZt)8a}_` zw(rU`XZaJ!Dx4GXq>alTx&6Nh_$XX$@Qn-U4OoW2QOufI1p+hJ02PBxt0J~w7BAEQ z6y(IG5RlLRCJ#gjFpd;sDb!_R64|u%I-XPKD7gZXJ>1AFT6RCoN!4n{ifCYCfMf`* zFpRRLXHhM>$cO6IZxfknU!G+Qo@X39SQdQW;$Zxi`02P4SuxnmlZnAVS$H9irV88+ zt8mqwpn8xZv8|WKwm6c0yUnb(t zQa&*U*!z1(JwH5jVQ8fva)Z?4^~eY0EOxR}P~4+98_#SlREWWbjWP~1O% z=iX7t$3J`0H_PW#g7T4DN2Tqb9lYilA3klUcU5pcsy^&LXv!Nl|B6MXF^!;H!fdF( zVhHOzKOw#O`9ZkFtY3Y|LHoj%Pk>EqeEk`p)ql85PV!?tUV8oM7w4wH(R%`xz_j#x zVG4R=f2CSn868zQ>9}(B?4fX(7{{~sH3gM@lC8;;S<_?jOZdUX{=#`aKQ9_!)bud} zXbbnPqO|lCXO{$a@3^@?oI_G!(e^NBBK>qBvdEb3NUBv9w{OKv6$Ps&UVIa|9{uo6 z@{o9@=x77vQ!<20Xz1UdeEvJM(BEGp^moE`TJ9T5nZ5EWSB#;lkYCN}{!GAfqArmA zaTG6dqq&>ImI0KP&go*K0<+EY$%_1h>Eg$h?Sq^V$;WY>fcOok4Rm9!m-tLo-(%h( z@dlA?2vmu5J*&5Q&Uk`J(bW(Y)bUrsU1l{k zm-ANa-)~FWliYJHD_7E3_XX!7f#^bur5j8_cP-TOQwc4uI!c&VL#D2dy#>lIPL&_9 zpM4>g6nZQCRH*_@3v?6&5FS@Effpr5^94NY}c|^U8MTZ(<;bAo|U0pJC8$b z_&`|PsEXnvVR%Q7nN#d+z5T$ATyk)iyPQ-|jZbPLi=Me7%|pssP5HuM4{Kkh%W8oN zS8Tl)*l71`PT@hr>Gv1kMZJ7}BPpOlBA3 z#K9d6kH0}`?OfT4s4)+38i4%6Bj{w3TmzH~X=Fm*HU$?Na`W#JwEdKh{W`{}P&GZ` z)eI?4in1RB|pekOEEe91(=Dmd`FQUf1K< z{a&KpCWxudvu5u@N3VVr-nitqpA|q!Wbdq@D3CBwlV!COr^E+%(}*Qo!u?zk)z9?l zaIFr}&$k89awQN{C#j3B*oGsEe=Gl@x82=#dMfAP$lTkwQDZ^B8!x@gbQj9HL45iG z^r=yDXzPIw$F<3)3*=qsj_HJaAC0GR`YU-2QOsd9x!vK@1%}=@^Rn;tKN^a?rPe!C&blpmsZD+!fy0sG&H?dpFg%3 z`*Byep?^}_9b%~3uXkpv)>8PEt}sp_pLZH!?ceoWp3u*0#A?ow-^ScCsT8QW-wydP zhww*#LWubx5~19lI#-J6%9a$#wcgI1J$|Q}E=XT9){@UEth(e2vt@QuwU+d+Gj6j- zCMw2rCb8TL){e~?dGJ8Vp4_B8H3>H9UuEQ9<;Y~P!vCiemrn?~(hT4tM`3CE-hi`g z3*meb8K^nr7O`Y+BB4=gcMnSFXsXaa%8O5axBcwWBG0Sa8TPyw)_%tK0sa@78Z(oX zf|*PQ?e*$+vAZ3(sD%4oDAi5P_@F@%1*aG1WLhtn5#%3-$|;_VW!-$n7fzV0m{@V& zC&!Af!fcuZARbMWD>JhYjS~zBbu3FUmf(Szd=9O^#KGL*VHpAUP~x&#!bRStBlBj& zyd@q73;h$CVpa)@AL<+j>LuyizllKmDI?_Q=4Ijebq66&g)@VTekbwOeNKTFE{@71 z@L$+3Of2M-&R*kSaQ&0!AN8#`EXJ!V3@yXT#klBtG_VDOMSm1^)}G7tG<1%YEc;kG ze683g^bTl)&GAcWth=oDSIi@nF* zrp5D7B~`WrBb=G%?hcXvFkf!$rTMh(2;a8LFGt>w0It0^c|rs=ev}@g`NVz97rT{s z6f1`K-r;v7%^$YZ@&)Q{dRd@`i0qt#MzSS`@@Hao^b1^tS0u~obA2Cflnh@~*)~Mk zQhH7Xq7VmOuD=MGJ57;mW(BnDm^?E2l&zd~+o_54z^%dKbO zyUF1k>rVevF>E754JIo`u(#5WF1I>p4lJ#i9vr=~~mT$&x8iC;m-a6bAHPT?z zkF6>bvuugp%7uGgMKYRYZ4GRB4-z~AXr_Vu&5;(_gI1>xnqW`URVEjr^aQ?q50$%^ zbrq@-Z77~(Yba)6?kFB!1I_FEy~z0gtFQkDXAN{Ao2TR=(UK!}qsXEbA}q@DyF@$B z+g7G^i~>jUtDDz$az5QP>+#nfRD89S&_paxon_I8o2_z-_s;pv{N7vPZOvEl*@1Rj zN&Ghz+acLp?#l`rfOr&+{Kb4kfuQVlCT2FqV^iuG4?+mp+dRIt*YYCu=(_@BP}8}y zJN;gb8+iyApFY58+#r15GFiJpFZJ^r7OE$@V4GTsEkqeoQdz9NqHXU=N^3l1DvVpU zowa(HcEcFLk!*^J|95%Q*6>&z`y3?HIK_%8g)f}lclFkbbz**>{}%<7rtt4)!r`3R z9=3l~!$E>sxFu;y^5!>%U`(t7_nS9QTJE%p-1ih4i)pyH^@&XOF@^4;jj+ECCV&Y2 z6ZyQ&BI~cGO&@5T`=@RDFSj)qNck@zDBM#FXf3?rl`R3v52e6G8!s!&E)V0t$S{%% zD>lQ1oz!Z-3KW{rMcTPcw;-uR13?>(p5G@*&h&`p44XLhCzYQ(%<%ob8)e^Y$Iq4< z4rz03_2YUN6t1ce3w$+VikEAeQkaN8$?XtVxbRxG#9I_#yifDnSwGZvpRmd8zLYl* z?xqF?WlPX;unt(Fj)GtavAszx4;z+Zo`j(i%L-AFuhTYp^;`E<<&)#jjJ3R$^dvJh z>LMOei7hcZuAvtmxm*qTeomJqxbgMqC2*IgPyas^-u+ivAS#AvM>D1eFszWC080^b zbMjNT>GXO~(Kvzj@hJrtQKNd-Jj`-XtWm1l0D`_dJj@K#1f{uGNwgbgdRB#TZQI4N94x;MO|`22=aLMt`lciJCgh zQi+ftJjI_ycVeorp@Ed>CFw$B?D0*bDGz7ohr91EhP<@3rI&Y)CNw~wflkDLvR23x z)H>zJMT3RvoMXb=CU*If{dL~guOn*dyB}ei097|U%8tFj7L0CY;FPCV*&{nvRoa#} zcI|!_wENvQz%evOfPx;Sj4+v#QN0W!SuNIs*xUFq8lc3F9BVIE9<2*k836C+4kjW1^OROn&PW(W6#JGA12 z?dnfVjqCPQPvTc@5-4U^(2=swhzh4+sj`Iygv}*6ql8OQW@ENiryC@1=)%c!2wu!& z8nj}fxgg3Tk$Vi;L_4_S4fW81+0OMy&9luzInVgi2MLq;?4$IK7h^~a&4aFAf+VhK zJwoXhpSe*MMyPwg19EqVYA5t<|3nmcPcTmbWlhbhZh;fi+xW<=ARS#?Wbs#pg5d`d zWwgkxz8~+rdMW+QjYDJIEGEaTUaSXnF@(bLJ(VL)!`reRaPz1rKYt!77|dbwVoN=? zkT|EQNwe1cGCVxeR;KUmEt+sV$xz732m(0xz@4};1(M7_4d%K$=F2#4r$c54^Er7?}byG zj_q1HHuC-QjI~d_%~{claJf0edGk}C`2%3#KOt0RN0XO%=4~c;nQ;obX2hw$UsLvm z_nj|p-|{sjln>%e2zc@QKdpI)fvR7yLcAP%m&=r=`{uZvu9Uq?i*Wb6$PSCKX}1D{ z2gYcN*7}Pz9Xfum9ysY9ER{PXIm}Qo5WMu@Z&>xe^Z#GRQPwEm!%!>}BgZ-D=92^- z_kDbE1%z&26D7?l6OWVDF?ms2<70(uw!W0VZOkPZ8PYY?#Yy*RC*BIe#H{fuxA^ma zkTbEj{c!R{+9@&p$RuMP&SRg|qV({9z0|DnYfANVn@Jo~?iNtvjRiE}m2bZ6i}Tmc zH$#2D?E(rgG&qGrXq|me|a4!^<5cashb>&y%Qowfs0OMU^!H03Dp zd^tW~3O6U9HFj971u)eR;O-BhL5$zz4=#%b$jYDJ$%lkVVv#!SHj=>PPu&zS@tQju z*jb@@xMInU*DxGl5GSaEAMYc|C`p-7ele;y9Zh% zwUcn-bq~(GDv8XI$qwbi+jL|9e7~3V^jO(wp}FjBRLN;r$t;ZrSmb--avl>7zi0`kNirvEEOljs$?X@Cx1P`fbWpx?Q_nhEk@j>Pv7NMoK2gu zMc%a?^}UrI9)VM%`F6MNhecUEG2`2xG+yIq8>w;BxVCcO+vluv8Xsu^C*8q-ZgTOz zv*G_wxMl-KW73nTaFTZ;x2_9mTh`KgtlgFHapOf_92lLZW}tHS#?X*>8Z1-dCeJDY zlsYIxXtfKAyB_dungG&Rvp`FZg)lYfPZ$R1VSrw67b9UUKuoRsJ)%hetNlp(WLiv? z{`LmH&|}j^`d4ucFerKeT45OW(zPBOBC%`lPF{Q~lFr{XIp@V~@>=$E^8dx&o5w@l zw*BL}REi|BWSz>IwPfF>4M~zc#8i?kNp^;*B-uj{)oBE_4&;Cne#l4^Elqe`*0C?xu-?AsL510cc%$m`~tCSSQdI&if6u`O-cHh;@HI7;04$w|Wlo>@C z!@*(w(??gLA7e@~adA_Kh*bJ+iq+etZzKTaTNah}3n6Qfb`j3jw&uFJ)69=gK^3%A z2AA|W)-yl;*O=#Dea+DUzY6TTE9m>YcMRxmB;?0`g8SQOWK6(VhlU$^M@JpX&S>&% zdfC4g6PS*+=|4GyHI@8rN74h6;wH7>!*=a zt@`q=ge9vUTsbKztN8wYd-UjC#*d9{S0p|r&zRlo;Fv-bq8j}XQ*(hO{<;ma=Y=~; zKsphtKseCUCB^$vbtb~k)+MCAi^;;+@j>{<{s?>V=pj(zcC)GWe+V4>cfi8`z3+o< z+6)O#J%!hAM$nV&biPC~LyXCy!)Z?Lk7%~NAncZveS27YVEURoCabzAT7MNt>P5e18$nT6I`=d5eg z0Z!Fi)b+ncun;>6j*J!rGLo+{@-q)|7?7}PA{3U zJc<*}i!Y0)vU*QSHZ6?tx6xgrwabpG>|L9dl{V(%J0qI3`DoPmw8z+$gp#D*4!#=| zvM4<*^)$Yy~8!NbpwBM zS$M&HWSxe}H#I*S`MKbd%kq}?ch}y>jK*-_40O zr{sUFXWj~TrpSkNliJJZ|=Ns;U4wM#%K#Fqq((sq&A-O#1 z9?PZnh;W+mnG-&|j!&Bz-%tE@O=*8bP0zbs&DP)-v@Ybvb?92yN5q;s1W$krtv zNi0-|rum#OId;jWmH*7Zm;9nv!VC@)T->LexWH*A&iIQ(5$COJkt2JRSEQ=i3v&D1 zdzg(j^yZkWSjC;f$JX-#^@?gSZ`EtIoi^ozc?Klz8Y2;%=38ga2}Enc$yo@{uG=m` z^y@lJ(q3lf4Wvjdc5Y!N-437IMe<=;9sysVu08-HB+#_8=O93JR$Ibugq5Si~o^R9uiW{URp==Jr`}1;|ZF3!YHQF7!Kg+H@ z3VX`_B!2HBryNui!U40b;_@821wz4|Ih2ufT|KvXZ?c2=7q#f-&^&SWZS0s#6`2tj zXUXMXzREu{Z2#TgW~)UIzz)EuPalAjPIpijP^Y_q>kr_lPkIsyD3gzekR z^J}7U(MI~6Dd*+G%^<^ErsUg}PIgSCr%d!a1m8rb`r;)PSx8=>hcIxZb_=8=EWlP3 zGJAul1?qa!V`|y}y0z+}MGp-QmyCqwnaaO^mGb49quj*8hp8xFNX9V0kQ@cY!+DMn zO0+gbweojsg!n-hmj|p-j6|P?48b4y38T`SZwvT%|=}T{cRN(>JT8FVp_sNy9_!;kL{WzC@@O{z$~?L zY+k>AJdmO&?(eq^*HDZ%oP~> zpTAzQUv2_VA-ljizU>NjlTHoRxdc}WRrE;~TiMh`%ynh7M32h68qQrRNa5GA5M~hf z7EPPJN!X&W$xJFd$+l0DdA`ZQ<1~J}|4@%`b=nlKu7tPq)b+b@GkOa5j@gCK9e8w? zFWg`=6w^r~3j96?I|)BODLbOR5)F*FD8P^{fE7Pk%?~<#yha~h4%kn*Nl0m+iS~Lx z8E!1bfD_4%z+ati>nER)bGf0QR|<10(L#al(5w5WQ6R0A00B)m4xv}ToicSRGzu)Y zG2`_^Ml_Qxh#Wu-x}FK?1{5cNfy-Dl=Q6%cli|ZTwOfCS5BgVDTh>X;UZW6!w8W z-5>}$>Td`1qc<)g)_VI9q)oSb+(Aml;UdY7;yW6HRQ=pGZ!_N4w@t;v7e2ODipr%% z4(BKPH~&qSh&hN1DuBCLfeMqp34pcx5P!Uz4|3SpPj|(xi1vOKw!W4?I~4MF9hX0R zDg^%>R^mcsg;0t&VKjAZVw^w^`86U-Ie|jS0A-9P1D+XkmX&T15~VUjr{q1utF9f} zZ)lPrSbqGeDk}_$`Q!C4v3XdrXafe+tgx${&!69k!vuTeX&a}`8Ft4jkd@1QZnW}_ zw5DEULo0TEIh!<>lWh25uwt2#>-!zTa)#8>cdeNHU2*ZN*v-F0OL%Y6ys`RF_k zB^1e9v1v7`Pz_czSfjgylX{(NEkrOFx{p;-7f^}|&IEO{`sQ3jXKG1++-ZaW+_Qk> znyJ(Ey-Fk)cZ7VDE*QE+&Dmf(W>fZD>0QK~Pc+a{<~L?Yz_CXUU!Sh z63^;NJ4Qt10g-&VUg#~@(2~wtIOJfJ8tuk$|7_0kPJejQeVTHfKIsnfF>>QF90IWJ z*XX)0`Jr@#pa1wtewVtqypVgz203XO#q(y}Nr*Uy^qw}Nacr2d?*X($=tK;N>AWo8BReq`1|)(ZCF+K9*6{;mamx^EEx&J zX2bGmOn7WQIUPw+7O;>6Hhhx;p%wO_;EzIokeo1`H0v0d=gb%_<1ClIb; zOcd;ZniLi%!c|&0DA@qa(#sWlp+kl@LRJeed35=IetVes2OmHpmJ~-Yssj)-MWdoQ z)I+luml5ZjH+5s&DeQCdO8s6jruGxHb#FzV`qH1{x8;~L3h4i~;5m1FfW}U_3ciov zSDdkyRo~KMj=l7VxqLfS_tkY};k09`p+uQOq+}gJLh!PD2a`crf3Y9QbZUUub6&_u ztNuh>u)#SV_rKBiIS8vbfYyrY;hSlbKj?ODZW1}*e!G2HT6=fv=*tnb1a<$z+O!Q| z$Yfg9)*%xplWpW}&=_I8`LDre1F=ion=-$VB0C2}QfIMxpF_n4b1E;@p4$=%9e>>Kam6VwDn+N{@%>B9 zyv9dyNFKD!4>~T&B~k`ikraESU+!|Q22U|`xL{mQR`(%mUhC<7A%T$5vcqN{Q7Ey$ zM=pON&mEtn&+7exa)l5TlqXm{DENc|ootzlwz)XXCj9a&yj<}RHuXT6#daoEl=4A$ zLZ2Fv0NoKaN8L)+46A{%%j+{yl#vDn=*l81+3_B%QAK4*NvaoFvwt;KGWW&t;5I>f z-qaZ*(#PL2!>TU0pl$Rct@)$s6|Etqc=WRpe<3|rFXpzfuNCfjXBom@-cY^WN|UYs z2-*iqLxFTPH)0gHeb*8^#%bTIIeICqWNwP_x8m|)RbCnTCDsqb(UpM4Gj^Ud(R;#) zQ9=dkOHYBxzli|t8)U)8M$%HG=jrPaeP}^pK(Q@)^(@`dncf{;pThIGPSR_?noINRQE z@hr+!m^~9l2?boJyP(NbdJU|Y80B=QEZW;;>X1&+b$lLq+buU+!)^bvPu5Fcc$)^^ zf&d7$TOc*H3WkE-4?@S-`Omjz0NSN&auYw3^9=dD@q7e$mZyf)ULJ5R?`6DQ82p+Vkrpobd@R)h%#_eB&0Q+~NW+dt{r@c}i%9;xEQd7m{K$QEhy z<9liZ!T~kxG)r0~M8Ksc0m?f-(yu#y`{ib&-V+=3Z8s>14n&Rn4p6^P6fi7RCisL& zcMLw+JIAzlCC?+QLs+jdKk?2<8&BQ*i|AK;{GW|^6JJOKf*dYhHwx6!J%??9fU-AZ z>^zob$Y?Tixt)9*ZeNI(2~IDpK-Q|%SuGCg&B3hp*q&*KN%fpd2`f22EtY?j$Ogtg zA@c20nq>*MrsQ3W73JbKfo+BC~`7Lgr6h&rQ!RmLjGv%PW1cc>IhX9>;= z`}lEkVotFz)VaDsIDZ)FX#i6PMq{Yj-bi2i~ z25O!>tdEExBSqTRc!Sn+_3XQE=rkwmwz28>mgYtkNnoLo*3y0MU7-jrxP#+yq!pes zD&1a#gDZOblf#xpZl&Fq@7^-OkA34_ptR(BDTjgKc?P1bOrk#&7E3$g?~kv(mM*3c zQ%2@GM(58b^R~lht2uO%9+>-(LXg-R1CZ~L_ugcQ*e(@4_P{(lgWvuk%yL&J9@)dFj z>(X0$9S)m94-0s&+%4{_mOi)gLEWg4&^o!g*RoWr*CkVCM=LGx<)O;B^7_b;RP#l! zqkv~?ZkI!Pw>pUltq#PD+y&w@r=q` znuYA4Nc3V!pf@LqR1M>%=;4E&`KHFc9koaitsgc|QWkvbq^tCN;QFQLM4h-nA^7{L zFQ^(&Qo(B)b)~yXUjRAT1?k8PBX=EY{@Cm$d6}>2?uFCVQtkCNmNR zDhl)fHJa)gW~#BE#lF|^O9$y58?s4H%VW(#TuLF+Zx7!K?DLn=^qf3nRNF^ee}(I1su&@!vjJsrs))-naI?Fu-k|whYa=4@k!tu8OZi`t zeGWp4ni}&Vm72vq&C59i7>x9J0tYiB9D1qa=8PbEcT`46+$(*Cu`jHvc#O8>K|e0A1TOPJu*a7VwQ0_)6wC z=OD$Il;q4tD49bZMiq=N&Lp4=ZSh3_K^MY+H(u=W7C=PRqpCtStriEn5pbbFTem3C z)(uG&EJBqy!C{2CMca!cSAeK~X0H1$k;b6o(5fEX&m4#9Cvh*L} zgUz|F6|EmAE795;`0RkylkMao)2emiTkv_la23#?%|DY=**H8HDu=t$el_Y!q!ioY zu-H`{$-?I+b$t%wdZEfqbl5D7^8kM{CY|^}cTvBAg>vjW0Jr$*{7uL=z@T#}z!@kw zYYrZUJE!eud}j?sdX!nqvcnT_95K<<{Dbc0(h?vZqW8H&hejqfg791QUKT+sVd>kn zOFQpFgzJ5ZKz-2NOGeM*9@jlpe zl^=fjw}}V7UJcCqZ?PzbXkAS@A8@GJxdf%Ejl(tZ zb9EJ8BLWE6$;R<{j>YZ_h*FfxCPXPzQVn9%P=q{dFjQ z?Uf-GDC~p8a;O;noE|;xAO`elzn@l2GD+_!%OpN48u#5?e-GbWwXU6nKBFDLb7DwZ z@LiqT!_EuT*o<1IC^GSBMaA#VHhmk~2?AP%g(Ha~PSBl;^6+l*K{y?rs~P%Te`1v) zvcp2e5Mjh-Fzvn4QWTV;arrv5|8inie2QDRYk1NQj0n!-SkO2PfZ6we^?ZNUEbeEY znC+RPw0TZ?I?Ic^XCHHJ&rZr0g*oIW$>$IAD^gCg)WCLFp=$*Q(BF0*I4pa13nMRx z(oAJQXha2PuN&2f?x(6|T31G5~yC*m#opy|2 zLWX((xqSl-5W39`VRrw&U3~n%yB2kZ3N{DmkIULe;j(kWXV#StYlqzJyJPO+B5(O2 zRKf~1%gJ_mn|o->xGd9`d?hqw;^BH&)Je1D=-%g3;Y&;w^6}!2X1t0sMUdImAGbv( zyeLPLYoLb%x;~Oh(38r8N0|#3)#F(e$)~4RH@-d#q;}u5YgWB+9|d(_^7BrAdH_W^ z9NowkWNe^DN5??Na)tb%nwPWDXTW!r49@w!I}vH0i=Mo(xgREEcgQzK+O5Nd zG}p*Oj3u0%td98LAmR7kaZnL6T-NcRi>NeJ;uRjucfvs--}0jnW9B66x8_MiBu$OL z=)?)k+dc#0gD0;9axfer69?7IGAS1b;~_Z?pBg8XY)il3an#&X?9P1M$YRS+MllPr zs_}x+Dm$jL$&>23*GPeRPICYp+yz;zD9dnWv1q`8eLvp3KPuZl7I(d*LKz{ukbeIRH}`c0jt#3{pc}tLburV1 z^1e`~-}zK3kAj4zaDY$s=_BA%b^RrLsz0G=xWSG>0lfxAt5rno2roH88>6z%X5pb1 zYk$!FN~+^p2765i+W;kULU%+|c09k_T%u`l_#-a4&H#errww3it1f;6KmYm`LjUYN ze@1JpqpV%YS3ql2I6zVgi~u&@qwI7A!Lum>W7BH24VM z&Ac4_2U{W+!R}pu5q~Y2nub~=`pQSU@^tvAG~~~{lh*&*To@kv-3*+MOodFV$(Qh6 z;U4qQxha1Bydz}P@Gu*8>^wt3qeXZ|_J!HY8@>{tzRT?ksw<1c&{Sbt<^!@E@#_#` z=YY<8=u@5rxFCV4K0qzf?d=lh@Uzkesg6R0k+6H}oHs04c>PoYFFuPe<&w421jPyL z0pQX8nbT1MJeNa<0Hz@xcDPt~wp`_229`!voJlT?G@l^XFw4<7k}LO6dNO&KTkfkv9t42na~^m%p*Pqfn^ucJd3ABsM==Zog=FRo!xU=VMwWNd3` zSqy(~mi>*P2J$DzIqETVA|12ljwwJ;Bb`BY%CL$5-?eW3q`Fq%pYdTfVL+Ne&kidJ z8pC(dUUuv@hTmHbPQ0TeThNysN>#D?#?Wv4U-VZvW~wErDS&z`5yh*AaLr2hu5gz2 zzu1z(E_g$wSit%^ZtvT%H*;_9e7ORA`uzy{`2+!_Vgfu~9IokfTRM>g?|De-eYB8w zOXmR@9sw;arA4PsAUYo+aF%3{{@pwI!l&L<_?cUU9r->hVQ$6jYd!pHCn-a&$k%hX z7#}%3rlxABz;#Kr*j8*jMjOGnu&$<(eheEq#s4iKxP8d&1iaw7&bjvtbAs%9R(&z` zWM;Q!0dB(01havi$Uy$S(~Zs=Ez*MJnr1q&4Bq=#6VeW)zqu=rTGa&%hJaku3&@cY z#37Pn(~@~n_YCLG^U4R^$*MkI@6$}Z9^5;|`0&79?7$b<|1b}KMq{d0r)DCi7pji| zzB3dwtxT;B7W_fyi+sMiNpB_D{n&{0IpSK7k}Cg| zQWl%1jx*=|{r4x^xcYdA*E+lK>Pkj*v!0jK|3ufXwRN*HWO(=usvZ)=!%(L#vZROK z@M0ag*+mT5*YM#Y+TQvgE{Nm%0LwGD$6Ie=lT#Oq<4ecVZ>=*r!k>jCCiwUw%LUi- z76*#6+tNKy9RuWOz4Mylem)=wyTJo~{D%b7zvH)0GY;%mkp+T2&|xzJ6|XZW?LP@* zGN2K@u`)qOCE$nt3U?FCeg(!Yr*_-M8;L{eUx186%LBmHqT^^M{h({?A(`nFh1QM9 zc#N4YxKpKjw8Ud>$`;MEOlyVk#VGUPB0e2FE&%E-ngH7q!L7k-4Z!y1@aV-P_q!Wh zF`DcJ5LBFtI|CVW?g8Vfp>08k%yQ90hvm(LhMl3lRk(+1pxaag)Tp9Yx|NY#^4_rV z+7x5Zs}yk*pS>E%X{s~31^uY2G0C9$nIReg))!*Y} z`k0zvnV=b?ldBJh-JrhXxQP{CJBB%St3Grq#P+g{kB~>C+`h!`6Jq>28gX+xnV?d- z_iA-a9hA%5$>NP2%LkIj-Tqbf9bP}p_^V{+*=NK3`^hgU?4<5=$~D?xkF%O)Iw`@Z z`)Yt^+Pl$aNv`Xy<=WD$QSsZ_W-rzvgCla^?*w^!1yZcI8d!#Tc&X5O-_9V;l*#1x z)yX#sIAd;7-z^Rj87Kg$kM$qHHMkT1~M`6ko>v)%7^o}Z= zpM9px-C;*Z9K942c$^#DUUPDHCth9PVLKGoG~q9SAo`QyuwzX18v81c^}g!prxcH= zFFLsz-F_z*KaGra`1!FHHf49)-SO`}L9VZMD*Yu$aYu3l@F)ZVPHSMzu%(X2gj2ho zrFM@^TuP?y{hSdAWufAiYTa3P0_<)kiTU4K9a$S``$3mAaS!<&9!+Z{Rt*jgKe8CV z`9=RY^>g(Z%kSR40Ip;^pL_n@LhSdhJVzCezU#S7F!`y1GsO??nRANR!J;2#XVC6Q z%=)Vmdq_gV(5I*kG@~WyXmgTQIzP2D>#cozW^&H4*Plb>9+$lyw0{Q?xnRI!dhgbe zGdn2kR_&6^aPnl|xCEZ}2I)D!pN>M0!&bthq4zOOg<+PD7ruIN_UMThKl&|~yZdQj zmVj~wumkGOd2m(5;FBc%^o5=Ld^TIcEdqagecJm16q4(uFte+q%w#fxv0MR4qMK=Cc(LQ%E?Q>v?@2*+H0_z4?~e}u9Kq2g0Hg5Wzs4@ml&yO;FxJ(|E}swqrqTYwyN(9P4I5=-VLiDj-Hp zmxiBpo@5cN7vMS_He+QvWq2Z#^GI%?v{qTidx)Vcp4ILL>(L@R-TwL zbLdJ)rB|%zSf|2zcsMO(a8?xe1TRzbgKiISx4MQzMrwvdiF_(u5qJDH$v3wIT%VJ# ztwq{;jg)o9u3%L^ckYK?Tgr|qouO``X8Zy~pClse$OzKaIie@%ef6ela0$O~>s{zN za##>6T((Tc!y2JSq>G12UTj#pN8i77D?%MB{e5|$XdwM9w)OS_#_^2uEde}avgAaF* zk*gU6pS(SngQCr5V}4yc7&hlQj)`ciZCARqvnCU2c$6{<)~%H%ZrV7gjlpX==>AN z+5z8E1*nMuJm?5DJ?8$-R2k=GQ(pCI8#PpTM8hHR=Wbn^@(Z8z_`ja%I2v*?`eHgt zYwulFSSqYobC@#tn zgAHLO&Jm>gH&TTOdT+a>?l0%wt4MXqQ9J+eYeANHw(;3B6Z>1Sa(gyyIk3;BL=?A`7LgK|M3KKhrwJljl~z~~lV!LX_Ea+ZA{ z>0iUcLPQM-jUPvKKh6_TA`Pi4n&EX2y3aw6&NZ34CDBm@0S5L9q~ndE9QA6nfCeHa zkRXXsBIRaS+Oup#)<0`?`N&afrdLgu(Xz5U4ptHcTJARKlaICsG)i zk$8QuOOw1_$mKYj0v?*Q8fa^b` z;Su#1kQCHE!*I@;2Vl9b9vY2=l@DK>Xgo`kid1IA_O(i|hfS~$cJyuYv~^S!!$+T` zcEsI9X?lObgft>cl&Ab|0;vUk5It`U@SO+@h%r!k4U$nqM$@xP_+hGs1dX%Ttv-XA z-laP7VXMq4kA!J~PUcr1MSL3sNtq=yOjM}Yj&O~n?|BoBmq~k?Fbq@UMz}=oI#e9SV zteNSi9Q1Cgq!weAvb#ZlLik+L0^Dv&7>@|t9P^nv`yt`B`ue5AOfS;yB#{2)`A#*+ z-_)4#UFNYS`0-$BGD1k|L9c(lj~lmm!|kzP6KmI02_|AjB4z>+mTP2~tmTv^>#o~B zR50SgIVbA1iteYRL(kMQa7^C`K;fW6KA#a_Vi-IiPVM9+SR0X|5A9bwHPM833EJ!m z{kAx+O5h6P7Yglx6nF8o-F8BXj1MRrF9m$ z0wvlm`^+(YDcj&)?WscP<6#Y71RIfz9?)Y>#A*TjY;u;i!-sLpG1Wq?lNHy^t=ecr zj!4;#PU!;^dH&s*n8vK3W;ce!8J(2s`+B?&UE4nGbzhNq^?f^x$W|RjhBWc0XAWsb zMtgAN>i#COp_(Zfqr{sS41ve&msoV1EJg+f@O=w7j`6O)qMLWt5G_7fI^f03pV6Cp z?~KsPsJJ($$YYQ8;H*06e)m!vyo)9IEIMIgTl2@@yJg@|!dHm!z(S#GxkKRs9 zhNum?+{}DYeahRiEu+&=sjwz4 z6~yV^!;;%Azb=C8&7AyS63hJmi#?eq8XVL$1>RfP@QST-zTG)U>B5IWt-OZ0p{}}()4ovapxk-ui-q( z=`NG*w~j#!MqMr0jjj#9Rby&`u?I+cvlv>5uh;W%cSi%{<>2(Xm7dE9?0#J)d#g#M z&RHKrH5BtYoearNo50ejt6zd{R+48rDccQKFDxo~@`QF&=)=l&^`1)_*bG09M;am| z=meC<%0H(8bj@0+bbGTsoEq!$5TLz2-;#0~SFYvQg!Kc}KCy4OrVOl-AYrd-$}DKh zRyF+QO8v`P7a{L&k?D6n@}J{K%b;BDEnyPdKn5l8S@cP)eMoa=7;@LWP5nWqCT1Q? zR+wzXs_q$8D26>jFjp!1mL=)eV;C2_oVFfF7K36Oh?epG%78bF0gEHo``>H@!Ua+} zN-AQUKJ;xyT!0lXs=Ru^nlD^q5Y+lT^sV@DQO75($~N5wniriHn+vun2OV@n z#%zA(51^FQcl5Rwjos}VIbgSIMJ^(`MC-9oO@GK!2JoL-*-l%9Lrs;b* zeB8E?`8amzmiK#~cDg)nQ`UF!cN(TPF-^J<*5MADd|Ee8C?7P%>z{kgtm`RBku;%*dyXfs$a@&7JaEGaX#;CTgKC^!wC4(xYq}n^dEnP zrHp(&{+oX_I4ak-XpAYdB*kV}k$xl7N0He2)WZaqlq_9#+p15!=AECLujajf?EA)S zyh6I<_LTa`c9Wjf6Mb?c-wmgRSBC1FGvzySelJfGDHe~ZM{}vMJ<&LhL+@78DCi2cA?bbaj8)H{GnJ?;BhP*8=sR-9$@BUOTn03td_{;OC z@M>_l)!wLPB|XO#M?r?1V2p4bCLb?Om6BH>q*BM6Q)-soa$*aQ*#EkL>{8d)Ytn?q)zU?8c!%V*I7mZYt zaKfVYEzx+ZuMb!>KHGuUgh#|QwP4cC>Jj)W$o)%YP{rDcV7Q9gZJlOSMI$o+b|uw0-7;`j*|)jTuY$!^a8y4?7ho)0WzZp%!y{Q}!lmAl(m6b}lK) zM6Z-Dy*QG{0)(2-;Xn_!!Yj-}2QH6injCx)AVG?LF8GmkIE z*~jW+;yfuZjiL%3Ty%6PA;iAoL!e)}dD<-jzns?s$I{P_&TR3yo7jBg0Z`skXOh!( zJaSnVU(sw-=46>AC5mNIKAG0!HdmkQJfkyAhdeKQJ^!#zkp#yIHHee`}4IgoTQ6n145i#(r;xpR+X82xohYby7vawk1A!q6?RU zSFBG^VR+hmCxbghOL*VdiM8i&VaMmE&hx z$9f~Ehi!v(%yp=9a}dgXUJ791scZlJ1uXrQ;SPqX8Z`>NP2Ji;zCjQ^xvT?n_$K7< zF9ISBw82ta7!8;pLNExQ-BXZvKR5;PQ3n5b1ch>>@(DhfH~&ym1iK2`l4h@=Q>&;VTs1bJZXK4lrka1S(iA(H_)v$ zbFPM&77P(ZjjKiKqq1mCkTp}N!zx*f4LstDrNwMI(w-{dtnEA0eL!$>wH{Eee4x_Z zu8cmTHeQqf?I_sfj%PZJOO(QXmi9s)yiYkC{DUsOWQz(E&=@Gv`Xn(s>JcRP8;Ktz zMx`8V2n-Z<8B1z6zN>zfWu@MyLsGwtnkpJQ*jomJp+CN5d5oCUpB>PhsDHptE-yBw zN9+x~3s<6Kpv|1<9xcSPP1HcewpkNWk;0xnS*{j@Km5Lp<<0|RHYg)q7s(A^sQEw! z3bJi@)7yHraWERoC2$h$Q?wZhl@=sr_+Ola?js>;eAO)UpBJmE*6-YeJ?hdei5%wG zIY}pR??0{c->vk|zyCylU^^WHF{G?|+hb0pHB_zitYxssYYD$V{MPmhZ8 zaKRvI_1)QBDp~4sLX4=`?0wJ-u!v+A1qAvnX^h$#PJvgeRKzLL@f{^603LVmXv+1| zFIpoiiIfqyH*TSHJC6U%y#L?l$Mvh*=my^Gad97c+cdn!Q1s~+mapkMep^S1Y&wTX;k|*a^1WP|7acoQ>SAzq-RUI8+lqkqwZe~4X zDxKlzr{H$m;Y!4T-uQW7tkf5cG8=Cm1Hw9rrj`HH>QESBZ%RD#jMuZ zb+Rcm8YS77a*lrBvC0*R7C4k_20uFhF)Zt=(qsuNu~L{@F7wq69dd8~{<Xaijyw9-jzB8g*;oKou-5tYP@Z^`@xx( zyEi{7Dc#YRUz{obcx$O5PR2<-GfAny-PSrO-0y?u1`syUw*M=r*~VOh-yBL6xe^R> zIR^;Eg)L*O>}(BWI%fSFkRy_FeQFF-x|a4yeu*0+uiu59iTAXBy^sF0P=B4cp@F|n ztb;-jJ}R=9Mc{jf&m_)}*>sp&Ela3OCx||EH3G0{zz%i#8aiZP#k*FgVv4MII&w<;X;$Hj<41hHprI0gY8)}Q%mv*eQ4ct zn5F{?7h&KCs#~JI1Kt{l2HVsy6f3{E8st&$_Qq7^@+v}SEHxrmYN;U}ma5zylnW^Guh@^Na?;%0Q1^~ViIiKES2J0Czl;79A1O3C*MTx{h^ zJ;_Ylv3rHN?5C%(PhgUWpFU8FYmX5(m)I5Yv9Ykckcj=SV!f90{ev{&psIrjMGON_ zKJfg+))55vpD*=7+%W?!qF(|%kLV6+n*O%!76d$$BndJ#*BoKgWWk?WHi0gf-{Shz z=;KO_6Zd(TuxG>-e(2De)1u@0nH$Oz)9K2h0iAPJJcRt@P{*Y8}MUa`JhP^&_7O4DXjqoLKiS!PXwVjMntNM?TRI zAtZ#U@w)n8Q$)$UH!KH3q-bBi-8=Haq_jXZ>w$kx4xy2jl|fRxS=B97J(O!Xq$ib9 zT}QiHdr)&&Sy^eqEW+?v)_}XE*_X23RaLCP6@hLk=+OtEq%9g3495i$F%X);?5+X$ zWsF2bfy58Gt`@|^eELMp8s*^Woj%0H*8ZDR_bt7C@$T<%*PU7ME_%T)c@z|_!pOaYe>7}qyt%}Q_APc@^GXyM@H+hlEo;kcLi#$ zh-`-d=0O=bU6)cPPNI>noy#Y5;^_+po{`tCDRHbd|8b~&w;ytxiGK9#UEbLDitn$# zIp`<`w9S1t22zsv3V@TMcaDI3S(G9u+|>T#m4jYHVZ`<}3*{gmW|$qsNibI;2gh31 z6Ph&KyI;*VZD=Wgi7XK1>UYR20WxHmnQ-tSe;HRzO_xaZ2h>@Pz|_N6&c=8xuXuE$ zcoxb(kBT6gHVNJg(!wm4*;eBC=&_;@!cPm+LFuimEAHg z2#M|Ne=aO#($OgwZttSnGOkqR9z;P&&=>C*%yP&6+XsRyo!ETi=Y}iLe6YnNSfEFH z2ipiPsqxFJo}rOtnc1sHURkBb#zyY*?iag~Vy9W+H{!3cUMOTB|R$*WaEA&03!533$+g%QG>EQi}};uKqJ44f%OCtkM5i8PI>M3?ES( zpi2rtZ~UM`jhzMMu?qdzU$0D?96Q>Ggj63`0%E6A75L|Q9=@IqW1f$V3>9EfCADshRVH zh&;K8C5zXGM_WZTs9V-x7%5yi-l&FwiU-MQ3lFyk6=m#$?OW*RxP-%wygmH>i8VdJ zi0IWDz)ccuNL8yQD4?fUxJI3Jth4-3dcFf%N~W`&+zipqGxeX&^WJ?W^mIrbSgd2k z$x+;JQ+(O8O&FV#03W_OEyH^Bf}B(I{jD;Bns&R7Ld=D_yV2Kg@#kLiG>h>PI7KiW zyh4~wkqIy9+DmG$O+B1Cb|$Y@AufC2)5T%G2syPH?Z8BC<4<(c`LYT?EPbf~Ll+=o zNl_xWFS)+8YTe7(8Ph7sIqt_^^10ZD`@N<4U4e@umC9v_@4h!Fn+ZViZuQWk0b=&P z)q#_KVJW&bX1>n`eH+U{M2kO_Rz;eb-xq)uUAlLq-Fc?fO`uQq>=ACSRx=Gj?^r8> zR~<`mMI>^J7_+`nuS4buy1$+`1z zm9;Zw0X0j6A)}{Fzh-r3XFV#T28b@$?pk6wujbVqVIWWA0_4vgMUm`Rqc9t~z=&b` zprjdFYH$e69+Y-mM&o$Yk)wcbj}oA!(gXoDaf*QmFdtD3a1uRpSq43&Ar##eDL9U1 zmq;s##8nz)>Wyx4EX!l>i0Lw$^dy^El~{G|m~hyiYQD$5YcRVp5cGTkaCFcg5rj7A zWO_9e(JcccVi4B>86XaD7;aA?lAt6uC1|ld5#jc?^Z0or2_)w(p#h{s1)fhNzzmuB z31nIbf@Zk`PHDb$GRsj4I8-QI z=ojzbI2c>hzV?Hz|MWId&QW?y$)t$wkZV_*>Yrd0b=_pZxTuMH0X z(Jl;Fa9SE5(1-zt{HFn#75(E|o1k^44^h7Yj{w*t9#!lX6`*UBvP~A6vUNRKouW+u z;UEhRKxEh8;K>hQhBUf}P*TFE#r6oL>nzoYf5bEMTJq;b2_$PAK>0lE#D+X$?hnK( zq&R%kR7DGZxBuNo`DF+SN9oPDJC=t{OIJpc1{*H2JaFIqhimrJ*Y)$jqKE>b+v&Rw zO#)df%5Dq5_PYneA6JHdkhP}_y%|G0jt8hFlu?xXFR~ue+&|K=~@fj%!3n+S^JQ9Kr z^oG&c^h>DeI3z))ykgDMCjhqdf!FInz!y)#x50?uG)X;^E6i3~-Ta%5|7ThT#nVoF zlfsNL^pN^izu}|(S$SZKME;gZwf#F#`K*3z^6tDVFE5wdx)wh&TJZN1;W1qVYSbgs3gRBQXYZv?doeM0p+O1Y3DR%5vswxlT(muXF!yn|ideBk29OfX;sr-(= zWp@+ox%KMl)1UrlSe3ZF?D^~K`Letf-_fFcSHaKF8ei2gq2BqGD!(N|k6m7D&Z%Dd z1lkKib;@G2tQISOqhkKE{(mez`(Y&i@3w2Dxy>esAu9jQB3<+JZTy_Sy*?}HhWEWKEiM$_{ z#vNh#OC-F%?!tV*KlQ+QlHbh#1oF9oT~p6*`?u6?{-^p~JkIaD{^|b=A&2wcp1;2C zo|V+c4PR6{SFLnhz3-RuzO}Ayd__0q4ud<5_=79%JiKIT#$7U1^S}B2Q688$1?;y2 zW7G1({y)m~DZlM+0IRI{!tCeypKZ>6T~nTWYpzw^^A+oA+(P4dJ+IDLoO;W1b5z8w z(q#)p-u>xMT!fk3V{Z8H#-y8X&WyUfJ1;w4kjHlCSJe0@9Q2dF%->ZYJ72n@-g1yBLJk8PmAsf(JD)X~{ zyWh44`l|HFn@@lCfAukYcjs@_+s6yn18XXbI>Ap~YklXERfhsMzgL-`thM7-N!mk| zcYFFbte)~w{HQ*6h5wORWsR$|KHkihYCFH_)|Nb<-FFr}XjMpUl$rGtJ?+M%{<#la z*;AA8!M~%%^MS3m&u`YZb97bL^_Plh3f+0H_w;+R^lWv7gz$y#%F~T2I+u#fyA;0P zdD^n1HB&Wq-(Qt}Z%d$S&BiyaM2&(E;I0p-`y}V7f4DdQu{`gqSz>GR^tSBvy5()X zBD(kEuBnOh?g*c)d0+qNFZ-dYy15@#Ki>K(%3C`B!~33f>SiCaJQ?Hl9>i#}UHhbP zLSEHTy=Ws}NUeFC_+$RodO`6=$2)AIAI^TykyUnU-~9aL-1(xBcTRl^I6mov>r;z( zJ$Jk0l$33ZCqfUf%c>vT-}sO1L+siWKc<#0s>sc?J6f~x$6CSC>UbkhAnU%X+3=c&S^kNaaf0nN0^}*Dx^i&M|s7 z<-PRMnaU4Tyyw=cKiGeymN`Uf+VqG1O;UM__#RefK72i68T<9B4VHhh_x}+80Gw`P z*zvI!SaX`ns(Jo#UfJuBS;ZrCJULUbH!R%WbmsO`kE_2(Z*n+os35moCEFyYZ`F$f ztF?KW_yb%E{WkE%f|^%xC{K^+$S|8D{S3hbh% literal 0 HcmV?d00001 diff --git a/hub/imports/energy_systems/montreal_future_energy_systems_parameters.py b/hub/imports/energy_systems/montreal_future_energy_systems_parameters.py index 76ac9351..3eb82a7d 100644 --- a/hub/imports/energy_systems/montreal_future_energy_systems_parameters.py +++ b/hub/imports/energy_systems/montreal_future_energy_systems_parameters.py @@ -163,6 +163,7 @@ class MontrealFutureEnergySystemParameters: _generic_storage_system.type_energy_stored = 'electrical' else: _generic_storage_system = ThermalStorageSystem() + _generic_storage_system.name = storage_system.name _generic_storage_system.type_energy_stored = storage_system.type_energy_stored _generic_storage_system.height = storage_system.height _generic_storage_system.layers = storage_system.layers diff --git a/main.py b/main.py index e69de29b..9bc2a936 100644 --- a/main.py +++ b/main.py @@ -0,0 +1,70 @@ +from pathlib import Path +import subprocess +from building_modelling.ep_run_enrich import energy_plus_workflow +from energy_system_modelling_package.energy_system_modelling_factories.montreal_energy_system_archetype_modelling_factory import \ + MontrealEnergySystemArchetypesSimulationFactory +from hub.imports.geometry_factory import GeometryFactory +from hub.helpers.dictionaries import Dictionaries +from hub.imports.construction_factory import ConstructionFactory +from hub.imports.usage_factory import UsageFactory +from hub.imports.weather_factory import WeatherFactory +from hub.imports.results_factory import ResultFactory + +from building_modelling.geojson_creator import process_geojson +from energy_system_modelling_package import random_assignation +from hub.imports.energy_systems_factory import EnergySystemsFactory +from energy_system_modelling_package.energy_system_modelling_factories.energy_system_sizing_factory import EnergySystemsSizingFactory +from energy_system_modelling_package.energy_system_retrofit.energy_system_retrofit_results import consumption_data, cost_data +from costing_package.cost import Cost +from costing_package.constants import SYSTEM_RETROFIT_AND_PV, CURRENT_STATUS, SYSTEM_RETROFIT +from hub.exports.exports_factory import ExportsFactory + +# Specify the GeoJSON file path +input_files_path = (Path(__file__).parent / 'input_files') +input_files_path.mkdir(parents=True, exist_ok=True) +geojson_file = process_geojson(x=-73.5681295982132, y=45.49218262677643, diff=0.0001) +geojson_file_path = input_files_path / 'output_buildings.geojson' +output_path = (Path(__file__).parent / 'out_files').resolve() +output_path.mkdir(parents=True, exist_ok=True) +energy_plus_output_path = output_path / 'energy_plus_outputs' +energy_plus_output_path.mkdir(parents=True, exist_ok=True) +simulation_results_path = (Path(__file__).parent / 'out_files' / 'simulation_results').resolve() +simulation_results_path.mkdir(parents=True, exist_ok=True) +sra_output_path = output_path / 'sra_outputs' +sra_output_path.mkdir(parents=True, exist_ok=True) +cost_analysis_output_path = output_path / 'cost_analysis' +cost_analysis_output_path.mkdir(parents=True, exist_ok=True) +city = GeometryFactory(file_type='geojson', + path=geojson_file_path, + height_field='height', + year_of_construction_field='year_of_construction', + function_field='function', + function_to_hub=Dictionaries().montreal_function_to_hub_function).city +ConstructionFactory('nrcan', city).enrich() +UsageFactory('nrcan', city).enrich() +WeatherFactory('epw', city).enrich() +ExportsFactory('sra', city, sra_output_path).export() +sra_path = (sra_output_path / f'{city.name}_sra.xml').resolve() +subprocess.run(['sra', str(sra_path)]) +ResultFactory('sra', city, sra_output_path).enrich() +energy_plus_workflow(city, energy_plus_output_path) +random_assignation.call_random(city.buildings, random_assignation.residential_new_systems_percentage) +EnergySystemsFactory('montreal_future', city).enrich() +EnergySystemsSizingFactory('pv_sizing', city).enrich() +EnergySystemsSizingFactory('peak_load_sizing', city).enrich() +EnergySystemsSizingFactory('heuristic_sizing', city).enrich() +# for building in city.buildings: +# MontrealEnergySystemArchetypesSimulationFactory(f'archetype_cluster_{building.energy_systems_archetype_cluster_id}', +# building, +# simulation_results_path).enrich() +# retrofitted_energy_consumption = consumption_data(city) +# retrofitted_life_cycle_cost = {} +# for building in city.buildings: +# cost_retrofit_scenario = SYSTEM_RETROFIT +# lcc_dataframe = Cost(building=building, +# retrofit_scenario=cost_retrofit_scenario, +# fuel_tariffs=['Electricity-D', 'Gas-Energir']).life_cycle +# print(lcc_dataframe.loc['total_capital_costs_systems', f'Scenario {cost_retrofit_scenario}']) + + +